Compare commits

..

No commits in common. "main" and "yesvelte" have entirely different histories.

9 changed files with 245 additions and 461 deletions

View file

@ -67,7 +67,7 @@ At the location you're running production, pull the updated container
To start it up (and tail the logs - CTRL-C to quit out of the logs without affecting running container)
docker-compose rm -sf && docker-compose up -d && docker-compose logs -f
docker-compose up -d && docker-compose logs -f
### To clear out an old image (if it's running)

386
package-lock.json generated
View file

@ -552,9 +552,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.16.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz",
"integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==",
"version": "9.15.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz",
"integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==",
"dev": true,
"license": "MIT",
"engines": {
@ -1509,9 +1509,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz",
"integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz",
"integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==",
"cpu": [
"arm"
],
@ -1523,9 +1523,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz",
"integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz",
"integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==",
"cpu": [
"arm64"
],
@ -1537,9 +1537,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz",
"integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz",
"integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==",
"cpu": [
"arm64"
],
@ -1551,9 +1551,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz",
"integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz",
"integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==",
"cpu": [
"x64"
],
@ -1565,9 +1565,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz",
"integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz",
"integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==",
"cpu": [
"arm64"
],
@ -1579,9 +1579,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz",
"integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz",
"integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==",
"cpu": [
"x64"
],
@ -1593,9 +1593,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz",
"integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz",
"integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==",
"cpu": [
"arm"
],
@ -1607,9 +1607,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz",
"integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz",
"integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==",
"cpu": [
"arm"
],
@ -1621,9 +1621,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz",
"integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz",
"integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==",
"cpu": [
"arm64"
],
@ -1635,9 +1635,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz",
"integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz",
"integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==",
"cpu": [
"arm64"
],
@ -1649,9 +1649,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz",
"integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz",
"integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==",
"cpu": [
"ppc64"
],
@ -1663,9 +1663,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz",
"integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz",
"integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==",
"cpu": [
"riscv64"
],
@ -1677,9 +1677,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz",
"integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz",
"integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==",
"cpu": [
"s390x"
],
@ -1691,9 +1691,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz",
"integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz",
"integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==",
"cpu": [
"x64"
],
@ -1705,9 +1705,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz",
"integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz",
"integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==",
"cpu": [
"x64"
],
@ -1719,9 +1719,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz",
"integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz",
"integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==",
"cpu": [
"arm64"
],
@ -1733,9 +1733,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz",
"integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz",
"integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==",
"cpu": [
"ia32"
],
@ -1747,9 +1747,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz",
"integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz",
"integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==",
"cpu": [
"x64"
],
@ -1806,9 +1806,9 @@
}
},
"node_modules/@sveltejs/kit": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.9.0.tgz",
"integrity": "sha512-W3E7ed3ChB6kPqRs2H7tcHp+Z7oiTFC6m+lLyAQQuyXeqw6LdNuuwEUla+5VM0OGgqQD+cYD6+7Xq80vVm17Vg==",
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.8.1.tgz",
"integrity": "sha512-uuOfFwZ4xvnfPsiTB6a4H1ljjTUksGhWnYq5X/Y9z4x5+3uM2Md8q/YVeHL+7w+mygAwoEFdgKZ8YkUuk+VKww==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@ -1816,7 +1816,7 @@
"@types/cookie": "^0.6.0",
"cookie": "^0.6.0",
"devalue": "^5.1.0",
"esm-env": "^1.2.1",
"esm-env": "^1.0.0",
"import-meta-resolve": "^4.1.0",
"kleur": "^4.1.5",
"magic-string": "^0.30.5",
@ -1833,9 +1833,9 @@
"node": ">=18.13"
},
"peerDependencies": {
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1",
"svelte": "^4.0.0 || ^5.0.0-next.0",
"vite": "^5.0.3 || ^6.0.0"
"vite": "^5.0.3"
}
},
"node_modules/@sveltejs/vite-plugin-svelte": {
@ -1918,14 +1918,14 @@
"license": "MIT"
},
"node_modules/@vitest/expect": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz",
"integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz",
"integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/spy": "2.1.8",
"@vitest/utils": "2.1.8",
"@vitest/spy": "2.1.5",
"@vitest/utils": "2.1.5",
"chai": "^5.1.2",
"tinyrainbow": "^1.2.0"
},
@ -1934,13 +1934,13 @@
}
},
"node_modules/@vitest/mocker": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz",
"integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz",
"integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/spy": "2.1.8",
"@vitest/spy": "2.1.5",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.12"
},
@ -1971,9 +1971,9 @@
}
},
"node_modules/@vitest/pretty-format": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz",
"integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz",
"integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -1984,13 +1984,13 @@
}
},
"node_modules/@vitest/runner": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz",
"integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz",
"integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/utils": "2.1.8",
"@vitest/utils": "2.1.5",
"pathe": "^1.1.2"
},
"funding": {
@ -1998,13 +1998,13 @@
}
},
"node_modules/@vitest/snapshot": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz",
"integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz",
"integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "2.1.8",
"@vitest/pretty-format": "2.1.5",
"magic-string": "^0.30.12",
"pathe": "^1.1.2"
},
@ -2013,9 +2013,9 @@
}
},
"node_modules/@vitest/spy": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz",
"integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz",
"integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -2026,13 +2026,13 @@
}
},
"node_modules/@vitest/utils": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz",
"integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz",
"integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/pretty-format": "2.1.8",
"@vitest/pretty-format": "2.1.5",
"loupe": "^3.1.2",
"tinyrainbow": "^1.2.0"
},
@ -2272,9 +2272,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001685",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001685.tgz",
"integrity": "sha512-e/kJN1EMyHQzgcMEEgoo+YTCO1NGCmIYHk5Qk8jT6AazWemS5QFKJ5ShCJlH3GZrNIdZofcNCEwZqbMjjKzmnA==",
"version": "1.0.30001680",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
"integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
"dev": true,
"funding": [
{
@ -2622,9 +2622,9 @@
}
},
"node_modules/dotenv": {
"version": "16.4.6",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.6.tgz",
"integrity": "sha512-JhcR/+KIjkkjiU8yEpaB/USlzVi3i5whwOjpIRNGi9svKEXZSe+Qp6IWAjFjv+2GViAoDRCUv/QLNziQxsLqDg==",
"version": "16.4.5",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
@ -2634,9 +2634,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.68",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz",
"integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==",
"version": "1.5.63",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz",
"integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==",
"dev": true,
"license": "ISC"
},
@ -2730,9 +2730,9 @@
}
},
"node_modules/eslint": {
"version": "9.16.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz",
"integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==",
"version": "9.15.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz",
"integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -2741,7 +2741,7 @@
"@eslint/config-array": "^0.19.0",
"@eslint/core": "^0.9.0",
"@eslint/eslintrc": "^3.2.0",
"@eslint/js": "9.16.0",
"@eslint/js": "9.15.0",
"@eslint/plugin-kit": "^0.2.3",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
@ -2819,9 +2819,9 @@
}
},
"node_modules/eslint-plugin-svelte": {
"version": "2.46.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.46.1.tgz",
"integrity": "sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==",
"version": "2.46.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.46.0.tgz",
"integrity": "sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -2884,9 +2884,9 @@
}
},
"node_modules/esm-env": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz",
"integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.1.4.tgz",
"integrity": "sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==",
"dev": true,
"license": "MIT"
},
@ -3186,9 +3186,9 @@
}
},
"node_modules/globals": {
"version": "15.13.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz",
"integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==",
"version": "15.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz",
"integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==",
"dev": true,
"license": "MIT",
"engines": {
@ -3213,15 +3213,12 @@
"license": "MIT"
},
"node_modules/gopd": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz",
"integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
"get-intrinsic": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@ -3250,13 +3247,10 @@
}
},
"node_modules/has-proto": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz",
"integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.7"
},
"engines": {
"node": ">= 0.4"
},
@ -3265,9 +3259,9 @@
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
@ -3326,9 +3320,9 @@
}
},
"node_modules/imagetools-core": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/imagetools-core/-/imagetools-core-7.0.2.tgz",
"integrity": "sha512-nrLdKLJHHXd8MitwlXK6/h1TSwGaH3X1DZ3z6yMv/tX7dJ12ecLxZ6P5jgKetfIFh8IJwH9fCWMoTA8ixg0VVA==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/imagetools-core/-/imagetools-core-7.0.1.tgz",
"integrity": "sha512-XDUx3Ac1VrZ4XF5eAJNYdHbFXRPNyebHFrwJsZ4WHb7X2MitOVW23cFphSDByT3MH5rdWdxKr4edSW2agChvDg==",
"dev": true,
"license": "MIT",
"engines": {
@ -3336,9 +3330,9 @@
}
},
"node_modules/immutable": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz",
"integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==",
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz",
"integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==",
"license": "MIT"
},
"node_modules/import-fresh": {
@ -3490,15 +3484,13 @@
}
},
"node_modules/is-regex": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz",
"integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
"gopd": "^1.1.0",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@ -3651,9 +3643,9 @@
}
},
"node_modules/magic-string": {
"version": "0.30.14",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz",
"integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==",
"version": "0.30.13",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz",
"integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
@ -3742,9 +3734,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
"integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"funding": [
{
"type": "github",
@ -4151,9 +4143,9 @@
}
},
"node_modules/prettier": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz",
"integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==",
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
"integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
"dev": true,
"license": "MIT",
"bin": {
@ -4167,9 +4159,9 @@
}
},
"node_modules/prettier-plugin-svelte": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.2.tgz",
"integrity": "sha512-kRPjH8wSj2iu+dO+XaUv4vD8qr5mdDmlak3IT/7AOgGIMRG86z/EHOLauFcClKEnOUf4A4nOA7sre5KrJD4Raw==",
"version": "3.2.8",
"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.8.tgz",
"integrity": "sha512-PAHmmU5cGZdnhW4mWhmvxuG2PVbbHIxUuPOdUKvfE+d4Qt2d29iU5VWrPdsaW5YqVEE0nqhlvN4eoKmVMpIF3Q==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@ -4275,9 +4267,9 @@
}
},
"node_modules/rollup": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz",
"integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==",
"version": "4.27.3",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz",
"integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -4291,24 +4283,24 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.28.0",
"@rollup/rollup-android-arm64": "4.28.0",
"@rollup/rollup-darwin-arm64": "4.28.0",
"@rollup/rollup-darwin-x64": "4.28.0",
"@rollup/rollup-freebsd-arm64": "4.28.0",
"@rollup/rollup-freebsd-x64": "4.28.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.28.0",
"@rollup/rollup-linux-arm-musleabihf": "4.28.0",
"@rollup/rollup-linux-arm64-gnu": "4.28.0",
"@rollup/rollup-linux-arm64-musl": "4.28.0",
"@rollup/rollup-linux-powerpc64le-gnu": "4.28.0",
"@rollup/rollup-linux-riscv64-gnu": "4.28.0",
"@rollup/rollup-linux-s390x-gnu": "4.28.0",
"@rollup/rollup-linux-x64-gnu": "4.28.0",
"@rollup/rollup-linux-x64-musl": "4.28.0",
"@rollup/rollup-win32-arm64-msvc": "4.28.0",
"@rollup/rollup-win32-ia32-msvc": "4.28.0",
"@rollup/rollup-win32-x64-msvc": "4.28.0",
"@rollup/rollup-android-arm-eabi": "4.27.3",
"@rollup/rollup-android-arm64": "4.27.3",
"@rollup/rollup-darwin-arm64": "4.27.3",
"@rollup/rollup-darwin-x64": "4.27.3",
"@rollup/rollup-freebsd-arm64": "4.27.3",
"@rollup/rollup-freebsd-x64": "4.27.3",
"@rollup/rollup-linux-arm-gnueabihf": "4.27.3",
"@rollup/rollup-linux-arm-musleabihf": "4.27.3",
"@rollup/rollup-linux-arm64-gnu": "4.27.3",
"@rollup/rollup-linux-arm64-musl": "4.27.3",
"@rollup/rollup-linux-powerpc64le-gnu": "4.27.3",
"@rollup/rollup-linux-riscv64-gnu": "4.27.3",
"@rollup/rollup-linux-s390x-gnu": "4.27.3",
"@rollup/rollup-linux-x64-gnu": "4.27.3",
"@rollup/rollup-linux-x64-musl": "4.27.3",
"@rollup/rollup-win32-arm64-msvc": "4.27.3",
"@rollup/rollup-win32-ia32-msvc": "4.27.3",
"@rollup/rollup-win32-x64-msvc": "4.27.3",
"fsevents": "~2.3.2"
}
},
@ -4344,9 +4336,9 @@
}
},
"node_modules/sass": {
"version": "1.81.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.81.1.tgz",
"integrity": "sha512-VNLgf4FC5yFyKwAumAAwwNh8X4SevlVREq3Y8aDZIkm0lI/zO1feycMXQ4hn+eB6FVhRbleSQ1Yb/q8juSldTA==",
"version": "1.81.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.81.0.tgz",
"integrity": "sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==",
"license": "MIT",
"dependencies": {
"chokidar": "^4.0.0",
@ -4993,14 +4985,14 @@
}
},
"node_modules/vite-imagetools": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/vite-imagetools/-/vite-imagetools-7.0.5.tgz",
"integrity": "sha512-OOvVnaBTqJJ2J7X1cM1qpH4pj9jsfTxia1VSuWeyXtf+OnP8d0YI1LHpv8y2NT47wg+n7XiTgh3BvcSffuBWrw==",
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/vite-imagetools/-/vite-imagetools-7.0.4.tgz",
"integrity": "sha512-C9C7b2p/8/TCN2g26tE9haoer2i8K4x0v2RXUiHsIjiz221vQuKItCQ+VyiVCsUMPXfJC/tlZsmCZVBz5jh7uA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.0.5",
"imagetools-core": "^7.0.2",
"imagetools-core": "^7.0.1",
"sharp": "^0.33.4"
},
"engines": {
@ -5008,9 +5000,9 @@
}
},
"node_modules/vite-node": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz",
"integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz",
"integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -5046,19 +5038,19 @@
}
},
"node_modules/vitest": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz",
"integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==",
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz",
"integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vitest/expect": "2.1.8",
"@vitest/mocker": "2.1.8",
"@vitest/pretty-format": "^2.1.8",
"@vitest/runner": "2.1.8",
"@vitest/snapshot": "2.1.8",
"@vitest/spy": "2.1.8",
"@vitest/utils": "2.1.8",
"@vitest/expect": "2.1.5",
"@vitest/mocker": "2.1.5",
"@vitest/pretty-format": "^2.1.5",
"@vitest/runner": "2.1.5",
"@vitest/snapshot": "2.1.5",
"@vitest/spy": "2.1.5",
"@vitest/utils": "2.1.5",
"chai": "^5.1.2",
"debug": "^4.3.7",
"expect-type": "^1.1.0",
@ -5070,7 +5062,7 @@
"tinypool": "^1.0.1",
"tinyrainbow": "^1.2.0",
"vite": "^5.0.0",
"vite-node": "2.1.8",
"vite-node": "2.1.5",
"why-is-node-running": "^2.3.0"
},
"bin": {
@ -5085,8 +5077,8 @@
"peerDependencies": {
"@edge-runtime/vm": "*",
"@types/node": "^18.0.0 || >=20.0.0",
"@vitest/browser": "2.1.8",
"@vitest/ui": "2.1.8",
"@vitest/browser": "2.1.5",
"@vitest/ui": "2.1.5",
"happy-dom": "*",
"jsdom": "*"
},

View file

@ -4,17 +4,16 @@ html {
}
body {
font-family: 'Moderustic';
background-color: #ddfafa !important;
background-color: #ddfafa;
box-sizing: border-box;
margin: 0 auto;
min-height: 100%;
padding: 1em;
width: 100%;
font-size: 1.15em !important;
font-size: 1.15em;
border: double 3px #ddd;
border-top: none;
border-bottom: none;
font-size: 100%;
}
h1 {
padding-left: 0;
@ -47,7 +46,7 @@ a:visited {
width: 90%;
margin: 1em auto;
max-width: 40em;
height: auto !important;
height: auto;
padding: 0;
}
.y-modal .y-modal-container .y-modal-content {

View file

@ -1,119 +0,0 @@
<script>
// the filters
import { setFilter, getFilter } from '$lib/components/filter.js';
import { Accordions, Accordion, AccordionBody, El } from 'yesvelte';
import Filterable from '$lib/components/Filterable.svelte';
export let categoryFilter;
export let results;
</script>
<Accordions>
<Accordion title="Filters">
<AccordionBody>
<p>
You can filter the software services listed below by the following filtering dimensions.
Click a tag to remove or re-add it, or use 'select all or none' to select none, or invert your selection if it's more useful.</p>
<p><strong>Tip</strong>: if you want to see all technologies tagged with a specific tag, click that tag to <em>deselect</em> it, and then 'invert selection'. You'll see only the technologies that have the resulting tag.
</p>
<Accordions>
<Accordion title="Software Catergory Filter">
<AccordionBody>
<div class="filter-group categories">
<Filterable
filterValues={categoryFilter}
histogram={results.tech_lists.category_list}
context={'categories'}>
<h2 slot="title">Categories</h2>
<p slot="description">
These are general categories of software which help you understand the sort of software you're looking at, as well as identifying functionally similar software for comparison.
</p>
</Filterable>
</div>
</AccordionBody>
</Accordion>
<Accordion title="Software Analogue Filter">
<AccordionBody>
<div class="filter-group analogues">
<Filterable
filterValues={analogueFilter}
{tabindex}
histogram={results.tech_lists.analogue_list}
context={'analogues'}>
<h2 slot="title">Analogues</h2>
<p slot="description">
Because all the software listed here is '<a
href="https://tech.oeru.org/foss-libresoftware-its-about-clarity-and-values"
>libre</a
>', I've included the names of functionally similar but heavily marketed
<a href="https://davelane.nz/proprietary">proprietary</a> software that is therefore
better known to the general population, also for the purposes of understanding the
use of the software shown and to what it can be compared.
</p>
</Filterable>
</div>
</AccordionBody>
</Accordion>
<Accordion title="License Filter">
<AccordionBody>
<div class="filter-group licenses">
<Filterable
filterValues={licenseFilter}
{tabindex}
histogram={results.tech_lists.license_list}
context={'licenses'}
>
<h2 slot="title">Open Source & Copyleft Licenses</h2>
<p slot="description">
These are the various '<a href="https://opensource.org/licenses">open source</a
>' and '<a href="https://copyleft.org">copyleft</a>' licenses that apply to the
software listed. You can chose
</p>
</Filterable>
</div>
</AccordionBody>
</Accordion>
<Accordion title="Service Status Filter">
<AccordionBody>
<div class="filter-group statuses">
<Filterable
filterValues={statusFilter}
{tabindex}
histogram={results.instance_lists.status_list}
context={'statuses'}
>
<h2 slot="title">Statuses</h2>
<p slot="description"></p>
</Filterable>
</div>
</AccordionBody>
</Accordion>
<Accordion title="Service Affiliates Filter">
<AccordionBody>
<div class="filter-group affilates">
<Filterable filterValues={affiliateFilter}
{tabindex} histogram={results.instance_lists.affiliate_list}
context={'affiliates'}
colours={affiliate_colours}><h2 slot="title">Affiliates</h2>
<p slot="description"></p>
</Filterable>
</div>
</AccordionBody>
</Accordion>
<Accordion title="Service Host Filter">
<AccordionBody>
<div class="filter-group hosts">
<Filterable filterValues={hostFilter}
{tabindex}
histogram={results.instance_lists.host_list}
context={'hosts'}
colours={host_colours}><h2 slot="title">Hosts</h2>
<p slot="description"></p>
</Filterable>
</div>
</AccordionBody>
</Accordion>
</Accordions>
</AccordionBody>
</Accordion>
</Accordions>

View file

@ -65,12 +65,8 @@
{/if}
</div>
<p class="description">{technology.description}{#if technology.extended_description}
<span class="circle-info">i</span>
<Popover trigger="hover">
<PopoverHeader><strong>Extra information</strong></PopoverHeader>
<PopoverBody>{technology.extended_description}</PopoverBody>
</Popover>{/if}
<p class="description">{technology.description}{#if technology.extended_description}<span
title={technology.extended_description}>i</span>{/if}
</p>
<div class="details">
{#if technology.categories}<p class="property categories">{pluraliser('Category',
@ -160,7 +156,6 @@
margin-right: 18px;
margin-top: 8px;
overflow: hidden;
/*overflow: visible;*/
padding: 0;
position: relative;
text-align: left;
@ -215,11 +210,9 @@
height: 200px;
line-height: 1.2em;
text-overflow: ellipsis;
overflow: visible;
overflow: hidden;
padding-top: 0.5em;
/*vertical-align: top;*/
position: absolute;
top: 4em;
vertical-align: top;
}
.tile.technology p {
padding: 0 0.7em 0.2em 0.7em;
@ -231,10 +224,7 @@
margin: 0;
}
.tile.technology .details {
/*vertical-align: bottom;*/
position: absolute;
bottom: 3em;
margin-bottom: 10px;
vertical-align: bottom;
}
.tile.technology .instances {
background-color: #ddd;
@ -270,17 +260,4 @@
.circle:hover {
border: 1px solid #000;
}
.circle-info {
height: 18px;
width: 18px;
font-style: italic;
background-color: #777;
border-radius: 50%;
display: inline-block;
border: 0px solid #777;
color: #fff;
margin-left: 5px;
padding: 0px 0px 2px 6px;
text-align: middle;
}
</style>

View file

@ -1,11 +1,10 @@
<script>
import tabler from 'yesvelte/css/tabler.min.css?url';
import '../app.css';
import { Navbar, NavbarItem } from 'yesvelte';
let theme = 'tabler';
import '../app.css';
</script>
<svelte:head>
@ -13,8 +12,7 @@
</svelte:head>
<Navbar theme='light' style="margin-bottom: 2em;">
<a href="/"><NavbarItem title="Home" /></a>
<a href="/project"><NavbarItem title="Project" /></a>
<a href="/"><NavbarItem title="Web Services" /></a>
<a href="/about"><NavbarItem title="About" /></a>
</Navbar>

View file

@ -10,8 +10,6 @@
import { setFilter, getFilter } from '$lib/components/filter.js';
import { Accordions, Accordion, AccordionBody, El } from 'yesvelte';
import Filterable from '$lib/components/Filterable.svelte';
//import Filters from '$lib/components/Filters.svelte';
// collapsible sections
//import CollapsibleSection from '$lib/components/CollapsibleSection.svelte';
import TechnologyTile from '$lib/components/TechnologyTile.svelte';
@ -370,22 +368,22 @@
if (hasInstances(tech)) {
//console.log('instances: ', tech.instances);
for (let id in tech.instances) {
//console.log('id = ', id);
//console.log('field = ', field);
console.log('id = ', id);
console.log('field = ', field);
let instance = tech.instances[id];
let value = instance[field];
//console.log('field value = ', value);
//console.log('list = ', list);
console.log('field value = ', value);
console.log('list = ', list);
if (instance.hasOwnProperty(field)) {
//const intersection = inCommon([instance[field]], list);
const intersection = inCommon([value], list);
if (intersection && intersection.constructor === Array) {
//console.log('intersection length: ', intersection.length);
console.log('intersection length: ', intersection.length);
// if any one instance belonging to the tech is in the set, add the tech.
if (intersection.length > 0) {
/*if (instance.hasOwnProperty('domain')) {
if (instance.hasOwnProperty('domain')) {
console.log('setting to include ',instance.domain);
}*/
}
to_include = true;
} else {
// if an instance doesn't belong in the set, remove it.
@ -400,7 +398,7 @@
}
}
if (to_include) {
//console.log('including ', tech.name);
console.log('including ', tech.name);
included.push(tech);
}
});
@ -457,22 +455,22 @@
// reactive stuff...
$: {
/*console.log(
console.log(
'about to filter technologies by categories - starting with ' +
results.active_services.length +
' technologies...'
);*/
);
// filter by categories
filteredTechnologies = filterTechnologiesByArray(
results.active_services,
'categories',
flattenFilter($categoryFilter)
);
/*console.log(
console.log(
'about to filter technologies by analogues - starting with ' +
filteredTechnologies.length +
' technologies...'
);*/
);
// filter by analogues
filteredTechnologies = filterTechnologiesByArray(
filteredTechnologies,
@ -489,11 +487,11 @@
'license',
flattenFilter($licenseFilter)
);
/*console.log(
console.log(
'about to filter technologies by instance status - starting with ' +
filteredTechnologies.length +
' technologies...'
);*/
);
filteredTechnologies = filterTechnologiesByInstanceValue(
filteredTechnologies,
'status',
@ -511,11 +509,11 @@
)
//filteredTechnologies = filterTechnologiesByCategoryList(results.all_services, flattenFilter($categoryFilter));
/*console.log(
console.log(
'about to sort technologies alphabetically - starting with ' +
filteredTechnologies.length +
' technologies...'
);*/
);
const technologies = sortTechnologies(filteredTechnologies);
//console.log('finally have ' + technologies.length + ' technologies left to show...');
}
@ -574,19 +572,37 @@
</div>
<h1>Web Services</h1>
<p>
This is a list of the <a href="https://tech.oeru.org/foss-libresoftware-its-about-clarity-and-values" title="What do I mean by 'libre' software?">libre software</a> web services I - (<a href="https://davelane.nz" title="Who is this Dave Lane character?">Dave Lane</a>) currently host on behalf of my employer, organisations for whom I provide voluntary services, for consulting customers, and for my own interest and utility.
This sites exists to provide an 'always-up-to-date', in-depth description of the
<a href="https://tech.oeru.org/foss-libresoftware-its-about-clarity-and-values"
title="What do I mean by 'libre' software?">libre software</a>
web services I (<a href="https://davelane.nz"
title="Who is this Dave Lane character?">Dave Lane</a>) have set up and maintain.
</p>
<p>
Each 'technology tile' below represents a different libre web-based technology for which I actively run a publicly accessible instance either in a day-to-day production capacity or as a trial. Some are developed and run commercially by businesses, some are made available by governments, universities, charitable organisations and foundations, and others by loosely organised collectives and other sorts of communities. All are globally available, under the terms of their selected libre license.
These services are run primarily on commodity Linux Virtual Private Servers, aka 'hosts',
which I also maintain. Some systems are also run on real physical hosts either in my home
hosting facility or in commercial hosting facilities. These hosts are based in Aotearoa NZ,
Singapore, the US, and in Germany. Almost all run an LTS (Long Term Support) version of Ubuntu
Linux although a few hosts run Debian Linux.
</p>
<p>
Clicking on a tile below will pop up an expanded view of the technology and its details.
Almost all the hosts are <a href="https://tech.oeru.org/creating-your-own-oer-foundation-style-libre-self-hosting-infrastructure-docker-compose-and-ubuntu">configured in a particular way</a> which allows multiple services to run harmoniously on the same host. I use a set of somewhere
between one and twenty-one Docker containers (which I run via Docker Compose) for each service,
to keep different services, each of which has different software dependencies, from interfering
with one another. Each service is made available to the Internet via a 'reverse proxy' (for which
I use Nginx) and user interactions with them are secured (encrypted) with Let's Encrypt SSL certificates (which renew automatically).
</p>
<p>
You can also filter the list of technologies shown based on three sets of software criteria: software categories, heavily marketed proprietary alternatives, and the libre (or 'open source') license used.
To manage the servers and keep them up-to-date, I use SSH to establish secure encrypted
connections to them (via key-based authentication). I run updates of the hosts manually, and
update individual services when required (urgently if updates are security-related). Some of
the Docker containers I run I have built myself, in other cases I use those supplied by the
communities developing the service.
</p>
<p>
You can also filter technologies based on the active instances, like their current status (e.g. planned, production, trial, etc.), with which organisation or individual they are affiliated, and on which actual host they reside.
One huge advantage of the Docker Compose pattern is that I can rapidly move services between
different hosts, or even replicate services very rapidly for development or staging purposes.
Using them has revolutionised my hosting processes.
</p>
</div>
<Accordions>
@ -698,7 +714,7 @@
</AccordionBody>
</Accordion>
</Accordions>
<p>Showing {filteredTechnologies.length} active technology tiles.</p>
<p>Showing {filteredTechnologies.length} technology tiles.</p>
<!--<p>Current URL: {$page.url}...</p>-->
<div class="tiles">
{#each filteredTechnologies as technology, index}
@ -708,10 +724,11 @@
<TechnologyTile {technology} {affiliate_colours} {licenses} {showModal}/>
{/if}-->
{:else}
<p class='no-tiles'>No technologies with active instances are selected.<br/> If you selected a filter tag but no technologies appear, it is because that technology is in a testing or planning stage and does not yet have a publicly visible instance.</p>
<p class='no-tiles'>No technologies are selected</p>
{/each}
</div>
</div>
<style>
.webservices {
display: grid;
@ -749,9 +766,6 @@
.summary .number {
color: #000;
}
.tiles {
overflow: hidden;
}
@media screen and (max-width: 600px) {
.summary {
float: none;

View file

@ -1,41 +1,6 @@
<h1>About this site... </h1>
<p>
This sites exists to provide an always-up-to-date, in-depth catalogue of the
<a href="https://tech.oeru.org/foss-libresoftware-its-about-clarity-and-values"
title="What do I mean by 'libre' software?">libre software</a>
web services I (<a href="https://davelane.nz"
title="Who is this Dave Lane character?">Dave Lane</a>) have set up and maintain.
<p>This simple app is a work-in-progress that allows visitors to see the various <a href="https://tech.oeru.org/foss-libresoftware-its-about-clarity-and-values">libre</a> web services I currently run, filter them on a variety of properties like functional categories, similar proprietary apps, libre license used, instance status, which of my roles they're affiliated with, and on which host they reside... </p>
<p>The <a href="https://forge.magnificent.nz/lightweight/webservices">source code for this project is available</a> under an AGPL license.</p>
<p>This app is built on a suite of technologies that are largely new to me, but that I wanted to try out, as I see great potential in them. The key technology is a Javascript 'framework' called <a href="https://kid.svelte.dev">SvelteKit</a>, built with <a href="https://svelte.dev">Svelte</a> (a compiled language that generates pure Javascript) and ecosystem of extensions created by the community which provides useful components designed for reuse.
</p>
<p>
This collection is as much for my benefit as it is for others, who might want to learn more about libre technologies they could use in their own organisations. My purpose here is to show the libre services I (or my colleagues and customers) have found compelling enough to warrant setting up instances either for testing or full production. The options are many, diverse, and often mature and highly functional.
</p>
<h2>Hosting Platform</h2>
<p>
These services are run primarily on commodity Linux Virtual Private Servers, aka 'hosts',
which I also maintain. Some systems are also run on real physical hosts either in my home
hosting facility or in commercial hosting facilities. These hosts are based in Aotearoa NZ,
Singapore, the US, and in Germany. Almost all run an LTS (Long Term Support) version of Ubuntu
Linux although a few hosts run Debian Linux.
</p>
<p>
Almost all the hosts are <a href="https://tech.oeru.org/creating-your-own-oer-foundation-style-libre-self-hosting-infrastructure-docker-compose-and-ubuntu">configured in a particular way</a> which allows multiple services to run harmoniously on the same host. I use a set of somewhere
between one and twenty-one Docker containers (which I run via Docker Compose) for each service,
to keep different services, each of which has different software dependencies, from interfering
with one another. Each service is made available to the Internet via a 'reverse proxy' (for which
I use Nginx) and user interactions with them are secured (encrypted) with Let's Encrypt SSL certificates (which renew automatically).
</p>
<p>
To manage the servers and keep them up-to-date, I use SSH to establish secure encrypted
connections to them (via key-based authentication). I run updates of the hosts manually, and
update individual services when required (urgently if updates are security-related). Some of
the Docker containers I run I have built myself, in other cases I use those supplied by the
communities developing the service.
</p>
<p>
One huge advantage of the Docker Compose pattern is that I can rapidly move services between
different hosts, or even replicate services very rapidly for development or staging purposes.
Using them has revolutionised my hosting processes.
</p>

View file

@ -1,42 +0,0 @@
<h1>About this project... </h1>
<p>
This simple app is a work-in-progress that allows visitors to see the various <a href="https://tech.oeru.org/foss-libresoftware-its-about-clarity-and-values">libre</a> web services I currently run, filter them on a variety of properties like functional categories, similar proprietary apps, libre license used, instance status, which of my roles they're affiliated with, and on which host they reside...
</p>
<p>
The <a href="https://forge.magnificent.nz/lightweight/webservices">source code for this project is available</a> under an AGPL license.
</p>
<p>
This app is built on a suite of technologies that are largely new to me, but that I wanted to try out, as I see great potential in them. The key technology is a Javascript 'framework' called <a href="https://kid.svelte.dev">SvelteKit</a>, built with <a href="https://svelte.dev">Svelte</a> (a compiled language that generates pure Javascript) and ecosystem of extensions created by the community which provides useful components designed for reuse.
</p>
<h2>Future plans</h2>
<p>
In future, I'd like to enhance this app to:
</p>
<ul>
<li>
<p>
include an 'uptime' dashboard, showing the current status of each of the instances.
</p>
</li>
<li>
<p>
make it possible to reference a given technology tile with unique web address (URL).
</p>
</li>
<li>
<p>
allow users to page through the 'close up' view of technologies in their filtered list.
</p>
</li>
<li>
<p>
support limiting technologies to those featuring instances set up for a subset of Affiliates, allowing an up-to-date list of available webservices for my specific affiliates like those I run for the OER Foundation (my employer), my various volunteer roles, my consulting customers, and for my personal edification and utility.
</p>
</li>
<li>
<p>
provide a host-based map, which shows instances of technologies running on specific hosts (and shows their current status), which would help me diagnose problems, but also provide users of those services with a quick place to see where there might be problems affecting their access.
</p>
</li>
</ul>