diff --git a/.gitignore b/.gitignore
index e0d08c3..68ceb0a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ dev-dist
# Editor directories and files
.idea
.DS_Store
+.env
*.suo
*.ntvs*
*.njsproj
diff --git a/package-lock.json b/package-lock.json
index 6a430d8..70e1702 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,8 @@
"@supabase/supabase-js": "^2.45.3",
"@tanstack/react-router": "^1.56.2",
"react": "^18.3.1",
- "react-dom": "^18.3.1"
+ "react-dom": "^18.3.1",
+ "supabase": "^1.200.3"
},
"devDependencies": {
"@playwright/test": "^1.47.0",
@@ -24,6 +25,7 @@
"@vite-pwa/assets-generator": "^0.2.4",
"@vitejs/plugin-react": "^4.2.1",
"autoprefixer": "^10.4.20",
+ "daisyui": "^4.12.10",
"eslint": "^8.57.0",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.6",
@@ -2387,7 +2389,6 @@
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
"dependencies": {
"string-width": "^5.1.2",
"string-width-cjs": "npm:string-width@^4.2.0",
@@ -2404,7 +2405,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
"engines": {
"node": ">=12"
},
@@ -2416,7 +2416,6 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
"dependencies": {
"ansi-regex": "^6.0.1"
},
@@ -2427,6 +2426,18 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
@@ -2524,7 +2535,6 @@
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
"optional": true,
"engines": {
"node": ">=14"
@@ -2615,208 +2625,224 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz",
- "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz",
+ "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz",
- "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz",
+ "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz",
- "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz",
+ "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz",
- "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz",
+ "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz",
- "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz",
+ "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz",
- "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz",
+ "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz",
- "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz",
+ "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz",
- "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz",
+ "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz",
- "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz",
+ "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==",
"cpu": [
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz",
- "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz",
+ "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==",
"cpu": [
"riscv64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz",
- "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz",
+ "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==",
"cpu": [
"s390x"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz",
- "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz",
+ "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz",
- "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz",
+ "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz",
- "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz",
+ "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz",
- "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz",
+ "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz",
- "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz",
+ "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
@@ -2981,6 +3007,7 @@
"version": "1.56.2",
"resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.56.2.tgz",
"integrity": "sha512-U/9+PBbLCfuy3sUzSzQ7YmU7o7V0aEN5f6jbKfwV9I1bd0AnpmtFJ7W5HnOpAZwCLiL00g04ZRWXF7JiSkm5ew==",
+ "peer": true,
"dependencies": {
"@tanstack/virtual-file-routes": "^1.56.0",
"prettier": "^3.3.3",
@@ -2996,20 +3023,21 @@
}
},
"node_modules/@tanstack/router-plugin": {
- "version": "1.56.2",
- "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.56.2.tgz",
- "integrity": "sha512-E6PA7Mvo+vK0Yen42C/CVDPXXTRhOQtx22TuyuhoZVjmeqV9uV50msTtPslzaP1sK29Tg6QqcjAs8J3bSXhcaA==",
+ "version": "1.58.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.58.4.tgz",
+ "integrity": "sha512-Ypoy+HrHwpv9A41bj7dpHhtLYavu7CU8WyuJnuFBY3SI5ZKWF7s/hMYUtVmEVwwT7fJCVQ8gcTkbfAag4uy/pA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
+ "@babel/generator": "^7.25.6",
+ "@babel/parser": "^7.25.6",
"@babel/plugin-syntax-jsx": "^7.24.7",
- "@babel/plugin-syntax-typescript": "^7.24.7",
+ "@babel/plugin-syntax-typescript": "^7.25.4",
"@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.3",
- "@babel/types": "^7.25.2",
- "@tanstack/router-generator": "^1.56.2",
+ "@babel/traverse": "^7.25.6",
+ "@babel/types": "^7.25.6",
+ "@tanstack/router-generator": "^1.58.1",
"@tanstack/virtual-file-routes": "^1.56.0",
"@types/babel__core": "^7.20.5",
"@types/babel__generator": "^7.6.8",
@@ -3028,7 +3056,7 @@
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
- "@rsbuild/core": ">=1.0.0",
+ "@rsbuild/core": ">=1.0.2",
"vite": ">=5.0.0",
"webpack": ">=5.92.0"
},
@@ -3044,6 +3072,26 @@
}
}
},
+ "node_modules/@tanstack/router-plugin/node_modules/@tanstack/router-generator": {
+ "version": "1.58.1",
+ "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.58.1.tgz",
+ "integrity": "sha512-oj/97KWi8EHFx/w07fAuXXyhWi5xgSMCfzbB9q42c1ZdLbv8wzBo4a6PO1fCi01tpKKHUopA8dSlGIOeJDhBAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/virtual-file-routes": "^1.56.0",
+ "prettier": "^3.3.3",
+ "tsx": "^4.19.1",
+ "zod": "^3.23.8"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
"node_modules/@tanstack/store": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.5.5.tgz",
@@ -3424,6 +3472,18 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -3444,7 +3504,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -3675,8 +3734,7 @@
"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==",
- "dev": true
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/bare-events": {
"version": "2.4.2",
@@ -3745,6 +3803,21 @@
}
]
},
+ "node_modules/bin-links": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz",
+ "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==",
+ "license": "ISC",
+ "dependencies": {
+ "cmd-shim": "^6.0.0",
+ "npm-normalize-package-bin": "^3.0.0",
+ "read-cmd-shim": "^4.0.0",
+ "write-file-atomic": "^5.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -3772,7 +3845,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -3985,6 +4057,15 @@
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"dev": true
},
+ "node_modules/cmd-shim": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz",
+ "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -4100,7 +4181,6 @@
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -4119,6 +4199,17 @@
"node": ">=8"
}
},
+ "node_modules/css-selector-tokenizer": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
+ "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "fastparse": "^1.1.2"
+ }
+ },
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -4137,6 +4228,45 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"dev": true
},
+ "node_modules/culori": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
+ "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/daisyui": {
+ "version": "4.12.10",
+ "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.10.tgz",
+ "integrity": "sha512-jp1RAuzbHhGdXmn957Z2XsTZStXGHzFfF0FgIOZj3Wv9sH7OZgLfXTRZNfKVYxltGUOBsG1kbWAdF5SrqjebvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-selector-tokenizer": "^0.8",
+ "culori": "^3",
+ "picocolors": "^1",
+ "postcss-js": "^4"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/daisyui"
+ }
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/data-view-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
@@ -4192,7 +4322,6 @@
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
- "dev": true,
"dependencies": {
"ms": "^2.1.3"
},
@@ -4359,8 +4488,7 @@
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
},
"node_modules/ejs": {
"version": "3.1.10",
@@ -4386,8 +4514,7 @@
"node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
},
"node_modules/end-of-stream": {
"version": "1.4.4",
@@ -4945,6 +5072,13 @@
"integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
"dev": true
},
+ "node_modules/fastparse": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/fastq": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
@@ -4954,6 +5088,29 @@
"reusify": "^1.0.4"
}
},
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -5048,7 +5205,6 @@
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
"integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
- "dev": true,
"dependencies": {
"cross-spawn": "^7.0.0",
"signal-exit": "^4.0.1"
@@ -5060,6 +5216,18 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
@@ -5422,6 +5590,19 @@
"node": ">= 0.4"
}
},
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/ico-endec": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz",
@@ -5483,7 +5664,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
"engines": {
"node": ">=0.8.19"
}
@@ -5672,7 +5852,6 @@
"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==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -5867,14 +6046,12 @@
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"node_modules/jackspeak": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "dev": true,
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
@@ -6242,7 +6419,6 @@
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -6266,11 +6442,73 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/minizlib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz",
+ "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/minizlib/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minizlib/node_modules/rimraf": {
+ "version": "5.0.10",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
+ "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^10.3.7"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
@@ -6280,8 +6518,7 @@
"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==",
- "dev": true
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/mz": {
"version": "2.7.0",
@@ -6342,6 +6579,43 @@
"integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
"dev": true
},
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
"node_modules/node-releases": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
@@ -6366,6 +6640,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/npm-normalize-package-bin": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+ "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -6482,8 +6765,7 @@
"node_modules/package-json-from-dist": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
- "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
- "dev": true
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="
},
"node_modules/parent-module": {
"version": "1.0.1",
@@ -6519,7 +6801,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -6534,7 +6815,6 @@
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
- "dev": true,
"dependencies": {
"lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
@@ -6549,8 +6829,7 @@
"node_modules/path-scurry/node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "dev": true
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
},
"node_modules/path-type": {
"version": "4.0.0",
@@ -7013,6 +7292,15 @@
"pify": "^2.3.0"
}
},
+ "node_modules/read-cmd-shim": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz",
+ "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -7198,10 +7486,11 @@
}
},
"node_modules/rollup": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz",
- "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz",
+ "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/estree": "1.0.5"
},
@@ -7213,22 +7502,22 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.21.2",
- "@rollup/rollup-android-arm64": "4.21.2",
- "@rollup/rollup-darwin-arm64": "4.21.2",
- "@rollup/rollup-darwin-x64": "4.21.2",
- "@rollup/rollup-linux-arm-gnueabihf": "4.21.2",
- "@rollup/rollup-linux-arm-musleabihf": "4.21.2",
- "@rollup/rollup-linux-arm64-gnu": "4.21.2",
- "@rollup/rollup-linux-arm64-musl": "4.21.2",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2",
- "@rollup/rollup-linux-riscv64-gnu": "4.21.2",
- "@rollup/rollup-linux-s390x-gnu": "4.21.2",
- "@rollup/rollup-linux-x64-gnu": "4.21.2",
- "@rollup/rollup-linux-x64-musl": "4.21.2",
- "@rollup/rollup-win32-arm64-msvc": "4.21.2",
- "@rollup/rollup-win32-ia32-msvc": "4.21.2",
- "@rollup/rollup-win32-x64-msvc": "4.21.2",
+ "@rollup/rollup-android-arm-eabi": "4.22.4",
+ "@rollup/rollup-android-arm64": "4.22.4",
+ "@rollup/rollup-darwin-arm64": "4.22.4",
+ "@rollup/rollup-darwin-x64": "4.22.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.22.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.22.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.22.4",
+ "@rollup/rollup-linux-arm64-musl": "4.22.4",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.22.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.22.4",
+ "@rollup/rollup-linux-x64-gnu": "4.22.4",
+ "@rollup/rollup-linux-x64-musl": "4.22.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.22.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.22.4",
+ "@rollup/rollup-win32-x64-msvc": "4.22.4",
"fsevents": "~2.3.2"
}
},
@@ -7409,7 +7698,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -7421,7 +7709,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -7448,7 +7735,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
"engines": {
"node": ">=14"
},
@@ -7599,7 +7885,6 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
@@ -7617,7 +7902,6 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -7630,14 +7914,12 @@
"node_modules/string-width-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/string-width/node_modules/ansi-regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
"engines": {
"node": ">=12"
},
@@ -7649,7 +7931,6 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
"dependencies": {
"ansi-regex": "^6.0.1"
},
@@ -7753,7 +8034,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -7766,7 +8046,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -7846,6 +8125,25 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/supabase": {
+ "version": "1.200.3",
+ "resolved": "https://registry.npmjs.org/supabase/-/supabase-1.200.3.tgz",
+ "integrity": "sha512-3NdhqBkfPVlm+rAhWQoVcyr54kykuAlHav/GWaAoQEHBDbbYI1lhbDzugk8ryQg92vSLwr3pWz0s4Hjdte8WyQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "bin-links": "^4.0.3",
+ "https-proxy-agent": "^7.0.2",
+ "node-fetch": "^3.3.2",
+ "tar": "7.4.3"
+ },
+ "bin": {
+ "supabase": "bin/supabase"
+ },
+ "engines": {
+ "npm": ">=8"
+ }
+ },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -7907,6 +8205,23 @@
"node": ">=14.0.0"
}
},
+ "node_modules/tar": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+ "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tar-fs": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz",
@@ -7932,6 +8247,24 @@
"streamx": "^2.15.0"
}
},
+ "node_modules/tar/node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/temp-dir": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
@@ -8117,9 +8450,10 @@
"dev": true
},
"node_modules/tsx": {
- "version": "4.19.0",
- "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.0.tgz",
- "integrity": "sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==",
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz",
+ "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==",
+ "license": "MIT",
"dependencies": {
"esbuild": "~0.23.0",
"get-tsconfig": "^4.7.5"
@@ -8735,10 +9069,11 @@
}
},
"node_modules/unplugin": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.13.1.tgz",
- "integrity": "sha512-6Kq1iSSwg7KyjcThRUks9LuqDAKvtnioxbL9iEtB9ctTyBA5OmrB8gZd/d225VJu1w3UpUsKV7eGrvf59J7+VA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz",
+ "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"acorn": "^8.12.1",
"webpack-virtual-modules": "^0.6.2"
@@ -8819,10 +9154,11 @@
"dev": true
},
"node_modules/vite": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
- "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
+ "version": "5.4.7",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz",
+ "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@@ -8907,6 +9243,15 @@
}
}
},
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/webidl-conversions": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
@@ -8934,7 +9279,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
@@ -9315,7 +9659,6 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
@@ -9333,7 +9676,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -9350,7 +9692,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -9365,7 +9706,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -9376,20 +9716,17 @@
"node_modules/wrap-ansi-cjs/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/wrap-ansi-cjs/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==",
- "dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -9403,7 +9740,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
"engines": {
"node": ">=12"
},
@@ -9415,7 +9751,6 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
"engines": {
"node": ">=12"
},
@@ -9427,7 +9762,6 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
"dependencies": {
"ansi-regex": "^6.0.1"
},
@@ -9444,6 +9778,19 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/ws": {
"version": "8.18.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
diff --git a/package.json b/package.json
index c59523d..1afabaf 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,8 @@
"@supabase/supabase-js": "^2.45.3",
"@tanstack/react-router": "^1.56.2",
"react": "^18.3.1",
- "react-dom": "^18.3.1"
+ "react-dom": "^18.3.1",
+ "supabase": "^1.200.3"
},
"devDependencies": {
"@playwright/test": "^1.47.0",
@@ -27,6 +28,7 @@
"@vite-pwa/assets-generator": "^0.2.4",
"@vitejs/plugin-react": "^4.2.1",
"autoprefixer": "^10.4.20",
+ "daisyui": "^4.12.10",
"eslint": "^8.57.0",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.6",
diff --git a/src/components/Button.tsx b/src/components/Button.tsx
deleted file mode 100644
index 495efec..0000000
--- a/src/components/Button.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { ReactNode } from "react"
-
-type Props = {
- children: ReactNode,
- type: 'submit' | 'reset' | 'button',
-}
-
-export function Button(props: Props) {
- return (
-
- )
-}
diff --git a/src/components/Common/Center.tsx b/src/components/Common/Center.tsx
new file mode 100644
index 0000000..8cc4670
--- /dev/null
+++ b/src/components/Common/Center.tsx
@@ -0,0 +1,9 @@
+import ChildrenProps from '../interface/ChildrenProps';
+
+export const Center = ({ children }: ChildrenProps) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/components/Common/HStack.tsx b/src/components/Common/HStack.tsx
new file mode 100644
index 0000000..6bb3487
--- /dev/null
+++ b/src/components/Common/HStack.tsx
@@ -0,0 +1,9 @@
+import ChildrenProps from '../interface/ChildrenProps';
+
+export const HStack = ({ children, className }: ChildrenProps) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/components/Common/Image.tsx b/src/components/Common/Image.tsx
new file mode 100644
index 0000000..20cd72d
--- /dev/null
+++ b/src/components/Common/Image.tsx
@@ -0,0 +1,10 @@
+import ImageProps from '../interface/ImageProps';
+
+export const Image = ({ children, className, src, alt }: ImageProps) => {
+ return (
+ <>
+
+ {children}
+ >
+ );
+};
diff --git a/src/components/Common/VStack.tsx b/src/components/Common/VStack.tsx
new file mode 100644
index 0000000..dd14adb
--- /dev/null
+++ b/src/components/Common/VStack.tsx
@@ -0,0 +1,9 @@
+import ChildrenProps from '../interface/ChildrenProps';
+
+export const VStack = ({ children, className }: ChildrenProps) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/components/Common/customButton.tsx b/src/components/Common/customButton.tsx
new file mode 100644
index 0000000..ecb68e2
--- /dev/null
+++ b/src/components/Common/customButton.tsx
@@ -0,0 +1,9 @@
+import ButtonProps from "../interface/ButtonProps";
+
+export const Button = ({ children, type, className, onClick }: ButtonProps) => (
+
+);
\ No newline at end of file
diff --git a/src/components/DrawerOption.tsx b/src/components/DrawerOption.tsx
new file mode 100644
index 0000000..a3c6fe1
--- /dev/null
+++ b/src/components/DrawerOption.tsx
@@ -0,0 +1,48 @@
+import { Link } from "@tanstack/react-router";
+import { useState } from "react";
+import { HStack, SidebarArrowDownIcon, SidebarArrowRightIcon, VStack } from "../components";
+
+const options = [
+ { name: "首頁", engName: "Home", pageNav: "/" },
+ { name: "活動/揪人", engName: "Events", pageNav: "/events" },
+ { name: "拍賣", engName: "Market", pageNav: "/sales" },
+ { name: "行事曆", engName: "Calendar", pageNav: "/calendar" },
+ { name: "地圖", engName: "Map", pageNav: "/map" },
+ { name: "今晚吃什麼", engName: "Dinner Decider", pageNav: "/dinner" },
+];
+
+export const DrawerOption = () => {
+ const [openOptions, setOpenOptions] = useState<{ [key: string]: boolean }>({});
+
+ const toggleOption = (name: string) => {
+ setOpenOptions((prev) => {
+ return {
+ ...prev,
+ [name]: !prev[name],
+ };
+ });
+ };
+
+ return (
+
+ {options.map((option) => (
+
+ toggleOption(option.name)}>
+ {openOptions[option.name] ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {option.name}({option.engName})
+
+
+
+
+ ))}
+
+ );
+};
diff --git a/src/components/DrawerSideBar.tsx b/src/components/DrawerSideBar.tsx
new file mode 100644
index 0000000..68d2fa4
--- /dev/null
+++ b/src/components/DrawerSideBar.tsx
@@ -0,0 +1,53 @@
+import { Image, VStack } from "../components";
+import { supabase } from "../utils/supabase";
+import { DrawerOption } from "./DrawerOption";
+
+
+const signOut = async () => {
+ await supabase.auth.signOut().then(() => {
+ window.location.href = '/';
+ });
+};
+
+export const DrawerSideBar = ({ name, avatar }: { name: string, avatar: string }) => {
+ return (
+
+
+
+
+
+
+
+
+ {/* Indise Drawer */}
+
+
+
+
+ {/* Sidebar content here */}
+
+
+ {name}
+ View Profile
+
+
+
+
+
+
+
+
+
+
+
+
Settings
+
About Us
+
Sign Out
+
+
+
+
+ );
+};
diff --git a/src/components/HStack.tsx b/src/components/HStack.tsx
deleted file mode 100644
index 08e25c6..0000000
--- a/src/components/HStack.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { ReactNode } from "react"
-
-type Props = {
- children: ReactNode
-}
-
-export function HStack({ children }: Props) {
- return (
-
- {children}
-
- )
-}
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
new file mode 100644
index 0000000..604bcce
--- /dev/null
+++ b/src/components/Header.tsx
@@ -0,0 +1,61 @@
+import { HStack } from "../components";
+import { supabase } from "../utils/supabase";
+import { DrawerSideBar } from "./DrawerSideBar";
+
+
+
+import React, { useEffect, useState } from 'react';
+
+export const Header: React.FC = () => {
+
+ const [userName, setUserName] = useState('');
+ const [userAvatar, setUserAvatar] = useState('');
+ const [error, setError] = useState('');
+
+ useEffect(() => {
+ const fetchData = async () => {
+ try {
+ const userId = (await supabase.auth.getUser()).data?.user?.id;
+ if (!userId) {
+ throw new Error('User ID is undefined');
+ }
+ const { data } = await supabase
+ .from('members')
+ .select(`*, identities ( identity_no, identity_name )`)
+ .eq('uuid', userId);
+
+ if (data && data.length > 0) {
+ setUserName(data[0].name);
+ setUserAvatar(data[0].avatar);
+ } else {
+ throw new Error('User data not found');
+ }
+ } catch (error: unknown) {
+ if (error instanceof Error) {
+ setError(error.message);
+ } else {
+ setError(String(error));
+ }
+ }
+ };
+ fetchData();
+ }, []);
+
+ if (!userName || !userAvatar) {
+ return Loading...
;
+ }
+ if (error) {
+ console.log('error', error);
+ }
+
+ return (
+
+ );
+};
diff --git a/src/components/icons/BasicIcon.tsx b/src/components/icons/BasicIcon.tsx
new file mode 100644
index 0000000..3dc87fd
--- /dev/null
+++ b/src/components/icons/BasicIcon.tsx
@@ -0,0 +1,21 @@
+import React from 'react';
+import IconProps from '../interface/IconProps';
+
+export const BasicIcon: React.FC = ({ fill = 'currentColor', stroke = 'currentColor', size = 24, children }) => (
+
+
+
+
+);
+
diff --git a/src/components/icons/CalendarIcon.tsx b/src/components/icons/CalendarIcon.tsx
new file mode 100644
index 0000000..c5690d8
--- /dev/null
+++ b/src/components/icons/CalendarIcon.tsx
@@ -0,0 +1,16 @@
+
+import React from 'react';
+import IconProps from '../interface/IconProps';
+import { BasicIcon } from './BasicIcon';
+
+export const CalendarIcon: React.FC = ({ fill, stroke, size }) => (
+
+
+
+);
+
+export default CalendarIcon;
diff --git a/src/components/icons/LogoutIcon.tsx b/src/components/icons/LogoutIcon.tsx
new file mode 100644
index 0000000..93ff755
--- /dev/null
+++ b/src/components/icons/LogoutIcon.tsx
@@ -0,0 +1,16 @@
+
+import React from 'react';
+import IconProps from '../interface/IconProps';
+import { BasicIcon } from './BasicIcon';
+
+export const LogoutIcon: React.FC = ({ fill, stroke, size }) => (
+
+
+
+);
+
+export default LogoutIcon;
diff --git a/src/components/icons/SidebarArrowDownIcon.tsx b/src/components/icons/SidebarArrowDownIcon.tsx
new file mode 100644
index 0000000..db9be4e
--- /dev/null
+++ b/src/components/icons/SidebarArrowDownIcon.tsx
@@ -0,0 +1,12 @@
+
+import React from 'react';
+import IconProps from '../interface/IconProps';
+import { BasicIcon } from './BasicIcon';
+
+export const SidebarArrowDownIcon: React.FC = ({ fill, stroke, size }) => (
+
+
+
+);
+
+export default SidebarArrowDownIcon;
diff --git a/src/components/icons/SidebarArrowRightIcon.tsx b/src/components/icons/SidebarArrowRightIcon.tsx
new file mode 100644
index 0000000..dddd725
--- /dev/null
+++ b/src/components/icons/SidebarArrowRightIcon.tsx
@@ -0,0 +1,12 @@
+
+import React from 'react';
+import IconProps from '../interface/IconProps';
+import { BasicIcon } from './BasicIcon';
+
+export const SidebarArrowRightIcon: React.FC = ({ fill, stroke, size }) => (
+
+
+
+);
+
+export default SidebarArrowRightIcon;
diff --git a/src/components/index.ts b/src/components/index.ts
new file mode 100644
index 0000000..685bf76
--- /dev/null
+++ b/src/components/index.ts
@@ -0,0 +1,13 @@
+// Common Components
+export { Center } from './Common/Center';
+export { Button } from './Common/customButton';
+export { HStack } from './Common/HStack';
+export { Image } from './Common/Image';
+export { VStack } from './Common/VStack';
+export { Header } from './Header';
+// Icons
+export { CalendarIcon } from './icons/CalendarIcon';
+export { LogoutIcon } from './icons/LogoutIcon';
+export { SidebarArrowDownIcon } from './icons/SidebarArrowDownIcon';
+export { SidebarArrowRightIcon } from './icons/SidebarArrowRightIcon';
+
diff --git a/src/components/interface/ButtonProps.tsx b/src/components/interface/ButtonProps.tsx
new file mode 100644
index 0000000..e5432ec
--- /dev/null
+++ b/src/components/interface/ButtonProps.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+interface ButtonProps extends React.ButtonHTMLAttributes {
+ children: React.ReactNode;
+ type?: 'submit' | 'reset' | 'button';
+ className?: string;
+}
+
+export default ButtonProps;
\ No newline at end of file
diff --git a/src/components/interface/ChildrenProps.tsx b/src/components/interface/ChildrenProps.tsx
new file mode 100644
index 0000000..5475827
--- /dev/null
+++ b/src/components/interface/ChildrenProps.tsx
@@ -0,0 +1,7 @@
+import { ReactNode } from 'react';
+
+interface ChildrenProps extends React.HTMLAttributes {
+ children: ReactNode;
+ className?: string;
+
+}export default ChildrenProps;
\ No newline at end of file
diff --git a/src/components/interface/IconProps.tsx b/src/components/interface/IconProps.tsx
new file mode 100644
index 0000000..ca26a1c
--- /dev/null
+++ b/src/components/interface/IconProps.tsx
@@ -0,0 +1,7 @@
+interface IconProps {
+ fill?: string | 'currentColor' | 'none';
+ stroke?: string;
+ size?: number;
+}
+
+export default IconProps;
\ No newline at end of file
diff --git a/src/components/interface/ImageProps.tsx b/src/components/interface/ImageProps.tsx
new file mode 100644
index 0000000..35e4bcb
--- /dev/null
+++ b/src/components/interface/ImageProps.tsx
@@ -0,0 +1,10 @@
+import React from 'react';
+
+interface ImageProps extends React.ButtonHTMLAttributes {
+ children: React.ReactNode;
+ className?: string;
+ src?: string;
+ alt?: string;
+}
+
+export default ImageProps;
\ No newline at end of file
diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts
index d6f301d..e4b276f 100644
--- a/src/routeTree.gen.ts
+++ b/src/routeTree.gen.ts
@@ -12,7 +12,13 @@
import { Route as rootRoute } from './routes/__root'
import { Route as LoginImport } from './routes/login'
+import { Route as IndexImport } from './routes/index'
+import { Route as SalesIndexImport } from './routes/sales/index'
+import { Route as MapIndexImport } from './routes/map/index'
import { Route as EventsIndexImport } from './routes/events/index'
+import { Route as DinnerIndexImport } from './routes/dinner/index'
+import { Route as CalendarIndexImport } from './routes/calendar/index'
+import { Route as HomeInfoCardImport } from './routes/home/infoCard'
import { Route as EventsCreateImport } from './routes/events/create'
import { Route as EventsEventIdImport } from './routes/events/$eventId'
@@ -23,11 +29,41 @@ const LoginRoute = LoginImport.update({
getParentRoute: () => rootRoute,
} as any)
+const IndexRoute = IndexImport.update({
+ path: '/',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const SalesIndexRoute = SalesIndexImport.update({
+ path: '/sales/',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const MapIndexRoute = MapIndexImport.update({
+ path: '/map/',
+ getParentRoute: () => rootRoute,
+} as any)
+
const EventsIndexRoute = EventsIndexImport.update({
path: '/events/',
getParentRoute: () => rootRoute,
} as any)
+const DinnerIndexRoute = DinnerIndexImport.update({
+ path: '/dinner/',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const CalendarIndexRoute = CalendarIndexImport.update({
+ path: '/calendar/',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const HomeInfoCardRoute = HomeInfoCardImport.update({
+ path: '/home/infoCard',
+ getParentRoute: () => rootRoute,
+} as any)
+
const EventsCreateRoute = EventsCreateImport.update({
path: '/events/create',
getParentRoute: () => rootRoute,
@@ -42,6 +78,13 @@ const EventsEventIdRoute = EventsEventIdImport.update({
declare module '@tanstack/react-router' {
interface FileRoutesByPath {
+ '/': {
+ id: '/'
+ path: '/'
+ fullPath: '/'
+ preLoaderRoute: typeof IndexImport
+ parentRoute: typeof rootRoute
+ }
'/login': {
id: '/login'
path: '/login'
@@ -63,6 +106,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof EventsCreateImport
parentRoute: typeof rootRoute
}
+ '/home/infoCard': {
+ id: '/home/infoCard'
+ path: '/home/infoCard'
+ fullPath: '/home/infoCard'
+ preLoaderRoute: typeof HomeInfoCardImport
+ parentRoute: typeof rootRoute
+ }
+ '/calendar/': {
+ id: '/calendar/'
+ path: '/calendar'
+ fullPath: '/calendar'
+ preLoaderRoute: typeof CalendarIndexImport
+ parentRoute: typeof rootRoute
+ }
+ '/dinner/': {
+ id: '/dinner/'
+ path: '/dinner'
+ fullPath: '/dinner'
+ preLoaderRoute: typeof DinnerIndexImport
+ parentRoute: typeof rootRoute
+ }
'/events/': {
id: '/events/'
path: '/events'
@@ -70,53 +134,129 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof EventsIndexImport
parentRoute: typeof rootRoute
}
+ '/map/': {
+ id: '/map/'
+ path: '/map'
+ fullPath: '/map'
+ preLoaderRoute: typeof MapIndexImport
+ parentRoute: typeof rootRoute
+ }
+ '/sales/': {
+ id: '/sales/'
+ path: '/sales'
+ fullPath: '/sales'
+ preLoaderRoute: typeof SalesIndexImport
+ parentRoute: typeof rootRoute
+ }
}
}
// Create and export the route tree
-interface FileRoutesByFullPath {
+export interface FileRoutesByFullPath {
+ '/': typeof IndexRoute
'/login': typeof LoginRoute
'/events/$eventId': typeof EventsEventIdRoute
'/events/create': typeof EventsCreateRoute
+ '/home/infoCard': typeof HomeInfoCardRoute
+ '/calendar': typeof CalendarIndexRoute
+ '/dinner': typeof DinnerIndexRoute
'/events': typeof EventsIndexRoute
+ '/map': typeof MapIndexRoute
+ '/sales': typeof SalesIndexRoute
}
-interface FileRoutesByTo {
+export interface FileRoutesByTo {
+ '/': typeof IndexRoute
'/login': typeof LoginRoute
'/events/$eventId': typeof EventsEventIdRoute
'/events/create': typeof EventsCreateRoute
+ '/home/infoCard': typeof HomeInfoCardRoute
+ '/calendar': typeof CalendarIndexRoute
+ '/dinner': typeof DinnerIndexRoute
'/events': typeof EventsIndexRoute
+ '/map': typeof MapIndexRoute
+ '/sales': typeof SalesIndexRoute
}
-interface FileRoutesById {
+export interface FileRoutesById {
+ __root__: typeof rootRoute
+ '/': typeof IndexRoute
'/login': typeof LoginRoute
'/events/$eventId': typeof EventsEventIdRoute
'/events/create': typeof EventsCreateRoute
+ '/home/infoCard': typeof HomeInfoCardRoute
+ '/calendar/': typeof CalendarIndexRoute
+ '/dinner/': typeof DinnerIndexRoute
'/events/': typeof EventsIndexRoute
+ '/map/': typeof MapIndexRoute
+ '/sales/': typeof SalesIndexRoute
}
-interface FileRouteTypes {
+export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
- fullPaths: '/login' | '/events/$eventId' | '/events/create' | '/events'
+ fullPaths:
+ | '/'
+ | '/login'
+ | '/events/$eventId'
+ | '/events/create'
+ | '/home/infoCard'
+ | '/calendar'
+ | '/dinner'
+ | '/events'
+ | '/map'
+ | '/sales'
fileRoutesByTo: FileRoutesByTo
- to: '/login' | '/events/$eventId' | '/events/create' | '/events'
- id: '/login' | '/events/$eventId' | '/events/create' | '/events/'
+ to:
+ | '/'
+ | '/login'
+ | '/events/$eventId'
+ | '/events/create'
+ | '/home/infoCard'
+ | '/calendar'
+ | '/dinner'
+ | '/events'
+ | '/map'
+ | '/sales'
+ id:
+ | '__root__'
+ | '/'
+ | '/login'
+ | '/events/$eventId'
+ | '/events/create'
+ | '/home/infoCard'
+ | '/calendar/'
+ | '/dinner/'
+ | '/events/'
+ | '/map/'
+ | '/sales/'
fileRoutesById: FileRoutesById
}
-interface RootRouteChildren {
+export interface RootRouteChildren {
+ IndexRoute: typeof IndexRoute
LoginRoute: typeof LoginRoute
EventsEventIdRoute: typeof EventsEventIdRoute
EventsCreateRoute: typeof EventsCreateRoute
+ HomeInfoCardRoute: typeof HomeInfoCardRoute
+ CalendarIndexRoute: typeof CalendarIndexRoute
+ DinnerIndexRoute: typeof DinnerIndexRoute
EventsIndexRoute: typeof EventsIndexRoute
+ MapIndexRoute: typeof MapIndexRoute
+ SalesIndexRoute: typeof SalesIndexRoute
}
const rootRouteChildren: RootRouteChildren = {
+ IndexRoute: IndexRoute,
LoginRoute: LoginRoute,
EventsEventIdRoute: EventsEventIdRoute,
EventsCreateRoute: EventsCreateRoute,
+ HomeInfoCardRoute: HomeInfoCardRoute,
+ CalendarIndexRoute: CalendarIndexRoute,
+ DinnerIndexRoute: DinnerIndexRoute,
EventsIndexRoute: EventsIndexRoute,
+ MapIndexRoute: MapIndexRoute,
+ SalesIndexRoute: SalesIndexRoute,
}
export const routeTree = rootRoute
@@ -131,12 +271,21 @@ export const routeTree = rootRoute
"__root__": {
"filePath": "__root.tsx",
"children": [
+ "/",
"/login",
"/events/$eventId",
"/events/create",
- "/events/"
+ "/home/infoCard",
+ "/calendar/",
+ "/dinner/",
+ "/events/",
+ "/map/",
+ "/sales/"
]
},
+ "/": {
+ "filePath": "index.tsx"
+ },
"/login": {
"filePath": "login.tsx"
},
@@ -146,8 +295,23 @@ export const routeTree = rootRoute
"/events/create": {
"filePath": "events/create.tsx"
},
+ "/home/infoCard": {
+ "filePath": "home/infoCard.tsx"
+ },
+ "/calendar/": {
+ "filePath": "calendar/index.tsx"
+ },
+ "/dinner/": {
+ "filePath": "dinner/index.tsx"
+ },
"/events/": {
"filePath": "events/index.tsx"
+ },
+ "/map/": {
+ "filePath": "map/index.tsx"
+ },
+ "/sales/": {
+ "filePath": "sales/index.tsx"
}
}
}
diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx
index 1fae538..2925ffc 100644
--- a/src/routes/__root.tsx
+++ b/src/routes/__root.tsx
@@ -1,18 +1,13 @@
-import { createRootRoute, Link, Outlet } from '@tanstack/react-router'
+import { createRootRoute, Outlet } from '@tanstack/react-router';
export const Route = createRootRoute({
- component: () => (
+ component: RootComponent,
+})
+
+function RootComponent() {
+ return (
<>
-
-
- NCU App
-
-
- Events
-
-
-
- >
- ),
-})
+ >
+ )
+}
diff --git a/src/routes/calendar/index.tsx b/src/routes/calendar/index.tsx
new file mode 100644
index 0000000..2466418
--- /dev/null
+++ b/src/routes/calendar/index.tsx
@@ -0,0 +1,17 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { Header } from '../../components'
+import { AuthGuard } from '../../utils/auth'
+
+export const Route = createFileRoute('/calendar/')({
+ beforeLoad: AuthGuard,
+ component: CalendarIndex,
+})
+
+function CalendarIndex() {
+ return (
+ <>
+
+ Hello /calendar/!
+ >
+ )
+}
diff --git a/src/routes/dinner/index.tsx b/src/routes/dinner/index.tsx
new file mode 100644
index 0000000..bc2512b
--- /dev/null
+++ b/src/routes/dinner/index.tsx
@@ -0,0 +1,17 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { Header } from '../../components'
+import { AuthGuard } from '../../utils/auth'
+
+export const Route = createFileRoute('/dinner/')({
+ beforeLoad: AuthGuard,
+ component: DinnerIndex,
+})
+
+function DinnerIndex() {
+ return (
+ <>
+
+ Hello /dinner/!
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/routes/events/create.tsx b/src/routes/events/create.tsx
index 8771014..0fa6ae3 100644
--- a/src/routes/events/create.tsx
+++ b/src/routes/events/create.tsx
@@ -1,6 +1,6 @@
import { createFileRoute, Link } from '@tanstack/react-router';
import { ChangeEvent, FormEvent, useEffect, useState } from 'react';
-import { Button } from '../../components/Button';
+import { Button } from '../../components/Common/customButton';
import { UserController } from '../../controllers/user';
import { AuthGuard } from '../../utils/auth';
import { supabase } from '../../utils/supabase';
diff --git a/src/routes/events/index.tsx b/src/routes/events/index.tsx
index 2b665fa..3f70e4a 100644
--- a/src/routes/events/index.tsx
+++ b/src/routes/events/index.tsx
@@ -1,4 +1,6 @@
import { createFileRoute, Link } from '@tanstack/react-router';
+import { Header } from '../../components';
+import { AuthGuard } from '../../utils/auth';
import { supabase } from '../../utils/supabase';
const styles = {
@@ -9,6 +11,7 @@ const styles = {
};
export const Route = createFileRoute('/events/')({
+ beforeLoad: AuthGuard,
loader: async () => {
const { data, error } = await supabase
.from('events')
@@ -26,13 +29,16 @@ export const Route = createFileRoute('/events/')({
function EventIndex() {
const { events } = Route.useLoaderData()
return (
-
-
活動列表
- {
- events.map((event) => (
- {event.name}
- ))
- }
-
+ <>
+
+
+
活動列表
+ {
+ events.map((event) => (
+ {event.name}
+ ))
+ }
+
+ >
)
}
diff --git a/src/routes/home/infoCard.tsx b/src/routes/home/infoCard.tsx
new file mode 100644
index 0000000..322d4ab
--- /dev/null
+++ b/src/routes/home/infoCard.tsx
@@ -0,0 +1,5 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/home/infoCard')({
+ component: () => Hello /home/infoCard!
+})
\ No newline at end of file
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
new file mode 100644
index 0000000..c5b9bc5
--- /dev/null
+++ b/src/routes/index.tsx
@@ -0,0 +1,51 @@
+import { createFileRoute, Link } from '@tanstack/react-router';
+import { Header } from '../components';
+import { AuthGuard } from '../utils/auth';
+import { supabase } from '../utils/supabase';
+
+const styles = {
+ container: {
+ flex: 1,
+ backgroundColor: '#ffffff',
+ },
+};
+
+export const Route = createFileRoute('/')({
+ beforeLoad: AuthGuard,
+ loader: async () => {
+ const userId = (await supabase.auth.getUser()).data?.user?.id
+ if (!userId) {
+ throw new Error('User ID is undefined')
+ }
+ const { data, error } = await supabase
+ .from('members')
+ .select(`*, identities ( identity_no, identity_name )`)
+ .eq('uuid', userId)
+
+
+ if (error !== null) {
+ throw error
+ }
+
+ return { user: data }
+ },
+ component: HomeIndex
+})
+
+function HomeIndex() {
+ const { user } = Route.useLoaderData()
+ return (
+ <>
+
+
+
+
+
Name: {user[0].name}
+ Badge: {user[0].identities?.identity_name}
+
+
+
Go to /home/infoCard
+
+ >
+ )
+}
diff --git a/src/routes/login.tsx b/src/routes/login.tsx
index a03661d..f30a8c4 100644
--- a/src/routes/login.tsx
+++ b/src/routes/login.tsx
@@ -1,5 +1,6 @@
import { createFileRoute } from '@tanstack/react-router'
import { useState } from 'react'
+import { VStack } from '../components'
import { supabase } from '../utils/supabase'
export const Route = createFileRoute('/login')({
@@ -33,10 +34,16 @@ function LoginPage() {
return (
)
diff --git a/src/routes/map/index.tsx b/src/routes/map/index.tsx
new file mode 100644
index 0000000..c8d9802
--- /dev/null
+++ b/src/routes/map/index.tsx
@@ -0,0 +1,17 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { Header } from '../../components'
+import { AuthGuard } from '../../utils/auth'
+
+export const Route = createFileRoute('/map/')({
+ beforeLoad: AuthGuard,
+ component: MapIndex,
+})
+
+function MapIndex() {
+ return (
+ <>
+
+ Hello /map/!
+ >
+ )
+}
diff --git a/src/routes/sales/index.tsx b/src/routes/sales/index.tsx
new file mode 100644
index 0000000..507772a
--- /dev/null
+++ b/src/routes/sales/index.tsx
@@ -0,0 +1,17 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { Header } from '../../components'
+import { AuthGuard } from '../../utils/auth'
+
+export const Route = createFileRoute('/sales/')({
+ beforeLoad: AuthGuard,
+ component: SalesIndex,
+})
+
+function SalesIndex() {
+ return (
+ <>
+
+ Hello /sales/!
+ >
+ )
+}
diff --git a/src/utils/database.types.ts b/src/utils/database.types.ts
index fb4cc72..c199ae4 100644
--- a/src/utils/database.types.ts
+++ b/src/utils/database.types.ts
@@ -34,6 +34,21 @@ export type Database = {
}
public: {
Tables: {
+ event_type: {
+ Row: {
+ type_id: number
+ type_name: string | null
+ }
+ Insert: {
+ type_id?: number
+ type_name?: string | null
+ }
+ Update: {
+ type_id?: number
+ type_name?: string | null
+ }
+ Relationships: []
+ }
events: {
Row: {
created_at: string
@@ -43,6 +58,7 @@ export type Database = {
id: number
name: string | null
start_time: string | null
+ type: number | null
user_id: string
}
Insert: {
@@ -53,6 +69,7 @@ export type Database = {
id?: number
name?: string | null
start_time?: string | null
+ type?: number | null
user_id: string
}
Update: {
@@ -63,9 +80,17 @@ export type Database = {
id?: number
name?: string | null
start_time?: string | null
+ type?: number | null
user_id?: string
}
Relationships: [
+ {
+ foreignKeyName: "events_type_fkey"
+ columns: ["type"]
+ isOneToOne: false
+ referencedRelation: "event_type"
+ referencedColumns: ["type_id"]
+ },
{
foreignKeyName: "events_user_id_fkey"
columns: ["user_id"]
@@ -75,6 +100,66 @@ export type Database = {
},
]
}
+ identities: {
+ Row: {
+ identity_name: string
+ identity_no: number
+ }
+ Insert: {
+ identity_name?: string
+ identity_no?: number
+ }
+ Update: {
+ identity_name?: string
+ identity_no?: number
+ }
+ Relationships: []
+ }
+ members: {
+ Row: {
+ avatar: string
+ created_at: string
+ fk_email: string
+ fk_identity: number
+ grad_time: string | null
+ name: string
+ uuid: string
+ }
+ Insert: {
+ avatar?: string
+ created_at?: string
+ fk_email?: string
+ fk_identity?: number
+ grad_time?: string | null
+ name: string
+ uuid?: string
+ }
+ Update: {
+ avatar?: string
+ created_at?: string
+ fk_email?: string
+ fk_identity?: number
+ grad_time?: string | null
+ name?: string
+ uuid?: string
+ }
+ Relationships: [
+ {
+ foreignKeyName: "members_fk_identity_fkey"
+ columns: ["fk_identity"]
+ isOneToOne: false
+ referencedRelation: "identities"
+ referencedColumns: ["identity_no"]
+ },
+ {
+ foreignKeyName: "members_uuid_fkey"
+ columns: ["uuid"]
+ isOneToOne: true
+ referencedRelation: "users"
+ referencedColumns: ["id"]
+ },
+ ]
+ }
sales: {
Row: {
created_at: string
diff --git a/supabase/migrations/20241002170227_remote_schema.sql b/supabase/migrations/20241002170227_remote_schema.sql
new file mode 100644
index 0000000..a9ba594
--- /dev/null
+++ b/supabase/migrations/20241002170227_remote_schema.sql
@@ -0,0 +1,223 @@
+create table "public"."event_type" (
+ "type_id" smallint generated by default as identity not null,
+ "type_name" text
+);
+
+
+alter table "public"."event_type" enable row level security;
+
+create table "public"."identities" (
+ "identity_no" integer generated by default as identity not null,
+ "identity_name" text not null default 'other'::text
+);
+
+
+alter table "public"."identities" enable row level security;
+
+create table "public"."members" (
+ "uuid" uuid not null default auth.uid(),
+ "created_at" timestamp with time zone not null default now(),
+ "name" character varying not null,
+ "fk_email" character varying not null default 'auth.users.email'::character varying,
+ "fk_identity" integer not null default 5,
+ "grad_time" date,
+ "avatar" character varying not null default 'http://127.0.0.1:54321/storage/v1/object/public/avatar/defaultAvatar.webp?t=2024-10-02T15%3A40%3A27.045Z'::character varying
+);
+
+
+alter table "public"."members" enable row level security;
+
+alter table "public"."events" add column "type" smallint default '7'::smallint;
+
+CREATE UNIQUE INDEX event_type_pkey ON public.event_type USING btree (type_id);
+
+CREATE UNIQUE INDEX identities_pkey ON public.identities USING btree (identity_no);
+
+CREATE UNIQUE INDEX members_pkey ON public.members USING btree (uuid);
+
+alter table "public"."event_type" add constraint "event_type_pkey" PRIMARY KEY using index "event_type_pkey";
+
+alter table "public"."identities" add constraint "identities_pkey" PRIMARY KEY using index "identities_pkey";
+
+alter table "public"."members" add constraint "members_pkey" PRIMARY KEY using index "members_pkey";
+
+alter table "public"."events" add constraint "events_type_fkey" FOREIGN KEY (type) REFERENCES event_type(type_id) ON UPDATE CASCADE not valid;
+
+alter table "public"."events" validate constraint "events_type_fkey";
+
+alter table "public"."members" add constraint "members_fk_identity_fkey" FOREIGN KEY (fk_identity) REFERENCES identities(identity_no) ON UPDATE CASCADE not valid;
+
+alter table "public"."members" validate constraint "members_fk_identity_fkey";
+
+alter table "public"."members" add constraint "members_uuid_fkey" FOREIGN KEY (uuid) REFERENCES auth.users(id) ON UPDATE CASCADE not valid;
+
+alter table "public"."members" validate constraint "members_uuid_fkey";
+
+grant delete on table "public"."event_type" to "anon";
+
+grant insert on table "public"."event_type" to "anon";
+
+grant references on table "public"."event_type" to "anon";
+
+grant select on table "public"."event_type" to "anon";
+
+grant trigger on table "public"."event_type" to "anon";
+
+grant truncate on table "public"."event_type" to "anon";
+
+grant update on table "public"."event_type" to "anon";
+
+grant delete on table "public"."event_type" to "authenticated";
+
+grant insert on table "public"."event_type" to "authenticated";
+
+grant references on table "public"."event_type" to "authenticated";
+
+grant select on table "public"."event_type" to "authenticated";
+
+grant trigger on table "public"."event_type" to "authenticated";
+
+grant truncate on table "public"."event_type" to "authenticated";
+
+grant update on table "public"."event_type" to "authenticated";
+
+grant delete on table "public"."event_type" to "service_role";
+
+grant insert on table "public"."event_type" to "service_role";
+
+grant references on table "public"."event_type" to "service_role";
+
+grant select on table "public"."event_type" to "service_role";
+
+grant trigger on table "public"."event_type" to "service_role";
+
+grant truncate on table "public"."event_type" to "service_role";
+
+grant update on table "public"."event_type" to "service_role";
+
+grant delete on table "public"."identities" to "anon";
+
+grant insert on table "public"."identities" to "anon";
+
+grant references on table "public"."identities" to "anon";
+
+grant select on table "public"."identities" to "anon";
+
+grant trigger on table "public"."identities" to "anon";
+
+grant truncate on table "public"."identities" to "anon";
+
+grant update on table "public"."identities" to "anon";
+
+grant delete on table "public"."identities" to "authenticated";
+
+grant insert on table "public"."identities" to "authenticated";
+
+grant references on table "public"."identities" to "authenticated";
+
+grant select on table "public"."identities" to "authenticated";
+
+grant trigger on table "public"."identities" to "authenticated";
+
+grant truncate on table "public"."identities" to "authenticated";
+
+grant update on table "public"."identities" to "authenticated";
+
+grant delete on table "public"."identities" to "service_role";
+
+grant insert on table "public"."identities" to "service_role";
+
+grant references on table "public"."identities" to "service_role";
+
+grant select on table "public"."identities" to "service_role";
+
+grant trigger on table "public"."identities" to "service_role";
+
+grant truncate on table "public"."identities" to "service_role";
+
+grant update on table "public"."identities" to "service_role";
+
+grant delete on table "public"."members" to "anon";
+
+grant insert on table "public"."members" to "anon";
+
+grant references on table "public"."members" to "anon";
+
+grant select on table "public"."members" to "anon";
+
+grant trigger on table "public"."members" to "anon";
+
+grant truncate on table "public"."members" to "anon";
+
+grant update on table "public"."members" to "anon";
+
+grant delete on table "public"."members" to "authenticated";
+
+grant insert on table "public"."members" to "authenticated";
+
+grant references on table "public"."members" to "authenticated";
+
+grant select on table "public"."members" to "authenticated";
+
+grant trigger on table "public"."members" to "authenticated";
+
+grant truncate on table "public"."members" to "authenticated";
+
+grant update on table "public"."members" to "authenticated";
+
+grant delete on table "public"."members" to "service_role";
+
+grant insert on table "public"."members" to "service_role";
+
+grant references on table "public"."members" to "service_role";
+
+grant select on table "public"."members" to "service_role";
+
+grant trigger on table "public"."members" to "service_role";
+
+grant truncate on table "public"."members" to "service_role";
+
+grant update on table "public"."members" to "service_role";
+
+create policy "Enable read access for all users"
+on "public"."identities"
+as permissive
+for select
+to public
+using (true);
+
+
+create policy "Enable delete for users based on user_id"
+on "public"."members"
+as permissive
+for delete
+to authenticated
+using ((( SELECT auth.uid() AS uid) = uuid));
+
+
+create policy "Enable insert for users based on user_id"
+on "public"."members"
+as permissive
+for insert
+to authenticated
+with check ((( SELECT auth.uid() AS uid) = uuid));
+
+
+create policy "Enable read access for authenticated users only"
+on "public"."members"
+as permissive
+for select
+to authenticated
+using (true);
+
+
+create policy "Enable update for users based on user_id"
+on "public"."members"
+as permissive
+for update
+to authenticated
+using ((( SELECT auth.uid() AS uid) = uuid))
+with check ((( SELECT auth.uid() AS uid) = uuid));
+
+
+
diff --git a/supabase/seed.sql b/supabase/seed.sql
index e69de29..bc98eea 100644
--- a/supabase/seed.sql
+++ b/supabase/seed.sql
@@ -0,0 +1,287 @@
+SET session_replication_role = replica;
+
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 15.1 (Ubuntu 15.1-1.pgdg20.04+1)
+-- Dumped by pg_dump version 15.7 (Ubuntu 15.7-1.pgdg20.04+1)
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- Data for Name: audit_log_entries; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+INSERT INTO "auth"."audit_log_entries" ("instance_id", "id", "payload", "created_at", "ip_address") VALUES
+ ('00000000-0000-0000-0000-000000000000', 'deb1ed76-8824-41db-b828-41df13f8ab00', '{"action":"user_signedup","actor_id":"00000000-0000-0000-0000-000000000000","actor_username":"service_role","actor_via_sso":false,"log_type":"team","traits":{"user_email":"ncuapp@test.com","user_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","user_phone":""}}', '2024-10-02 10:35:35.562773+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'ed403553-8154-4688-8502-daea6f1ca73c', '{"action":"login","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-10-02 10:36:09.936352+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '95d16bac-bd07-4916-aebb-6a5625dab9f6', '{"action":"token_refreshed","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 11:50:58.301333+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'cdb2a32e-8c07-4330-b919-58353546b459', '{"action":"token_revoked","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 11:50:58.301792+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'b280f568-e5b8-48a8-b0e7-14df55570569', '{"action":"token_refreshed","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 13:03:21.672306+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '6e7d43fe-397b-4d1a-9342-0757d889bfff', '{"action":"token_revoked","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 13:03:21.672995+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '29566b6d-cb57-4800-96cd-694d89718dc3', '{"action":"token_refreshed","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 14:03:23.417122+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '8af4ff22-3ef3-460a-b4f4-79ad58377be4', '{"action":"token_revoked","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 14:03:23.417642+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'a58c98ac-8669-4626-a9ba-5c1fd7044f50', '{"action":"token_refreshed","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 15:03:38.959391+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'c8ca0a1d-6ead-4b58-94a9-db845a2bd529', '{"action":"token_revoked","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"token"}', '2024-10-02 15:03:38.960108+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '0a429f97-071a-4d76-95e1-6f1d3f20f8c1', '{"action":"logout","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account"}', '2024-10-02 15:56:28.490475+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '72696d50-841d-462f-97d1-b776c12af0a3', '{"action":"login","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-10-02 16:09:29.251602+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '1265bb43-f5c7-4c1a-93c6-fce33fe5f1c1', '{"action":"login","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-10-02 16:15:37.46596+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'ec161169-c89e-4b05-b901-67ee71294a17', '{"action":"logout","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account"}', '2024-10-02 16:19:38.156323+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '22bd8fc1-ee1f-4209-a3ea-0ece49776bd7', '{"action":"login","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-10-02 16:41:03.776042+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '6582ebf9-2681-4279-b240-6372ea52b165', '{"action":"logout","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account"}', '2024-10-02 16:41:17.933011+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'b22254f7-aad1-4323-8015-a2faa18fec0e', '{"action":"login","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-10-02 16:46:25.927847+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'a9594d72-c937-46cc-bd8a-1e2aee05a476', '{"action":"logout","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account"}', '2024-10-02 16:46:32.72011+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '21974e0b-1b76-4f17-8f50-d6a1b7b3a8b2', '{"action":"login","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-10-02 16:48:05.392616+00', ''),
+ ('00000000-0000-0000-0000-000000000000', 'adf3345c-0207-4bd4-95ed-936f5944ad6c', '{"action":"logout","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account"}', '2024-10-02 16:48:08.153584+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '699045ab-841f-4766-a53b-1dd0fe9042e8', '{"action":"login","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-10-02 16:48:17.708698+00', ''),
+ ('00000000-0000-0000-0000-000000000000', '51b875b1-286f-44f2-b0ce-aba59c4beb21', '{"action":"logout","actor_id":"c7e80cb0-7d3d-411f-9983-5e3addf62980","actor_username":"ncuapp@test.com","actor_via_sso":false,"log_type":"account"}', '2024-10-02 16:49:39.293615+00', '');
+
+
+--
+-- Data for Name: flow_state; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: users; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+INSERT INTO "auth"."users" ("instance_id", "id", "aud", "role", "email", "encrypted_password", "email_confirmed_at", "invited_at", "confirmation_token", "confirmation_sent_at", "recovery_token", "recovery_sent_at", "email_change_token_new", "email_change", "email_change_sent_at", "last_sign_in_at", "raw_app_meta_data", "raw_user_meta_data", "is_super_admin", "created_at", "updated_at", "phone", "phone_confirmed_at", "phone_change", "phone_change_token", "phone_change_sent_at", "email_change_token_current", "email_change_confirm_status", "banned_until", "reauthentication_token", "reauthentication_sent_at", "is_sso_user", "deleted_at", "is_anonymous") VALUES
+ ('00000000-0000-0000-0000-000000000000', 'c7e80cb0-7d3d-411f-9983-5e3addf62980', 'authenticated', 'authenticated', 'ncuapp@test.com', '$2a$10$Y3OTXkqoLAgYrjGpEeMKLOuMnrYWwvLTRdqXwgRO9npX50TD8Ku32', '2024-10-02 10:35:35.563744+00', NULL, '', NULL, '', NULL, '', '', NULL, '2024-10-02 16:48:17.709158+00', '{"provider": "email", "providers": ["email"]}', '{}', NULL, '2024-10-02 10:35:35.560964+00', '2024-10-02 16:48:17.710194+00', NULL, NULL, '', '', NULL, '', 0, NULL, '', NULL, false, NULL, false);
+
+
+--
+-- Data for Name: identities; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+INSERT INTO "auth"."identities" ("provider_id", "user_id", "identity_data", "provider", "last_sign_in_at", "created_at", "updated_at", "id") VALUES
+ ('c7e80cb0-7d3d-411f-9983-5e3addf62980', 'c7e80cb0-7d3d-411f-9983-5e3addf62980', '{"sub": "c7e80cb0-7d3d-411f-9983-5e3addf62980", "email": "ncuapp@test.com", "email_verified": false, "phone_verified": false}', 'email', '2024-10-02 10:35:35.562128+00', '2024-10-02 10:35:35.562151+00', '2024-10-02 10:35:35.562151+00', 'e9c1a1d6-f840-4461-8694-30e39456b383');
+
+
+--
+-- Data for Name: instances; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: sessions; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: mfa_amr_claims; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: mfa_factors; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: mfa_challenges; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: one_time_tokens; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: refresh_tokens; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: sso_providers; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: saml_providers; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: saml_relay_states; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: sso_domains; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
+--
+
+
+
+--
+-- Data for Name: key; Type: TABLE DATA; Schema: pgsodium; Owner: supabase_admin
+--
+
+
+
+--
+-- Data for Name: event_type; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+INSERT INTO "public"."event_type" ("type_id", "type_name") VALUES
+ (1, '揪人共乘'),
+ (2, '揪人運動'),
+ (3, '揪人遊戲'),
+ (4, '揪人其他'),
+ (5, '校園活動'),
+ (6, '社團活動'),
+ (7, '系上活動'),
+ (8, '活動其他');
+
+
+--
+-- Data for Name: events; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+INSERT INTO "public"."events" ("id", "name", "description", "start_time", "end_time", "fee", "created_at", "user_id", "type") VALUES
+ (1, 'ncu app recruiting', '', NULL, NULL, 0, '2024-10-02 10:38:22+00', 'c7e80cb0-7d3d-411f-9983-5e3addf62980', 4);
+
+
+--
+-- Data for Name: identities; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+INSERT INTO "public"."identities" ("identity_no", "identity_name") VALUES
+ (2, 'Student'),
+ (3, 'Alumni'),
+ (4, 'School'),
+ (5, 'Others'),
+ (1, 'Dev Team');
+
+
+--
+-- Data for Name: members; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+INSERT INTO "public"."members" ("uuid", "created_at", "name", "fk_email", "fk_identity", "grad_time", "avatar") VALUES
+ ('c7e80cb0-7d3d-411f-9983-5e3addf62980', '2024-10-02 10:35:46+00', 'NCU APP', 'ncuapp@test.com', 1, NULL, 'http://127.0.0.1:54321/storage/v1/object/public/avatar/logo.png?t=2024-10-02T15%3A39%3A22.509Z');
+
+
+--
+-- Data for Name: sales; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+
+
+--
+-- Data for Name: buckets; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
+--
+
+INSERT INTO "storage"."buckets" ("id", "name", "owner", "created_at", "updated_at", "public", "avif_autodetection", "file_size_limit", "allowed_mime_types", "owner_id") VALUES
+ ('avatar', 'avatar', NULL, '2024-10-02 15:39:08.478744+00', '2024-10-02 15:39:08.478744+00', true, false, NULL, NULL, NULL);
+
+
+--
+-- Data for Name: objects; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
+--
+
+INSERT INTO "storage"."objects" ("id", "bucket_id", "name", "owner", "created_at", "updated_at", "last_accessed_at", "metadata", "version", "owner_id", "user_metadata") VALUES
+ ('b452bfa8-6013-446a-a36f-8676914257c0', 'avatar', 'logo.png', NULL, '2024-10-02 15:39:19.235608+00', '2024-10-02 15:39:19.235608+00', '2024-10-02 15:39:19.235608+00', '{"eTag": "\"947cacbec2759960b0e6e5895e6d2d04\"", "size": 16858, "mimetype": "image/png", "cacheControl": "max-age=3600", "lastModified": "2024-10-02T15:39:19.226Z", "contentLength": 16858, "httpStatusCode": 200}', '89fd52da-ab3d-404c-bda5-e7233eb377f8', NULL, NULL),
+ ('e829e905-0433-47f2-a115-c420d2bfa770', 'avatar', 'defaultAvatar.webp', NULL, '2024-10-02 15:40:25.009052+00', '2024-10-02 15:40:25.009052+00', '2024-10-02 15:40:25.009052+00', '{"eTag": "\"0474dad9eb2752e87c90f18fa9529d93\"", "size": 18124, "mimetype": "image/webp", "cacheControl": "max-age=3600", "lastModified": "2024-10-02T15:40:25.005Z", "contentLength": 18124, "httpStatusCode": 200}', '8bebcc3d-4557-4d18-aa78-3f6f71a8eb31', NULL, NULL);
+
+
+--
+-- Data for Name: s3_multipart_uploads; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
+--
+
+
+
+--
+-- Data for Name: s3_multipart_uploads_parts; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
+--
+
+
+
+--
+-- Data for Name: hooks; Type: TABLE DATA; Schema: supabase_functions; Owner: supabase_functions_admin
+--
+
+
+
+--
+-- Data for Name: secrets; Type: TABLE DATA; Schema: vault; Owner: supabase_admin
+--
+
+
+
+--
+-- Name: refresh_tokens_id_seq; Type: SEQUENCE SET; Schema: auth; Owner: supabase_auth_admin
+--
+
+SELECT pg_catalog.setval('"auth"."refresh_tokens_id_seq"', 11, true);
+
+
+--
+-- Name: key_key_id_seq; Type: SEQUENCE SET; Schema: pgsodium; Owner: supabase_admin
+--
+
+SELECT pg_catalog.setval('"pgsodium"."key_key_id_seq"', 1, false);
+
+
+--
+-- Name: event_type_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('"public"."event_type_type_id_seq"', 1, false);
+
+
+--
+-- Name: events_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('"public"."events_id_seq"', 1, false);
+
+
+--
+-- Name: identities_identity_no_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('"public"."identities_identity_no_seq"', 1, false);
+
+
+--
+-- Name: sales_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('"public"."sales_id_seq"', 1, false);
+
+
+--
+-- Name: hooks_id_seq; Type: SEQUENCE SET; Schema: supabase_functions; Owner: supabase_functions_admin
+--
+
+SELECT pg_catalog.setval('"supabase_functions"."hooks_id_seq"', 1, false);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
+RESET ALL;
diff --git a/tailwind.config.js b/tailwind.config.js
index dca8ba0..989cfd0 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,4 +1,6 @@
/** @type {import('tailwindcss').Config} */
+import daisyui from 'daisyui'
+
export default {
content: [
"./index.html",
@@ -7,5 +9,7 @@ export default {
theme: {
extend: {},
},
- plugins: [],
+ plugins: [
+ daisyui,
+ ],
}