this repo has no description

whoa svelte is here

Co-authored-by: Astra <Astrrra@users.noreply.github.com>

ari.express 3f03c121 76d83732

verified
-1
deno.json
··· 5 5 "imports": { 6 6 "@atcute/bluesky": "npm:@atcute/bluesky@^2.0.2", 7 7 "@atcute/client": "npm:@atcute/client@^3.0.1", 8 - "@skyware/jetstream": "npm:@skyware/jetstream@^0.2.2", 9 8 "@std/assert": "jsr:@std/assert@1", 10 9 "dotenv": "npm:dotenv@^16.5.0" 11 10 }
+152 -14
deno.lock
··· 5 5 "jsr:@std/internal@^1.0.6": "1.0.6", 6 6 "npm:@atcute/bluesky@^2.0.2": "2.0.2_@atcute+client@3.0.1", 7 7 "npm:@atcute/client@^3.0.1": "3.0.1", 8 - "npm:@skyware/jetstream@~0.2.2": "0.2.2_@atcute+client@3.0.1", 8 + "npm:create-astro@*": "4.11.2", 9 + "npm:create-vite@latest": "6.4.1", 9 10 "npm:dotenv@^16.5.0": "16.5.0" 10 11 }, 11 12 "jsr": { ··· 20 21 } 21 22 }, 22 23 "npm": { 23 - "@atcute/bluesky@1.0.15_@atcute+client@3.0.1": { 24 - "integrity": "sha512-+EFiybmKQ97aBAgtaD+cKRJER5AMn3cZMkEwEg/pDdWyzxYJ9m1UgemmLdTgI8VrxPufKqdXS2nl7uO7TY6BPA==", 24 + "@astrojs/cli-kit@0.4.1": { 25 + "integrity": "sha512-bVzyKzEpIwqjihBU/aUzt1LQckJuHK0agd3/ITdXhPUYculrc6K1/K7H+XG4rwjXtg+ikT3PM05V1MVYWiIvQw==", 25 26 "dependencies": [ 26 - "@atcute/client" 27 + "chalk", 28 + "log-update", 29 + "sisteransi" 27 30 ] 28 31 }, 29 32 "@atcute/bluesky@2.0.2_@atcute+client@3.0.1": { ··· 35 38 "@atcute/client@3.0.1": { 36 39 "integrity": "sha512-j51SuQYQj5jeKrx1DCXx+Q3fpVvO0JYGnKnJAdDSlesSLjPXjvnx1abC+hkuro58KRHHJvRA6P1MC0pmJsWfcg==" 37 40 }, 38 - "@skyware/jetstream@0.2.2_@atcute+client@3.0.1": { 39 - "integrity": "sha512-d1MtWPTIFEciSzV8OClXZCJoz0DJ7aupt4EZSwpGAASYG0ZIPmZTt7RVJkoFzQyqRPHAMD7CvEwu0ut3MHX1og==", 41 + "@bluwy/giget-core@0.1.2": { 42 + "integrity": "sha512-v9f+ueUOKkZCDKiCm0yxKtYgYNLD9zlKarNux0NSXOvNm94QEYL3RlMpGKgD2hq44pbF2qWqEmHnCvmk56kPJw==", 43 + "dependencies": [ 44 + "tar" 45 + ] 46 + }, 47 + "ansi-escapes@5.0.0": { 48 + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", 49 + "dependencies": [ 50 + "type-fest" 51 + ] 52 + }, 53 + "ansi-regex@6.1.0": { 54 + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" 55 + }, 56 + "ansi-styles@6.2.1": { 57 + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" 58 + }, 59 + "chalk@5.4.1": { 60 + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" 61 + }, 62 + "chownr@2.0.0": { 63 + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" 64 + }, 65 + "cli-cursor@4.0.0": { 66 + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", 67 + "dependencies": [ 68 + "restore-cursor" 69 + ] 70 + }, 71 + "create-astro@4.11.2": { 72 + "integrity": "sha512-/kzqE865PBF89v7iPlhZRpvDA0q8hBlxzPUli2hxtY8pSIDyDAUEy4kl0j61QYxwj0K2rdTT+bKO469MngIsVw==", 40 73 "dependencies": [ 41 - "@atcute/bluesky@1.0.15_@atcute+client@3.0.1", 42 - "partysocket" 74 + "@astrojs/cli-kit", 75 + "@bluwy/giget-core" 43 76 ] 44 77 }, 78 + "create-vite@6.4.1": { 79 + "integrity": "sha512-an7oLlpm4FFd8zkVk6ytazmfLwMVYYyoLeuzlCoGPBKCbS6d7obm6OyVXAKt58xCxYlhMzxM0z42HBmMGWME2g==" 80 + }, 45 81 "dotenv@16.5.0": { 46 82 "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==" 47 83 }, 48 - "event-target-polyfill@0.0.4": { 49 - "integrity": "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==" 84 + "eastasianwidth@0.2.0": { 85 + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 86 + }, 87 + "emoji-regex@9.2.2": { 88 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 89 + }, 90 + "fs-minipass@2.1.0": { 91 + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 92 + "dependencies": [ 93 + "minipass@3.3.6" 94 + ] 50 95 }, 51 - "partysocket@1.1.3": { 52 - "integrity": "sha512-87Jd/nqPoWnVfzHE6Z12WLWTJ+TAgxs0b7i2S163HfQSrVDUK5tW/FC64T5N8L5ss+gqF+EV0BwjZMWggMY3UA==", 96 + "is-fullwidth-code-point@4.0.0": { 97 + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==" 98 + }, 99 + "log-update@5.0.1": { 100 + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", 53 101 "dependencies": [ 54 - "event-target-polyfill" 102 + "ansi-escapes", 103 + "cli-cursor", 104 + "slice-ansi", 105 + "strip-ansi", 106 + "wrap-ansi" 55 107 ] 108 + }, 109 + "mimic-fn@2.1.0": { 110 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 111 + }, 112 + "minipass@3.3.6": { 113 + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 114 + "dependencies": [ 115 + "yallist" 116 + ] 117 + }, 118 + "minipass@5.0.0": { 119 + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" 120 + }, 121 + "minizlib@2.1.2": { 122 + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 123 + "dependencies": [ 124 + "minipass@3.3.6", 125 + "yallist" 126 + ] 127 + }, 128 + "mkdirp@1.0.4": { 129 + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 130 + }, 131 + "onetime@5.1.2": { 132 + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 133 + "dependencies": [ 134 + "mimic-fn" 135 + ] 136 + }, 137 + "restore-cursor@4.0.0": { 138 + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", 139 + "dependencies": [ 140 + "onetime", 141 + "signal-exit" 142 + ] 143 + }, 144 + "signal-exit@3.0.7": { 145 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 146 + }, 147 + "sisteransi@1.0.5": { 148 + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" 149 + }, 150 + "slice-ansi@5.0.0": { 151 + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", 152 + "dependencies": [ 153 + "ansi-styles", 154 + "is-fullwidth-code-point" 155 + ] 156 + }, 157 + "string-width@5.1.2": { 158 + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 159 + "dependencies": [ 160 + "eastasianwidth", 161 + "emoji-regex", 162 + "strip-ansi" 163 + ] 164 + }, 165 + "strip-ansi@7.1.0": { 166 + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 167 + "dependencies": [ 168 + "ansi-regex" 169 + ] 170 + }, 171 + "tar@6.2.1": { 172 + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 173 + "dependencies": [ 174 + "chownr", 175 + "fs-minipass", 176 + "minipass@5.0.0", 177 + "minizlib", 178 + "mkdirp", 179 + "yallist" 180 + ] 181 + }, 182 + "type-fest@1.4.0": { 183 + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" 184 + }, 185 + "wrap-ansi@8.1.0": { 186 + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 187 + "dependencies": [ 188 + "ansi-styles", 189 + "string-width", 190 + "strip-ansi" 191 + ] 192 + }, 193 + "yallist@4.0.0": { 194 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 56 195 } 57 196 }, 58 197 "workspace": { ··· 60 199 "jsr:@std/assert@1", 61 200 "npm:@atcute/bluesky@^2.0.2", 62 201 "npm:@atcute/client@^3.0.1", 63 - "npm:@skyware/jetstream@~0.2.2", 64 202 "npm:dotenv@^16.5.0" 65 203 ] 66 204 }
+11
index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>Alpine.js Test</title> 7 + </head> 8 + <body> 9 + $POSTSPLACEHOLDER 10 + </body> 11 + </html>
+1 -1
main.ts
··· 142 142 return posts; 143 143 }; 144 144 145 - console.log(await fetchAllPosts()); 145 + export { fetchAllPosts, Post };
+24
web/.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + dist 12 + dist-ssr 13 + *.local 14 + 15 + # Editor directories and files 16 + .vscode/* 17 + !.vscode/extensions.json 18 + .idea 19 + .DS_Store 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw?
+3
web/.vscode/extensions.json
··· 1 + { 2 + "recommendations": ["svelte.svelte-vscode"] 3 + }
+47
web/README.md
··· 1 + # Svelte + TS + Vite 2 + 3 + This template should help get you started developing with Svelte and TypeScript in Vite. 4 + 5 + ## Recommended IDE Setup 6 + 7 + [VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). 8 + 9 + ## Need an official Svelte framework? 10 + 11 + Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. 12 + 13 + ## Technical considerations 14 + 15 + **Why use this over SvelteKit?** 16 + 17 + - It brings its own routing solution which might not be preferable for some users. 18 + - It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. 19 + 20 + This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. 21 + 22 + Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. 23 + 24 + **Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** 25 + 26 + Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. 27 + 28 + **Why include `.vscode/extensions.json`?** 29 + 30 + Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. 31 + 32 + **Why enable `allowJs` in the TS template?** 33 + 34 + While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. 35 + 36 + **Why is HMR not preserving my local component state?** 37 + 38 + HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). 39 + 40 + If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. 41 + 42 + ```ts 43 + // store.ts 44 + // An extremely simple external store 45 + import { writable } from 'svelte/store' 46 + export default writable(0) 47 + ```
+455
web/deno.lock
··· 1 + { 2 + "version": "4", 3 + "specifiers": { 4 + "npm:@atcute/bluesky@^2.0.2": "2.0.2_@atcute+client@3.0.1", 5 + "npm:@atcute/client@^3.0.1": "3.0.1", 6 + "npm:@sveltejs/vite-plugin-svelte@^5.0.3": "5.0.3_svelte@5.28.1__acorn@8.14.1_vite@6.3.2__picomatch@4.0.2", 7 + "npm:@tsconfig/svelte@^5.0.4": "5.0.4", 8 + "npm:svelte-check@^4.1.5": "4.1.6_svelte@5.28.1__acorn@8.14.1_typescript@5.7.3", 9 + "npm:svelte@^5.23.1": "5.28.1_acorn@8.14.1", 10 + "npm:typescript@~5.7.2": "5.7.3", 11 + "npm:vite@^6.3.1": "6.3.2_picomatch@4.0.2" 12 + }, 13 + "npm": { 14 + "@ampproject/remapping@2.3.0": { 15 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 16 + "dependencies": [ 17 + "@jridgewell/gen-mapping", 18 + "@jridgewell/trace-mapping" 19 + ] 20 + }, 21 + "@atcute/bluesky@2.0.2_@atcute+client@3.0.1": { 22 + "integrity": "sha512-xU+9Rp8bzc9AOnWSc11M1urRppDt3BiWR7v2QrLt3Qoysa5jvL8j2p2w4iRT8vLByz8Q+Xgk5Kz4zWVx1zCiug==", 23 + "dependencies": [ 24 + "@atcute/client" 25 + ] 26 + }, 27 + "@atcute/client@3.0.1": { 28 + "integrity": "sha512-j51SuQYQj5jeKrx1DCXx+Q3fpVvO0JYGnKnJAdDSlesSLjPXjvnx1abC+hkuro58KRHHJvRA6P1MC0pmJsWfcg==" 29 + }, 30 + "@esbuild/aix-ppc64@0.25.2": { 31 + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==" 32 + }, 33 + "@esbuild/android-arm64@0.25.2": { 34 + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==" 35 + }, 36 + "@esbuild/android-arm@0.25.2": { 37 + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==" 38 + }, 39 + "@esbuild/android-x64@0.25.2": { 40 + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==" 41 + }, 42 + "@esbuild/darwin-arm64@0.25.2": { 43 + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==" 44 + }, 45 + "@esbuild/darwin-x64@0.25.2": { 46 + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==" 47 + }, 48 + "@esbuild/freebsd-arm64@0.25.2": { 49 + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==" 50 + }, 51 + "@esbuild/freebsd-x64@0.25.2": { 52 + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==" 53 + }, 54 + "@esbuild/linux-arm64@0.25.2": { 55 + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==" 56 + }, 57 + "@esbuild/linux-arm@0.25.2": { 58 + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==" 59 + }, 60 + "@esbuild/linux-ia32@0.25.2": { 61 + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==" 62 + }, 63 + "@esbuild/linux-loong64@0.25.2": { 64 + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==" 65 + }, 66 + "@esbuild/linux-mips64el@0.25.2": { 67 + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==" 68 + }, 69 + "@esbuild/linux-ppc64@0.25.2": { 70 + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==" 71 + }, 72 + "@esbuild/linux-riscv64@0.25.2": { 73 + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==" 74 + }, 75 + "@esbuild/linux-s390x@0.25.2": { 76 + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==" 77 + }, 78 + "@esbuild/linux-x64@0.25.2": { 79 + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==" 80 + }, 81 + "@esbuild/netbsd-arm64@0.25.2": { 82 + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==" 83 + }, 84 + "@esbuild/netbsd-x64@0.25.2": { 85 + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==" 86 + }, 87 + "@esbuild/openbsd-arm64@0.25.2": { 88 + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==" 89 + }, 90 + "@esbuild/openbsd-x64@0.25.2": { 91 + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==" 92 + }, 93 + "@esbuild/sunos-x64@0.25.2": { 94 + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==" 95 + }, 96 + "@esbuild/win32-arm64@0.25.2": { 97 + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==" 98 + }, 99 + "@esbuild/win32-ia32@0.25.2": { 100 + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==" 101 + }, 102 + "@esbuild/win32-x64@0.25.2": { 103 + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==" 104 + }, 105 + "@jridgewell/gen-mapping@0.3.8": { 106 + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 107 + "dependencies": [ 108 + "@jridgewell/set-array", 109 + "@jridgewell/sourcemap-codec", 110 + "@jridgewell/trace-mapping" 111 + ] 112 + }, 113 + "@jridgewell/resolve-uri@3.1.2": { 114 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" 115 + }, 116 + "@jridgewell/set-array@1.2.1": { 117 + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" 118 + }, 119 + "@jridgewell/sourcemap-codec@1.5.0": { 120 + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 121 + }, 122 + "@jridgewell/trace-mapping@0.3.25": { 123 + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 124 + "dependencies": [ 125 + "@jridgewell/resolve-uri", 126 + "@jridgewell/sourcemap-codec" 127 + ] 128 + }, 129 + "@rollup/rollup-android-arm-eabi@4.40.0": { 130 + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==" 131 + }, 132 + "@rollup/rollup-android-arm64@4.40.0": { 133 + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==" 134 + }, 135 + "@rollup/rollup-darwin-arm64@4.40.0": { 136 + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==" 137 + }, 138 + "@rollup/rollup-darwin-x64@4.40.0": { 139 + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==" 140 + }, 141 + "@rollup/rollup-freebsd-arm64@4.40.0": { 142 + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==" 143 + }, 144 + "@rollup/rollup-freebsd-x64@4.40.0": { 145 + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==" 146 + }, 147 + "@rollup/rollup-linux-arm-gnueabihf@4.40.0": { 148 + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==" 149 + }, 150 + "@rollup/rollup-linux-arm-musleabihf@4.40.0": { 151 + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==" 152 + }, 153 + "@rollup/rollup-linux-arm64-gnu@4.40.0": { 154 + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==" 155 + }, 156 + "@rollup/rollup-linux-arm64-musl@4.40.0": { 157 + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==" 158 + }, 159 + "@rollup/rollup-linux-loongarch64-gnu@4.40.0": { 160 + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==" 161 + }, 162 + "@rollup/rollup-linux-powerpc64le-gnu@4.40.0": { 163 + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==" 164 + }, 165 + "@rollup/rollup-linux-riscv64-gnu@4.40.0": { 166 + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==" 167 + }, 168 + "@rollup/rollup-linux-riscv64-musl@4.40.0": { 169 + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==" 170 + }, 171 + "@rollup/rollup-linux-s390x-gnu@4.40.0": { 172 + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==" 173 + }, 174 + "@rollup/rollup-linux-x64-gnu@4.40.0": { 175 + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==" 176 + }, 177 + "@rollup/rollup-linux-x64-musl@4.40.0": { 178 + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==" 179 + }, 180 + "@rollup/rollup-win32-arm64-msvc@4.40.0": { 181 + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==" 182 + }, 183 + "@rollup/rollup-win32-ia32-msvc@4.40.0": { 184 + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==" 185 + }, 186 + "@rollup/rollup-win32-x64-msvc@4.40.0": { 187 + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==" 188 + }, 189 + "@sveltejs/acorn-typescript@1.0.5_acorn@8.14.1": { 190 + "integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==", 191 + "dependencies": [ 192 + "acorn" 193 + ] 194 + }, 195 + "@sveltejs/vite-plugin-svelte-inspector@4.0.1_@sveltejs+vite-plugin-svelte@5.0.3__svelte@5.28.1___acorn@8.14.1__vite@6.3.2___picomatch@4.0.2_svelte@5.28.1__acorn@8.14.1_vite@6.3.2__picomatch@4.0.2": { 196 + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", 197 + "dependencies": [ 198 + "@sveltejs/vite-plugin-svelte", 199 + "debug", 200 + "svelte", 201 + "vite" 202 + ] 203 + }, 204 + "@sveltejs/vite-plugin-svelte@5.0.3_svelte@5.28.1__acorn@8.14.1_vite@6.3.2__picomatch@4.0.2": { 205 + "integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==", 206 + "dependencies": [ 207 + "@sveltejs/vite-plugin-svelte-inspector", 208 + "debug", 209 + "deepmerge", 210 + "kleur", 211 + "magic-string", 212 + "svelte", 213 + "vite", 214 + "vitefu" 215 + ] 216 + }, 217 + "@tsconfig/svelte@5.0.4": { 218 + "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==" 219 + }, 220 + "@types/estree@1.0.7": { 221 + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" 222 + }, 223 + "acorn@8.14.1": { 224 + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==" 225 + }, 226 + "aria-query@5.3.2": { 227 + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" 228 + }, 229 + "axobject-query@4.1.0": { 230 + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==" 231 + }, 232 + "chokidar@4.0.3": { 233 + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 234 + "dependencies": [ 235 + "readdirp" 236 + ] 237 + }, 238 + "clsx@2.1.1": { 239 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" 240 + }, 241 + "debug@4.4.0": { 242 + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 243 + "dependencies": [ 244 + "ms" 245 + ] 246 + }, 247 + "deepmerge@4.3.1": { 248 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" 249 + }, 250 + "esbuild@0.25.2": { 251 + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", 252 + "dependencies": [ 253 + "@esbuild/aix-ppc64", 254 + "@esbuild/android-arm", 255 + "@esbuild/android-arm64", 256 + "@esbuild/android-x64", 257 + "@esbuild/darwin-arm64", 258 + "@esbuild/darwin-x64", 259 + "@esbuild/freebsd-arm64", 260 + "@esbuild/freebsd-x64", 261 + "@esbuild/linux-arm", 262 + "@esbuild/linux-arm64", 263 + "@esbuild/linux-ia32", 264 + "@esbuild/linux-loong64", 265 + "@esbuild/linux-mips64el", 266 + "@esbuild/linux-ppc64", 267 + "@esbuild/linux-riscv64", 268 + "@esbuild/linux-s390x", 269 + "@esbuild/linux-x64", 270 + "@esbuild/netbsd-arm64", 271 + "@esbuild/netbsd-x64", 272 + "@esbuild/openbsd-arm64", 273 + "@esbuild/openbsd-x64", 274 + "@esbuild/sunos-x64", 275 + "@esbuild/win32-arm64", 276 + "@esbuild/win32-ia32", 277 + "@esbuild/win32-x64" 278 + ] 279 + }, 280 + "esm-env@1.2.2": { 281 + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" 282 + }, 283 + "esrap@1.4.6": { 284 + "integrity": "sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==", 285 + "dependencies": [ 286 + "@jridgewell/sourcemap-codec" 287 + ] 288 + }, 289 + "fdir@6.4.4_picomatch@4.0.2": { 290 + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 291 + "dependencies": [ 292 + "picomatch" 293 + ] 294 + }, 295 + "fsevents@2.3.3": { 296 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" 297 + }, 298 + "is-reference@3.0.3": { 299 + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", 300 + "dependencies": [ 301 + "@types/estree" 302 + ] 303 + }, 304 + "kleur@4.1.5": { 305 + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" 306 + }, 307 + "locate-character@3.0.0": { 308 + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" 309 + }, 310 + "magic-string@0.30.17": { 311 + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 312 + "dependencies": [ 313 + "@jridgewell/sourcemap-codec" 314 + ] 315 + }, 316 + "mri@1.2.0": { 317 + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" 318 + }, 319 + "ms@2.1.3": { 320 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 321 + }, 322 + "nanoid@3.3.11": { 323 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" 324 + }, 325 + "picocolors@1.1.1": { 326 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 327 + }, 328 + "picomatch@4.0.2": { 329 + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" 330 + }, 331 + "postcss@8.5.3": { 332 + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 333 + "dependencies": [ 334 + "nanoid", 335 + "picocolors", 336 + "source-map-js" 337 + ] 338 + }, 339 + "readdirp@4.1.2": { 340 + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" 341 + }, 342 + "rollup@4.40.0": { 343 + "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", 344 + "dependencies": [ 345 + "@rollup/rollup-android-arm-eabi", 346 + "@rollup/rollup-android-arm64", 347 + "@rollup/rollup-darwin-arm64", 348 + "@rollup/rollup-darwin-x64", 349 + "@rollup/rollup-freebsd-arm64", 350 + "@rollup/rollup-freebsd-x64", 351 + "@rollup/rollup-linux-arm-gnueabihf", 352 + "@rollup/rollup-linux-arm-musleabihf", 353 + "@rollup/rollup-linux-arm64-gnu", 354 + "@rollup/rollup-linux-arm64-musl", 355 + "@rollup/rollup-linux-loongarch64-gnu", 356 + "@rollup/rollup-linux-powerpc64le-gnu", 357 + "@rollup/rollup-linux-riscv64-gnu", 358 + "@rollup/rollup-linux-riscv64-musl", 359 + "@rollup/rollup-linux-s390x-gnu", 360 + "@rollup/rollup-linux-x64-gnu", 361 + "@rollup/rollup-linux-x64-musl", 362 + "@rollup/rollup-win32-arm64-msvc", 363 + "@rollup/rollup-win32-ia32-msvc", 364 + "@rollup/rollup-win32-x64-msvc", 365 + "@types/estree", 366 + "fsevents" 367 + ] 368 + }, 369 + "sade@1.8.1": { 370 + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 371 + "dependencies": [ 372 + "mri" 373 + ] 374 + }, 375 + "source-map-js@1.2.1": { 376 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" 377 + }, 378 + "svelte-check@4.1.6_svelte@5.28.1__acorn@8.14.1_typescript@5.7.3": { 379 + "integrity": "sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==", 380 + "dependencies": [ 381 + "@jridgewell/trace-mapping", 382 + "chokidar", 383 + "fdir", 384 + "picocolors", 385 + "sade", 386 + "svelte", 387 + "typescript" 388 + ] 389 + }, 390 + "svelte@5.28.1_acorn@8.14.1": { 391 + "integrity": "sha512-iOa9WmfNG95lSOSJdMhdjJ4Afok7IRAQYXpbnxhd5EINnXseG0GVa9j6WPght4eX78XfFez45Fi+uRglGKPV/Q==", 392 + "dependencies": [ 393 + "@ampproject/remapping", 394 + "@jridgewell/sourcemap-codec", 395 + "@sveltejs/acorn-typescript", 396 + "@types/estree", 397 + "acorn", 398 + "aria-query", 399 + "axobject-query", 400 + "clsx", 401 + "esm-env", 402 + "esrap", 403 + "is-reference", 404 + "locate-character", 405 + "magic-string", 406 + "zimmerframe" 407 + ] 408 + }, 409 + "tinyglobby@0.2.13_picomatch@4.0.2": { 410 + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 411 + "dependencies": [ 412 + "fdir", 413 + "picomatch" 414 + ] 415 + }, 416 + "typescript@5.7.3": { 417 + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==" 418 + }, 419 + "vite@6.3.2_picomatch@4.0.2": { 420 + "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==", 421 + "dependencies": [ 422 + "esbuild", 423 + "fdir", 424 + "fsevents", 425 + "picomatch", 426 + "postcss", 427 + "rollup", 428 + "tinyglobby" 429 + ] 430 + }, 431 + "vitefu@1.0.6_vite@6.3.2__picomatch@4.0.2": { 432 + "integrity": "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==", 433 + "dependencies": [ 434 + "vite" 435 + ] 436 + }, 437 + "zimmerframe@1.1.2": { 438 + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==" 439 + } 440 + }, 441 + "workspace": { 442 + "packageJson": { 443 + "dependencies": [ 444 + "npm:@atcute/bluesky@^2.0.2", 445 + "npm:@atcute/client@^3.0.1", 446 + "npm:@sveltejs/vite-plugin-svelte@^5.0.3", 447 + "npm:@tsconfig/svelte@^5.0.4", 448 + "npm:svelte-check@^4.1.5", 449 + "npm:svelte@^5.23.1", 450 + "npm:typescript@~5.7.2", 451 + "npm:vite@^6.3.1" 452 + ] 453 + } 454 + } 455 + }
+13
web/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <link rel="icon" type="image/svg+xml" href="/witchcraft.ico" /> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>ATProto PDS</title> 8 + </head> 9 + <body> 10 + <div id="app"></div> 11 + <script type="module" src="/src/main.ts"></script> 12 + </body> 13 + </html>
+24
web/package.json
··· 1 + { 2 + "name": "web", 3 + "private": true, 4 + "version": "0.0.0", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "vite build", 9 + "preview": "vite preview", 10 + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" 11 + }, 12 + "dependencies": { 13 + "@atcute/bluesky": "^2.0.2", 14 + "@atcute/client": "^3.0.1" 15 + }, 16 + "devDependencies": { 17 + "@sveltejs/vite-plugin-svelte": "^5.0.3", 18 + "@tsconfig/svelte": "^5.0.4", 19 + "svelte": "^5.23.1", 20 + "svelte-check": "^4.1.5", 21 + "typescript": "~5.7.2", 22 + "vite": "^6.3.1" 23 + } 24 + }
+1
web/public/vite.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
web/public/witchcraft.ico

This is a binary file and will not be displayed.

+19
web/src/App.svelte
··· 1 + <script lang="ts"> 2 + import PostComponent from "./lib/PostComponent.svelte"; 3 + import { fetchAllPosts, Post } from "./lib/pdsfetch"; 4 + const postsPromise = fetchAllPosts(); 5 + </script> 6 + 7 + <main> 8 + {#await postsPromise} 9 + <p>Loading...</p> 10 + {:then postsData} 11 + {#each postsData as postObject} 12 + <PostComponent post={postObject as Post} /> 13 + {/each} 14 + {/await} 15 + </main> 16 + 17 + <style> 18 + 19 + </style>
+79
web/src/app.css
··· 1 + :root { 2 + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; 3 + line-height: 1.5; 4 + font-weight: 400; 5 + 6 + color-scheme: light dark; 7 + color: rgba(255, 255, 255, 0.87); 8 + background-color: #242424; 9 + 10 + font-synthesis: none; 11 + text-rendering: optimizeLegibility; 12 + -webkit-font-smoothing: antialiased; 13 + -moz-osx-font-smoothing: grayscale; 14 + } 15 + 16 + a { 17 + font-weight: 500; 18 + color: #646cff; 19 + text-decoration: inherit; 20 + } 21 + a:hover { 22 + color: #535bf2; 23 + } 24 + 25 + body { 26 + margin: 0; 27 + display: flex; 28 + place-items: center; 29 + min-width: 320px; 30 + min-height: 100vh; 31 + } 32 + 33 + h1 { 34 + font-size: 3.2em; 35 + line-height: 1.1; 36 + } 37 + 38 + .card { 39 + padding: 2em; 40 + } 41 + 42 + #app { 43 + max-width: 1280px; 44 + margin: 0 auto; 45 + padding: 2rem; 46 + text-align: center; 47 + } 48 + 49 + button { 50 + border-radius: 8px; 51 + border: 1px solid transparent; 52 + padding: 0.6em 1.2em; 53 + font-size: 1em; 54 + font-weight: 500; 55 + font-family: inherit; 56 + background-color: #1a1a1a; 57 + cursor: pointer; 58 + transition: border-color 0.25s; 59 + } 60 + button:hover { 61 + border-color: #646cff; 62 + } 63 + button:focus, 64 + button:focus-visible { 65 + outline: 4px auto -webkit-focus-ring-color; 66 + } 67 + 68 + @media (prefers-color-scheme: light) { 69 + :root { 70 + color: #213547; 71 + background-color: #ffffff; 72 + } 73 + a:hover { 74 + color: #747bff; 75 + } 76 + button { 77 + background-color: #f9f9f9; 78 + } 79 + }
+1
web/src/assets/svelte.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="26.6" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 308"><path fill="#FF3E00" d="M239.682 40.707C211.113-.182 154.69-12.301 113.895 13.69L42.247 59.356a82.198 82.198 0 0 0-37.135 55.056a86.566 86.566 0 0 0 8.536 55.576a82.425 82.425 0 0 0-12.296 30.719a87.596 87.596 0 0 0 14.964 66.244c28.574 40.893 84.997 53.007 125.787 27.016l71.648-45.664a82.182 82.182 0 0 0 37.135-55.057a86.601 86.601 0 0 0-8.53-55.577a82.409 82.409 0 0 0 12.29-30.718a87.573 87.573 0 0 0-14.963-66.244"></path><path fill="#FFF" d="M106.889 270.841c-23.102 6.007-47.497-3.036-61.103-22.648a52.685 52.685 0 0 1-9.003-39.85a49.978 49.978 0 0 1 1.713-6.693l1.35-4.115l3.671 2.697a92.447 92.447 0 0 0 28.036 14.007l2.663.808l-.245 2.659a16.067 16.067 0 0 0 2.89 10.656a17.143 17.143 0 0 0 18.397 6.828a15.786 15.786 0 0 0 4.403-1.935l71.67-45.672a14.922 14.922 0 0 0 6.734-9.977a15.923 15.923 0 0 0-2.713-12.011a17.156 17.156 0 0 0-18.404-6.832a15.78 15.78 0 0 0-4.396 1.933l-27.35 17.434a52.298 52.298 0 0 1-14.553 6.391c-23.101 6.007-47.497-3.036-61.101-22.649a52.681 52.681 0 0 1-9.004-39.849a49.428 49.428 0 0 1 22.34-33.114l71.664-45.677a52.218 52.218 0 0 1 14.563-6.398c23.101-6.007 47.497 3.036 61.101 22.648a52.685 52.685 0 0 1 9.004 39.85a50.559 50.559 0 0 1-1.713 6.692l-1.35 4.116l-3.67-2.693a92.373 92.373 0 0 0-28.037-14.013l-2.664-.809l.246-2.658a16.099 16.099 0 0 0-2.89-10.656a17.143 17.143 0 0 0-18.398-6.828a15.786 15.786 0 0 0-4.402 1.935l-71.67 45.674a14.898 14.898 0 0 0-6.73 9.975a15.9 15.9 0 0 0 2.709 12.012a17.156 17.156 0 0 0 18.404 6.832a15.841 15.841 0 0 0 4.402-1.935l27.345-17.427a52.147 52.147 0 0 1 14.552-6.397c23.101-6.006 47.497 3.037 61.102 22.65a52.681 52.681 0 0 1 9.003 39.848a49.453 49.453 0 0 1-22.34 33.12l-71.664 45.673a52.218 52.218 0 0 1-14.563 6.398"></path></svg>
+21
web/src/lib/PostComponent.svelte
··· 1 + <script lang="ts"> 2 + import { Post } from "./pdsfetch"; 3 + let { post } : { post : Post } = $props(); 4 + </script> 5 + 6 + <div> 7 + <p>{post.displayName} | {post.timenotstamp}</p> 8 + <p>{post.text}</p> 9 + {#if post.replyingDid} 10 + <p>Replying to: {post.replyingDid}</p> 11 + {/if} 12 + {#if post.imagesLinksCid} 13 + {#each post.imagesLinksCid as imageLink} 14 + <img src="https://pds.witchcraft.systems/xrpc/com.atproto.sync.getBlob?did={post.authorDid}&cid={imageLink}" /> 15 + {/each} 16 + {/if} 17 + {#if post.videosLinkCid} 18 + <video src="https://pds.witchcraft.systems/xrpc/com.atproto.sync.getBlob?did={post.authorDid}&cid={post.videosLinkCid}" /> 19 + {/if} 20 + 21 + </div>
+153
web/src/lib/pdsfetch.ts
··· 1 + import { simpleFetchHandler, XRPC } from "@atcute/client"; 2 + import "@atcute/bluesky/lexicons"; 3 + // import { ComAtprotoRepoListRecords } from "@atcute/client/lexicons"; 4 + // import { AppBskyFeedPost } from "@atcute/client/lexicons"; 5 + // import { AppBskyActorDefs } from "@atcute/client/lexicons"; 6 + 7 + interface AccountMetadata { 8 + did: string; 9 + displayName: string; 10 + avatarCid: string | null; 11 + } 12 + class Post { 13 + authorDid: string; 14 + displayName : string; 15 + text: string; 16 + timestamp: number; 17 + timenotstamp: string; 18 + quotingDid: string | null; 19 + replyingDid: string | null; 20 + imagesLinksCid: string[] | null; 21 + imagesAltText: string[] | null; 22 + videosLinkCid: string | null; 23 + videosLinksUrls: string[] | null; 24 + 25 + constructor(record: ComAtprotoRepoListRecords.Record, account : AccountMetadata) { 26 + this.authorDid = account.did; 27 + this.displayName = account.displayName; 28 + const post = record.value as AppBskyFeedPost.Record; 29 + this.timenotstamp = post.createdAt; 30 + this.text = post.text; 31 + this.timestamp = Date.parse(post.createdAt); 32 + if (post.reply) { 33 + this.replyingDid = didFromATuri(post.reply.parent.uri).repo; 34 + } else { 35 + this.replyingDid = null; 36 + } 37 + this.quotingDid = null; 38 + this.imagesLinksCid = null; 39 + this.videosLinkCid = null; 40 + switch (post.embed?.$type) { 41 + case "app.bsky.embed.images": 42 + this.imagesLinksCid = post.embed.images.map((imageRecord) => 43 + imageRecord.image.ref.$link 44 + ); 45 + this.imagesAltText = post.embed.images.map((imageRecord) => imageRecord.alt || "no alt text :(") 46 + break; 47 + case "app.bsky.embed.video": 48 + this.videosLinkCid = post.embed.video.ref.$link; 49 + break; 50 + case "app.bsky.embed.record": 51 + this.quotingDid = didFromATuri(post.embed.record.uri).repo; 52 + break; 53 + case "app.bsky.embed.recordWithMedia": 54 + this.quotingDid = didFromATuri(post.embed.record.record.uri).repo; 55 + switch (post.embed.media.$type) { 56 + case "app.bsky.embed.images": 57 + this.imagesLinksCid = post.embed.media.images.map((imageRecord) => 58 + imageRecord.image.ref.$link 59 + ); 60 + this.imagesAltText = post.embed.images.map((imageRecord) => imageRecord.alt || "no alt text :(") 61 + 62 + break; 63 + case "app.bsky.embed.video": 64 + this.videosLinkCid = post.embed.media.video.ref.$link; 65 + 66 + break; 67 + } 68 + break; 69 + } 70 + } 71 + } 72 + 73 + const didFromATuri = (aturi: string) => { 74 + const parts = aturi.split("/"); 75 + return { 76 + repo: parts[2], 77 + collection: parts[3], 78 + rkey: parts[4], 79 + }; 80 + }; 81 + 82 + const rpc = new XRPC({ 83 + handler: simpleFetchHandler({ 84 + service: "https://pds.witchcraft.systems", 85 + }), 86 + }); 87 + 88 + const getDidsFromPDS = async () => { 89 + const { data } = await rpc.get("com.atproto.sync.listRepos", { 90 + params: {}, 91 + }); 92 + return data.repos.map((repo: any) => (repo.did)); 93 + }; 94 + const getAccountMetadata = async (did: `did:${string}:${string}`) => { 95 + // gonna assume self exists in the app.bsky.actor.profile 96 + const { data } = await rpc.get("com.atproto.repo.getRecord", { 97 + params: { 98 + repo: did, 99 + collection: "app.bsky.actor.profile", 100 + rkey: "self", 101 + }, 102 + }); 103 + const value = data.value as AppBskyActorDefs.ProfileView; 104 + const account: AccountMetadata = { 105 + did: did, 106 + displayName: value.displayName || "", 107 + avatarCid: null, 108 + }; 109 + if (value.avatar) { 110 + account.avatarCid = value.avatar.ref["$link"]; 111 + } 112 + return account; 113 + }; 114 + 115 + const getAllMetadataFromPds = async () => { 116 + const dids = await getDidsFromPDS(); 117 + const metadata = await Promise.all( 118 + dids.map(async (repo: `did:${string}:${string}`) => { 119 + return await getAccountMetadata(repo); 120 + }), 121 + ); 122 + return metadata; 123 + }; 124 + 125 + const fetchPosts = async (did: string) => { 126 + const { data } = await rpc.get("com.atproto.repo.listRecords", { 127 + params: { 128 + repo: did, 129 + collection: "app.bsky.feed.post", 130 + limit: 5, 131 + }, 132 + }); 133 + return { 134 + records: data.records as ComAtprotoRepoListRecords.Record[], 135 + did: did, 136 + }; 137 + }; 138 + 139 + const fetchAllPosts = async () => { 140 + const users: AccountMetadata[] = await getAllMetadataFromPds(); 141 + const postRecords = await Promise.all( 142 + users.map(async (metadata: AccountMetadata) => 143 + await fetchPosts(metadata.did) 144 + ), 145 + ); 146 + const posts : Post[] = postRecords.flatMap((userFetch) => 147 + userFetch.records.map((record) => new Post(record, users.find((user : AccountMetadata) => user.did == userFetch.did))) 148 + ); 149 + posts.sort((a, b) => b.timestamp - a.timestamp); 150 + return posts; 151 + }; 152 + 153 + export { fetchAllPosts, Post };
+9
web/src/main.ts
··· 1 + import { mount } from 'svelte' 2 + import './app.css' 3 + import App from './App.svelte' 4 + 5 + const app = mount(App, { 6 + target: document.getElementById('app')!, 7 + }) 8 + 9 + export default app
+2
web/src/vite-env.d.ts
··· 1 + /// <reference types="svelte" /> 2 + /// <reference types="vite/client" />
+7
web/svelte.config.js
··· 1 + import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 2 + 3 + export default { 4 + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 5 + // for more information about preprocessors 6 + preprocess: vitePreprocess(), 7 + }
+20
web/tsconfig.app.json
··· 1 + { 2 + "extends": "@tsconfig/svelte/tsconfig.json", 3 + "compilerOptions": { 4 + "target": "ESNext", 5 + "useDefineForClassFields": true, 6 + "module": "ESNext", 7 + "resolveJsonModule": true, 8 + /** 9 + * Typecheck JS in `.svelte` and `.js` files by default. 10 + * Disable checkJs if you'd like to use dynamic types in JS. 11 + * Note that setting allowJs false does not prevent the use 12 + * of JS in `.svelte` files. 13 + */ 14 + "allowJs": true, 15 + "checkJs": true, 16 + "isolatedModules": true, 17 + "moduleDetection": "force" 18 + }, 19 + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] 20 + }
+7
web/tsconfig.json
··· 1 + { 2 + "files": [], 3 + "references": [ 4 + { "path": "./tsconfig.app.json" }, 5 + { "path": "./tsconfig.node.json" } 6 + ] 7 + }
+24
web/tsconfig.node.json
··· 1 + { 2 + "compilerOptions": { 3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 + "target": "ES2022", 5 + "lib": ["ES2023"], 6 + "module": "ESNext", 7 + "skipLibCheck": true, 8 + 9 + /* Bundler mode */ 10 + "moduleResolution": "bundler", 11 + "allowImportingTsExtensions": true, 12 + "isolatedModules": true, 13 + "moduleDetection": "force", 14 + "noEmit": true, 15 + 16 + /* Linting */ 17 + "strict": true, 18 + "noUnusedLocals": true, 19 + "noUnusedParameters": true, 20 + "noFallthroughCasesInSwitch": true, 21 + "noUncheckedSideEffectImports": true 22 + }, 23 + "include": ["vite.config.ts"] 24 + }
+7
web/vite.config.ts
··· 1 + import { defineConfig } from 'vite' 2 + import { svelte } from '@sveltejs/vite-plugin-svelte' 3 + 4 + // https://vite.dev/config/ 5 + export default defineConfig({ 6 + plugins: [svelte()], 7 + })