diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..319e41e
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+strict-peer-dependencies=false
diff --git a/client/public/IIS/iis_app1.png b/client/public/images/IIS/iis_app1.png
similarity index 100%
rename from client/public/IIS/iis_app1.png
rename to client/public/images/IIS/iis_app1.png
diff --git a/client/public/IIS/iis_app2.png b/client/public/images/IIS/iis_app2.png
similarity index 100%
rename from client/public/IIS/iis_app2.png
rename to client/public/images/IIS/iis_app2.png
diff --git a/client/public/IIS/iis_app3.png b/client/public/images/IIS/iis_app3.png
similarity index 100%
rename from client/public/IIS/iis_app3.png
rename to client/public/images/IIS/iis_app3.png
diff --git a/client/public/IIS/iis_app4.png b/client/public/images/IIS/iis_app4.png
similarity index 100%
rename from client/public/IIS/iis_app4.png
rename to client/public/images/IIS/iis_app4.png
diff --git a/client/public/IIS/iis_app5.png b/client/public/images/IIS/iis_app5.png
similarity index 100%
rename from client/public/IIS/iis_app5.png
rename to client/public/images/IIS/iis_app5.png
diff --git a/client/public/IIS/iis_app6.png b/client/public/images/IIS/iis_app6.png
similarity index 100%
rename from client/public/IIS/iis_app6.png
rename to client/public/images/IIS/iis_app6.png
diff --git a/client/public/IIS/iis_app7.png b/client/public/images/IIS/iis_app7.png
similarity index 100%
rename from client/public/IIS/iis_app7.png
rename to client/public/images/IIS/iis_app7.png
diff --git a/client/public/IIS/iis_app8.png b/client/public/images/IIS/iis_app8.png
similarity index 100%
rename from client/public/IIS/iis_app8.png
rename to client/public/images/IIS/iis_app8.png
diff --git a/client/public/favicon.ico b/client/public/images/favicon.ico
similarity index 100%
rename from client/public/favicon.ico
rename to client/public/images/favicon.ico
diff --git a/client/public/home/bypass.png b/client/public/images/home/bypass.png
similarity index 100%
rename from client/public/home/bypass.png
rename to client/public/images/home/bypass.png
diff --git a/client/public/logo.png b/client/public/images/logo.png
similarity index 100%
rename from client/public/logo.png
rename to client/public/images/logo.png
diff --git a/client/public/player/music.png b/client/public/images/player/music.png
similarity index 100%
rename from client/public/player/music.png
rename to client/public/images/player/music.png
diff --git a/client/public/player/pause.png b/client/public/images/player/pause.png
similarity index 100%
rename from client/public/player/pause.png
rename to client/public/images/player/pause.png
diff --git a/client/public/player/play.png b/client/public/images/player/play.png
similarity index 100%
rename from client/public/player/play.png
rename to client/public/images/player/play.png
diff --git a/client/public/player/skip-back.png b/client/public/images/player/skip-back.png
similarity index 100%
rename from client/public/player/skip-back.png
rename to client/public/images/player/skip-back.png
diff --git a/client/public/player/skip-forward.png b/client/public/images/player/skip-forward.png
similarity index 100%
rename from client/public/player/skip-forward.png
rename to client/public/images/player/skip-forward.png
diff --git a/client/public/vu/vu1.png b/client/public/images/vu/vu1.png
similarity index 100%
rename from client/public/vu/vu1.png
rename to client/public/images/vu/vu1.png
diff --git a/client/public/vu/vu10.png b/client/public/images/vu/vu10.png
similarity index 100%
rename from client/public/vu/vu10.png
rename to client/public/images/vu/vu10.png
diff --git a/client/public/vu/vu11.png b/client/public/images/vu/vu11.png
similarity index 100%
rename from client/public/vu/vu11.png
rename to client/public/images/vu/vu11.png
diff --git a/client/public/vu/vu12.png b/client/public/images/vu/vu12.png
similarity index 100%
rename from client/public/vu/vu12.png
rename to client/public/images/vu/vu12.png
diff --git a/client/public/vu/vu13.png b/client/public/images/vu/vu13.png
similarity index 100%
rename from client/public/vu/vu13.png
rename to client/public/images/vu/vu13.png
diff --git a/client/public/vu/vu14.png b/client/public/images/vu/vu14.png
similarity index 100%
rename from client/public/vu/vu14.png
rename to client/public/images/vu/vu14.png
diff --git a/client/public/vu/vu15.png b/client/public/images/vu/vu15.png
similarity index 100%
rename from client/public/vu/vu15.png
rename to client/public/images/vu/vu15.png
diff --git a/client/public/vu/vu16.png b/client/public/images/vu/vu16.png
similarity index 100%
rename from client/public/vu/vu16.png
rename to client/public/images/vu/vu16.png
diff --git a/client/public/vu/vu2.png b/client/public/images/vu/vu2.png
similarity index 100%
rename from client/public/vu/vu2.png
rename to client/public/images/vu/vu2.png
diff --git a/client/public/vu/vu3.png b/client/public/images/vu/vu3.png
similarity index 100%
rename from client/public/vu/vu3.png
rename to client/public/images/vu/vu3.png
diff --git a/client/public/vu/vu4.png b/client/public/images/vu/vu4.png
similarity index 100%
rename from client/public/vu/vu4.png
rename to client/public/images/vu/vu4.png
diff --git a/client/public/vu/vu5.png b/client/public/images/vu/vu5.png
similarity index 100%
rename from client/public/vu/vu5.png
rename to client/public/images/vu/vu5.png
diff --git a/client/public/vu/vu6.png b/client/public/images/vu/vu6.png
similarity index 100%
rename from client/public/vu/vu6.png
rename to client/public/images/vu/vu6.png
diff --git a/client/public/vu/vu7.png b/client/public/images/vu/vu7.png
similarity index 100%
rename from client/public/vu/vu7.png
rename to client/public/images/vu/vu7.png
diff --git a/client/public/vu/vu8.png b/client/public/images/vu/vu8.png
similarity index 100%
rename from client/public/vu/vu8.png
rename to client/public/images/vu/vu8.png
diff --git a/client/public/vu/vu9.png b/client/public/images/vu/vu9.png
similarity index 100%
rename from client/public/vu/vu9.png
rename to client/public/images/vu/vu9.png
diff --git a/client/src/pages/Home.tsx b/client/src/pages/Home.tsx
index 390313f..7b4bb2a 100644
--- a/client/src/pages/Home.tsx
+++ b/client/src/pages/Home.tsx
@@ -762,7 +762,7 @@ export default function Home() {
onClick={() => updateSetting({ bt_next: 0 })}
className="w-10 h-10 rounded-full flex items-center justify-center transition-all active:scale-95"
style={{ background: "rgba(0,255,246,0.15)", border: "1px solid rgba(0,255,246,0.3)" }}>
-
+
@@ -842,7 +842,7 @@ export default function Home() {
onClick={() => updateSetting({ dsp_enable: bypassOn ? 1 : 0 })}
>
}
label={homeText.vu ?? "VU表"}
value={vuLabel}
- thumbnail={`${import.meta.env.BASE_URL}vu/vu${(ds.vu ?? 0) + 1}.png`}
+ thumbnail={`${import.meta.env.BASE_URL}images/vu/vu${(ds.vu ?? 0) + 1}.png`}
onClick={() => setLocation("/vu")}
/>
;
const iisModeImageUrl = (index: number) =>
- `${import.meta.env.BASE_URL}IIS/iis_app${index + 1}.png`;
+ `${import.meta.env.BASE_URL}images/IIS/iis_app${index + 1}.png`;
/* ── Key → API field mapping ── */
const KEY_TO_SETTING: Record = {
diff --git a/client/src/pages/VUPage.tsx b/client/src/pages/VUPage.tsx
index e5d191f..772ca74 100644
--- a/client/src/pages/VUPage.tsx
+++ b/client/src/pages/VUPage.tsx
@@ -26,7 +26,7 @@ interface VUStyle {
const VU_STYLES: VUStyle[] = Array.from({ length: 16 }, (_, i) => ({
index: i,
name: `VU ${i + 1}`,
- preview: `${import.meta.env.BASE_URL}vu/vu${i + 1}.png`,
+ preview: `${import.meta.env.BASE_URL}images/vu/vu${i + 1}.png`,
}));
export default function VUPage() {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f87e361..90e8f0c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -110,9 +110,6 @@ importers:
embla-carousel-react:
specifier: ^8.6.0
version: 8.6.0(react@19.2.7)
- express:
- specifier: ^4.21.2
- version: 4.22.2
framer-motion:
specifier: ^12.23.22
version: 12.40.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
@@ -173,13 +170,10 @@ importers:
version: 0.1.1(vite@7.3.5(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.22.4))
'@tailwindcss/typography':
specifier: ^0.5.15
- version: 0.5.19(tailwindcss@4.3.0)
+ version: 0.5.20(tailwindcss@4.3.0)
'@tailwindcss/vite':
specifier: ^4.1.3
version: 4.3.0(vite@7.3.5(@types/node@24.13.1)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.22.4))
- '@types/express':
- specifier: 4.17.21
- version: 4.17.21
'@types/google.maps':
specifier: ^3.58.1
version: 3.65.1
@@ -222,9 +216,6 @@ importers:
terser:
specifier: ^5.46.1
version: 5.46.1
- tsx:
- specifier: ^4.19.1
- version: 4.22.4
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
@@ -1957,10 +1948,10 @@ packages:
resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==}
engines: {node: '>= 20'}
- '@tailwindcss/typography@0.5.19':
- resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
+ '@tailwindcss/typography@0.5.20':
+ resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==}
peerDependencies:
- tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+ tailwindcss: '>=3.0.0 || >=4.0.0 || insiders'
'@tailwindcss/vite@4.3.0':
resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==}
@@ -1979,12 +1970,6 @@ packages:
'@types/babel__traverse@7.28.0':
resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
- '@types/body-parser@1.19.6':
- resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
-
- '@types/connect@3.4.38':
- resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
-
'@types/d3-array@3.2.2':
resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
@@ -2090,12 +2075,6 @@ packages:
'@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
- '@types/express-serve-static-core@4.19.6':
- resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
-
- '@types/express@4.17.21':
- resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
-
'@types/geojson@7946.0.16':
resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
@@ -2105,30 +2084,18 @@ packages:
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
- '@types/http-errors@2.0.5':
- resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
-
'@types/katex@0.16.7':
resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
- '@types/mime@1.3.5':
- resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
-
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
'@types/node@24.13.1':
resolution: {integrity: sha512-RSpUJGmvsJ1ZeBehQZFhIdpsz+bIpES0nIQXko4Ybq+N+kX6XvOq3Jo+iJ82FWLdblFq85AsMikd3m35jgezYg==}
- '@types/qs@6.14.0':
- resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
-
- '@types/range-parser@1.2.7':
- resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
-
'@types/react-dom@19.2.1':
resolution: {integrity: sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==}
peerDependencies:
@@ -2137,15 +2104,6 @@ packages:
'@types/react@19.2.17':
resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==}
- '@types/send@0.17.5':
- resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==}
-
- '@types/send@1.2.0':
- resolution: {integrity: sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==}
-
- '@types/serve-static@1.15.9':
- resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==}
-
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -2196,10 +2154,6 @@ packages:
'@vitest/utils@2.1.9':
resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==}
- accepts@1.3.8:
- resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
- engines: {node: '>= 0.6'}
-
acorn@8.15.0:
resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
engines: {node: '>=0.4.0'}
@@ -2226,9 +2180,6 @@ packages:
resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
engines: {node: '>=10'}
- array-flatten@1.1.1:
- resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
-
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
@@ -2258,10 +2209,6 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
- body-parser@1.20.5:
- resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==}
- engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
-
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
@@ -2274,10 +2221,6 @@ packages:
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
- bytes@3.1.2:
- resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
- engines: {node: '>= 0.8'}
-
cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
@@ -2286,10 +2229,6 @@ packages:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
- call-bound@1.0.4:
- resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
- engines: {node: '>= 0.4'}
-
camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
@@ -2373,24 +2312,9 @@ packages:
confbox@0.2.2:
resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
- content-disposition@0.5.4:
- resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
- engines: {node: '>= 0.6'}
-
- content-type@1.0.5:
- resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
- engines: {node: '>= 0.6'}
-
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
- cookie-signature@1.0.6:
- resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
-
- cookie@0.7.1:
- resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
- engines: {node: '>= 0.6'}
-
cose-base@1.0.3:
resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
@@ -2573,14 +2497,6 @@ packages:
dayjs@1.11.18:
resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
- debug@2.6.9:
- resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -2610,18 +2526,10 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
- depd@2.0.0:
- resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
- engines: {node: '>= 0.8'}
-
dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
- destroy@1.2.0:
- resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
- engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
-
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
@@ -2651,9 +2559,6 @@ packages:
echarts@6.1.0:
resolution: {integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==}
- ee-first@1.1.1:
- resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
-
electron-to-chromium@1.5.368:
resolution: {integrity: sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==}
@@ -2670,14 +2575,6 @@ packages:
embla-carousel@8.6.0:
resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==}
- encodeurl@1.0.2:
- resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
- engines: {node: '>= 0.8'}
-
- encodeurl@2.0.0:
- resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
- engines: {node: '>= 0.8'}
-
enhanced-resolve@5.23.0:
resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==}
engines: {node: '>=10.13.0'}
@@ -2729,9 +2626,6 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
- escape-html@1.0.3:
- resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
escape-string-regexp@5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
@@ -2745,10 +2639,6 @@ packages:
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
- etag@1.8.1:
- resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
- engines: {node: '>= 0.6'}
-
eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
@@ -2756,10 +2646,6 @@ packages:
resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
engines: {node: '>=12.0.0'}
- express@4.22.2:
- resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==}
- engines: {node: '>= 0.10.0'}
-
exsolve@1.0.7:
resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
@@ -2790,10 +2676,6 @@ packages:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
- finalhandler@1.3.1:
- resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
- engines: {node: '>= 0.8'}
-
follow-redirects@1.16.0:
resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==}
engines: {node: '>=4.0'}
@@ -2807,10 +2689,6 @@ packages:
resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
engines: {node: '>= 6'}
- forwarded@0.2.0:
- resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
- engines: {node: '>= 0.6'}
-
fraction.js@5.3.4:
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
@@ -2828,10 +2706,6 @@ packages:
react-dom:
optional: true
- fresh@0.5.2:
- resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
- engines: {node: '>= 0.6'}
-
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -2946,29 +2820,14 @@ packages:
html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
- http-errors@2.0.0:
- resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
- engines: {node: '>= 0.8'}
-
- http-errors@2.0.1:
- resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
- engines: {node: '>= 0.8'}
-
https-proxy-agent@5.0.1:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
- iconv-lite@0.4.24:
- resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
- engines: {node: '>=0.10.0'}
-
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
inline-style-parser@0.2.4:
resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
@@ -2985,10 +2844,6 @@ packages:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
- ipaddr.js@1.9.1:
- resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
- engines: {node: '>= 0.10'}
-
is-alphabetical@2.0.1:
resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
@@ -3249,13 +3104,6 @@ packages:
mdast-util-to-string@4.0.0:
resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
- media-typer@0.3.0:
- resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
- engines: {node: '>= 0.6'}
-
- merge-descriptors@1.0.3:
- resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
-
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
@@ -3263,10 +3111,6 @@ packages:
mermaid@11.12.0:
resolution: {integrity: sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==}
- methods@1.1.2:
- resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
- engines: {node: '>= 0.6'}
-
micromark-core-commonmark@2.0.3:
resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
@@ -3395,11 +3239,6 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
- mime@1.6.0:
- resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
- engines: {node: '>=4'}
- hasBin: true
-
mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
@@ -3415,9 +3254,6 @@ packages:
motion-utils@12.39.0:
resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==}
- ms@2.0.0:
- resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -3434,10 +3270,6 @@ packages:
engines: {node: ^18 || >=20}
hasBin: true
- negotiator@0.6.3:
- resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
- engines: {node: '>= 0.6'}
-
next-themes@0.4.6:
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
peerDependencies:
@@ -3460,14 +3292,6 @@ packages:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
- object-inspect@1.13.4:
- resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
- engines: {node: '>= 0.4'}
-
- on-finished@2.4.1:
- resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
- engines: {node: '>= 0.8'}
-
oniguruma-parser@0.12.1:
resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
@@ -3483,19 +3307,12 @@ packages:
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
- parseurl@1.3.3:
- resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
- engines: {node: '>= 0.8'}
-
path-data-parser@0.1.0:
resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- path-to-regexp@0.1.12:
- resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
-
pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
@@ -3607,32 +3424,16 @@ packages:
property-information@7.2.0:
resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==}
- proxy-addr@2.0.7:
- resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
- engines: {node: '>= 0.10'}
-
proxy-from-env@2.1.0:
resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==}
engines: {node: '>=10'}
- qs@6.15.2:
- resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==}
- engines: {node: '>=0.6'}
-
quansync@0.2.11:
resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- range-parser@1.2.1:
- resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
- engines: {node: '>= 0.6'}
-
- raw-body@2.5.3:
- resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==}
- engines: {node: '>= 0.8'}
-
react-day-picker@9.14.0:
resolution: {integrity: sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==}
engines: {node: '>=18'}
@@ -3818,9 +3619,6 @@ packages:
rw@1.3.3:
resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
- safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -3831,36 +3629,9 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- send@0.19.0:
- resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
- engines: {node: '>= 0.8.0'}
-
- serve-static@1.16.2:
- resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
- engines: {node: '>= 0.8.0'}
-
- setprototypeof@1.2.0:
- resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
-
shiki@3.14.0:
resolution: {integrity: sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g==}
- side-channel-list@1.0.1:
- resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
- engines: {node: '>= 0.4'}
-
- side-channel-map@1.0.1:
- resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
- engines: {node: '>= 0.4'}
-
- side-channel-weakmap@1.0.2:
- resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
- engines: {node: '>= 0.4'}
-
- side-channel@1.1.0:
- resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
- engines: {node: '>= 0.4'}
-
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@@ -3887,14 +3658,6 @@ packages:
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
- statuses@2.0.1:
- resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
- engines: {node: '>= 0.8'}
-
- statuses@2.0.2:
- resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
- engines: {node: '>= 0.8'}
-
std-env@3.9.0:
resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
@@ -3988,10 +3751,6 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
- toidentifier@1.0.1:
- resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
- engines: {node: '>=0.6'}
-
trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
@@ -4019,10 +3778,6 @@ packages:
tw-animate-css@1.4.0:
resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
- type-is@1.6.18:
- resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
- engines: {node: '>= 0.6'}
-
typescript@5.6.3:
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
@@ -4058,10 +3813,6 @@ packages:
unist-util-visit@5.1.0:
resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
- unpipe@1.0.0:
- resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
- engines: {node: '>= 0.8'}
-
update-browserslist-db@1.2.3:
resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true
@@ -4096,18 +3847,10 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- utils-merge@1.0.1:
- resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
- engines: {node: '>= 0.4.0'}
-
uuid@11.1.0:
resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
hasBin: true
- vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
-
vaul@1.1.2:
resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==}
peerDependencies:
@@ -5679,7 +5422,7 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.3.0
'@tailwindcss/oxide-win32-x64-msvc': 4.3.0
- '@tailwindcss/typography@0.5.19(tailwindcss@4.3.0)':
+ '@tailwindcss/typography@0.5.20(tailwindcss@4.3.0)':
dependencies:
postcss-selector-parser: 6.0.10
tailwindcss: 4.3.0
@@ -5712,15 +5455,6 @@ snapshots:
dependencies:
'@babel/types': 7.28.4
- '@types/body-parser@1.19.6':
- dependencies:
- '@types/connect': 3.4.38
- '@types/node': 24.13.1
-
- '@types/connect@3.4.38':
- dependencies:
- '@types/node': 24.13.1
-
'@types/d3-array@3.2.2': {}
'@types/d3-axis@3.0.6':
@@ -5850,20 +5584,6 @@ snapshots:
'@types/estree@1.0.9': {}
- '@types/express-serve-static-core@4.19.6':
- dependencies:
- '@types/node': 24.13.1
- '@types/qs': 6.14.0
- '@types/range-parser': 1.2.7
- '@types/send': 1.2.0
-
- '@types/express@4.17.21':
- dependencies:
- '@types/body-parser': 1.19.6
- '@types/express-serve-static-core': 4.19.6
- '@types/qs': 6.14.0
- '@types/serve-static': 1.15.9
-
'@types/geojson@7946.0.16': {}
'@types/google.maps@3.65.1': {}
@@ -5872,26 +5592,18 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
- '@types/http-errors@2.0.5': {}
-
'@types/katex@0.16.7': {}
'@types/mdast@4.0.4':
dependencies:
'@types/unist': 3.0.3
- '@types/mime@1.3.5': {}
-
'@types/ms@2.1.0': {}
'@types/node@24.13.1':
dependencies:
undici-types: 7.18.2
- '@types/qs@6.14.0': {}
-
- '@types/range-parser@1.2.7': {}
-
'@types/react-dom@19.2.1(@types/react@19.2.17)':
dependencies:
'@types/react': 19.2.17
@@ -5900,21 +5612,6 @@ snapshots:
dependencies:
csstype: 3.2.3
- '@types/send@0.17.5':
- dependencies:
- '@types/mime': 1.3.5
- '@types/node': 24.13.1
-
- '@types/send@1.2.0':
- dependencies:
- '@types/node': 24.13.1
-
- '@types/serve-static@1.15.9':
- dependencies:
- '@types/http-errors': 2.0.5
- '@types/node': 24.13.1
- '@types/send': 0.17.5
-
'@types/trusted-types@2.0.7':
optional: true
@@ -5978,11 +5675,6 @@ snapshots:
loupe: 3.2.1
tinyrainbow: 1.2.0
- accepts@1.3.8:
- dependencies:
- mime-types: 2.1.35
- negotiator: 0.6.3
-
acorn@8.15.0: {}
add@2.0.6: {}
@@ -6006,8 +5698,6 @@ snapshots:
dependencies:
tslib: 2.8.1
- array-flatten@1.1.1: {}
-
assertion-error@2.0.1: {}
asynckit@0.4.0: {}
@@ -6037,23 +5727,6 @@ snapshots:
binary-extensions@2.3.0: {}
- body-parser@1.20.5:
- dependencies:
- bytes: 3.1.2
- content-type: 1.0.5
- debug: 2.6.9
- depd: 2.0.0
- destroy: 1.2.0
- http-errors: 2.0.1
- iconv-lite: 0.4.24
- on-finished: 2.4.1
- qs: 6.15.2
- raw-body: 2.5.3
- type-is: 1.6.18
- unpipe: 1.0.0
- transitivePeerDependencies:
- - supports-color
-
braces@3.0.3:
dependencies:
fill-range: 7.1.1
@@ -6068,8 +5741,6 @@ snapshots:
buffer-from@1.1.2: {}
- bytes@3.1.2: {}
-
cac@6.7.14: {}
call-bind-apply-helpers@1.0.2:
@@ -6077,11 +5748,6 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
- call-bound@1.0.4:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- get-intrinsic: 1.3.0
-
camelcase-css@2.0.1: {}
caniuse-lite@1.0.30001797: {}
@@ -6168,18 +5834,8 @@ snapshots:
confbox@0.2.2: {}
- content-disposition@0.5.4:
- dependencies:
- safe-buffer: 5.2.1
-
- content-type@1.0.5: {}
-
convert-source-map@2.0.0: {}
- cookie-signature@1.0.6: {}
-
- cookie@0.7.1: {}
-
cose-base@1.0.3:
dependencies:
layout-base: 1.0.2
@@ -6384,10 +6040,6 @@ snapshots:
dayjs@1.11.18: {}
- debug@2.6.9:
- dependencies:
- ms: 2.0.0
-
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -6410,12 +6062,8 @@ snapshots:
delayed-stream@1.0.0: {}
- depd@2.0.0: {}
-
dequal@2.0.3: {}
- destroy@1.2.0: {}
-
detect-libc@2.1.2: {}
detect-node-es@1.1.0: {}
@@ -6448,8 +6096,6 @@ snapshots:
tslib: 2.3.0
zrender: 6.1.0
- ee-first@1.1.1: {}
-
electron-to-chromium@1.5.368: {}
embla-carousel-react@8.6.0(react@19.2.7):
@@ -6464,10 +6110,6 @@ snapshots:
embla-carousel@8.6.0: {}
- encodeurl@1.0.2: {}
-
- encodeurl@2.0.0: {}
-
enhanced-resolve@5.23.0:
dependencies:
graceful-fs: 4.2.11
@@ -6604,11 +6246,10 @@ snapshots:
'@esbuild/win32-arm64': 0.28.0
'@esbuild/win32-ia32': 0.28.0
'@esbuild/win32-x64': 0.28.0
+ optional: true
escalade@3.2.0: {}
- escape-html@1.0.3: {}
-
escape-string-regexp@5.0.0: {}
estree-util-is-identifier-name@3.0.0: {}
@@ -6619,48 +6260,10 @@ snapshots:
dependencies:
'@types/estree': 1.0.8
- etag@1.8.1: {}
-
eventemitter3@4.0.7: {}
expect-type@1.2.2: {}
- express@4.22.2:
- dependencies:
- accepts: 1.3.8
- array-flatten: 1.1.1
- body-parser: 1.20.5
- content-disposition: 0.5.4
- content-type: 1.0.5
- cookie: 0.7.1
- cookie-signature: 1.0.6
- debug: 2.6.9
- depd: 2.0.0
- encodeurl: 2.0.0
- escape-html: 1.0.3
- etag: 1.8.1
- finalhandler: 1.3.1
- fresh: 0.5.2
- http-errors: 2.0.0
- merge-descriptors: 1.0.3
- methods: 1.1.2
- on-finished: 2.4.1
- parseurl: 1.3.3
- path-to-regexp: 0.1.12
- proxy-addr: 2.0.7
- qs: 6.15.2
- range-parser: 1.2.1
- safe-buffer: 5.2.1
- send: 0.19.0
- serve-static: 1.16.2
- setprototypeof: 1.2.0
- statuses: 2.0.1
- type-is: 1.6.18
- utils-merge: 1.0.1
- vary: 1.1.2
- transitivePeerDependencies:
- - supports-color
-
exsolve@1.0.7: {}
extend@3.0.2: {}
@@ -6687,18 +6290,6 @@ snapshots:
dependencies:
to-regex-range: 5.0.1
- finalhandler@1.3.1:
- dependencies:
- debug: 2.6.9
- encodeurl: 2.0.0
- escape-html: 1.0.3
- on-finished: 2.4.1
- parseurl: 1.3.3
- statuses: 2.0.1
- unpipe: 1.0.0
- transitivePeerDependencies:
- - supports-color
-
follow-redirects@1.16.0: {}
form-data@4.0.5:
@@ -6709,8 +6300,6 @@ snapshots:
hasown: 2.0.4
mime-types: 2.1.35
- forwarded@0.2.0: {}
-
fraction.js@5.3.4: {}
framer-motion@12.40.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
@@ -6722,8 +6311,6 @@ snapshots:
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
- fresh@0.5.2: {}
-
fsevents@2.3.3:
optional: true
@@ -6911,22 +6498,6 @@ snapshots:
html-void-elements@3.0.0: {}
- http-errors@2.0.0:
- dependencies:
- depd: 2.0.0
- inherits: 2.0.4
- setprototypeof: 1.2.0
- statuses: 2.0.1
- toidentifier: 1.0.1
-
- http-errors@2.0.1:
- dependencies:
- depd: 2.0.0
- inherits: 2.0.4
- setprototypeof: 1.2.0
- statuses: 2.0.2
- toidentifier: 1.0.1
-
https-proxy-agent@5.0.1:
dependencies:
agent-base: 6.0.0
@@ -6934,16 +6505,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- iconv-lite@0.4.24:
- dependencies:
- safer-buffer: 2.1.2
-
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
- inherits@2.0.4: {}
-
inline-style-parser@0.2.4: {}
input-otp@1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
@@ -6955,8 +6520,6 @@ snapshots:
internmap@2.0.3: {}
- ipaddr.js@1.9.1: {}
-
is-alphabetical@2.0.1: {}
is-alphanumerical@2.0.1:
@@ -7295,10 +6858,6 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
- media-typer@0.3.0: {}
-
- merge-descriptors@1.0.3: {}
-
merge2@1.4.1: {}
mermaid@11.12.0:
@@ -7326,8 +6885,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- methods@1.1.2: {}
-
micromark-core-commonmark@2.0.3:
dependencies:
decode-named-character-reference: 1.3.0
@@ -7572,8 +7129,6 @@ snapshots:
dependencies:
mime-db: 1.52.0
- mime@1.6.0: {}
-
mitt@3.0.1: {}
mlly@1.8.0:
@@ -7591,8 +7146,6 @@ snapshots:
motion-utils@12.39.0: {}
- ms@2.0.0: {}
-
ms@2.1.3: {}
mz@2.7.0:
@@ -7605,8 +7158,6 @@ snapshots:
nanoid@5.1.11: {}
- negotiator@0.6.3: {}
-
next-themes@0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
react: 19.2.7
@@ -7620,12 +7171,6 @@ snapshots:
object-hash@3.0.0: {}
- object-inspect@1.13.4: {}
-
- on-finished@2.4.1:
- dependencies:
- ee-first: 1.1.1
-
oniguruma-parser@0.12.1: {}
oniguruma-to-es@4.3.3:
@@ -7650,14 +7195,10 @@ snapshots:
dependencies:
entities: 6.0.1
- parseurl@1.3.3: {}
-
path-data-parser@0.1.0: {}
path-parse@1.0.7: {}
- path-to-regexp@0.1.12: {}
-
pathe@1.1.2: {}
pathe@2.0.3: {}
@@ -7750,30 +7291,12 @@ snapshots:
property-information@7.2.0: {}
- proxy-addr@2.0.7:
- dependencies:
- forwarded: 0.2.0
- ipaddr.js: 1.9.1
-
proxy-from-env@2.1.0: {}
- qs@6.15.2:
- dependencies:
- side-channel: 1.1.0
-
quansync@0.2.11: {}
queue-microtask@1.2.3: {}
- range-parser@1.2.1: {}
-
- raw-body@2.5.3:
- dependencies:
- bytes: 3.1.2
- http-errors: 2.0.1
- iconv-lite: 0.4.24
- unpipe: 1.0.0
-
react-day-picker@9.14.0(react@19.2.7):
dependencies:
'@date-fns/tz': 1.4.1
@@ -8027,43 +7550,12 @@ snapshots:
rw@1.3.3: {}
- safe-buffer@5.2.1: {}
-
safer-buffer@2.1.2: {}
scheduler@0.27.0: {}
semver@6.3.1: {}
- send@0.19.0:
- dependencies:
- debug: 2.6.9
- depd: 2.0.0
- destroy: 1.2.0
- encodeurl: 1.0.2
- escape-html: 1.0.3
- etag: 1.8.1
- fresh: 0.5.2
- http-errors: 2.0.0
- mime: 1.6.0
- ms: 2.1.3
- on-finished: 2.4.1
- range-parser: 1.2.1
- statuses: 2.0.1
- transitivePeerDependencies:
- - supports-color
-
- serve-static@1.16.2:
- dependencies:
- encodeurl: 2.0.0
- escape-html: 1.0.3
- parseurl: 1.3.3
- send: 0.19.0
- transitivePeerDependencies:
- - supports-color
-
- setprototypeof@1.2.0: {}
-
shiki@3.14.0:
dependencies:
'@shikijs/core': 3.14.0
@@ -8075,34 +7567,6 @@ snapshots:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
- side-channel-list@1.0.1:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-map@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-weakmap@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
- side-channel-map: 1.0.1
-
- side-channel@1.1.0:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
- side-channel-list: 1.0.1
- side-channel-map: 1.0.1
- side-channel-weakmap: 1.0.2
-
siginfo@2.0.0: {}
sonner@2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
@@ -8123,10 +7587,6 @@ snapshots:
stackback@0.0.2: {}
- statuses@2.0.1: {}
-
- statuses@2.0.2: {}
-
std-env@3.9.0: {}
streamdown@1.6.11(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.7):
@@ -8264,8 +7724,6 @@ snapshots:
dependencies:
is-number: 7.0.0
- toidentifier@1.0.1: {}
-
trim-lines@3.0.1: {}
trough@2.2.0: {}
@@ -8283,14 +7741,10 @@ snapshots:
esbuild: 0.28.0
optionalDependencies:
fsevents: 2.3.3
+ optional: true
tw-animate-css@1.4.0: {}
- type-is@1.6.18:
- dependencies:
- media-typer: 0.3.0
- mime-types: 2.1.35
-
typescript@5.6.3: {}
ufo@1.6.1: {}
@@ -8340,8 +7794,6 @@ snapshots:
unist-util-is: 6.0.1
unist-util-visit-parents: 6.0.2
- unpipe@1.0.0: {}
-
update-browserslist-db@1.2.3(browserslist@4.28.2):
dependencies:
browserslist: 4.28.2
@@ -8369,12 +7821,8 @@ snapshots:
util-deprecate@1.0.2: {}
- utils-merge@1.0.1: {}
-
uuid@11.1.0: {}
- vary@1.1.2: {}
-
vaul@1.1.2(@types/react-dom@19.2.1(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
'@radix-ui/react-dialog': 1.1.16(@types/react-dom@19.2.1(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
diff --git a/scripts/deploy.sh b/scripts/deploy.sh
new file mode 100755
index 0000000..3b162f3
--- /dev/null
+++ b/scripts/deploy.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+# ============================================================
+# 部署脚本 - 支持 test 环境与 images 目录排除
+#
+# 用法:
+# ./scripts/deploy.sh 上传至正式环境 (v2)
+# ./scripts/deploy.sh -test 上传至测试环境 (test)
+# ./scripts/deploy.sh -eximg 排除 images 目录,上传至正式环境
+# ./scripts/deploy.sh -eximg -test 排除 images 目录,上传至测试环境
+# -reload 参数:上传完成后刷新 CloudFront 缓存
+# ./scripts/deploy.sh -reload 上传正式环境并刷新缓存
+# ./scripts/deploy.sh -eximg -test -reload 排除 images,上传测试环境并刷新缓存
+# ============================================================
+
+set -e
+
+# 自动识别项目名称 (x8 / x9),依据脚本所在的项目根目录名
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(basename "$(dirname "$SCRIPT_DIR")")"
+PROJECT_NAME="$(echo "$PROJECT_ROOT" | grep -oE '^(x8|x9)')"
+
+if [ -z "$PROJECT_NAME" ]; then
+ echo "错误: 无法从路径 '$PROJECT_ROOT' 识别项目名称 (x8/x9)"
+ exit 1
+fi
+
+# 解析参数
+TARGET_ENV="prod" # 默认正式环境
+EXCLUDE_IMAGES=false # 默认不排除 images
+RELOAD=false # 默认不刷新 CloudFront 缓存
+
+for arg in "$@"; do
+ case "$arg" in
+ -test)
+ TARGET_ENV="test"
+ ;;
+ -eximg)
+ EXCLUDE_IMAGES=true
+ ;;
+ -reload)
+ RELOAD=true
+ ;;
+ *)
+ echo "未知参数: $arg"
+ echo "用法: ./scripts/deploy.sh [-test] [-eximg] [-reload]"
+ exit 1
+ ;;
+ esac
+done
+
+# 确定 S3 目标路径与 CloudFront 刷新路径
+if [ "$TARGET_ENV" = "test" ]; then
+ S3_PATH="s3://luxsin-app-bucket/${PROJECT_NAME}/test/"
+ CF_PATH="/${PROJECT_NAME}/test/*"
+else
+ S3_PATH="s3://luxsin-app-bucket/${PROJECT_NAME}/v2/"
+ CF_PATH="/${PROJECT_NAME}/v2/*"
+fi
+
+# CloudFront 分配 ID
+DISTRIBUTION_ID="EUS4XQ8Y0W2ZV"
+
+# 构建 aws s3 sync 命令参数(使用数组,避免引号转义问题)
+CMD_ARGS=("aws" "s3" "sync" "./dist" "$S3_PATH" "--delete")
+
+if [ "$EXCLUDE_IMAGES" = true ]; then
+ CMD_ARGS+=("--exclude" "*images/*")
+fi
+
+# 输出部署信息
+echo "=========================================="
+echo "项目: ${PROJECT_NAME}"
+echo "环境: ${TARGET_ENV}"
+echo "目标: ${S3_PATH}"
+[ "$EXCLUDE_IMAGES" = true ] && echo "排除: *images/*"
+echo "刷新: ${RELOAD}"
+echo "命令: ${CMD_ARGS[*]}"
+echo "=========================================="
+echo ""
+
+# 执行同步
+"${CMD_ARGS[@]}"
+
+echo ""
+
+# 刷新 CloudFront 缓存
+if [ "$RELOAD" = true ]; then
+ echo "刷新 CloudFront 缓存..."
+ echo "路径: ${CF_PATH}"
+ aws cloudfront create-invalidation \
+ --distribution-id "$DISTRIBUTION_ID" \
+ --paths "$CF_PATH"
+ echo ""
+ echo "CloudFront 缓存刷新完成!"
+fi
+
+echo "部署完成!"