-1
deno.json
-1
deno.json
+152
-14
deno.lock
+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
+11
index.html
+1
-1
main.ts
+1
-1
main.ts
+24
web/.gitignore
+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?
+47
web/README.md
+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
+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
+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
+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
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
web/public/witchcraft.ico
This is a binary file and will not be displayed.
+19
web/src/App.svelte
+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
+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
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
+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
+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
+9
web/src/main.ts
+2
web/src/vite-env.d.ts
+2
web/src/vite-env.d.ts
+7
web/svelte.config.js
+7
web/svelte.config.js
+20
web/tsconfig.app.json
+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
+7
web/tsconfig.json
+24
web/tsconfig.node.json
+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
+
}