detached 35d8b67

feat: initial auth setup and db configuration

- Add 'docs/' to .gitignore
- Add database dependencies and scripts
- Update devDependencies with necessary packages
- Add initial User interface with auth fields
- Create basic AimLogin component
- Update chat room styling and types
commit
35d8b67fc4723e3578a46322f5a82631cba69965
author
Kit · · 2025-02-10 18:02 UTC
parent
2c4b9db
signature
SSH UnverifiedSHA256:H91DFuEG4jpk5edzLA4aUKkpv4zv9Q339ipRmkph6Tk The key is unknown
25 files · +2559 -78
M .gitignore +2 -0
@@ -21,3 +21,5 @@ Thumbs.db
2121 # Vite
2222 vite.config.js.timestamp-*
2323 vite.config.ts.timestamp-*
24+
25+docs/⏎̸
@@ -21,3 +21,5 @@ Thumbs.db
21 # Vite21 # Vite
22 vite.config.js.timestamp-*22 vite.config.js.timestamp-*
23 vite.config.ts.timestamp-*23 vite.config.ts.timestamp-*
24+
25+docs/⏎̸
A drizzle.config.ts +12 -0
@@ -0,0 +1,12 @@
1+import 'dotenv/config';
2+import { defineConfig } from 'drizzle-kit';
3+
4+export default defineConfig({
5+ out: './drizzle',
6+ schema: './src/lib/db/schema.ts',
7+ dialect: 'turso',
8+ dbCredentials: {
9+ url: process.env.TURSO_DATABASE_URL as string,
10+ authToken: process.env.TURSO_AUTH_TOKEN as string,
11+ },
12+});⏎̸
@@ -0,0 +1,12 @@
1+import 'dotenv/config';
2+import { defineConfig } from 'drizzle-kit';
3+
4+export default defineConfig({
5+ out: './drizzle',
6+ schema: './src/lib/db/schema.ts',
7+ dialect: 'turso',
8+ dbCredentials: {
9+ url: process.env.TURSO_DATABASE_URL as string,
10+ authToken: process.env.TURSO_AUTH_TOKEN as string,
11+ },
12+});⏎̸
A drizzle/0000_shallow_ghost_rider.sql +33 -0
@@ -0,0 +1,33 @@
1+CREATE TABLE `chat_rooms` (
2+ `id` text PRIMARY KEY NOT NULL,
3+ `name` text,
4+ `type` text DEFAULT 'direct' NOT NULL,
5+ `created_at` integer NOT NULL
6+);
7+--> statement-breakpoint
8+CREATE TABLE `messages` (
9+ `id` text PRIMARY KEY NOT NULL,
10+ `chat_room_id` text NOT NULL,
11+ `sender_id` text NOT NULL,
12+ `content` text NOT NULL,
13+ `type` text DEFAULT 'chat' NOT NULL,
14+ `timestamp` integer NOT NULL,
15+ FOREIGN KEY (`chat_room_id`) REFERENCES `chat_rooms`(`id`) ON UPDATE no action ON DELETE no action,
16+ FOREIGN KEY (`sender_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
17+);
18+--> statement-breakpoint
19+CREATE TABLE `users` (
20+ `id` text PRIMARY KEY NOT NULL,
21+ `email` text NOT NULL,
22+ `password` text NOT NULL,
23+ `nickname` text NOT NULL,
24+ `status` text DEFAULT 'offline',
25+ `avatar_url` text,
26+ `created_at` integer NOT NULL,
27+ `last_seen` integer
28+);
29+--> statement-breakpoint
30+CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);--> statement-breakpoint
31+CREATE VIEW `chat_room_view` AS select "id", "name", "type", "created_at" from "chat_rooms";--> statement-breakpoint
32+CREATE VIEW `message_view` AS select "messages"."id", "messages"."content", "messages"."type", "messages"."timestamp", "users"."nickname", "chat_rooms"."name" from "messages" left join "users" on "messages"."sender_id" = "users"."id" left join "chat_rooms" on "messages"."chat_room_id" = "chat_rooms"."id";--> statement-breakpoint
33+CREATE VIEW `user_view` AS select "id", "nickname", "status", "avatar_url", "last_seen" from "users";⏎̸
@@ -0,0 +1,33 @@
1+CREATE TABLE `chat_rooms` (
2+ `id` text PRIMARY KEY NOT NULL,
3+ `name` text,
4+ `type` text DEFAULT 'direct' NOT NULL,
5+ `created_at` integer NOT NULL
6+);
7+--> statement-breakpoint
8+CREATE TABLE `messages` (
9+ `id` text PRIMARY KEY NOT NULL,
10+ `chat_room_id` text NOT NULL,
11+ `sender_id` text NOT NULL,
12+ `content` text NOT NULL,
13+ `type` text DEFAULT 'chat' NOT NULL,
14+ `timestamp` integer NOT NULL,
15+ FOREIGN KEY (`chat_room_id`) REFERENCES `chat_rooms`(`id`) ON UPDATE no action ON DELETE no action,
16+ FOREIGN KEY (`sender_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
17+);
18+--> statement-breakpoint
19+CREATE TABLE `users` (
20+ `id` text PRIMARY KEY NOT NULL,
21+ `email` text NOT NULL,
22+ `password` text NOT NULL,
23+ `nickname` text NOT NULL,
24+ `status` text DEFAULT 'offline',
25+ `avatar_url` text,
26+ `created_at` integer NOT NULL,
27+ `last_seen` integer
28+);
29+--> statement-breakpoint
30+CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);--> statement-breakpoint
31+CREATE VIEW `chat_room_view` AS select "id", "name", "type", "created_at" from "chat_rooms";--> statement-breakpoint
32+CREATE VIEW `message_view` AS select "messages"."id", "messages"."content", "messages"."type", "messages"."timestamp", "users"."nickname", "chat_rooms"."name" from "messages" left join "users" on "messages"."sender_id" = "users"."id" left join "chat_rooms" on "messages"."chat_room_id" = "chat_rooms"."id";--> statement-breakpoint
33+CREATE VIEW `user_view` AS select "id", "nickname", "status", "avatar_url", "last_seen" from "users";⏎̸
A drizzle/meta/0000_snapshot.json +342 -0
@@ -0,0 +1,342 @@
1+{
2+ "version": "6",
3+ "dialect": "sqlite",
4+ "id": "16b13426-2b9d-4084-8e17-71f9de0f72d0",
5+ "prevId": "00000000-0000-0000-0000-000000000000",
6+ "tables": {
7+ "chat_rooms": {
8+ "name": "chat_rooms",
9+ "columns": {
10+ "id": {
11+ "name": "id",
12+ "type": "text",
13+ "primaryKey": true,
14+ "notNull": true,
15+ "autoincrement": false
16+ },
17+ "name": {
18+ "name": "name",
19+ "type": "text",
20+ "primaryKey": false,
21+ "notNull": false,
22+ "autoincrement": false
23+ },
24+ "type": {
25+ "name": "type",
26+ "type": "text",
27+ "primaryKey": false,
28+ "notNull": true,
29+ "autoincrement": false,
30+ "default": "'direct'"
31+ },
32+ "created_at": {
33+ "name": "created_at",
34+ "type": "integer",
35+ "primaryKey": false,
36+ "notNull": true,
37+ "autoincrement": false
38+ }
39+ },
40+ "indexes": {},
41+ "foreignKeys": {},
42+ "compositePrimaryKeys": {},
43+ "uniqueConstraints": {},
44+ "checkConstraints": {}
45+ },
46+ "messages": {
47+ "name": "messages",
48+ "columns": {
49+ "id": {
50+ "name": "id",
51+ "type": "text",
52+ "primaryKey": true,
53+ "notNull": true,
54+ "autoincrement": false
55+ },
56+ "chat_room_id": {
57+ "name": "chat_room_id",
58+ "type": "text",
59+ "primaryKey": false,
60+ "notNull": true,
61+ "autoincrement": false
62+ },
63+ "sender_id": {
64+ "name": "sender_id",
65+ "type": "text",
66+ "primaryKey": false,
67+ "notNull": true,
68+ "autoincrement": false
69+ },
70+ "content": {
71+ "name": "content",
72+ "type": "text",
73+ "primaryKey": false,
74+ "notNull": true,
75+ "autoincrement": false
76+ },
77+ "type": {
78+ "name": "type",
79+ "type": "text",
80+ "primaryKey": false,
81+ "notNull": true,
82+ "autoincrement": false,
83+ "default": "'chat'"
84+ },
85+ "timestamp": {
86+ "name": "timestamp",
87+ "type": "integer",
88+ "primaryKey": false,
89+ "notNull": true,
90+ "autoincrement": false
91+ }
92+ },
93+ "indexes": {},
94+ "foreignKeys": {
95+ "messages_chat_room_id_chat_rooms_id_fk": {
96+ "name": "messages_chat_room_id_chat_rooms_id_fk",
97+ "tableFrom": "messages",
98+ "tableTo": "chat_rooms",
99+ "columnsFrom": [
100+ "chat_room_id"
101+ ],
102+ "columnsTo": [
103+ "id"
104+ ],
105+ "onDelete": "no action",
106+ "onUpdate": "no action"
107+ },
108+ "messages_sender_id_users_id_fk": {
109+ "name": "messages_sender_id_users_id_fk",
110+ "tableFrom": "messages",
111+ "tableTo": "users",
112+ "columnsFrom": [
113+ "sender_id"
114+ ],
115+ "columnsTo": [
116+ "id"
117+ ],
118+ "onDelete": "no action",
119+ "onUpdate": "no action"
120+ }
121+ },
122+ "compositePrimaryKeys": {},
123+ "uniqueConstraints": {},
124+ "checkConstraints": {}
125+ },
126+ "users": {
127+ "name": "users",
128+ "columns": {
129+ "id": {
130+ "name": "id",
131+ "type": "text",
132+ "primaryKey": true,
133+ "notNull": true,
134+ "autoincrement": false
135+ },
136+ "email": {
137+ "name": "email",
138+ "type": "text",
139+ "primaryKey": false,
140+ "notNull": true,
141+ "autoincrement": false
142+ },
143+ "password": {
144+ "name": "password",
145+ "type": "text",
146+ "primaryKey": false,
147+ "notNull": true,
148+ "autoincrement": false
149+ },
150+ "nickname": {
151+ "name": "nickname",
152+ "type": "text",
153+ "primaryKey": false,
154+ "notNull": true,
155+ "autoincrement": false
156+ },
157+ "status": {
158+ "name": "status",
159+ "type": "text",
160+ "primaryKey": false,
161+ "notNull": false,
162+ "autoincrement": false,
163+ "default": "'offline'"
164+ },
165+ "avatar_url": {
166+ "name": "avatar_url",
167+ "type": "text",
168+ "primaryKey": false,
169+ "notNull": false,
170+ "autoincrement": false
171+ },
172+ "created_at": {
173+ "name": "created_at",
174+ "type": "integer",
175+ "primaryKey": false,
176+ "notNull": true,
177+ "autoincrement": false
178+ },
179+ "last_seen": {
180+ "name": "last_seen",
181+ "type": "integer",
182+ "primaryKey": false,
183+ "notNull": false,
184+ "autoincrement": false
185+ }
186+ },
187+ "indexes": {
188+ "users_email_unique": {
189+ "name": "users_email_unique",
190+ "columns": [
191+ "email"
192+ ],
193+ "isUnique": true
194+ }
195+ },
196+ "foreignKeys": {},
197+ "compositePrimaryKeys": {},
198+ "uniqueConstraints": {},
199+ "checkConstraints": {}
200+ }
201+ },
202+ "views": {
203+ "chat_room_view": {
204+ "columns": {
205+ "id": {
206+ "name": "id",
207+ "type": "text",
208+ "primaryKey": true,
209+ "notNull": true,
210+ "autoincrement": false
211+ },
212+ "name": {
213+ "name": "name",
214+ "type": "text",
215+ "primaryKey": false,
216+ "notNull": false,
217+ "autoincrement": false
218+ },
219+ "type": {
220+ "name": "type",
221+ "type": "text",
222+ "primaryKey": false,
223+ "notNull": true,
224+ "autoincrement": false,
225+ "default": "'direct'"
226+ },
227+ "created_at": {
228+ "name": "created_at",
229+ "type": "integer",
230+ "primaryKey": false,
231+ "notNull": true,
232+ "autoincrement": false
233+ }
234+ },
235+ "name": "chat_room_view",
236+ "isExisting": false,
237+ "definition": "select \"id\", \"name\", \"type\", \"created_at\" from \"chat_rooms\""
238+ },
239+ "message_view": {
240+ "columns": {
241+ "id": {
242+ "name": "id",
243+ "type": "text",
244+ "primaryKey": true,
245+ "notNull": true,
246+ "autoincrement": false
247+ },
248+ "content": {
249+ "name": "content",
250+ "type": "text",
251+ "primaryKey": false,
252+ "notNull": true,
253+ "autoincrement": false
254+ },
255+ "type": {
256+ "name": "type",
257+ "type": "text",
258+ "primaryKey": false,
259+ "notNull": true,
260+ "autoincrement": false,
261+ "default": "'chat'"
262+ },
263+ "timestamp": {
264+ "name": "timestamp",
265+ "type": "integer",
266+ "primaryKey": false,
267+ "notNull": true,
268+ "autoincrement": false
269+ },
270+ "nickname": {
271+ "name": "nickname",
272+ "type": "text",
273+ "primaryKey": false,
274+ "notNull": true,
275+ "autoincrement": false
276+ },
277+ "name": {
278+ "name": "name",
279+ "type": "text",
280+ "primaryKey": false,
281+ "notNull": false,
282+ "autoincrement": false
283+ }
284+ },
285+ "name": "message_view",
286+ "isExisting": false,
287+ "definition": "select \"messages\".\"id\", \"messages\".\"content\", \"messages\".\"type\", \"messages\".\"timestamp\", \"users\".\"nickname\", \"chat_rooms\".\"name\" from \"messages\" left join \"users\" on \"messages\".\"sender_id\" = \"users\".\"id\" left join \"chat_rooms\" on \"messages\".\"chat_room_id\" = \"chat_rooms\".\"id\""
288+ },
289+ "user_view": {
290+ "columns": {
291+ "id": {
292+ "name": "id",
293+ "type": "text",
294+ "primaryKey": true,
295+ "notNull": true,
296+ "autoincrement": false
297+ },
298+ "nickname": {
299+ "name": "nickname",
300+ "type": "text",
301+ "primaryKey": false,
302+ "notNull": true,
303+ "autoincrement": false
304+ },
305+ "status": {
306+ "name": "status",
307+ "type": "text",
308+ "primaryKey": false,
309+ "notNull": false,
310+ "autoincrement": false,
311+ "default": "'offline'"
312+ },
313+ "avatar_url": {
314+ "name": "avatar_url",
315+ "type": "text",
316+ "primaryKey": false,
317+ "notNull": false,
318+ "autoincrement": false
319+ },
320+ "last_seen": {
321+ "name": "last_seen",
322+ "type": "integer",
323+ "primaryKey": false,
324+ "notNull": false,
325+ "autoincrement": false
326+ }
327+ },
328+ "name": "user_view",
329+ "isExisting": false,
330+ "definition": "select \"id\", \"nickname\", \"status\", \"avatar_url\", \"last_seen\" from \"users\""
331+ }
332+ },
333+ "enums": {},
334+ "_meta": {
335+ "schemas": {},
336+ "tables": {},
337+ "columns": {}
338+ },
339+ "internal": {
340+ "indexes": {}
341+ }
342+}⏎̸
@@ -0,0 +1,342 @@
1+{
2+ "version": "6",
3+ "dialect": "sqlite",
4+ "id": "16b13426-2b9d-4084-8e17-71f9de0f72d0",
5+ "prevId": "00000000-0000-0000-0000-000000000000",
6+ "tables": {
7+ "chat_rooms": {
8+ "name": "chat_rooms",
9+ "columns": {
10+ "id": {
11+ "name": "id",
12+ "type": "text",
13+ "primaryKey": true,
14+ "notNull": true,
15+ "autoincrement": false
16+ },
17+ "name": {
18+ "name": "name",
19+ "type": "text",
20+ "primaryKey": false,
21+ "notNull": false,
22+ "autoincrement": false
23+ },
24+ "type": {
25+ "name": "type",
26+ "type": "text",
27+ "primaryKey": false,
28+ "notNull": true,
29+ "autoincrement": false,
30+ "default": "'direct'"
31+ },
32+ "created_at": {
33+ "name": "created_at",
34+ "type": "integer",
35+ "primaryKey": false,
36+ "notNull": true,
37+ "autoincrement": false
38+ }
39+ },
40+ "indexes": {},
41+ "foreignKeys": {},
42+ "compositePrimaryKeys": {},
43+ "uniqueConstraints": {},
44+ "checkConstraints": {}
45+ },
46+ "messages": {
47+ "name": "messages",
48+ "columns": {
49+ "id": {
50+ "name": "id",
51+ "type": "text",
52+ "primaryKey": true,
53+ "notNull": true,
54+ "autoincrement": false
55+ },
56+ "chat_room_id": {
57+ "name": "chat_room_id",
58+ "type": "text",
59+ "primaryKey": false,
60+ "notNull": true,
61+ "autoincrement": false
62+ },
63+ "sender_id": {
64+ "name": "sender_id",
65+ "type": "text",
66+ "primaryKey": false,
67+ "notNull": true,
68+ "autoincrement": false
69+ },
70+ "content": {
71+ "name": "content",
72+ "type": "text",
73+ "primaryKey": false,
74+ "notNull": true,
75+ "autoincrement": false
76+ },
77+ "type": {
78+ "name": "type",
79+ "type": "text",
80+ "primaryKey": false,
81+ "notNull": true,
82+ "autoincrement": false,
83+ "default": "'chat'"
84+ },
85+ "timestamp": {
86+ "name": "timestamp",
87+ "type": "integer",
88+ "primaryKey": false,
89+ "notNull": true,
90+ "autoincrement": false
91+ }
92+ },
93+ "indexes": {},
94+ "foreignKeys": {
95+ "messages_chat_room_id_chat_rooms_id_fk": {
96+ "name": "messages_chat_room_id_chat_rooms_id_fk",
97+ "tableFrom": "messages",
98+ "tableTo": "chat_rooms",
99+ "columnsFrom": [
100+ "chat_room_id"
101+ ],
102+ "columnsTo": [
103+ "id"
104+ ],
105+ "onDelete": "no action",
106+ "onUpdate": "no action"
107+ },
108+ "messages_sender_id_users_id_fk": {
109+ "name": "messages_sender_id_users_id_fk",
110+ "tableFrom": "messages",
111+ "tableTo": "users",
112+ "columnsFrom": [
113+ "sender_id"
114+ ],
115+ "columnsTo": [
116+ "id"
117+ ],
118+ "onDelete": "no action",
119+ "onUpdate": "no action"
120+ }
121+ },
122+ "compositePrimaryKeys": {},
123+ "uniqueConstraints": {},
124+ "checkConstraints": {}
125+ },
126+ "users": {
127+ "name": "users",
128+ "columns": {
129+ "id": {
130+ "name": "id",
131+ "type": "text",
132+ "primaryKey": true,
133+ "notNull": true,
134+ "autoincrement": false
135+ },
136+ "email": {
137+ "name": "email",
138+ "type": "text",
139+ "primaryKey": false,
140+ "notNull": true,
141+ "autoincrement": false
142+ },
143+ "password": {
144+ "name": "password",
145+ "type": "text",
146+ "primaryKey": false,
147+ "notNull": true,
148+ "autoincrement": false
149+ },
150+ "nickname": {
151+ "name": "nickname",
152+ "type": "text",
153+ "primaryKey": false,
154+ "notNull": true,
155+ "autoincrement": false
156+ },
157+ "status": {
158+ "name": "status",
159+ "type": "text",
160+ "primaryKey": false,
161+ "notNull": false,
162+ "autoincrement": false,
163+ "default": "'offline'"
164+ },
165+ "avatar_url": {
166+ "name": "avatar_url",
167+ "type": "text",
168+ "primaryKey": false,
169+ "notNull": false,
170+ "autoincrement": false
171+ },
172+ "created_at": {
173+ "name": "created_at",
174+ "type": "integer",
175+ "primaryKey": false,
176+ "notNull": true,
177+ "autoincrement": false
178+ },
179+ "last_seen": {
180+ "name": "last_seen",
181+ "type": "integer",
182+ "primaryKey": false,
183+ "notNull": false,
184+ "autoincrement": false
185+ }
186+ },
187+ "indexes": {
188+ "users_email_unique": {
189+ "name": "users_email_unique",
190+ "columns": [
191+ "email"
192+ ],
193+ "isUnique": true
194+ }
195+ },
196+ "foreignKeys": {},
197+ "compositePrimaryKeys": {},
198+ "uniqueConstraints": {},
199+ "checkConstraints": {}
200+ }
201+ },
202+ "views": {
203+ "chat_room_view": {
204+ "columns": {
205+ "id": {
206+ "name": "id",
207+ "type": "text",
208+ "primaryKey": true,
209+ "notNull": true,
210+ "autoincrement": false
211+ },
212+ "name": {
213+ "name": "name",
214+ "type": "text",
215+ "primaryKey": false,
216+ "notNull": false,
217+ "autoincrement": false
218+ },
219+ "type": {
220+ "name": "type",
221+ "type": "text",
222+ "primaryKey": false,
223+ "notNull": true,
224+ "autoincrement": false,
225+ "default": "'direct'"
226+ },
227+ "created_at": {
228+ "name": "created_at",
229+ "type": "integer",
230+ "primaryKey": false,
231+ "notNull": true,
232+ "autoincrement": false
233+ }
234+ },
235+ "name": "chat_room_view",
236+ "isExisting": false,
237+ "definition": "select \"id\", \"name\", \"type\", \"created_at\" from \"chat_rooms\""
238+ },
239+ "message_view": {
240+ "columns": {
241+ "id": {
242+ "name": "id",
243+ "type": "text",
244+ "primaryKey": true,
245+ "notNull": true,
246+ "autoincrement": false
247+ },
248+ "content": {
249+ "name": "content",
250+ "type": "text",
251+ "primaryKey": false,
252+ "notNull": true,
253+ "autoincrement": false
254+ },
255+ "type": {
256+ "name": "type",
257+ "type": "text",
258+ "primaryKey": false,
259+ "notNull": true,
260+ "autoincrement": false,
261+ "default": "'chat'"
262+ },
263+ "timestamp": {
264+ "name": "timestamp",
265+ "type": "integer",
266+ "primaryKey": false,
267+ "notNull": true,
268+ "autoincrement": false
269+ },
270+ "nickname": {
271+ "name": "nickname",
272+ "type": "text",
273+ "primaryKey": false,
274+ "notNull": true,
275+ "autoincrement": false
276+ },
277+ "name": {
278+ "name": "name",
279+ "type": "text",
280+ "primaryKey": false,
281+ "notNull": false,
282+ "autoincrement": false
283+ }
284+ },
285+ "name": "message_view",
286+ "isExisting": false,
287+ "definition": "select \"messages\".\"id\", \"messages\".\"content\", \"messages\".\"type\", \"messages\".\"timestamp\", \"users\".\"nickname\", \"chat_rooms\".\"name\" from \"messages\" left join \"users\" on \"messages\".\"sender_id\" = \"users\".\"id\" left join \"chat_rooms\" on \"messages\".\"chat_room_id\" = \"chat_rooms\".\"id\""
288+ },
289+ "user_view": {
290+ "columns": {
291+ "id": {
292+ "name": "id",
293+ "type": "text",
294+ "primaryKey": true,
295+ "notNull": true,
296+ "autoincrement": false
297+ },
298+ "nickname": {
299+ "name": "nickname",
300+ "type": "text",
301+ "primaryKey": false,
302+ "notNull": true,
303+ "autoincrement": false
304+ },
305+ "status": {
306+ "name": "status",
307+ "type": "text",
308+ "primaryKey": false,
309+ "notNull": false,
310+ "autoincrement": false,
311+ "default": "'offline'"
312+ },
313+ "avatar_url": {
314+ "name": "avatar_url",
315+ "type": "text",
316+ "primaryKey": false,
317+ "notNull": false,
318+ "autoincrement": false
319+ },
320+ "last_seen": {
321+ "name": "last_seen",
322+ "type": "integer",
323+ "primaryKey": false,
324+ "notNull": false,
325+ "autoincrement": false
326+ }
327+ },
328+ "name": "user_view",
329+ "isExisting": false,
330+ "definition": "select \"id\", \"nickname\", \"status\", \"avatar_url\", \"last_seen\" from \"users\""
331+ }
332+ },
333+ "enums": {},
334+ "_meta": {
335+ "schemas": {},
336+ "tables": {},
337+ "columns": {}
338+ },
339+ "internal": {
340+ "indexes": {}
341+ }
342+}⏎̸
A drizzle/meta/_journal.json +13 -0
@@ -0,0 +1,13 @@
1+{
2+ "version": "7",
3+ "dialect": "sqlite",
4+ "entries": [
5+ {
6+ "idx": 0,
7+ "version": "6",
8+ "when": 1739208055141,
9+ "tag": "0000_shallow_ghost_rider",
10+ "breakpoints": true
11+ }
12+ ]
13+}⏎̸
@@ -0,0 +1,13 @@
1+{
2+ "version": "7",
3+ "dialect": "sqlite",
4+ "entries": [
5+ {
6+ "idx": 0,
7+ "version": "6",
8+ "when": 1739208055141,
9+ "tag": "0000_shallow_ghost_rider",
10+ "breakpoints": true
11+ }
12+ ]
13+}⏎̸
M package.json +10 -1
@@ -16,7 +16,9 @@
1616 "format": "prettier --write .",
1717 "lint": "prettier --check . && eslint .",
1818 "test:unit": "vitest",
19- "test": "npm run test:unit -- --run"
19+ "test": "npm run test:unit -- --run",
20+ "db:generate": "pnpx drizzle-kit generate",
21+ "db:push": "pnpx drizzle-kit push"
2022 },
2123 "devDependencies": {
2224 "@eslint/compat": "^1.2.5",
@@ -27,7 +29,9 @@
2729 "@tailwindcss/container-queries": "^0.1.1",
2830 "@tailwindcss/forms": "^0.5.10",
2931 "@tailwindcss/typography": "^0.5.16",
32+ "@types/node": "^22.13.1",
3033 "autoprefixer": "^10.4.20",
34+ "drizzle-kit": "^0.30.4",
3135 "eslint": "^9.18.0",
3236 "eslint-config-prettier": "^10.0.1",
3337 "eslint-plugin-svelte": "^2.46.1",
@@ -38,12 +42,17 @@
3842 "svelte": "^5.0.0",
3943 "svelte-check": "^4.0.0",
4044 "tailwindcss": "^3.4.17",
45+ "tsx": "^4.19.2",
4146 "typescript": "^5.0.0",
4247 "typescript-eslint": "^8.20.0",
4348 "vite": "^6.0.0",
4449 "vitest": "^3.0.0"
4550 },
4651 "dependencies": {
52+ "@libsql/client": "^0.14.0",
53+ "dotenv": "^16.4.7",
54+ "drizzle-orm": "^0.39.3",
55+ "uuid": "^11.0.5",
4756 "xp.css": "^0.2.6"
4857 }
4958 }
@@ -16,7 +16,9 @@
16 "format": "prettier --write .",16 "format": "prettier --write .",
17 "lint": "prettier --check . && eslint .",17 "lint": "prettier --check . && eslint .",
18 "test:unit": "vitest",18 "test:unit": "vitest",
19- "test": "npm run test:unit -- --run"19+ "test": "npm run test:unit -- --run",
20+ "db:generate": "pnpx drizzle-kit generate",
21+ "db:push": "pnpx drizzle-kit push"
20 },22 },
21 "devDependencies": {23 "devDependencies": {
22 "@eslint/compat": "^1.2.5",24 "@eslint/compat": "^1.2.5",
@@ -27,7 +29,9 @@
27 "@tailwindcss/container-queries": "^0.1.1",29 "@tailwindcss/container-queries": "^0.1.1",
28 "@tailwindcss/forms": "^0.5.10",30 "@tailwindcss/forms": "^0.5.10",
29 "@tailwindcss/typography": "^0.5.16",31 "@tailwindcss/typography": "^0.5.16",
32+ "@types/node": "^22.13.1",
30 "autoprefixer": "^10.4.20",33 "autoprefixer": "^10.4.20",
34+ "drizzle-kit": "^0.30.4",
31 "eslint": "^9.18.0",35 "eslint": "^9.18.0",
32 "eslint-config-prettier": "^10.0.1",36 "eslint-config-prettier": "^10.0.1",
33 "eslint-plugin-svelte": "^2.46.1",37 "eslint-plugin-svelte": "^2.46.1",
@@ -38,12 +42,17 @@
38 "svelte": "^5.0.0",42 "svelte": "^5.0.0",
39 "svelte-check": "^4.0.0",43 "svelte-check": "^4.0.0",
40 "tailwindcss": "^3.4.17",44 "tailwindcss": "^3.4.17",
45+ "tsx": "^4.19.2",
41 "typescript": "^5.0.0",46 "typescript": "^5.0.0",
42 "typescript-eslint": "^8.20.0",47 "typescript-eslint": "^8.20.0",
43 "vite": "^6.0.0",48 "vite": "^6.0.0",
44 "vitest": "^3.0.0"49 "vitest": "^3.0.0"
45 },50 },
46 "dependencies": {51 "dependencies": {
52+ "@libsql/client": "^0.14.0",
53+ "dotenv": "^16.4.7",
54+ "drizzle-orm": "^0.39.3",
55+ "uuid": "^11.0.5",
47 "xp.css": "^0.2.6"56 "xp.css": "^0.2.6"
48 }57 }
49 }58 }
M pnpm-lock.yaml +1164 -28
@@ -8,6 +8,18 @@ importers:
88
99 .:
1010 dependencies:
11+ '@libsql/client':
12+ specifier: ^0.14.0
13+ version: 0.14.0
14+ dotenv:
15+ specifier: ^16.4.7
16+ version: 16.4.7
17+ drizzle-orm:
18+ specifier: ^0.39.3
19+ version: 0.39.3(@cloudflare/workers-types@4.20250204.0)(@libsql/client@0.14.0)
20+ uuid:
21+ specifier: ^11.0.5
22+ version: 11.0.5
1123 xp.css:
1224 specifier: ^0.2.6
1325 version: 0.2.6
@@ -20,13 +32,13 @@ importers:
2032 version: 9.20.0
2133 '@sveltejs/adapter-cloudflare':
2234 specifier: ^5.0.1
23- version: 5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))
35+ version: 5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))
2436 '@sveltejs/kit':
2537 specifier: ^2.16.0
26- version: 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
38+ version: 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
2739 '@sveltejs/vite-plugin-svelte':
2840 specifier: ^5.0.0
29- version: 5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
41+ version: 5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
3042 '@tailwindcss/container-queries':
3143 specifier: ^0.1.1
3244 version: 0.1.1(tailwindcss@3.4.17)
@@ -36,9 +48,15 @@ importers:
3648 '@tailwindcss/typography':
3749 specifier: ^0.5.16
3850 version: 0.5.16(tailwindcss@3.4.17)
51+ '@types/node':
52+ specifier: ^22.13.1
53+ version: 22.13.1
3954 autoprefixer:
4055 specifier: ^10.4.20
4156 version: 10.4.20(postcss@8.5.1)
57+ drizzle-kit:
58+ specifier: ^0.30.4
59+ version: 0.30.4
4260 eslint:
4361 specifier: ^9.18.0
4462 version: 9.20.0(jiti@1.21.7)
@@ -69,6 +87,9 @@ importers:
6987 tailwindcss:
7088 specifier: ^3.4.17
7189 version: 3.4.17
90+ tsx:
91+ specifier: ^4.19.2
92+ version: 4.19.2
7293 typescript:
7394 specifier: ^5.0.0
7495 version: 5.7.3
@@ -77,10 +98,10 @@ importers:
7798 version: 8.23.0(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3)
7899 vite:
79100 specifier: ^6.0.0
80- version: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
101+ version: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
81102 vitest:
82103 specifier: ^3.0.0
83- version: 3.0.5(jiti@1.21.7)(yaml@2.7.0)
104+ version: 3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
84105
85106 packages:
86107
@@ -133,6 +154,17 @@ packages:
133154 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
134155 engines: {node: '>=12'}
135156
157+ '@drizzle-team/brocli@0.10.2':
158+ resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
159+
160+ '@esbuild-kit/core-utils@3.3.2':
161+ resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
162+ deprecated: 'Merged into tsx: https://tsx.is'
163+
164+ '@esbuild-kit/esm-loader@2.6.5':
165+ resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
166+ deprecated: 'Merged into tsx: https://tsx.is'
167+
136168 '@esbuild-plugins/node-globals-polyfill@0.2.3':
137169 resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==}
138170 peerDependencies:
@@ -143,6 +175,18 @@ packages:
143175 peerDependencies:
144176 esbuild: '*'
145177
178+ '@esbuild/aix-ppc64@0.19.12':
179+ resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
180+ engines: {node: '>=12'}
181+ cpu: [ppc64]
182+ os: [aix]
183+
184+ '@esbuild/aix-ppc64@0.23.1':
185+ resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
186+ engines: {node: '>=18'}
187+ cpu: [ppc64]
188+ os: [aix]
189+
146190 '@esbuild/aix-ppc64@0.24.2':
147191 resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
148192 engines: {node: '>=18'}
@@ -155,6 +199,24 @@ packages:
155199 cpu: [arm64]
156200 os: [android]
157201
202+ '@esbuild/android-arm64@0.18.20':
203+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
204+ engines: {node: '>=12'}
205+ cpu: [arm64]
206+ os: [android]
207+
208+ '@esbuild/android-arm64@0.19.12':
209+ resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
210+ engines: {node: '>=12'}
211+ cpu: [arm64]
212+ os: [android]
213+
214+ '@esbuild/android-arm64@0.23.1':
215+ resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
216+ engines: {node: '>=18'}
217+ cpu: [arm64]
218+ os: [android]
219+
158220 '@esbuild/android-arm64@0.24.2':
159221 resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
160222 engines: {node: '>=18'}
@@ -167,6 +229,24 @@ packages:
167229 cpu: [arm]
168230 os: [android]
169231
232+ '@esbuild/android-arm@0.18.20':
233+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
234+ engines: {node: '>=12'}
235+ cpu: [arm]
236+ os: [android]
237+
238+ '@esbuild/android-arm@0.19.12':
239+ resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
240+ engines: {node: '>=12'}
241+ cpu: [arm]
242+ os: [android]
243+
244+ '@esbuild/android-arm@0.23.1':
245+ resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
246+ engines: {node: '>=18'}
247+ cpu: [arm]
248+ os: [android]
249+
170250 '@esbuild/android-arm@0.24.2':
171251 resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
172252 engines: {node: '>=18'}
@@ -179,6 +259,24 @@ packages:
179259 cpu: [x64]
180260 os: [android]
181261
262+ '@esbuild/android-x64@0.18.20':
263+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
264+ engines: {node: '>=12'}
265+ cpu: [x64]
266+ os: [android]
267+
268+ '@esbuild/android-x64@0.19.12':
269+ resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
270+ engines: {node: '>=12'}
271+ cpu: [x64]
272+ os: [android]
273+
274+ '@esbuild/android-x64@0.23.1':
275+ resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
276+ engines: {node: '>=18'}
277+ cpu: [x64]
278+ os: [android]
279+
182280 '@esbuild/android-x64@0.24.2':
183281 resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
184282 engines: {node: '>=18'}
@@ -191,6 +289,24 @@ packages:
191289 cpu: [arm64]
192290 os: [darwin]
193291
292+ '@esbuild/darwin-arm64@0.18.20':
293+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
294+ engines: {node: '>=12'}
295+ cpu: [arm64]
296+ os: [darwin]
297+
298+ '@esbuild/darwin-arm64@0.19.12':
299+ resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
300+ engines: {node: '>=12'}
301+ cpu: [arm64]
302+ os: [darwin]
303+
304+ '@esbuild/darwin-arm64@0.23.1':
305+ resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
306+ engines: {node: '>=18'}
307+ cpu: [arm64]
308+ os: [darwin]
309+
194310 '@esbuild/darwin-arm64@0.24.2':
195311 resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
196312 engines: {node: '>=18'}
@@ -203,6 +319,24 @@ packages:
203319 cpu: [x64]
204320 os: [darwin]
205321
322+ '@esbuild/darwin-x64@0.18.20':
323+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
324+ engines: {node: '>=12'}
325+ cpu: [x64]
326+ os: [darwin]
327+
328+ '@esbuild/darwin-x64@0.19.12':
329+ resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
330+ engines: {node: '>=12'}
331+ cpu: [x64]
332+ os: [darwin]
333+
334+ '@esbuild/darwin-x64@0.23.1':
335+ resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
336+ engines: {node: '>=18'}
337+ cpu: [x64]
338+ os: [darwin]
339+
206340 '@esbuild/darwin-x64@0.24.2':
207341 resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
208342 engines: {node: '>=18'}
@@ -215,6 +349,24 @@ packages:
215349 cpu: [arm64]
216350 os: [freebsd]
217351
352+ '@esbuild/freebsd-arm64@0.18.20':
353+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
354+ engines: {node: '>=12'}
355+ cpu: [arm64]
356+ os: [freebsd]
357+
358+ '@esbuild/freebsd-arm64@0.19.12':
359+ resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
360+ engines: {node: '>=12'}
361+ cpu: [arm64]
362+ os: [freebsd]
363+
364+ '@esbuild/freebsd-arm64@0.23.1':
365+ resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
366+ engines: {node: '>=18'}
367+ cpu: [arm64]
368+ os: [freebsd]
369+
218370 '@esbuild/freebsd-arm64@0.24.2':
219371 resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
220372 engines: {node: '>=18'}
@@ -227,6 +379,24 @@ packages:
227379 cpu: [x64]
228380 os: [freebsd]
229381
382+ '@esbuild/freebsd-x64@0.18.20':
383+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
384+ engines: {node: '>=12'}
385+ cpu: [x64]
386+ os: [freebsd]
387+
388+ '@esbuild/freebsd-x64@0.19.12':
389+ resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
390+ engines: {node: '>=12'}
391+ cpu: [x64]
392+ os: [freebsd]
393+
394+ '@esbuild/freebsd-x64@0.23.1':
395+ resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
396+ engines: {node: '>=18'}
397+ cpu: [x64]
398+ os: [freebsd]
399+
230400 '@esbuild/freebsd-x64@0.24.2':
231401 resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
232402 engines: {node: '>=18'}
@@ -239,6 +409,24 @@ packages:
239409 cpu: [arm64]
240410 os: [linux]
241411
412+ '@esbuild/linux-arm64@0.18.20':
413+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
414+ engines: {node: '>=12'}
415+ cpu: [arm64]
416+ os: [linux]
417+
418+ '@esbuild/linux-arm64@0.19.12':
419+ resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
420+ engines: {node: '>=12'}
421+ cpu: [arm64]
422+ os: [linux]
423+
424+ '@esbuild/linux-arm64@0.23.1':
425+ resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
426+ engines: {node: '>=18'}
427+ cpu: [arm64]
428+ os: [linux]
429+
242430 '@esbuild/linux-arm64@0.24.2':
243431 resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
244432 engines: {node: '>=18'}
@@ -251,6 +439,24 @@ packages:
251439 cpu: [arm]
252440 os: [linux]
253441
442+ '@esbuild/linux-arm@0.18.20':
443+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
444+ engines: {node: '>=12'}
445+ cpu: [arm]
446+ os: [linux]
447+
448+ '@esbuild/linux-arm@0.19.12':
449+ resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
450+ engines: {node: '>=12'}
451+ cpu: [arm]
452+ os: [linux]
453+
454+ '@esbuild/linux-arm@0.23.1':
455+ resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
456+ engines: {node: '>=18'}
457+ cpu: [arm]
458+ os: [linux]
459+
254460 '@esbuild/linux-arm@0.24.2':
255461 resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
256462 engines: {node: '>=18'}
@@ -263,6 +469,24 @@ packages:
263469 cpu: [ia32]
264470 os: [linux]
265471
472+ '@esbuild/linux-ia32@0.18.20':
473+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
474+ engines: {node: '>=12'}
475+ cpu: [ia32]
476+ os: [linux]
477+
478+ '@esbuild/linux-ia32@0.19.12':
479+ resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
480+ engines: {node: '>=12'}
481+ cpu: [ia32]
482+ os: [linux]
483+
484+ '@esbuild/linux-ia32@0.23.1':
485+ resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
486+ engines: {node: '>=18'}
487+ cpu: [ia32]
488+ os: [linux]
489+
266490 '@esbuild/linux-ia32@0.24.2':
267491 resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
268492 engines: {node: '>=18'}
@@ -275,6 +499,24 @@ packages:
275499 cpu: [loong64]
276500 os: [linux]
277501
502+ '@esbuild/linux-loong64@0.18.20':
503+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
504+ engines: {node: '>=12'}
505+ cpu: [loong64]
506+ os: [linux]
507+
508+ '@esbuild/linux-loong64@0.19.12':
509+ resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
510+ engines: {node: '>=12'}
511+ cpu: [loong64]
512+ os: [linux]
513+
514+ '@esbuild/linux-loong64@0.23.1':
515+ resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
516+ engines: {node: '>=18'}
517+ cpu: [loong64]
518+ os: [linux]
519+
278520 '@esbuild/linux-loong64@0.24.2':
279521 resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
280522 engines: {node: '>=18'}
@@ -287,6 +529,24 @@ packages:
287529 cpu: [mips64el]
288530 os: [linux]
289531
532+ '@esbuild/linux-mips64el@0.18.20':
533+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
534+ engines: {node: '>=12'}
535+ cpu: [mips64el]
536+ os: [linux]
537+
538+ '@esbuild/linux-mips64el@0.19.12':
539+ resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
540+ engines: {node: '>=12'}
541+ cpu: [mips64el]
542+ os: [linux]
543+
544+ '@esbuild/linux-mips64el@0.23.1':
545+ resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
546+ engines: {node: '>=18'}
547+ cpu: [mips64el]
548+ os: [linux]
549+
290550 '@esbuild/linux-mips64el@0.24.2':
291551 resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
292552 engines: {node: '>=18'}
@@ -299,6 +559,24 @@ packages:
299559 cpu: [ppc64]
300560 os: [linux]
301561
562+ '@esbuild/linux-ppc64@0.18.20':
563+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
564+ engines: {node: '>=12'}
565+ cpu: [ppc64]
566+ os: [linux]
567+
568+ '@esbuild/linux-ppc64@0.19.12':
569+ resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
570+ engines: {node: '>=12'}
571+ cpu: [ppc64]
572+ os: [linux]
573+
574+ '@esbuild/linux-ppc64@0.23.1':
575+ resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
576+ engines: {node: '>=18'}
577+ cpu: [ppc64]
578+ os: [linux]
579+
302580 '@esbuild/linux-ppc64@0.24.2':
303581 resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
304582 engines: {node: '>=18'}
@@ -311,6 +589,24 @@ packages:
311589 cpu: [riscv64]
312590 os: [linux]
313591
592+ '@esbuild/linux-riscv64@0.18.20':
593+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
594+ engines: {node: '>=12'}
595+ cpu: [riscv64]
596+ os: [linux]
597+
598+ '@esbuild/linux-riscv64@0.19.12':
599+ resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
600+ engines: {node: '>=12'}
601+ cpu: [riscv64]
602+ os: [linux]
603+
604+ '@esbuild/linux-riscv64@0.23.1':
605+ resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
606+ engines: {node: '>=18'}
607+ cpu: [riscv64]
608+ os: [linux]
609+
314610 '@esbuild/linux-riscv64@0.24.2':
315611 resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
316612 engines: {node: '>=18'}
@@ -323,6 +619,24 @@ packages:
323619 cpu: [s390x]
324620 os: [linux]
325621
622+ '@esbuild/linux-s390x@0.18.20':
623+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
624+ engines: {node: '>=12'}
625+ cpu: [s390x]
626+ os: [linux]
627+
628+ '@esbuild/linux-s390x@0.19.12':
629+ resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
630+ engines: {node: '>=12'}
631+ cpu: [s390x]
632+ os: [linux]
633+
634+ '@esbuild/linux-s390x@0.23.1':
635+ resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
636+ engines: {node: '>=18'}
637+ cpu: [s390x]
638+ os: [linux]
639+
326640 '@esbuild/linux-s390x@0.24.2':
327641 resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
328642 engines: {node: '>=18'}
@@ -335,6 +649,24 @@ packages:
335649 cpu: [x64]
336650 os: [linux]
337651
652+ '@esbuild/linux-x64@0.18.20':
653+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
654+ engines: {node: '>=12'}
655+ cpu: [x64]
656+ os: [linux]
657+
658+ '@esbuild/linux-x64@0.19.12':
659+ resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
660+ engines: {node: '>=12'}
661+ cpu: [x64]
662+ os: [linux]
663+
664+ '@esbuild/linux-x64@0.23.1':
665+ resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
666+ engines: {node: '>=18'}
667+ cpu: [x64]
668+ os: [linux]
669+
338670 '@esbuild/linux-x64@0.24.2':
339671 resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
340672 engines: {node: '>=18'}
@@ -353,12 +685,36 @@ packages:
353685 cpu: [x64]
354686 os: [netbsd]
355687
688+ '@esbuild/netbsd-x64@0.18.20':
689+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
690+ engines: {node: '>=12'}
691+ cpu: [x64]
692+ os: [netbsd]
693+
694+ '@esbuild/netbsd-x64@0.19.12':
695+ resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
696+ engines: {node: '>=12'}
697+ cpu: [x64]
698+ os: [netbsd]
699+
700+ '@esbuild/netbsd-x64@0.23.1':
701+ resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
702+ engines: {node: '>=18'}
703+ cpu: [x64]
704+ os: [netbsd]
705+
356706 '@esbuild/netbsd-x64@0.24.2':
357707 resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
358708 engines: {node: '>=18'}
359709 cpu: [x64]
360710 os: [netbsd]
361711
712+ '@esbuild/openbsd-arm64@0.23.1':
713+ resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
714+ engines: {node: '>=18'}
715+ cpu: [arm64]
716+ os: [openbsd]
717+
362718 '@esbuild/openbsd-arm64@0.24.2':
363719 resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
364720 engines: {node: '>=18'}
@@ -371,6 +727,24 @@ packages:
371727 cpu: [x64]
372728 os: [openbsd]
373729
730+ '@esbuild/openbsd-x64@0.18.20':
731+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
732+ engines: {node: '>=12'}
733+ cpu: [x64]
734+ os: [openbsd]
735+
736+ '@esbuild/openbsd-x64@0.19.12':
737+ resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
738+ engines: {node: '>=12'}
739+ cpu: [x64]
740+ os: [openbsd]
741+
742+ '@esbuild/openbsd-x64@0.23.1':
743+ resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
744+ engines: {node: '>=18'}
745+ cpu: [x64]
746+ os: [openbsd]
747+
374748 '@esbuild/openbsd-x64@0.24.2':
375749 resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
376750 engines: {node: '>=18'}
@@ -383,6 +757,24 @@ packages:
383757 cpu: [x64]
384758 os: [sunos]
385759
760+ '@esbuild/sunos-x64@0.18.20':
761+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
762+ engines: {node: '>=12'}
763+ cpu: [x64]
764+ os: [sunos]
765+
766+ '@esbuild/sunos-x64@0.19.12':
767+ resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
768+ engines: {node: '>=12'}
769+ cpu: [x64]
770+ os: [sunos]
771+
772+ '@esbuild/sunos-x64@0.23.1':
773+ resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
774+ engines: {node: '>=18'}
775+ cpu: [x64]
776+ os: [sunos]
777+
386778 '@esbuild/sunos-x64@0.24.2':
387779 resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
388780 engines: {node: '>=18'}
@@ -395,6 +787,24 @@ packages:
395787 cpu: [arm64]
396788 os: [win32]
397789
790+ '@esbuild/win32-arm64@0.18.20':
791+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
792+ engines: {node: '>=12'}
793+ cpu: [arm64]
794+ os: [win32]
795+
796+ '@esbuild/win32-arm64@0.19.12':
797+ resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
798+ engines: {node: '>=12'}
799+ cpu: [arm64]
800+ os: [win32]
801+
802+ '@esbuild/win32-arm64@0.23.1':
803+ resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
804+ engines: {node: '>=18'}
805+ cpu: [arm64]
806+ os: [win32]
807+
398808 '@esbuild/win32-arm64@0.24.2':
399809 resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
400810 engines: {node: '>=18'}
@@ -407,6 +817,24 @@ packages:
407817 cpu: [ia32]
408818 os: [win32]
409819
820+ '@esbuild/win32-ia32@0.18.20':
821+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
822+ engines: {node: '>=12'}
823+ cpu: [ia32]
824+ os: [win32]
825+
826+ '@esbuild/win32-ia32@0.19.12':
827+ resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
828+ engines: {node: '>=12'}
829+ cpu: [ia32]
830+ os: [win32]
831+
832+ '@esbuild/win32-ia32@0.23.1':
833+ resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
834+ engines: {node: '>=18'}
835+ cpu: [ia32]
836+ os: [win32]
837+
410838 '@esbuild/win32-ia32@0.24.2':
411839 resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
412840 engines: {node: '>=18'}
@@ -419,6 +847,24 @@ packages:
419847 cpu: [x64]
420848 os: [win32]
421849
850+ '@esbuild/win32-x64@0.18.20':
851+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
852+ engines: {node: '>=12'}
853+ cpu: [x64]
854+ os: [win32]
855+
856+ '@esbuild/win32-x64@0.19.12':
857+ resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
858+ engines: {node: '>=12'}
859+ cpu: [x64]
860+ os: [win32]
861+
862+ '@esbuild/win32-x64@0.23.1':
863+ resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
864+ engines: {node: '>=18'}
865+ cpu: [x64]
866+ os: [win32]
867+
422868 '@esbuild/win32-x64@0.24.2':
423869 resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
424870 engines: {node: '>=18'}
@@ -521,6 +967,60 @@ packages:
521967 '@jridgewell/trace-mapping@0.3.9':
522968 resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
523969
970+ '@libsql/client@0.14.0':
971+ resolution: {integrity: sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==}
972+
973+ '@libsql/core@0.14.0':
974+ resolution: {integrity: sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==}
975+
976+ '@libsql/darwin-arm64@0.4.7':
977+ resolution: {integrity: sha512-yOL742IfWUlUevnI5PdnIT4fryY3LYTdLm56bnY0wXBw7dhFcnjuA7jrH3oSVz2mjZTHujxoITgAE7V6Z+eAbg==}
978+ cpu: [arm64]
979+ os: [darwin]
980+
981+ '@libsql/darwin-x64@0.4.7':
982+ resolution: {integrity: sha512-ezc7V75+eoyyH07BO9tIyJdqXXcRfZMbKcLCeF8+qWK5nP8wWuMcfOVywecsXGRbT99zc5eNra4NEx6z5PkSsA==}
983+ cpu: [x64]
984+ os: [darwin]
985+
986+ '@libsql/hrana-client@0.7.0':
987+ resolution: {integrity: sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==}
988+
989+ '@libsql/isomorphic-fetch@0.3.1':
990+ resolution: {integrity: sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==}
991+ engines: {node: '>=18.0.0'}
992+
993+ '@libsql/isomorphic-ws@0.1.5':
994+ resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==}
995+
996+ '@libsql/linux-arm64-gnu@0.4.7':
997+ resolution: {integrity: sha512-WlX2VYB5diM4kFfNaYcyhw5y+UJAI3xcMkEUJZPtRDEIu85SsSFrQ+gvoKfcVh76B//ztSeEX2wl9yrjF7BBCA==}
998+ cpu: [arm64]
999+ os: [linux]
1000+
1001+ '@libsql/linux-arm64-musl@0.4.7':
1002+ resolution: {integrity: sha512-6kK9xAArVRlTCpWeqnNMCoXW1pe7WITI378n4NpvU5EJ0Ok3aNTIC2nRPRjhro90QcnmLL1jPcrVwO4WD1U0xw==}
1003+ cpu: [arm64]
1004+ os: [linux]
1005+
1006+ '@libsql/linux-x64-gnu@0.4.7':
1007+ resolution: {integrity: sha512-CMnNRCmlWQqqzlTw6NeaZXzLWI8bydaXDke63JTUCvu8R+fj/ENsLrVBtPDlxQ0wGsYdXGlrUCH8Qi9gJep0yQ==}
1008+ cpu: [x64]
1009+ os: [linux]
1010+
1011+ '@libsql/linux-x64-musl@0.4.7':
1012+ resolution: {integrity: sha512-nI6tpS1t6WzGAt1Kx1n1HsvtBbZ+jHn0m7ogNNT6pQHZQj7AFFTIMeDQw/i/Nt5H38np1GVRNsFe99eSIMs9XA==}
1013+ cpu: [x64]
1014+ os: [linux]
1015+
1016+ '@libsql/win32-x64-msvc@0.4.7':
1017+ resolution: {integrity: sha512-7pJzOWzPm6oJUxml+PCDRzYQ4A1hTMHAciTAHfFK4fkbDZX33nWPVG7Y3vqdKtslcwAzwmrNDc6sXy2nwWnbiw==}
1018+ cpu: [x64]
1019+ os: [win32]
1020+
1021+ '@neon-rs/load@0.0.4':
1022+ resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==}
1023+
5241024 '@nodelib/fs.scandir@2.1.5':
5251025 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
5261026 engines: {node: '>= 8'}
@@ -689,6 +1189,12 @@ packages:
6891189 '@types/json-schema@7.0.15':
6901190 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
6911191
1192+ '@types/node@22.13.1':
1193+ resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==}
1194+
1195+ '@types/ws@8.5.14':
1196+ resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==}
1197+
6921198 '@typescript-eslint/eslint-plugin@8.23.0':
6931199 resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==}
6941200 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -863,6 +1369,9 @@ packages:
8631369 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
8641370 hasBin: true
8651371
1372+ buffer-from@1.1.2:
1373+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
1374+
8661375 cac@6.7.14:
8671376 resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
8681377 engines: {node: '>=8'}
@@ -939,6 +1448,10 @@ packages:
9391448 data-uri-to-buffer@2.0.2:
9401449 resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==}
9411450
1451+ data-uri-to-buffer@4.0.1:
1452+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
1453+ engines: {node: '>= 12'}
1454+
9421455 debug@4.4.0:
9431456 resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
9441457 engines: {node: '>=6.0'}
@@ -962,6 +1475,10 @@ packages:
9621475 defu@6.1.4:
9631476 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
9641477
1478+ detect-libc@2.0.2:
1479+ resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
1480+ engines: {node: '>=8'}
1481+
9651482 devalue@5.1.1:
9661483 resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
9671484
@@ -971,6 +1488,100 @@ packages:
9711488 dlv@1.1.3:
9721489 resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
9731490
1491+ dotenv@16.4.7:
1492+ resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
1493+ engines: {node: '>=12'}
1494+
1495+ drizzle-kit@0.30.4:
1496+ resolution: {integrity: sha512-B2oJN5UkvwwNHscPWXDG5KqAixu7AUzZ3qbe++KU9SsQ+cZWR4DXEPYcvWplyFAno0dhRJECNEhNxiDmFaPGyQ==}
1497+ hasBin: true
1498+
1499+ drizzle-orm@0.39.3:
1500+ resolution: {integrity: sha512-EZ8ZpYvDIvKU9C56JYLOmUskazhad+uXZCTCRN4OnRMsL+xAJ05dv1eCpAG5xzhsm1hqiuC5kAZUCS924u2DTw==}
1501+ peerDependencies:
1502+ '@aws-sdk/client-rds-data': '>=3'
1503+ '@cloudflare/workers-types': '>=4'
1504+ '@electric-sql/pglite': '>=0.2.0'
1505+ '@libsql/client': '>=0.10.0'
1506+ '@libsql/client-wasm': '>=0.10.0'
1507+ '@neondatabase/serverless': '>=0.10.0'
1508+ '@op-engineering/op-sqlite': '>=2'
1509+ '@opentelemetry/api': ^1.4.1
1510+ '@planetscale/database': '>=1'
1511+ '@prisma/client': '*'
1512+ '@tidbcloud/serverless': '*'
1513+ '@types/better-sqlite3': '*'
1514+ '@types/pg': '*'
1515+ '@types/sql.js': '*'
1516+ '@vercel/postgres': '>=0.8.0'
1517+ '@xata.io/client': '*'
1518+ better-sqlite3: '>=7'
1519+ bun-types: '*'
1520+ expo-sqlite: '>=14.0.0'
1521+ knex: '*'
1522+ kysely: '*'
1523+ mysql2: '>=2'
1524+ pg: '>=8'
1525+ postgres: '>=3'
1526+ prisma: '*'
1527+ sql.js: '>=1'
1528+ sqlite3: '>=5'
1529+ peerDependenciesMeta:
1530+ '@aws-sdk/client-rds-data':
1531+ optional: true
1532+ '@cloudflare/workers-types':
1533+ optional: true
1534+ '@electric-sql/pglite':
1535+ optional: true
1536+ '@libsql/client':
1537+ optional: true
1538+ '@libsql/client-wasm':
1539+ optional: true
1540+ '@neondatabase/serverless':
1541+ optional: true
1542+ '@op-engineering/op-sqlite':
1543+ optional: true
1544+ '@opentelemetry/api':
1545+ optional: true
1546+ '@planetscale/database':
1547+ optional: true
1548+ '@prisma/client':
1549+ optional: true
1550+ '@tidbcloud/serverless':
1551+ optional: true
1552+ '@types/better-sqlite3':
1553+ optional: true
1554+ '@types/pg':
1555+ optional: true
1556+ '@types/sql.js':
1557+ optional: true
1558+ '@vercel/postgres':
1559+ optional: true
1560+ '@xata.io/client':
1561+ optional: true
1562+ better-sqlite3:
1563+ optional: true
1564+ bun-types:
1565+ optional: true
1566+ expo-sqlite:
1567+ optional: true
1568+ knex:
1569+ optional: true
1570+ kysely:
1571+ optional: true
1572+ mysql2:
1573+ optional: true
1574+ pg:
1575+ optional: true
1576+ postgres:
1577+ optional: true
1578+ prisma:
1579+ optional: true
1580+ sql.js:
1581+ optional: true
1582+ sqlite3:
1583+ optional: true
1584+
9741585 eastasianwidth@0.2.0:
9751586 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
9761587
@@ -986,11 +1597,31 @@ packages:
9861597 es-module-lexer@1.6.0:
9871598 resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
9881599
1600+ esbuild-register@3.6.0:
1601+ resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
1602+ peerDependencies:
1603+ esbuild: '>=0.12 <1'
1604+
9891605 esbuild@0.17.19:
9901606 resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
9911607 engines: {node: '>=12'}
9921608 hasBin: true
9931609
1610+ esbuild@0.18.20:
1611+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
1612+ engines: {node: '>=12'}
1613+ hasBin: true
1614+
1615+ esbuild@0.19.12:
1616+ resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
1617+ engines: {node: '>=12'}
1618+ hasBin: true
1619+
1620+ esbuild@0.23.1:
1621+ resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
1622+ engines: {node: '>=18'}
1623+ hasBin: true
1624+
9941625 esbuild@0.24.2:
9951626 resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
9961627 engines: {node: '>=18'}
@@ -1120,6 +1751,10 @@ packages:
11201751 picomatch:
11211752 optional: true
11221753
1754+ fetch-blob@3.2.0:
1755+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
1756+ engines: {node: ^12.20 || >= 14.13}
1757+
11231758 file-entry-cache@8.0.0:
11241759 resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
11251760 engines: {node: '>=16.0.0'}
@@ -1143,6 +1778,10 @@ packages:
11431778 resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
11441779 engines: {node: '>=14'}
11451780
1781+ formdata-polyfill@4.0.10:
1782+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
1783+ engines: {node: '>=12.20.0'}
1784+
11461785 fraction.js@4.3.7:
11471786 resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
11481787
@@ -1157,6 +1796,9 @@ packages:
11571796 get-source@2.0.12:
11581797 resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}
11591798
1799+ get-tsconfig@4.10.0:
1800+ resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==}
1801+
11601802 glob-parent@5.1.2:
11611803 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
11621804 engines: {node: '>= 6'}
@@ -1243,6 +1885,9 @@ packages:
12431885 resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
12441886 hasBin: true
12451887
1888+ js-base64@3.7.7:
1889+ resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
1890+
12461891 js-yaml@4.1.0:
12471892 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
12481893 hasBin: true
@@ -1270,6 +1915,10 @@ packages:
12701915 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
12711916 engines: {node: '>= 0.8.0'}
12721917
1918+ libsql@0.4.7:
1919+ resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==}
1920+ os: [darwin, linux, win32]
1921+
12731922 lilconfig@2.1.0:
12741923 resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
12751924 engines: {node: '>=10'}
@@ -1371,6 +2020,14 @@ packages:
13712020 natural-compare@1.4.0:
13722021 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
13732022
2023+ node-domexception@1.0.0:
2024+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
2025+ engines: {node: '>=10.5.0'}
2026+
2027+ node-fetch@3.3.2:
2028+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
2029+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
2030+
13742031 node-releases@2.0.19:
13752032 resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
13762033
@@ -1600,6 +2257,9 @@ packages:
16002257 printable-characters@1.0.42:
16012258 resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==}
16022259
2260+ promise-limit@2.7.0:
2261+ resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==}
2262+
16032263 punycode@2.3.1:
16042264 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
16052265 engines: {node: '>=6'}
@@ -1626,6 +2286,9 @@ packages:
16262286 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
16272287 engines: {node: '>=4'}
16282288
2289+ resolve-pkg-maps@1.0.0:
2290+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
2291+
16292292 resolve@1.22.10:
16302293 resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
16312294 engines: {node: '>= 0.4'}
@@ -1688,6 +2351,9 @@ packages:
16882351 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
16892352 engines: {node: '>=0.10.0'}
16902353
2354+ source-map-support@0.5.21:
2355+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
2356+
16912357 source-map@0.6.1:
16922358 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
16932359 engines: {node: '>=0.10.0'}
@@ -1810,6 +2476,11 @@ packages:
18102476 ts-interface-checker@0.1.13:
18112477 resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
18122478
2479+ tsx@4.19.2:
2480+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
2481+ engines: {node: '>=18.0.0'}
2482+ hasBin: true
2483+
18132484 type-check@0.4.0:
18142485 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
18152486 engines: {node: '>= 0.8.0'}
@@ -1829,6 +2500,9 @@ packages:
18292500 ufo@1.5.4:
18302501 resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
18312502
2503+ undici-types@6.20.0:
2504+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
2505+
18322506 undici@5.28.5:
18332507 resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==}
18342508 engines: {node: '>=14.0'}
@@ -1848,6 +2522,10 @@ packages:
18482522 util-deprecate@1.0.2:
18492523 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
18502524
2525+ uuid@11.0.5:
2526+ resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==}
2527+ hasBin: true
2528+
18512529 vite-node@3.0.5:
18522530 resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==}
18532531 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -1929,6 +2607,10 @@ packages:
19292607 jsdom:
19302608 optional: true
19312609
2610+ web-streams-polyfill@3.3.3:
2611+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
2612+ engines: {node: '>= 8'}
2613+
19322614 which@2.0.2:
19332615 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
19342616 engines: {node: '>= 8'}
@@ -2041,6 +2723,18 @@ snapshots:
20412723 dependencies:
20422724 '@jridgewell/trace-mapping': 0.3.9
20432725
2726+ '@drizzle-team/brocli@0.10.2': {}
2727+
2728+ '@esbuild-kit/core-utils@3.3.2':
2729+ dependencies:
2730+ esbuild: 0.18.20
2731+ source-map-support: 0.5.21
2732+
2733+ '@esbuild-kit/esm-loader@2.6.5':
2734+ dependencies:
2735+ '@esbuild-kit/core-utils': 3.3.2
2736+ get-tsconfig: 4.10.0
2737+
20442738 '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)':
20452739 dependencies:
20462740 esbuild: 0.17.19
@@ -2051,102 +2745,252 @@ snapshots:
20512745 escape-string-regexp: 4.0.0
20522746 rollup-plugin-node-polyfills: 0.2.1
20532747
2748+ '@esbuild/aix-ppc64@0.19.12':
2749+ optional: true
2750+
2751+ '@esbuild/aix-ppc64@0.23.1':
2752+ optional: true
2753+
20542754 '@esbuild/aix-ppc64@0.24.2':
20552755 optional: true
20562756
20572757 '@esbuild/android-arm64@0.17.19':
20582758 optional: true
20592759
2760+ '@esbuild/android-arm64@0.18.20':
2761+ optional: true
2762+
2763+ '@esbuild/android-arm64@0.19.12':
2764+ optional: true
2765+
2766+ '@esbuild/android-arm64@0.23.1':
2767+ optional: true
2768+
20602769 '@esbuild/android-arm64@0.24.2':
20612770 optional: true
20622771
20632772 '@esbuild/android-arm@0.17.19':
20642773 optional: true
20652774
2775+ '@esbuild/android-arm@0.18.20':
2776+ optional: true
2777+
2778+ '@esbuild/android-arm@0.19.12':
2779+ optional: true
2780+
2781+ '@esbuild/android-arm@0.23.1':
2782+ optional: true
2783+
20662784 '@esbuild/android-arm@0.24.2':
20672785 optional: true
20682786
20692787 '@esbuild/android-x64@0.17.19':
20702788 optional: true
20712789
2790+ '@esbuild/android-x64@0.18.20':
2791+ optional: true
2792+
2793+ '@esbuild/android-x64@0.19.12':
2794+ optional: true
2795+
2796+ '@esbuild/android-x64@0.23.1':
2797+ optional: true
2798+
20722799 '@esbuild/android-x64@0.24.2':
20732800 optional: true
20742801
20752802 '@esbuild/darwin-arm64@0.17.19':
20762803 optional: true
20772804
2805+ '@esbuild/darwin-arm64@0.18.20':
2806+ optional: true
2807+
2808+ '@esbuild/darwin-arm64@0.19.12':
2809+ optional: true
2810+
2811+ '@esbuild/darwin-arm64@0.23.1':
2812+ optional: true
2813+
20782814 '@esbuild/darwin-arm64@0.24.2':
20792815 optional: true
20802816
20812817 '@esbuild/darwin-x64@0.17.19':
20822818 optional: true
20832819
2820+ '@esbuild/darwin-x64@0.18.20':
2821+ optional: true
2822+
2823+ '@esbuild/darwin-x64@0.19.12':
2824+ optional: true
2825+
2826+ '@esbuild/darwin-x64@0.23.1':
2827+ optional: true
2828+
20842829 '@esbuild/darwin-x64@0.24.2':
20852830 optional: true
20862831
20872832 '@esbuild/freebsd-arm64@0.17.19':
20882833 optional: true
20892834
2835+ '@esbuild/freebsd-arm64@0.18.20':
2836+ optional: true
2837+
2838+ '@esbuild/freebsd-arm64@0.19.12':
2839+ optional: true
2840+
2841+ '@esbuild/freebsd-arm64@0.23.1':
2842+ optional: true
2843+
20902844 '@esbuild/freebsd-arm64@0.24.2':
20912845 optional: true
20922846
20932847 '@esbuild/freebsd-x64@0.17.19':
20942848 optional: true
20952849
2850+ '@esbuild/freebsd-x64@0.18.20':
2851+ optional: true
2852+
2853+ '@esbuild/freebsd-x64@0.19.12':
2854+ optional: true
2855+
2856+ '@esbuild/freebsd-x64@0.23.1':
2857+ optional: true
2858+
20962859 '@esbuild/freebsd-x64@0.24.2':
20972860 optional: true
20982861
20992862 '@esbuild/linux-arm64@0.17.19':
21002863 optional: true
21012864
2865+ '@esbuild/linux-arm64@0.18.20':
2866+ optional: true
2867+
2868+ '@esbuild/linux-arm64@0.19.12':
2869+ optional: true
2870+
2871+ '@esbuild/linux-arm64@0.23.1':
2872+ optional: true
2873+
21022874 '@esbuild/linux-arm64@0.24.2':
21032875 optional: true
21042876
21052877 '@esbuild/linux-arm@0.17.19':
21062878 optional: true
21072879
2880+ '@esbuild/linux-arm@0.18.20':
2881+ optional: true
2882+
2883+ '@esbuild/linux-arm@0.19.12':
2884+ optional: true
2885+
2886+ '@esbuild/linux-arm@0.23.1':
2887+ optional: true
2888+
21082889 '@esbuild/linux-arm@0.24.2':
21092890 optional: true
21102891
21112892 '@esbuild/linux-ia32@0.17.19':
21122893 optional: true
21132894
2895+ '@esbuild/linux-ia32@0.18.20':
2896+ optional: true
2897+
2898+ '@esbuild/linux-ia32@0.19.12':
2899+ optional: true
2900+
2901+ '@esbuild/linux-ia32@0.23.1':
2902+ optional: true
2903+
21142904 '@esbuild/linux-ia32@0.24.2':
21152905 optional: true
21162906
21172907 '@esbuild/linux-loong64@0.17.19':
21182908 optional: true
21192909
2910+ '@esbuild/linux-loong64@0.18.20':
2911+ optional: true
2912+
2913+ '@esbuild/linux-loong64@0.19.12':
2914+ optional: true
2915+
2916+ '@esbuild/linux-loong64@0.23.1':
2917+ optional: true
2918+
21202919 '@esbuild/linux-loong64@0.24.2':
21212920 optional: true
21222921
21232922 '@esbuild/linux-mips64el@0.17.19':
21242923 optional: true
21252924
2925+ '@esbuild/linux-mips64el@0.18.20':
2926+ optional: true
2927+
2928+ '@esbuild/linux-mips64el@0.19.12':
2929+ optional: true
2930+
2931+ '@esbuild/linux-mips64el@0.23.1':
2932+ optional: true
2933+
21262934 '@esbuild/linux-mips64el@0.24.2':
21272935 optional: true
21282936
21292937 '@esbuild/linux-ppc64@0.17.19':
21302938 optional: true
21312939
2940+ '@esbuild/linux-ppc64@0.18.20':
2941+ optional: true
2942+
2943+ '@esbuild/linux-ppc64@0.19.12':
2944+ optional: true
2945+
2946+ '@esbuild/linux-ppc64@0.23.1':
2947+ optional: true
2948+
21322949 '@esbuild/linux-ppc64@0.24.2':
21332950 optional: true
21342951
21352952 '@esbuild/linux-riscv64@0.17.19':
21362953 optional: true
21372954
2955+ '@esbuild/linux-riscv64@0.18.20':
2956+ optional: true
2957+
2958+ '@esbuild/linux-riscv64@0.19.12':
2959+ optional: true
2960+
2961+ '@esbuild/linux-riscv64@0.23.1':
2962+ optional: true
2963+
21382964 '@esbuild/linux-riscv64@0.24.2':
21392965 optional: true
21402966
21412967 '@esbuild/linux-s390x@0.17.19':
21422968 optional: true
21432969
2970+ '@esbuild/linux-s390x@0.18.20':
2971+ optional: true
2972+
2973+ '@esbuild/linux-s390x@0.19.12':
2974+ optional: true
2975+
2976+ '@esbuild/linux-s390x@0.23.1':
2977+ optional: true
2978+
21442979 '@esbuild/linux-s390x@0.24.2':
21452980 optional: true
21462981
21472982 '@esbuild/linux-x64@0.17.19':
21482983 optional: true
21492984
2985+ '@esbuild/linux-x64@0.18.20':
2986+ optional: true
2987+
2988+ '@esbuild/linux-x64@0.19.12':
2989+ optional: true
2990+
2991+ '@esbuild/linux-x64@0.23.1':
2992+ optional: true
2993+
21502994 '@esbuild/linux-x64@0.24.2':
21512995 optional: true
21522996
@@ -2156,39 +3000,96 @@ snapshots:
21563000 '@esbuild/netbsd-x64@0.17.19':
21573001 optional: true
21583002
3003+ '@esbuild/netbsd-x64@0.18.20':
3004+ optional: true
3005+
3006+ '@esbuild/netbsd-x64@0.19.12':
3007+ optional: true
3008+
3009+ '@esbuild/netbsd-x64@0.23.1':
3010+ optional: true
3011+
21593012 '@esbuild/netbsd-x64@0.24.2':
21603013 optional: true
21613014
3015+ '@esbuild/openbsd-arm64@0.23.1':
3016+ optional: true
3017+
21623018 '@esbuild/openbsd-arm64@0.24.2':
21633019 optional: true
21643020
21653021 '@esbuild/openbsd-x64@0.17.19':
21663022 optional: true
21673023
3024+ '@esbuild/openbsd-x64@0.18.20':
3025+ optional: true
3026+
3027+ '@esbuild/openbsd-x64@0.19.12':
3028+ optional: true
3029+
3030+ '@esbuild/openbsd-x64@0.23.1':
3031+ optional: true
3032+
21683033 '@esbuild/openbsd-x64@0.24.2':
21693034 optional: true
21703035
21713036 '@esbuild/sunos-x64@0.17.19':
21723037 optional: true
21733038
3039+ '@esbuild/sunos-x64@0.18.20':
3040+ optional: true
3041+
3042+ '@esbuild/sunos-x64@0.19.12':
3043+ optional: true
3044+
3045+ '@esbuild/sunos-x64@0.23.1':
3046+ optional: true
3047+
21743048 '@esbuild/sunos-x64@0.24.2':
21753049 optional: true
21763050
21773051 '@esbuild/win32-arm64@0.17.19':
21783052 optional: true
21793053
3054+ '@esbuild/win32-arm64@0.18.20':
3055+ optional: true
3056+
3057+ '@esbuild/win32-arm64@0.19.12':
3058+ optional: true
3059+
3060+ '@esbuild/win32-arm64@0.23.1':
3061+ optional: true
3062+
21803063 '@esbuild/win32-arm64@0.24.2':
21813064 optional: true
21823065
21833066 '@esbuild/win32-ia32@0.17.19':
21843067 optional: true
21853068
3069+ '@esbuild/win32-ia32@0.18.20':
3070+ optional: true
3071+
3072+ '@esbuild/win32-ia32@0.19.12':
3073+ optional: true
3074+
3075+ '@esbuild/win32-ia32@0.23.1':
3076+ optional: true
3077+
21863078 '@esbuild/win32-ia32@0.24.2':
21873079 optional: true
21883080
21893081 '@esbuild/win32-x64@0.17.19':
21903082 optional: true
21913083
3084+ '@esbuild/win32-x64@0.18.20':
3085+ optional: true
3086+
3087+ '@esbuild/win32-x64@0.19.12':
3088+ optional: true
3089+
3090+ '@esbuild/win32-x64@0.23.1':
3091+ optional: true
3092+
21923093 '@esbuild/win32-x64@0.24.2':
21933094 optional: true
21943095
@@ -2288,6 +3189,64 @@ snapshots:
22883189 '@jridgewell/resolve-uri': 3.1.2
22893190 '@jridgewell/sourcemap-codec': 1.5.0
22903191
3192+ '@libsql/client@0.14.0':
3193+ dependencies:
3194+ '@libsql/core': 0.14.0
3195+ '@libsql/hrana-client': 0.7.0
3196+ js-base64: 3.7.7
3197+ libsql: 0.4.7
3198+ promise-limit: 2.7.0
3199+ transitivePeerDependencies:
3200+ - bufferutil
3201+ - utf-8-validate
3202+
3203+ '@libsql/core@0.14.0':
3204+ dependencies:
3205+ js-base64: 3.7.7
3206+
3207+ '@libsql/darwin-arm64@0.4.7':
3208+ optional: true
3209+
3210+ '@libsql/darwin-x64@0.4.7':
3211+ optional: true
3212+
3213+ '@libsql/hrana-client@0.7.0':
3214+ dependencies:
3215+ '@libsql/isomorphic-fetch': 0.3.1
3216+ '@libsql/isomorphic-ws': 0.1.5
3217+ js-base64: 3.7.7
3218+ node-fetch: 3.3.2
3219+ transitivePeerDependencies:
3220+ - bufferutil
3221+ - utf-8-validate
3222+
3223+ '@libsql/isomorphic-fetch@0.3.1': {}
3224+
3225+ '@libsql/isomorphic-ws@0.1.5':
3226+ dependencies:
3227+ '@types/ws': 8.5.14
3228+ ws: 8.18.0
3229+ transitivePeerDependencies:
3230+ - bufferutil
3231+ - utf-8-validate
3232+
3233+ '@libsql/linux-arm64-gnu@0.4.7':
3234+ optional: true
3235+
3236+ '@libsql/linux-arm64-musl@0.4.7':
3237+ optional: true
3238+
3239+ '@libsql/linux-x64-gnu@0.4.7':
3240+ optional: true
3241+
3242+ '@libsql/linux-x64-musl@0.4.7':
3243+ optional: true
3244+
3245+ '@libsql/win32-x64-msvc@0.4.7':
3246+ optional: true
3247+
3248+ '@neon-rs/load@0.0.4': {}
3249+
22913250 '@nodelib/fs.scandir@2.1.5':
22923251 dependencies:
22933252 '@nodelib/fs.stat': 2.0.5
@@ -2362,17 +3321,17 @@ snapshots:
23623321 '@rollup/rollup-win32-x64-msvc@4.34.6':
23633322 optional: true
23643323
2365- '@sveltejs/adapter-cloudflare@5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))':
3324+ '@sveltejs/adapter-cloudflare@5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))':
23663325 dependencies:
23673326 '@cloudflare/workers-types': 4.20250204.0
2368- '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
3327+ '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
23693328 esbuild: 0.24.2
23703329 worktop: 0.8.0-next.18
23713330 wrangler: 3.107.3(@cloudflare/workers-types@4.20250204.0)
23723331
2373- '@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':
3332+ '@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
23743333 dependencies:
2375- '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
3334+ '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
23763335 '@types/cookie': 0.6.0
23773336 cookie: 0.6.0
23783337 devalue: 5.1.1
@@ -2385,27 +3344,27 @@ snapshots:
23853344 set-cookie-parser: 2.7.1
23863345 sirv: 3.0.0
23873346 svelte: 5.19.9
2388- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
3347+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
23893348
2390- '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':
3349+ '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
23913350 dependencies:
2392- '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
3351+ '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
23933352 debug: 4.4.0
23943353 svelte: 5.19.9
2395- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
3354+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
23963355 transitivePeerDependencies:
23973356 - supports-color
23983357
2399- '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':
3358+ '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
24003359 dependencies:
2401- '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
3360+ '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
24023361 debug: 4.4.0
24033362 deepmerge: 4.3.1
24043363 kleur: 4.1.5
24053364 magic-string: 0.30.17
24063365 svelte: 5.19.9
2407- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
2408- vitefu: 1.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
3366+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
3367+ vitefu: 1.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
24093368 transitivePeerDependencies:
24103369 - supports-color
24113370
@@ -2432,6 +3391,14 @@ snapshots:
24323391
24333392 '@types/json-schema@7.0.15': {}
24343393
3394+ '@types/node@22.13.1':
3395+ dependencies:
3396+ undici-types: 6.20.0
3397+
3398+ '@types/ws@8.5.14':
3399+ dependencies:
3400+ '@types/node': 22.13.1
3401+
24353402 '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3)':
24363403 dependencies:
24373404 '@eslint-community/regexpp': 4.12.1
@@ -2516,13 +3483,13 @@ snapshots:
25163483 chai: 5.1.2
25173484 tinyrainbow: 2.0.0
25183485
2519- '@vitest/mocker@3.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':
3486+ '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
25203487 dependencies:
25213488 '@vitest/spy': 3.0.5
25223489 estree-walker: 3.0.3
25233490 magic-string: 0.30.17
25243491 optionalDependencies:
2525- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
3492+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
25263493
25273494 '@vitest/pretty-format@3.0.5':
25283495 dependencies:
@@ -2637,6 +3604,8 @@ snapshots:
26373604 node-releases: 2.0.19
26383605 update-browserslist-db: 1.1.2(browserslist@4.24.4)
26393606
3607+ buffer-from@1.1.2: {}
3608+
26403609 cac@6.7.14: {}
26413610
26423611 callsites@3.1.0: {}
@@ -2704,6 +3673,8 @@ snapshots:
27043673
27053674 data-uri-to-buffer@2.0.2: {}
27063675
3676+ data-uri-to-buffer@4.0.1: {}
3677+
27073678 debug@4.4.0:
27083679 dependencies:
27093680 ms: 2.1.3
@@ -2716,12 +3687,30 @@ snapshots:
27163687
27173688 defu@6.1.4: {}
27183689
3690+ detect-libc@2.0.2: {}
3691+
27193692 devalue@5.1.1: {}
27203693
27213694 didyoumean@1.2.2: {}
27223695
27233696 dlv@1.1.3: {}
27243697
3698+ dotenv@16.4.7: {}
3699+
3700+ drizzle-kit@0.30.4:
3701+ dependencies:
3702+ '@drizzle-team/brocli': 0.10.2
3703+ '@esbuild-kit/esm-loader': 2.6.5
3704+ esbuild: 0.19.12
3705+ esbuild-register: 3.6.0(esbuild@0.19.12)
3706+ transitivePeerDependencies:
3707+ - supports-color
3708+
3709+ drizzle-orm@0.39.3(@cloudflare/workers-types@4.20250204.0)(@libsql/client@0.14.0):
3710+ optionalDependencies:
3711+ '@cloudflare/workers-types': 4.20250204.0
3712+ '@libsql/client': 0.14.0
3713+
27253714 eastasianwidth@0.2.0: {}
27263715
27273716 electron-to-chromium@1.5.96: {}
@@ -2732,6 +3721,13 @@ snapshots:
27323721
27333722 es-module-lexer@1.6.0: {}
27343723
3724+ esbuild-register@3.6.0(esbuild@0.19.12):
3725+ dependencies:
3726+ debug: 4.4.0
3727+ esbuild: 0.19.12
3728+ transitivePeerDependencies:
3729+ - supports-color
3730+
27353731 esbuild@0.17.19:
27363732 optionalDependencies:
27373733 '@esbuild/android-arm': 0.17.19
@@ -2757,6 +3753,84 @@ snapshots:
27573753 '@esbuild/win32-ia32': 0.17.19
27583754 '@esbuild/win32-x64': 0.17.19
27593755
3756+ esbuild@0.18.20:
3757+ optionalDependencies:
3758+ '@esbuild/android-arm': 0.18.20
3759+ '@esbuild/android-arm64': 0.18.20
3760+ '@esbuild/android-x64': 0.18.20
3761+ '@esbuild/darwin-arm64': 0.18.20
3762+ '@esbuild/darwin-x64': 0.18.20
3763+ '@esbuild/freebsd-arm64': 0.18.20
3764+ '@esbuild/freebsd-x64': 0.18.20
3765+ '@esbuild/linux-arm': 0.18.20
3766+ '@esbuild/linux-arm64': 0.18.20
3767+ '@esbuild/linux-ia32': 0.18.20
3768+ '@esbuild/linux-loong64': 0.18.20
3769+ '@esbuild/linux-mips64el': 0.18.20
3770+ '@esbuild/linux-ppc64': 0.18.20
3771+ '@esbuild/linux-riscv64': 0.18.20
3772+ '@esbuild/linux-s390x': 0.18.20
3773+ '@esbuild/linux-x64': 0.18.20
3774+ '@esbuild/netbsd-x64': 0.18.20
3775+ '@esbuild/openbsd-x64': 0.18.20
3776+ '@esbuild/sunos-x64': 0.18.20
3777+ '@esbuild/win32-arm64': 0.18.20
3778+ '@esbuild/win32-ia32': 0.18.20
3779+ '@esbuild/win32-x64': 0.18.20
3780+
3781+ esbuild@0.19.12:
3782+ optionalDependencies:
3783+ '@esbuild/aix-ppc64': 0.19.12
3784+ '@esbuild/android-arm': 0.19.12
3785+ '@esbuild/android-arm64': 0.19.12
3786+ '@esbuild/android-x64': 0.19.12
3787+ '@esbuild/darwin-arm64': 0.19.12
3788+ '@esbuild/darwin-x64': 0.19.12
3789+ '@esbuild/freebsd-arm64': 0.19.12
3790+ '@esbuild/freebsd-x64': 0.19.12
3791+ '@esbuild/linux-arm': 0.19.12
3792+ '@esbuild/linux-arm64': 0.19.12
3793+ '@esbuild/linux-ia32': 0.19.12
3794+ '@esbuild/linux-loong64': 0.19.12
3795+ '@esbuild/linux-mips64el': 0.19.12
3796+ '@esbuild/linux-ppc64': 0.19.12
3797+ '@esbuild/linux-riscv64': 0.19.12
3798+ '@esbuild/linux-s390x': 0.19.12
3799+ '@esbuild/linux-x64': 0.19.12
3800+ '@esbuild/netbsd-x64': 0.19.12
3801+ '@esbuild/openbsd-x64': 0.19.12
3802+ '@esbuild/sunos-x64': 0.19.12
3803+ '@esbuild/win32-arm64': 0.19.12
3804+ '@esbuild/win32-ia32': 0.19.12
3805+ '@esbuild/win32-x64': 0.19.12
3806+
3807+ esbuild@0.23.1:
3808+ optionalDependencies:
3809+ '@esbuild/aix-ppc64': 0.23.1
3810+ '@esbuild/android-arm': 0.23.1
3811+ '@esbuild/android-arm64': 0.23.1
3812+ '@esbuild/android-x64': 0.23.1
3813+ '@esbuild/darwin-arm64': 0.23.1
3814+ '@esbuild/darwin-x64': 0.23.1
3815+ '@esbuild/freebsd-arm64': 0.23.1
3816+ '@esbuild/freebsd-x64': 0.23.1
3817+ '@esbuild/linux-arm': 0.23.1
3818+ '@esbuild/linux-arm64': 0.23.1
3819+ '@esbuild/linux-ia32': 0.23.1
3820+ '@esbuild/linux-loong64': 0.23.1
3821+ '@esbuild/linux-mips64el': 0.23.1
3822+ '@esbuild/linux-ppc64': 0.23.1
3823+ '@esbuild/linux-riscv64': 0.23.1
3824+ '@esbuild/linux-s390x': 0.23.1
3825+ '@esbuild/linux-x64': 0.23.1
3826+ '@esbuild/netbsd-x64': 0.23.1
3827+ '@esbuild/openbsd-arm64': 0.23.1
3828+ '@esbuild/openbsd-x64': 0.23.1
3829+ '@esbuild/sunos-x64': 0.23.1
3830+ '@esbuild/win32-arm64': 0.23.1
3831+ '@esbuild/win32-ia32': 0.23.1
3832+ '@esbuild/win32-x64': 0.23.1
3833+
27603834 esbuild@0.24.2:
27613835 optionalDependencies:
27623836 '@esbuild/aix-ppc64': 0.24.2
@@ -2932,6 +4006,11 @@ snapshots:
29324006
29334007 fdir@6.4.3: {}
29344008
4009+ fetch-blob@3.2.0:
4010+ dependencies:
4011+ node-domexception: 1.0.0
4012+ web-streams-polyfill: 3.3.3
4013+
29354014 file-entry-cache@8.0.0:
29364015 dependencies:
29374016 flat-cache: 4.0.1
@@ -2957,6 +4036,10 @@ snapshots:
29574036 cross-spawn: 7.0.6
29584037 signal-exit: 4.1.0
29594038
4039+ formdata-polyfill@4.0.10:
4040+ dependencies:
4041+ fetch-blob: 3.2.0
4042+
29604043 fraction.js@4.3.7: {}
29614044
29624045 fsevents@2.3.3:
@@ -2969,6 +4052,10 @@ snapshots:
29694052 data-uri-to-buffer: 2.0.2
29704053 source-map: 0.6.1
29714054
4055+ get-tsconfig@4.10.0:
4056+ dependencies:
4057+ resolve-pkg-maps: 1.0.0
4058+
29724059 glob-parent@5.1.2:
29734060 dependencies:
29744061 is-glob: 4.0.3
@@ -3043,6 +4130,8 @@ snapshots:
30434130
30444131 jiti@1.21.7: {}
30454132
4133+ js-base64@3.7.7: {}
4134+
30464135 js-yaml@4.1.0:
30474136 dependencies:
30484137 argparse: 2.0.1
@@ -3066,6 +4155,19 @@ snapshots:
30664155 prelude-ls: 1.2.1
30674156 type-check: 0.4.0
30684157
4158+ libsql@0.4.7:
4159+ dependencies:
4160+ '@neon-rs/load': 0.0.4
4161+ detect-libc: 2.0.2
4162+ optionalDependencies:
4163+ '@libsql/darwin-arm64': 0.4.7
4164+ '@libsql/darwin-x64': 0.4.7
4165+ '@libsql/linux-arm64-gnu': 0.4.7
4166+ '@libsql/linux-arm64-musl': 0.4.7
4167+ '@libsql/linux-x64-gnu': 0.4.7
4168+ '@libsql/linux-x64-musl': 0.4.7
4169+ '@libsql/win32-x64-msvc': 0.4.7
4170+
30694171 lilconfig@2.1.0: {}
30704172
30714173 lilconfig@3.1.3: {}
@@ -3159,6 +4261,14 @@ snapshots:
31594261
31604262 natural-compare@1.4.0: {}
31614263
4264+ node-domexception@1.0.0: {}
4265+
4266+ node-fetch@3.3.2:
4267+ dependencies:
4268+ data-uri-to-buffer: 4.0.1
4269+ fetch-blob: 3.2.0
4270+ formdata-polyfill: 4.0.10
4271+
31624272 node-releases@2.0.19: {}
31634273
31644274 normalize-path@3.0.0: {}
@@ -3301,6 +4411,8 @@ snapshots:
33014411
33024412 printable-characters@1.0.42: {}
33034413
4414+ promise-limit@2.7.0: {}
4415+
33044416 punycode@2.3.1: {}
33054417
33064418 queue-microtask@1.2.3: {}
@@ -3319,6 +4431,8 @@ snapshots:
33194431
33204432 resolve-from@4.0.0: {}
33214433
4434+ resolve-pkg-maps@1.0.0: {}
4435+
33224436 resolve@1.22.10:
33234437 dependencies:
33244438 is-core-module: 2.16.1
@@ -3396,6 +4510,11 @@ snapshots:
33964510
33974511 source-map-js@1.2.1: {}
33984512
4513+ source-map-support@0.5.21:
4514+ dependencies:
4515+ buffer-from: 1.1.2
4516+ source-map: 0.6.1
4517+
33994518 source-map@0.6.1: {}
34004519
34014520 sourcemap-codec@1.4.8: {}
@@ -3545,6 +4664,13 @@ snapshots:
35454664
35464665 ts-interface-checker@0.1.13: {}
35474666
4667+ tsx@4.19.2:
4668+ dependencies:
4669+ esbuild: 0.23.1
4670+ get-tsconfig: 4.10.0
4671+ optionalDependencies:
4672+ fsevents: 2.3.3
4673+
35484674 type-check@0.4.0:
35494675 dependencies:
35504676 prelude-ls: 1.2.1
@@ -3563,6 +4689,8 @@ snapshots:
35634689
35644690 ufo@1.5.4: {}
35654691
4692+ undici-types@6.20.0: {}
4693+
35664694 undici@5.28.5:
35674695 dependencies:
35684696 '@fastify/busboy': 2.1.1
@@ -3587,13 +4715,15 @@ snapshots:
35874715
35884716 util-deprecate@1.0.2: {}
35894717
3590- vite-node@3.0.5(jiti@1.21.7)(yaml@2.7.0):
4718+ uuid@11.0.5: {}
4719+
4720+ vite-node@3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
35914721 dependencies:
35924722 cac: 6.7.14
35934723 debug: 4.4.0
35944724 es-module-lexer: 1.6.0
35954725 pathe: 2.0.2
3596- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
4726+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
35974727 transitivePeerDependencies:
35984728 - '@types/node'
35994729 - jiti
@@ -3608,24 +4738,26 @@ snapshots:
36084738 - tsx
36094739 - yaml
36104740
3611- vite@6.1.0(jiti@1.21.7)(yaml@2.7.0):
4741+ vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
36124742 dependencies:
36134743 esbuild: 0.24.2
36144744 postcss: 8.5.1
36154745 rollup: 4.34.6
36164746 optionalDependencies:
4747+ '@types/node': 22.13.1
36174748 fsevents: 2.3.3
36184749 jiti: 1.21.7
4750+ tsx: 4.19.2
36194751 yaml: 2.7.0
36204752
3621- vitefu@1.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)):
4753+ vitefu@1.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)):
36224754 optionalDependencies:
3623- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
4755+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
36244756
3625- vitest@3.0.5(jiti@1.21.7)(yaml@2.7.0):
4757+ vitest@3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
36264758 dependencies:
36274759 '@vitest/expect': 3.0.5
3628- '@vitest/mocker': 3.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))
4760+ '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
36294761 '@vitest/pretty-format': 3.0.5
36304762 '@vitest/runner': 3.0.5
36314763 '@vitest/snapshot': 3.0.5
@@ -3641,9 +4773,11 @@ snapshots:
36414773 tinyexec: 0.3.2
36424774 tinypool: 1.0.2
36434775 tinyrainbow: 2.0.0
3644- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)
3645- vite-node: 3.0.5(jiti@1.21.7)(yaml@2.7.0)
4776+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
4777+ vite-node: 3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
36464778 why-is-node-running: 2.3.0
4779+ optionalDependencies:
4780+ '@types/node': 22.13.1
36474781 transitivePeerDependencies:
36484782 - jiti
36494783 - less
@@ -3658,6 +4792,8 @@ snapshots:
36584792 - tsx
36594793 - yaml
36604794
4795+ web-streams-polyfill@3.3.3: {}
4796+
36614797 which@2.0.2:
36624798 dependencies:
36634799 isexe: 2.0.0
@@ -8,6 +8,18 @@ importers:
8 8
9 .:9 .:
10 dependencies:10 dependencies:
11+ '@libsql/client':
12+ specifier: ^0.14.0
13+ version: 0.14.0
14+ dotenv:
15+ specifier: ^16.4.7
16+ version: 16.4.7
17+ drizzle-orm:
18+ specifier: ^0.39.3
19+ version: 0.39.3(@cloudflare/workers-types@4.20250204.0)(@libsql/client@0.14.0)
20+ uuid:
21+ specifier: ^11.0.5
22+ version: 11.0.5
11 xp.css:23 xp.css:
12 specifier: ^0.2.624 specifier: ^0.2.6
13 version: 0.2.625 version: 0.2.6
@@ -20,13 +32,13 @@ importers:
20 version: 9.20.032 version: 9.20.0
21 '@sveltejs/adapter-cloudflare':33 '@sveltejs/adapter-cloudflare':
22 specifier: ^5.0.134 specifier: ^5.0.1
23- version: 5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))35+ version: 5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))
24 '@sveltejs/kit':36 '@sveltejs/kit':
25 specifier: ^2.16.037 specifier: ^2.16.0
26- version: 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))38+ version: 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
27 '@sveltejs/vite-plugin-svelte':39 '@sveltejs/vite-plugin-svelte':
28 specifier: ^5.0.040 specifier: ^5.0.0
29- version: 5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))41+ version: 5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
30 '@tailwindcss/container-queries':42 '@tailwindcss/container-queries':
31 specifier: ^0.1.143 specifier: ^0.1.1
32 version: 0.1.1(tailwindcss@3.4.17)44 version: 0.1.1(tailwindcss@3.4.17)
@@ -36,9 +48,15 @@ importers:
36 '@tailwindcss/typography':48 '@tailwindcss/typography':
37 specifier: ^0.5.1649 specifier: ^0.5.16
38 version: 0.5.16(tailwindcss@3.4.17)50 version: 0.5.16(tailwindcss@3.4.17)
51+ '@types/node':
52+ specifier: ^22.13.1
53+ version: 22.13.1
39 autoprefixer:54 autoprefixer:
40 specifier: ^10.4.2055 specifier: ^10.4.20
41 version: 10.4.20(postcss@8.5.1)56 version: 10.4.20(postcss@8.5.1)
57+ drizzle-kit:
58+ specifier: ^0.30.4
59+ version: 0.30.4
42 eslint:60 eslint:
43 specifier: ^9.18.061 specifier: ^9.18.0
44 version: 9.20.0(jiti@1.21.7)62 version: 9.20.0(jiti@1.21.7)
@@ -69,6 +87,9 @@ importers:
69 tailwindcss:87 tailwindcss:
70 specifier: ^3.4.1788 specifier: ^3.4.17
71 version: 3.4.1789 version: 3.4.17
90+ tsx:
91+ specifier: ^4.19.2
92+ version: 4.19.2
72 typescript:93 typescript:
73 specifier: ^5.0.094 specifier: ^5.0.0
74 version: 5.7.395 version: 5.7.3
@@ -77,10 +98,10 @@ importers:
77 version: 8.23.0(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3)98 version: 8.23.0(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3)
78 vite:99 vite:
79 specifier: ^6.0.0100 specifier: ^6.0.0
80- version: 6.1.0(jiti@1.21.7)(yaml@2.7.0)101+ version: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
81 vitest:102 vitest:
82 specifier: ^3.0.0103 specifier: ^3.0.0
83- version: 3.0.5(jiti@1.21.7)(yaml@2.7.0)104+ version: 3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
84 105
85 packages:106 packages:
86 107
@@ -133,6 +154,17 @@ packages:
133 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}154 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
134 engines: {node: '>=12'}155 engines: {node: '>=12'}
135 156
157+ '@drizzle-team/brocli@0.10.2':
158+ resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
159+
160+ '@esbuild-kit/core-utils@3.3.2':
161+ resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
162+ deprecated: 'Merged into tsx: https://tsx.is'
163+
164+ '@esbuild-kit/esm-loader@2.6.5':
165+ resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
166+ deprecated: 'Merged into tsx: https://tsx.is'
167+
136 '@esbuild-plugins/node-globals-polyfill@0.2.3':168 '@esbuild-plugins/node-globals-polyfill@0.2.3':
137 resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==}169 resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==}
138 peerDependencies:170 peerDependencies:
@@ -143,6 +175,18 @@ packages:
143 peerDependencies:175 peerDependencies:
144 esbuild: '*'176 esbuild: '*'
145 177
178+ '@esbuild/aix-ppc64@0.19.12':
179+ resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
180+ engines: {node: '>=12'}
181+ cpu: [ppc64]
182+ os: [aix]
183+
184+ '@esbuild/aix-ppc64@0.23.1':
185+ resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
186+ engines: {node: '>=18'}
187+ cpu: [ppc64]
188+ os: [aix]
189+
146 '@esbuild/aix-ppc64@0.24.2':190 '@esbuild/aix-ppc64@0.24.2':
147 resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}191 resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
148 engines: {node: '>=18'}192 engines: {node: '>=18'}
@@ -155,6 +199,24 @@ packages:
155 cpu: [arm64]199 cpu: [arm64]
156 os: [android]200 os: [android]
157 201
202+ '@esbuild/android-arm64@0.18.20':
203+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
204+ engines: {node: '>=12'}
205+ cpu: [arm64]
206+ os: [android]
207+
208+ '@esbuild/android-arm64@0.19.12':
209+ resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
210+ engines: {node: '>=12'}
211+ cpu: [arm64]
212+ os: [android]
213+
214+ '@esbuild/android-arm64@0.23.1':
215+ resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
216+ engines: {node: '>=18'}
217+ cpu: [arm64]
218+ os: [android]
219+
158 '@esbuild/android-arm64@0.24.2':220 '@esbuild/android-arm64@0.24.2':
159 resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}221 resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
160 engines: {node: '>=18'}222 engines: {node: '>=18'}
@@ -167,6 +229,24 @@ packages:
167 cpu: [arm]229 cpu: [arm]
168 os: [android]230 os: [android]
169 231
232+ '@esbuild/android-arm@0.18.20':
233+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
234+ engines: {node: '>=12'}
235+ cpu: [arm]
236+ os: [android]
237+
238+ '@esbuild/android-arm@0.19.12':
239+ resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
240+ engines: {node: '>=12'}
241+ cpu: [arm]
242+ os: [android]
243+
244+ '@esbuild/android-arm@0.23.1':
245+ resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
246+ engines: {node: '>=18'}
247+ cpu: [arm]
248+ os: [android]
249+
170 '@esbuild/android-arm@0.24.2':250 '@esbuild/android-arm@0.24.2':
171 resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}251 resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
172 engines: {node: '>=18'}252 engines: {node: '>=18'}
@@ -179,6 +259,24 @@ packages:
179 cpu: [x64]259 cpu: [x64]
180 os: [android]260 os: [android]
181 261
262+ '@esbuild/android-x64@0.18.20':
263+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
264+ engines: {node: '>=12'}
265+ cpu: [x64]
266+ os: [android]
267+
268+ '@esbuild/android-x64@0.19.12':
269+ resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
270+ engines: {node: '>=12'}
271+ cpu: [x64]
272+ os: [android]
273+
274+ '@esbuild/android-x64@0.23.1':
275+ resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
276+ engines: {node: '>=18'}
277+ cpu: [x64]
278+ os: [android]
279+
182 '@esbuild/android-x64@0.24.2':280 '@esbuild/android-x64@0.24.2':
183 resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}281 resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
184 engines: {node: '>=18'}282 engines: {node: '>=18'}
@@ -191,6 +289,24 @@ packages:
191 cpu: [arm64]289 cpu: [arm64]
192 os: [darwin]290 os: [darwin]
193 291
292+ '@esbuild/darwin-arm64@0.18.20':
293+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
294+ engines: {node: '>=12'}
295+ cpu: [arm64]
296+ os: [darwin]
297+
298+ '@esbuild/darwin-arm64@0.19.12':
299+ resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
300+ engines: {node: '>=12'}
301+ cpu: [arm64]
302+ os: [darwin]
303+
304+ '@esbuild/darwin-arm64@0.23.1':
305+ resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
306+ engines: {node: '>=18'}
307+ cpu: [arm64]
308+ os: [darwin]
309+
194 '@esbuild/darwin-arm64@0.24.2':310 '@esbuild/darwin-arm64@0.24.2':
195 resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}311 resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
196 engines: {node: '>=18'}312 engines: {node: '>=18'}
@@ -203,6 +319,24 @@ packages:
203 cpu: [x64]319 cpu: [x64]
204 os: [darwin]320 os: [darwin]
205 321
322+ '@esbuild/darwin-x64@0.18.20':
323+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
324+ engines: {node: '>=12'}
325+ cpu: [x64]
326+ os: [darwin]
327+
328+ '@esbuild/darwin-x64@0.19.12':
329+ resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
330+ engines: {node: '>=12'}
331+ cpu: [x64]
332+ os: [darwin]
333+
334+ '@esbuild/darwin-x64@0.23.1':
335+ resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
336+ engines: {node: '>=18'}
337+ cpu: [x64]
338+ os: [darwin]
339+
206 '@esbuild/darwin-x64@0.24.2':340 '@esbuild/darwin-x64@0.24.2':
207 resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}341 resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
208 engines: {node: '>=18'}342 engines: {node: '>=18'}
@@ -215,6 +349,24 @@ packages:
215 cpu: [arm64]349 cpu: [arm64]
216 os: [freebsd]350 os: [freebsd]
217 351
352+ '@esbuild/freebsd-arm64@0.18.20':
353+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
354+ engines: {node: '>=12'}
355+ cpu: [arm64]
356+ os: [freebsd]
357+
358+ '@esbuild/freebsd-arm64@0.19.12':
359+ resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
360+ engines: {node: '>=12'}
361+ cpu: [arm64]
362+ os: [freebsd]
363+
364+ '@esbuild/freebsd-arm64@0.23.1':
365+ resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
366+ engines: {node: '>=18'}
367+ cpu: [arm64]
368+ os: [freebsd]
369+
218 '@esbuild/freebsd-arm64@0.24.2':370 '@esbuild/freebsd-arm64@0.24.2':
219 resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}371 resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
220 engines: {node: '>=18'}372 engines: {node: '>=18'}
@@ -227,6 +379,24 @@ packages:
227 cpu: [x64]379 cpu: [x64]
228 os: [freebsd]380 os: [freebsd]
229 381
382+ '@esbuild/freebsd-x64@0.18.20':
383+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
384+ engines: {node: '>=12'}
385+ cpu: [x64]
386+ os: [freebsd]
387+
388+ '@esbuild/freebsd-x64@0.19.12':
389+ resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
390+ engines: {node: '>=12'}
391+ cpu: [x64]
392+ os: [freebsd]
393+
394+ '@esbuild/freebsd-x64@0.23.1':
395+ resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
396+ engines: {node: '>=18'}
397+ cpu: [x64]
398+ os: [freebsd]
399+
230 '@esbuild/freebsd-x64@0.24.2':400 '@esbuild/freebsd-x64@0.24.2':
231 resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}401 resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
232 engines: {node: '>=18'}402 engines: {node: '>=18'}
@@ -239,6 +409,24 @@ packages:
239 cpu: [arm64]409 cpu: [arm64]
240 os: [linux]410 os: [linux]
241 411
412+ '@esbuild/linux-arm64@0.18.20':
413+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
414+ engines: {node: '>=12'}
415+ cpu: [arm64]
416+ os: [linux]
417+
418+ '@esbuild/linux-arm64@0.19.12':
419+ resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
420+ engines: {node: '>=12'}
421+ cpu: [arm64]
422+ os: [linux]
423+
424+ '@esbuild/linux-arm64@0.23.1':
425+ resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
426+ engines: {node: '>=18'}
427+ cpu: [arm64]
428+ os: [linux]
429+
242 '@esbuild/linux-arm64@0.24.2':430 '@esbuild/linux-arm64@0.24.2':
243 resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}431 resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
244 engines: {node: '>=18'}432 engines: {node: '>=18'}
@@ -251,6 +439,24 @@ packages:
251 cpu: [arm]439 cpu: [arm]
252 os: [linux]440 os: [linux]
253 441
442+ '@esbuild/linux-arm@0.18.20':
443+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
444+ engines: {node: '>=12'}
445+ cpu: [arm]
446+ os: [linux]
447+
448+ '@esbuild/linux-arm@0.19.12':
449+ resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
450+ engines: {node: '>=12'}
451+ cpu: [arm]
452+ os: [linux]
453+
454+ '@esbuild/linux-arm@0.23.1':
455+ resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
456+ engines: {node: '>=18'}
457+ cpu: [arm]
458+ os: [linux]
459+
254 '@esbuild/linux-arm@0.24.2':460 '@esbuild/linux-arm@0.24.2':
255 resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}461 resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
256 engines: {node: '>=18'}462 engines: {node: '>=18'}
@@ -263,6 +469,24 @@ packages:
263 cpu: [ia32]469 cpu: [ia32]
264 os: [linux]470 os: [linux]
265 471
472+ '@esbuild/linux-ia32@0.18.20':
473+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
474+ engines: {node: '>=12'}
475+ cpu: [ia32]
476+ os: [linux]
477+
478+ '@esbuild/linux-ia32@0.19.12':
479+ resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
480+ engines: {node: '>=12'}
481+ cpu: [ia32]
482+ os: [linux]
483+
484+ '@esbuild/linux-ia32@0.23.1':
485+ resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
486+ engines: {node: '>=18'}
487+ cpu: [ia32]
488+ os: [linux]
489+
266 '@esbuild/linux-ia32@0.24.2':490 '@esbuild/linux-ia32@0.24.2':
267 resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}491 resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
268 engines: {node: '>=18'}492 engines: {node: '>=18'}
@@ -275,6 +499,24 @@ packages:
275 cpu: [loong64]499 cpu: [loong64]
276 os: [linux]500 os: [linux]
277 501
502+ '@esbuild/linux-loong64@0.18.20':
503+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
504+ engines: {node: '>=12'}
505+ cpu: [loong64]
506+ os: [linux]
507+
508+ '@esbuild/linux-loong64@0.19.12':
509+ resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
510+ engines: {node: '>=12'}
511+ cpu: [loong64]
512+ os: [linux]
513+
514+ '@esbuild/linux-loong64@0.23.1':
515+ resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
516+ engines: {node: '>=18'}
517+ cpu: [loong64]
518+ os: [linux]
519+
278 '@esbuild/linux-loong64@0.24.2':520 '@esbuild/linux-loong64@0.24.2':
279 resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}521 resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
280 engines: {node: '>=18'}522 engines: {node: '>=18'}
@@ -287,6 +529,24 @@ packages:
287 cpu: [mips64el]529 cpu: [mips64el]
288 os: [linux]530 os: [linux]
289 531
532+ '@esbuild/linux-mips64el@0.18.20':
533+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
534+ engines: {node: '>=12'}
535+ cpu: [mips64el]
536+ os: [linux]
537+
538+ '@esbuild/linux-mips64el@0.19.12':
539+ resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
540+ engines: {node: '>=12'}
541+ cpu: [mips64el]
542+ os: [linux]
543+
544+ '@esbuild/linux-mips64el@0.23.1':
545+ resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
546+ engines: {node: '>=18'}
547+ cpu: [mips64el]
548+ os: [linux]
549+
290 '@esbuild/linux-mips64el@0.24.2':550 '@esbuild/linux-mips64el@0.24.2':
291 resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}551 resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
292 engines: {node: '>=18'}552 engines: {node: '>=18'}
@@ -299,6 +559,24 @@ packages:
299 cpu: [ppc64]559 cpu: [ppc64]
300 os: [linux]560 os: [linux]
301 561
562+ '@esbuild/linux-ppc64@0.18.20':
563+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
564+ engines: {node: '>=12'}
565+ cpu: [ppc64]
566+ os: [linux]
567+
568+ '@esbuild/linux-ppc64@0.19.12':
569+ resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
570+ engines: {node: '>=12'}
571+ cpu: [ppc64]
572+ os: [linux]
573+
574+ '@esbuild/linux-ppc64@0.23.1':
575+ resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
576+ engines: {node: '>=18'}
577+ cpu: [ppc64]
578+ os: [linux]
579+
302 '@esbuild/linux-ppc64@0.24.2':580 '@esbuild/linux-ppc64@0.24.2':
303 resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}581 resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
304 engines: {node: '>=18'}582 engines: {node: '>=18'}
@@ -311,6 +589,24 @@ packages:
311 cpu: [riscv64]589 cpu: [riscv64]
312 os: [linux]590 os: [linux]
313 591
592+ '@esbuild/linux-riscv64@0.18.20':
593+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
594+ engines: {node: '>=12'}
595+ cpu: [riscv64]
596+ os: [linux]
597+
598+ '@esbuild/linux-riscv64@0.19.12':
599+ resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
600+ engines: {node: '>=12'}
601+ cpu: [riscv64]
602+ os: [linux]
603+
604+ '@esbuild/linux-riscv64@0.23.1':
605+ resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
606+ engines: {node: '>=18'}
607+ cpu: [riscv64]
608+ os: [linux]
609+
314 '@esbuild/linux-riscv64@0.24.2':610 '@esbuild/linux-riscv64@0.24.2':
315 resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}611 resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
316 engines: {node: '>=18'}612 engines: {node: '>=18'}
@@ -323,6 +619,24 @@ packages:
323 cpu: [s390x]619 cpu: [s390x]
324 os: [linux]620 os: [linux]
325 621
622+ '@esbuild/linux-s390x@0.18.20':
623+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
624+ engines: {node: '>=12'}
625+ cpu: [s390x]
626+ os: [linux]
627+
628+ '@esbuild/linux-s390x@0.19.12':
629+ resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
630+ engines: {node: '>=12'}
631+ cpu: [s390x]
632+ os: [linux]
633+
634+ '@esbuild/linux-s390x@0.23.1':
635+ resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
636+ engines: {node: '>=18'}
637+ cpu: [s390x]
638+ os: [linux]
639+
326 '@esbuild/linux-s390x@0.24.2':640 '@esbuild/linux-s390x@0.24.2':
327 resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}641 resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
328 engines: {node: '>=18'}642 engines: {node: '>=18'}
@@ -335,6 +649,24 @@ packages:
335 cpu: [x64]649 cpu: [x64]
336 os: [linux]650 os: [linux]
337 651
652+ '@esbuild/linux-x64@0.18.20':
653+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
654+ engines: {node: '>=12'}
655+ cpu: [x64]
656+ os: [linux]
657+
658+ '@esbuild/linux-x64@0.19.12':
659+ resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
660+ engines: {node: '>=12'}
661+ cpu: [x64]
662+ os: [linux]
663+
664+ '@esbuild/linux-x64@0.23.1':
665+ resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
666+ engines: {node: '>=18'}
667+ cpu: [x64]
668+ os: [linux]
669+
338 '@esbuild/linux-x64@0.24.2':670 '@esbuild/linux-x64@0.24.2':
339 resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}671 resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
340 engines: {node: '>=18'}672 engines: {node: '>=18'}
@@ -353,12 +685,36 @@ packages:
353 cpu: [x64]685 cpu: [x64]
354 os: [netbsd]686 os: [netbsd]
355 687
688+ '@esbuild/netbsd-x64@0.18.20':
689+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
690+ engines: {node: '>=12'}
691+ cpu: [x64]
692+ os: [netbsd]
693+
694+ '@esbuild/netbsd-x64@0.19.12':
695+ resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
696+ engines: {node: '>=12'}
697+ cpu: [x64]
698+ os: [netbsd]
699+
700+ '@esbuild/netbsd-x64@0.23.1':
701+ resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
702+ engines: {node: '>=18'}
703+ cpu: [x64]
704+ os: [netbsd]
705+
356 '@esbuild/netbsd-x64@0.24.2':706 '@esbuild/netbsd-x64@0.24.2':
357 resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}707 resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
358 engines: {node: '>=18'}708 engines: {node: '>=18'}
359 cpu: [x64]709 cpu: [x64]
360 os: [netbsd]710 os: [netbsd]
361 711
712+ '@esbuild/openbsd-arm64@0.23.1':
713+ resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
714+ engines: {node: '>=18'}
715+ cpu: [arm64]
716+ os: [openbsd]
717+
362 '@esbuild/openbsd-arm64@0.24.2':718 '@esbuild/openbsd-arm64@0.24.2':
363 resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}719 resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
364 engines: {node: '>=18'}720 engines: {node: '>=18'}
@@ -371,6 +727,24 @@ packages:
371 cpu: [x64]727 cpu: [x64]
372 os: [openbsd]728 os: [openbsd]
373 729
730+ '@esbuild/openbsd-x64@0.18.20':
731+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
732+ engines: {node: '>=12'}
733+ cpu: [x64]
734+ os: [openbsd]
735+
736+ '@esbuild/openbsd-x64@0.19.12':
737+ resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
738+ engines: {node: '>=12'}
739+ cpu: [x64]
740+ os: [openbsd]
741+
742+ '@esbuild/openbsd-x64@0.23.1':
743+ resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
744+ engines: {node: '>=18'}
745+ cpu: [x64]
746+ os: [openbsd]
747+
374 '@esbuild/openbsd-x64@0.24.2':748 '@esbuild/openbsd-x64@0.24.2':
375 resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}749 resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
376 engines: {node: '>=18'}750 engines: {node: '>=18'}
@@ -383,6 +757,24 @@ packages:
383 cpu: [x64]757 cpu: [x64]
384 os: [sunos]758 os: [sunos]
385 759
760+ '@esbuild/sunos-x64@0.18.20':
761+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
762+ engines: {node: '>=12'}
763+ cpu: [x64]
764+ os: [sunos]
765+
766+ '@esbuild/sunos-x64@0.19.12':
767+ resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
768+ engines: {node: '>=12'}
769+ cpu: [x64]
770+ os: [sunos]
771+
772+ '@esbuild/sunos-x64@0.23.1':
773+ resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
774+ engines: {node: '>=18'}
775+ cpu: [x64]
776+ os: [sunos]
777+
386 '@esbuild/sunos-x64@0.24.2':778 '@esbuild/sunos-x64@0.24.2':
387 resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}779 resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
388 engines: {node: '>=18'}780 engines: {node: '>=18'}
@@ -395,6 +787,24 @@ packages:
395 cpu: [arm64]787 cpu: [arm64]
396 os: [win32]788 os: [win32]
397 789
790+ '@esbuild/win32-arm64@0.18.20':
791+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
792+ engines: {node: '>=12'}
793+ cpu: [arm64]
794+ os: [win32]
795+
796+ '@esbuild/win32-arm64@0.19.12':
797+ resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
798+ engines: {node: '>=12'}
799+ cpu: [arm64]
800+ os: [win32]
801+
802+ '@esbuild/win32-arm64@0.23.1':
803+ resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
804+ engines: {node: '>=18'}
805+ cpu: [arm64]
806+ os: [win32]
807+
398 '@esbuild/win32-arm64@0.24.2':808 '@esbuild/win32-arm64@0.24.2':
399 resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}809 resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
400 engines: {node: '>=18'}810 engines: {node: '>=18'}
@@ -407,6 +817,24 @@ packages:
407 cpu: [ia32]817 cpu: [ia32]
408 os: [win32]818 os: [win32]
409 819
820+ '@esbuild/win32-ia32@0.18.20':
821+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
822+ engines: {node: '>=12'}
823+ cpu: [ia32]
824+ os: [win32]
825+
826+ '@esbuild/win32-ia32@0.19.12':
827+ resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
828+ engines: {node: '>=12'}
829+ cpu: [ia32]
830+ os: [win32]
831+
832+ '@esbuild/win32-ia32@0.23.1':
833+ resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
834+ engines: {node: '>=18'}
835+ cpu: [ia32]
836+ os: [win32]
837+
410 '@esbuild/win32-ia32@0.24.2':838 '@esbuild/win32-ia32@0.24.2':
411 resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}839 resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
412 engines: {node: '>=18'}840 engines: {node: '>=18'}
@@ -419,6 +847,24 @@ packages:
419 cpu: [x64]847 cpu: [x64]
420 os: [win32]848 os: [win32]
421 849
850+ '@esbuild/win32-x64@0.18.20':
851+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
852+ engines: {node: '>=12'}
853+ cpu: [x64]
854+ os: [win32]
855+
856+ '@esbuild/win32-x64@0.19.12':
857+ resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
858+ engines: {node: '>=12'}
859+ cpu: [x64]
860+ os: [win32]
861+
862+ '@esbuild/win32-x64@0.23.1':
863+ resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
864+ engines: {node: '>=18'}
865+ cpu: [x64]
866+ os: [win32]
867+
422 '@esbuild/win32-x64@0.24.2':868 '@esbuild/win32-x64@0.24.2':
423 resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}869 resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
424 engines: {node: '>=18'}870 engines: {node: '>=18'}
@@ -521,6 +967,60 @@ packages:
521 '@jridgewell/trace-mapping@0.3.9':967 '@jridgewell/trace-mapping@0.3.9':
522 resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}968 resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
523 969
970+ '@libsql/client@0.14.0':
971+ resolution: {integrity: sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==}
972+
973+ '@libsql/core@0.14.0':
974+ resolution: {integrity: sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==}
975+
976+ '@libsql/darwin-arm64@0.4.7':
977+ resolution: {integrity: sha512-yOL742IfWUlUevnI5PdnIT4fryY3LYTdLm56bnY0wXBw7dhFcnjuA7jrH3oSVz2mjZTHujxoITgAE7V6Z+eAbg==}
978+ cpu: [arm64]
979+ os: [darwin]
980+
981+ '@libsql/darwin-x64@0.4.7':
982+ resolution: {integrity: sha512-ezc7V75+eoyyH07BO9tIyJdqXXcRfZMbKcLCeF8+qWK5nP8wWuMcfOVywecsXGRbT99zc5eNra4NEx6z5PkSsA==}
983+ cpu: [x64]
984+ os: [darwin]
985+
986+ '@libsql/hrana-client@0.7.0':
987+ resolution: {integrity: sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==}
988+
989+ '@libsql/isomorphic-fetch@0.3.1':
990+ resolution: {integrity: sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==}
991+ engines: {node: '>=18.0.0'}
992+
993+ '@libsql/isomorphic-ws@0.1.5':
994+ resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==}
995+
996+ '@libsql/linux-arm64-gnu@0.4.7':
997+ resolution: {integrity: sha512-WlX2VYB5diM4kFfNaYcyhw5y+UJAI3xcMkEUJZPtRDEIu85SsSFrQ+gvoKfcVh76B//ztSeEX2wl9yrjF7BBCA==}
998+ cpu: [arm64]
999+ os: [linux]
1000+
1001+ '@libsql/linux-arm64-musl@0.4.7':
1002+ resolution: {integrity: sha512-6kK9xAArVRlTCpWeqnNMCoXW1pe7WITI378n4NpvU5EJ0Ok3aNTIC2nRPRjhro90QcnmLL1jPcrVwO4WD1U0xw==}
1003+ cpu: [arm64]
1004+ os: [linux]
1005+
1006+ '@libsql/linux-x64-gnu@0.4.7':
1007+ resolution: {integrity: sha512-CMnNRCmlWQqqzlTw6NeaZXzLWI8bydaXDke63JTUCvu8R+fj/ENsLrVBtPDlxQ0wGsYdXGlrUCH8Qi9gJep0yQ==}
1008+ cpu: [x64]
1009+ os: [linux]
1010+
1011+ '@libsql/linux-x64-musl@0.4.7':
1012+ resolution: {integrity: sha512-nI6tpS1t6WzGAt1Kx1n1HsvtBbZ+jHn0m7ogNNT6pQHZQj7AFFTIMeDQw/i/Nt5H38np1GVRNsFe99eSIMs9XA==}
1013+ cpu: [x64]
1014+ os: [linux]
1015+
1016+ '@libsql/win32-x64-msvc@0.4.7':
1017+ resolution: {integrity: sha512-7pJzOWzPm6oJUxml+PCDRzYQ4A1hTMHAciTAHfFK4fkbDZX33nWPVG7Y3vqdKtslcwAzwmrNDc6sXy2nwWnbiw==}
1018+ cpu: [x64]
1019+ os: [win32]
1020+
1021+ '@neon-rs/load@0.0.4':
1022+ resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==}
1023+
524 '@nodelib/fs.scandir@2.1.5':1024 '@nodelib/fs.scandir@2.1.5':
525 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}1025 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
526 engines: {node: '>= 8'}1026 engines: {node: '>= 8'}
@@ -689,6 +1189,12 @@ packages:
689 '@types/json-schema@7.0.15':1189 '@types/json-schema@7.0.15':
690 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}1190 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
691 1191
1192+ '@types/node@22.13.1':
1193+ resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==}
1194+
1195+ '@types/ws@8.5.14':
1196+ resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==}
1197+
692 '@typescript-eslint/eslint-plugin@8.23.0':1198 '@typescript-eslint/eslint-plugin@8.23.0':
693 resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==}1199 resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==}
694 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}1200 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -863,6 +1369,9 @@ packages:
863 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}1369 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
864 hasBin: true1370 hasBin: true
865 1371
1372+ buffer-from@1.1.2:
1373+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
1374+
866 cac@6.7.14:1375 cac@6.7.14:
867 resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}1376 resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
868 engines: {node: '>=8'}1377 engines: {node: '>=8'}
@@ -939,6 +1448,10 @@ packages:
939 data-uri-to-buffer@2.0.2:1448 data-uri-to-buffer@2.0.2:
940 resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==}1449 resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==}
941 1450
1451+ data-uri-to-buffer@4.0.1:
1452+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
1453+ engines: {node: '>= 12'}
1454+
942 debug@4.4.0:1455 debug@4.4.0:
943 resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}1456 resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
944 engines: {node: '>=6.0'}1457 engines: {node: '>=6.0'}
@@ -962,6 +1475,10 @@ packages:
962 defu@6.1.4:1475 defu@6.1.4:
963 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}1476 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
964 1477
1478+ detect-libc@2.0.2:
1479+ resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
1480+ engines: {node: '>=8'}
1481+
965 devalue@5.1.1:1482 devalue@5.1.1:
966 resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}1483 resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
967 1484
@@ -971,6 +1488,100 @@ packages:
971 dlv@1.1.3:1488 dlv@1.1.3:
972 resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}1489 resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
973 1490
1491+ dotenv@16.4.7:
1492+ resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
1493+ engines: {node: '>=12'}
1494+
1495+ drizzle-kit@0.30.4:
1496+ resolution: {integrity: sha512-B2oJN5UkvwwNHscPWXDG5KqAixu7AUzZ3qbe++KU9SsQ+cZWR4DXEPYcvWplyFAno0dhRJECNEhNxiDmFaPGyQ==}
1497+ hasBin: true
1498+
1499+ drizzle-orm@0.39.3:
1500+ resolution: {integrity: sha512-EZ8ZpYvDIvKU9C56JYLOmUskazhad+uXZCTCRN4OnRMsL+xAJ05dv1eCpAG5xzhsm1hqiuC5kAZUCS924u2DTw==}
1501+ peerDependencies:
1502+ '@aws-sdk/client-rds-data': '>=3'
1503+ '@cloudflare/workers-types': '>=4'
1504+ '@electric-sql/pglite': '>=0.2.0'
1505+ '@libsql/client': '>=0.10.0'
1506+ '@libsql/client-wasm': '>=0.10.0'
1507+ '@neondatabase/serverless': '>=0.10.0'
1508+ '@op-engineering/op-sqlite': '>=2'
1509+ '@opentelemetry/api': ^1.4.1
1510+ '@planetscale/database': '>=1'
1511+ '@prisma/client': '*'
1512+ '@tidbcloud/serverless': '*'
1513+ '@types/better-sqlite3': '*'
1514+ '@types/pg': '*'
1515+ '@types/sql.js': '*'
1516+ '@vercel/postgres': '>=0.8.0'
1517+ '@xata.io/client': '*'
1518+ better-sqlite3: '>=7'
1519+ bun-types: '*'
1520+ expo-sqlite: '>=14.0.0'
1521+ knex: '*'
1522+ kysely: '*'
1523+ mysql2: '>=2'
1524+ pg: '>=8'
1525+ postgres: '>=3'
1526+ prisma: '*'
1527+ sql.js: '>=1'
1528+ sqlite3: '>=5'
1529+ peerDependenciesMeta:
1530+ '@aws-sdk/client-rds-data':
1531+ optional: true
1532+ '@cloudflare/workers-types':
1533+ optional: true
1534+ '@electric-sql/pglite':
1535+ optional: true
1536+ '@libsql/client':
1537+ optional: true
1538+ '@libsql/client-wasm':
1539+ optional: true
1540+ '@neondatabase/serverless':
1541+ optional: true
1542+ '@op-engineering/op-sqlite':
1543+ optional: true
1544+ '@opentelemetry/api':
1545+ optional: true
1546+ '@planetscale/database':
1547+ optional: true
1548+ '@prisma/client':
1549+ optional: true
1550+ '@tidbcloud/serverless':
1551+ optional: true
1552+ '@types/better-sqlite3':
1553+ optional: true
1554+ '@types/pg':
1555+ optional: true
1556+ '@types/sql.js':
1557+ optional: true
1558+ '@vercel/postgres':
1559+ optional: true
1560+ '@xata.io/client':
1561+ optional: true
1562+ better-sqlite3:
1563+ optional: true
1564+ bun-types:
1565+ optional: true
1566+ expo-sqlite:
1567+ optional: true
1568+ knex:
1569+ optional: true
1570+ kysely:
1571+ optional: true
1572+ mysql2:
1573+ optional: true
1574+ pg:
1575+ optional: true
1576+ postgres:
1577+ optional: true
1578+ prisma:
1579+ optional: true
1580+ sql.js:
1581+ optional: true
1582+ sqlite3:
1583+ optional: true
1584+
974 eastasianwidth@0.2.0:1585 eastasianwidth@0.2.0:
975 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}1586 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
976 1587
@@ -986,11 +1597,31 @@ packages:
986 es-module-lexer@1.6.0:1597 es-module-lexer@1.6.0:
987 resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}1598 resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
988 1599
1600+ esbuild-register@3.6.0:
1601+ resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
1602+ peerDependencies:
1603+ esbuild: '>=0.12 <1'
1604+
989 esbuild@0.17.19:1605 esbuild@0.17.19:
990 resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}1606 resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
991 engines: {node: '>=12'}1607 engines: {node: '>=12'}
992 hasBin: true1608 hasBin: true
993 1609
1610+ esbuild@0.18.20:
1611+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
1612+ engines: {node: '>=12'}
1613+ hasBin: true
1614+
1615+ esbuild@0.19.12:
1616+ resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
1617+ engines: {node: '>=12'}
1618+ hasBin: true
1619+
1620+ esbuild@0.23.1:
1621+ resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
1622+ engines: {node: '>=18'}
1623+ hasBin: true
1624+
994 esbuild@0.24.2:1625 esbuild@0.24.2:
995 resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}1626 resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
996 engines: {node: '>=18'}1627 engines: {node: '>=18'}
@@ -1120,6 +1751,10 @@ packages:
1120 picomatch:1751 picomatch:
1121 optional: true1752 optional: true
1122 1753
1754+ fetch-blob@3.2.0:
1755+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
1756+ engines: {node: ^12.20 || >= 14.13}
1757+
1123 file-entry-cache@8.0.0:1758 file-entry-cache@8.0.0:
1124 resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}1759 resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
1125 engines: {node: '>=16.0.0'}1760 engines: {node: '>=16.0.0'}
@@ -1143,6 +1778,10 @@ packages:
1143 resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}1778 resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
1144 engines: {node: '>=14'}1779 engines: {node: '>=14'}
1145 1780
1781+ formdata-polyfill@4.0.10:
1782+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
1783+ engines: {node: '>=12.20.0'}
1784+
1146 fraction.js@4.3.7:1785 fraction.js@4.3.7:
1147 resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}1786 resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
1148 1787
@@ -1157,6 +1796,9 @@ packages:
1157 get-source@2.0.12:1796 get-source@2.0.12:
1158 resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}1797 resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}
1159 1798
1799+ get-tsconfig@4.10.0:
1800+ resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==}
1801+
1160 glob-parent@5.1.2:1802 glob-parent@5.1.2:
1161 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}1803 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1162 engines: {node: '>= 6'}1804 engines: {node: '>= 6'}
@@ -1243,6 +1885,9 @@ packages:
1243 resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}1885 resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
1244 hasBin: true1886 hasBin: true
1245 1887
1888+ js-base64@3.7.7:
1889+ resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
1890+
1246 js-yaml@4.1.0:1891 js-yaml@4.1.0:
1247 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}1892 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1248 hasBin: true1893 hasBin: true
@@ -1270,6 +1915,10 @@ packages:
1270 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}1915 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1271 engines: {node: '>= 0.8.0'}1916 engines: {node: '>= 0.8.0'}
1272 1917
1918+ libsql@0.4.7:
1919+ resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==}
1920+ os: [darwin, linux, win32]
1921+
1273 lilconfig@2.1.0:1922 lilconfig@2.1.0:
1274 resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}1923 resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
1275 engines: {node: '>=10'}1924 engines: {node: '>=10'}
@@ -1371,6 +2020,14 @@ packages:
1371 natural-compare@1.4.0:2020 natural-compare@1.4.0:
1372 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}2021 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1373 2022
2023+ node-domexception@1.0.0:
2024+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
2025+ engines: {node: '>=10.5.0'}
2026+
2027+ node-fetch@3.3.2:
2028+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
2029+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
2030+
1374 node-releases@2.0.19:2031 node-releases@2.0.19:
1375 resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}2032 resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
1376 2033
@@ -1600,6 +2257,9 @@ packages:
1600 printable-characters@1.0.42:2257 printable-characters@1.0.42:
1601 resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==}2258 resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==}
1602 2259
2260+ promise-limit@2.7.0:
2261+ resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==}
2262+
1603 punycode@2.3.1:2263 punycode@2.3.1:
1604 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}2264 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1605 engines: {node: '>=6'}2265 engines: {node: '>=6'}
@@ -1626,6 +2286,9 @@ packages:
1626 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}2286 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1627 engines: {node: '>=4'}2287 engines: {node: '>=4'}
1628 2288
2289+ resolve-pkg-maps@1.0.0:
2290+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
2291+
1629 resolve@1.22.10:2292 resolve@1.22.10:
1630 resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}2293 resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
1631 engines: {node: '>= 0.4'}2294 engines: {node: '>= 0.4'}
@@ -1688,6 +2351,9 @@ packages:
1688 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}2351 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1689 engines: {node: '>=0.10.0'}2352 engines: {node: '>=0.10.0'}
1690 2353
2354+ source-map-support@0.5.21:
2355+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
2356+
1691 source-map@0.6.1:2357 source-map@0.6.1:
1692 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}2358 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
1693 engines: {node: '>=0.10.0'}2359 engines: {node: '>=0.10.0'}
@@ -1810,6 +2476,11 @@ packages:
1810 ts-interface-checker@0.1.13:2476 ts-interface-checker@0.1.13:
1811 resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}2477 resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
1812 2478
2479+ tsx@4.19.2:
2480+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
2481+ engines: {node: '>=18.0.0'}
2482+ hasBin: true
2483+
1813 type-check@0.4.0:2484 type-check@0.4.0:
1814 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}2485 resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1815 engines: {node: '>= 0.8.0'}2486 engines: {node: '>= 0.8.0'}
@@ -1829,6 +2500,9 @@ packages:
1829 ufo@1.5.4:2500 ufo@1.5.4:
1830 resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}2501 resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
1831 2502
2503+ undici-types@6.20.0:
2504+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
2505+
1832 undici@5.28.5:2506 undici@5.28.5:
1833 resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==}2507 resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==}
1834 engines: {node: '>=14.0'}2508 engines: {node: '>=14.0'}
@@ -1848,6 +2522,10 @@ packages:
1848 util-deprecate@1.0.2:2522 util-deprecate@1.0.2:
1849 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}2523 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1850 2524
2525+ uuid@11.0.5:
2526+ resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==}
2527+ hasBin: true
2528+
1851 vite-node@3.0.5:2529 vite-node@3.0.5:
1852 resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==}2530 resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==}
1853 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}2531 engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -1929,6 +2607,10 @@ packages:
1929 jsdom:2607 jsdom:
1930 optional: true2608 optional: true
1931 2609
2610+ web-streams-polyfill@3.3.3:
2611+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
2612+ engines: {node: '>= 8'}
2613+
1932 which@2.0.2:2614 which@2.0.2:
1933 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}2615 resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1934 engines: {node: '>= 8'}2616 engines: {node: '>= 8'}
@@ -2041,6 +2723,18 @@ snapshots:
2041 dependencies:2723 dependencies:
2042 '@jridgewell/trace-mapping': 0.3.92724 '@jridgewell/trace-mapping': 0.3.9
2043 2725
2726+ '@drizzle-team/brocli@0.10.2': {}
2727+
2728+ '@esbuild-kit/core-utils@3.3.2':
2729+ dependencies:
2730+ esbuild: 0.18.20
2731+ source-map-support: 0.5.21
2732+
2733+ '@esbuild-kit/esm-loader@2.6.5':
2734+ dependencies:
2735+ '@esbuild-kit/core-utils': 3.3.2
2736+ get-tsconfig: 4.10.0
2737+
2044 '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)':2738 '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)':
2045 dependencies:2739 dependencies:
2046 esbuild: 0.17.192740 esbuild: 0.17.19
@@ -2051,102 +2745,252 @@ snapshots:
2051 escape-string-regexp: 4.0.02745 escape-string-regexp: 4.0.0
2052 rollup-plugin-node-polyfills: 0.2.12746 rollup-plugin-node-polyfills: 0.2.1
2053 2747
2748+ '@esbuild/aix-ppc64@0.19.12':
2749+ optional: true
2750+
2751+ '@esbuild/aix-ppc64@0.23.1':
2752+ optional: true
2753+
2054 '@esbuild/aix-ppc64@0.24.2':2754 '@esbuild/aix-ppc64@0.24.2':
2055 optional: true2755 optional: true
2056 2756
2057 '@esbuild/android-arm64@0.17.19':2757 '@esbuild/android-arm64@0.17.19':
2058 optional: true2758 optional: true
2059 2759
2760+ '@esbuild/android-arm64@0.18.20':
2761+ optional: true
2762+
2763+ '@esbuild/android-arm64@0.19.12':
2764+ optional: true
2765+
2766+ '@esbuild/android-arm64@0.23.1':
2767+ optional: true
2768+
2060 '@esbuild/android-arm64@0.24.2':2769 '@esbuild/android-arm64@0.24.2':
2061 optional: true2770 optional: true
2062 2771
2063 '@esbuild/android-arm@0.17.19':2772 '@esbuild/android-arm@0.17.19':
2064 optional: true2773 optional: true
2065 2774
2775+ '@esbuild/android-arm@0.18.20':
2776+ optional: true
2777+
2778+ '@esbuild/android-arm@0.19.12':
2779+ optional: true
2780+
2781+ '@esbuild/android-arm@0.23.1':
2782+ optional: true
2783+
2066 '@esbuild/android-arm@0.24.2':2784 '@esbuild/android-arm@0.24.2':
2067 optional: true2785 optional: true
2068 2786
2069 '@esbuild/android-x64@0.17.19':2787 '@esbuild/android-x64@0.17.19':
2070 optional: true2788 optional: true
2071 2789
2790+ '@esbuild/android-x64@0.18.20':
2791+ optional: true
2792+
2793+ '@esbuild/android-x64@0.19.12':
2794+ optional: true
2795+
2796+ '@esbuild/android-x64@0.23.1':
2797+ optional: true
2798+
2072 '@esbuild/android-x64@0.24.2':2799 '@esbuild/android-x64@0.24.2':
2073 optional: true2800 optional: true
2074 2801
2075 '@esbuild/darwin-arm64@0.17.19':2802 '@esbuild/darwin-arm64@0.17.19':
2076 optional: true2803 optional: true
2077 2804
2805+ '@esbuild/darwin-arm64@0.18.20':
2806+ optional: true
2807+
2808+ '@esbuild/darwin-arm64@0.19.12':
2809+ optional: true
2810+
2811+ '@esbuild/darwin-arm64@0.23.1':
2812+ optional: true
2813+
2078 '@esbuild/darwin-arm64@0.24.2':2814 '@esbuild/darwin-arm64@0.24.2':
2079 optional: true2815 optional: true
2080 2816
2081 '@esbuild/darwin-x64@0.17.19':2817 '@esbuild/darwin-x64@0.17.19':
2082 optional: true2818 optional: true
2083 2819
2820+ '@esbuild/darwin-x64@0.18.20':
2821+ optional: true
2822+
2823+ '@esbuild/darwin-x64@0.19.12':
2824+ optional: true
2825+
2826+ '@esbuild/darwin-x64@0.23.1':
2827+ optional: true
2828+
2084 '@esbuild/darwin-x64@0.24.2':2829 '@esbuild/darwin-x64@0.24.2':
2085 optional: true2830 optional: true
2086 2831
2087 '@esbuild/freebsd-arm64@0.17.19':2832 '@esbuild/freebsd-arm64@0.17.19':
2088 optional: true2833 optional: true
2089 2834
2835+ '@esbuild/freebsd-arm64@0.18.20':
2836+ optional: true
2837+
2838+ '@esbuild/freebsd-arm64@0.19.12':
2839+ optional: true
2840+
2841+ '@esbuild/freebsd-arm64@0.23.1':
2842+ optional: true
2843+
2090 '@esbuild/freebsd-arm64@0.24.2':2844 '@esbuild/freebsd-arm64@0.24.2':
2091 optional: true2845 optional: true
2092 2846
2093 '@esbuild/freebsd-x64@0.17.19':2847 '@esbuild/freebsd-x64@0.17.19':
2094 optional: true2848 optional: true
2095 2849
2850+ '@esbuild/freebsd-x64@0.18.20':
2851+ optional: true
2852+
2853+ '@esbuild/freebsd-x64@0.19.12':
2854+ optional: true
2855+
2856+ '@esbuild/freebsd-x64@0.23.1':
2857+ optional: true
2858+
2096 '@esbuild/freebsd-x64@0.24.2':2859 '@esbuild/freebsd-x64@0.24.2':
2097 optional: true2860 optional: true
2098 2861
2099 '@esbuild/linux-arm64@0.17.19':2862 '@esbuild/linux-arm64@0.17.19':
2100 optional: true2863 optional: true
2101 2864
2865+ '@esbuild/linux-arm64@0.18.20':
2866+ optional: true
2867+
2868+ '@esbuild/linux-arm64@0.19.12':
2869+ optional: true
2870+
2871+ '@esbuild/linux-arm64@0.23.1':
2872+ optional: true
2873+
2102 '@esbuild/linux-arm64@0.24.2':2874 '@esbuild/linux-arm64@0.24.2':
2103 optional: true2875 optional: true
2104 2876
2105 '@esbuild/linux-arm@0.17.19':2877 '@esbuild/linux-arm@0.17.19':
2106 optional: true2878 optional: true
2107 2879
2880+ '@esbuild/linux-arm@0.18.20':
2881+ optional: true
2882+
2883+ '@esbuild/linux-arm@0.19.12':
2884+ optional: true
2885+
2886+ '@esbuild/linux-arm@0.23.1':
2887+ optional: true
2888+
2108 '@esbuild/linux-arm@0.24.2':2889 '@esbuild/linux-arm@0.24.2':
2109 optional: true2890 optional: true
2110 2891
2111 '@esbuild/linux-ia32@0.17.19':2892 '@esbuild/linux-ia32@0.17.19':
2112 optional: true2893 optional: true
2113 2894
2895+ '@esbuild/linux-ia32@0.18.20':
2896+ optional: true
2897+
2898+ '@esbuild/linux-ia32@0.19.12':
2899+ optional: true
2900+
2901+ '@esbuild/linux-ia32@0.23.1':
2902+ optional: true
2903+
2114 '@esbuild/linux-ia32@0.24.2':2904 '@esbuild/linux-ia32@0.24.2':
2115 optional: true2905 optional: true
2116 2906
2117 '@esbuild/linux-loong64@0.17.19':2907 '@esbuild/linux-loong64@0.17.19':
2118 optional: true2908 optional: true
2119 2909
2910+ '@esbuild/linux-loong64@0.18.20':
2911+ optional: true
2912+
2913+ '@esbuild/linux-loong64@0.19.12':
2914+ optional: true
2915+
2916+ '@esbuild/linux-loong64@0.23.1':
2917+ optional: true
2918+
2120 '@esbuild/linux-loong64@0.24.2':2919 '@esbuild/linux-loong64@0.24.2':
2121 optional: true2920 optional: true
2122 2921
2123 '@esbuild/linux-mips64el@0.17.19':2922 '@esbuild/linux-mips64el@0.17.19':
2124 optional: true2923 optional: true
2125 2924
2925+ '@esbuild/linux-mips64el@0.18.20':
2926+ optional: true
2927+
2928+ '@esbuild/linux-mips64el@0.19.12':
2929+ optional: true
2930+
2931+ '@esbuild/linux-mips64el@0.23.1':
2932+ optional: true
2933+
2126 '@esbuild/linux-mips64el@0.24.2':2934 '@esbuild/linux-mips64el@0.24.2':
2127 optional: true2935 optional: true
2128 2936
2129 '@esbuild/linux-ppc64@0.17.19':2937 '@esbuild/linux-ppc64@0.17.19':
2130 optional: true2938 optional: true
2131 2939
2940+ '@esbuild/linux-ppc64@0.18.20':
2941+ optional: true
2942+
2943+ '@esbuild/linux-ppc64@0.19.12':
2944+ optional: true
2945+
2946+ '@esbuild/linux-ppc64@0.23.1':
2947+ optional: true
2948+
2132 '@esbuild/linux-ppc64@0.24.2':2949 '@esbuild/linux-ppc64@0.24.2':
2133 optional: true2950 optional: true
2134 2951
2135 '@esbuild/linux-riscv64@0.17.19':2952 '@esbuild/linux-riscv64@0.17.19':
2136 optional: true2953 optional: true
2137 2954
2955+ '@esbuild/linux-riscv64@0.18.20':
2956+ optional: true
2957+
2958+ '@esbuild/linux-riscv64@0.19.12':
2959+ optional: true
2960+
2961+ '@esbuild/linux-riscv64@0.23.1':
2962+ optional: true
2963+
2138 '@esbuild/linux-riscv64@0.24.2':2964 '@esbuild/linux-riscv64@0.24.2':
2139 optional: true2965 optional: true
2140 2966
2141 '@esbuild/linux-s390x@0.17.19':2967 '@esbuild/linux-s390x@0.17.19':
2142 optional: true2968 optional: true
2143 2969
2970+ '@esbuild/linux-s390x@0.18.20':
2971+ optional: true
2972+
2973+ '@esbuild/linux-s390x@0.19.12':
2974+ optional: true
2975+
2976+ '@esbuild/linux-s390x@0.23.1':
2977+ optional: true
2978+
2144 '@esbuild/linux-s390x@0.24.2':2979 '@esbuild/linux-s390x@0.24.2':
2145 optional: true2980 optional: true
2146 2981
2147 '@esbuild/linux-x64@0.17.19':2982 '@esbuild/linux-x64@0.17.19':
2148 optional: true2983 optional: true
2149 2984
2985+ '@esbuild/linux-x64@0.18.20':
2986+ optional: true
2987+
2988+ '@esbuild/linux-x64@0.19.12':
2989+ optional: true
2990+
2991+ '@esbuild/linux-x64@0.23.1':
2992+ optional: true
2993+
2150 '@esbuild/linux-x64@0.24.2':2994 '@esbuild/linux-x64@0.24.2':
2151 optional: true2995 optional: true
2152 2996
@@ -2156,39 +3000,96 @@ snapshots:
2156 '@esbuild/netbsd-x64@0.17.19':3000 '@esbuild/netbsd-x64@0.17.19':
2157 optional: true3001 optional: true
2158 3002
3003+ '@esbuild/netbsd-x64@0.18.20':
3004+ optional: true
3005+
3006+ '@esbuild/netbsd-x64@0.19.12':
3007+ optional: true
3008+
3009+ '@esbuild/netbsd-x64@0.23.1':
3010+ optional: true
3011+
2159 '@esbuild/netbsd-x64@0.24.2':3012 '@esbuild/netbsd-x64@0.24.2':
2160 optional: true3013 optional: true
2161 3014
3015+ '@esbuild/openbsd-arm64@0.23.1':
3016+ optional: true
3017+
2162 '@esbuild/openbsd-arm64@0.24.2':3018 '@esbuild/openbsd-arm64@0.24.2':
2163 optional: true3019 optional: true
2164 3020
2165 '@esbuild/openbsd-x64@0.17.19':3021 '@esbuild/openbsd-x64@0.17.19':
2166 optional: true3022 optional: true
2167 3023
3024+ '@esbuild/openbsd-x64@0.18.20':
3025+ optional: true
3026+
3027+ '@esbuild/openbsd-x64@0.19.12':
3028+ optional: true
3029+
3030+ '@esbuild/openbsd-x64@0.23.1':
3031+ optional: true
3032+
2168 '@esbuild/openbsd-x64@0.24.2':3033 '@esbuild/openbsd-x64@0.24.2':
2169 optional: true3034 optional: true
2170 3035
2171 '@esbuild/sunos-x64@0.17.19':3036 '@esbuild/sunos-x64@0.17.19':
2172 optional: true3037 optional: true
2173 3038
3039+ '@esbuild/sunos-x64@0.18.20':
3040+ optional: true
3041+
3042+ '@esbuild/sunos-x64@0.19.12':
3043+ optional: true
3044+
3045+ '@esbuild/sunos-x64@0.23.1':
3046+ optional: true
3047+
2174 '@esbuild/sunos-x64@0.24.2':3048 '@esbuild/sunos-x64@0.24.2':
2175 optional: true3049 optional: true
2176 3050
2177 '@esbuild/win32-arm64@0.17.19':3051 '@esbuild/win32-arm64@0.17.19':
2178 optional: true3052 optional: true
2179 3053
3054+ '@esbuild/win32-arm64@0.18.20':
3055+ optional: true
3056+
3057+ '@esbuild/win32-arm64@0.19.12':
3058+ optional: true
3059+
3060+ '@esbuild/win32-arm64@0.23.1':
3061+ optional: true
3062+
2180 '@esbuild/win32-arm64@0.24.2':3063 '@esbuild/win32-arm64@0.24.2':
2181 optional: true3064 optional: true
2182 3065
2183 '@esbuild/win32-ia32@0.17.19':3066 '@esbuild/win32-ia32@0.17.19':
2184 optional: true3067 optional: true
2185 3068
3069+ '@esbuild/win32-ia32@0.18.20':
3070+ optional: true
3071+
3072+ '@esbuild/win32-ia32@0.19.12':
3073+ optional: true
3074+
3075+ '@esbuild/win32-ia32@0.23.1':
3076+ optional: true
3077+
2186 '@esbuild/win32-ia32@0.24.2':3078 '@esbuild/win32-ia32@0.24.2':
2187 optional: true3079 optional: true
2188 3080
2189 '@esbuild/win32-x64@0.17.19':3081 '@esbuild/win32-x64@0.17.19':
2190 optional: true3082 optional: true
2191 3083
3084+ '@esbuild/win32-x64@0.18.20':
3085+ optional: true
3086+
3087+ '@esbuild/win32-x64@0.19.12':
3088+ optional: true
3089+
3090+ '@esbuild/win32-x64@0.23.1':
3091+ optional: true
3092+
2192 '@esbuild/win32-x64@0.24.2':3093 '@esbuild/win32-x64@0.24.2':
2193 optional: true3094 optional: true
2194 3095
@@ -2288,6 +3189,64 @@ snapshots:
2288 '@jridgewell/resolve-uri': 3.1.23189 '@jridgewell/resolve-uri': 3.1.2
2289 '@jridgewell/sourcemap-codec': 1.5.03190 '@jridgewell/sourcemap-codec': 1.5.0
2290 3191
3192+ '@libsql/client@0.14.0':
3193+ dependencies:
3194+ '@libsql/core': 0.14.0
3195+ '@libsql/hrana-client': 0.7.0
3196+ js-base64: 3.7.7
3197+ libsql: 0.4.7
3198+ promise-limit: 2.7.0
3199+ transitivePeerDependencies:
3200+ - bufferutil
3201+ - utf-8-validate
3202+
3203+ '@libsql/core@0.14.0':
3204+ dependencies:
3205+ js-base64: 3.7.7
3206+
3207+ '@libsql/darwin-arm64@0.4.7':
3208+ optional: true
3209+
3210+ '@libsql/darwin-x64@0.4.7':
3211+ optional: true
3212+
3213+ '@libsql/hrana-client@0.7.0':
3214+ dependencies:
3215+ '@libsql/isomorphic-fetch': 0.3.1
3216+ '@libsql/isomorphic-ws': 0.1.5
3217+ js-base64: 3.7.7
3218+ node-fetch: 3.3.2
3219+ transitivePeerDependencies:
3220+ - bufferutil
3221+ - utf-8-validate
3222+
3223+ '@libsql/isomorphic-fetch@0.3.1': {}
3224+
3225+ '@libsql/isomorphic-ws@0.1.5':
3226+ dependencies:
3227+ '@types/ws': 8.5.14
3228+ ws: 8.18.0
3229+ transitivePeerDependencies:
3230+ - bufferutil
3231+ - utf-8-validate
3232+
3233+ '@libsql/linux-arm64-gnu@0.4.7':
3234+ optional: true
3235+
3236+ '@libsql/linux-arm64-musl@0.4.7':
3237+ optional: true
3238+
3239+ '@libsql/linux-x64-gnu@0.4.7':
3240+ optional: true
3241+
3242+ '@libsql/linux-x64-musl@0.4.7':
3243+ optional: true
3244+
3245+ '@libsql/win32-x64-msvc@0.4.7':
3246+ optional: true
3247+
3248+ '@neon-rs/load@0.0.4': {}
3249+
2291 '@nodelib/fs.scandir@2.1.5':3250 '@nodelib/fs.scandir@2.1.5':
2292 dependencies:3251 dependencies:
2293 '@nodelib/fs.stat': 2.0.53252 '@nodelib/fs.stat': 2.0.5
@@ -2362,17 +3321,17 @@ snapshots:
2362 '@rollup/rollup-win32-x64-msvc@4.34.6':3321 '@rollup/rollup-win32-x64-msvc@4.34.6':
2363 optional: true3322 optional: true
2364 3323
2365- '@sveltejs/adapter-cloudflare@5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))':3324+ '@sveltejs/adapter-cloudflare@5.0.2(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(wrangler@3.107.3(@cloudflare/workers-types@4.20250204.0))':
2366 dependencies:3325 dependencies:
2367 '@cloudflare/workers-types': 4.20250204.03326 '@cloudflare/workers-types': 4.20250204.0
2368- '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))3327+ '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
2369 esbuild: 0.24.23328 esbuild: 0.24.2
2370 worktop: 0.8.0-next.183329 worktop: 0.8.0-next.18
2371 wrangler: 3.107.3(@cloudflare/workers-types@4.20250204.0)3330 wrangler: 3.107.3(@cloudflare/workers-types@4.20250204.0)
2372 3331
2373- '@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':3332+ '@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
2374 dependencies:3333 dependencies:
2375- '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))3334+ '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
2376 '@types/cookie': 0.6.03335 '@types/cookie': 0.6.0
2377 cookie: 0.6.03336 cookie: 0.6.0
2378 devalue: 5.1.13337 devalue: 5.1.1
@@ -2385,27 +3344,27 @@ snapshots:
2385 set-cookie-parser: 2.7.13344 set-cookie-parser: 2.7.1
2386 sirv: 3.0.03345 sirv: 3.0.0
2387 svelte: 5.19.93346 svelte: 5.19.9
2388- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)3347+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
2389 3348
2390- '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':3349+ '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
2391 dependencies:3350 dependencies:
2392- '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))3351+ '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
2393 debug: 4.4.03352 debug: 4.4.0
2394 svelte: 5.19.93353 svelte: 5.19.9
2395- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)3354+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
2396 transitivePeerDependencies:3355 transitivePeerDependencies:
2397 - supports-color3356 - supports-color
2398 3357
2399- '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':3358+ '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
2400 dependencies:3359 dependencies:
2401- '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))3360+ '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.9)(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
2402 debug: 4.4.03361 debug: 4.4.0
2403 deepmerge: 4.3.13362 deepmerge: 4.3.1
2404 kleur: 4.1.53363 kleur: 4.1.5
2405 magic-string: 0.30.173364 magic-string: 0.30.17
2406 svelte: 5.19.93365 svelte: 5.19.9
2407- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)3366+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
2408- vitefu: 1.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))3367+ vitefu: 1.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
2409 transitivePeerDependencies:3368 transitivePeerDependencies:
2410 - supports-color3369 - supports-color
2411 3370
@@ -2432,6 +3391,14 @@ snapshots:
2432 3391
2433 '@types/json-schema@7.0.15': {}3392 '@types/json-schema@7.0.15': {}
2434 3393
3394+ '@types/node@22.13.1':
3395+ dependencies:
3396+ undici-types: 6.20.0
3397+
3398+ '@types/ws@8.5.14':
3399+ dependencies:
3400+ '@types/node': 22.13.1
3401+
2435 '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3)':3402 '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.20.0(jiti@1.21.7))(typescript@5.7.3)':
2436 dependencies:3403 dependencies:
2437 '@eslint-community/regexpp': 4.12.13404 '@eslint-community/regexpp': 4.12.1
@@ -2516,13 +3483,13 @@ snapshots:
2516 chai: 5.1.23483 chai: 5.1.2
2517 tinyrainbow: 2.0.03484 tinyrainbow: 2.0.0
2518 3485
2519- '@vitest/mocker@3.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))':3486+ '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))':
2520 dependencies:3487 dependencies:
2521 '@vitest/spy': 3.0.53488 '@vitest/spy': 3.0.5
2522 estree-walker: 3.0.33489 estree-walker: 3.0.3
2523 magic-string: 0.30.173490 magic-string: 0.30.17
2524 optionalDependencies:3491 optionalDependencies:
2525- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)3492+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
2526 3493
2527 '@vitest/pretty-format@3.0.5':3494 '@vitest/pretty-format@3.0.5':
2528 dependencies:3495 dependencies:
@@ -2637,6 +3604,8 @@ snapshots:
2637 node-releases: 2.0.193604 node-releases: 2.0.19
2638 update-browserslist-db: 1.1.2(browserslist@4.24.4)3605 update-browserslist-db: 1.1.2(browserslist@4.24.4)
2639 3606
3607+ buffer-from@1.1.2: {}
3608+
2640 cac@6.7.14: {}3609 cac@6.7.14: {}
2641 3610
2642 callsites@3.1.0: {}3611 callsites@3.1.0: {}
@@ -2704,6 +3673,8 @@ snapshots:
2704 3673
2705 data-uri-to-buffer@2.0.2: {}3674 data-uri-to-buffer@2.0.2: {}
2706 3675
3676+ data-uri-to-buffer@4.0.1: {}
3677+
2707 debug@4.4.0:3678 debug@4.4.0:
2708 dependencies:3679 dependencies:
2709 ms: 2.1.33680 ms: 2.1.3
@@ -2716,12 +3687,30 @@ snapshots:
2716 3687
2717 defu@6.1.4: {}3688 defu@6.1.4: {}
2718 3689
3690+ detect-libc@2.0.2: {}
3691+
2719 devalue@5.1.1: {}3692 devalue@5.1.1: {}
2720 3693
2721 didyoumean@1.2.2: {}3694 didyoumean@1.2.2: {}
2722 3695
2723 dlv@1.1.3: {}3696 dlv@1.1.3: {}
2724 3697
3698+ dotenv@16.4.7: {}
3699+
3700+ drizzle-kit@0.30.4:
3701+ dependencies:
3702+ '@drizzle-team/brocli': 0.10.2
3703+ '@esbuild-kit/esm-loader': 2.6.5
3704+ esbuild: 0.19.12
3705+ esbuild-register: 3.6.0(esbuild@0.19.12)
3706+ transitivePeerDependencies:
3707+ - supports-color
3708+
3709+ drizzle-orm@0.39.3(@cloudflare/workers-types@4.20250204.0)(@libsql/client@0.14.0):
3710+ optionalDependencies:
3711+ '@cloudflare/workers-types': 4.20250204.0
3712+ '@libsql/client': 0.14.0
3713+
2725 eastasianwidth@0.2.0: {}3714 eastasianwidth@0.2.0: {}
2726 3715
2727 electron-to-chromium@1.5.96: {}3716 electron-to-chromium@1.5.96: {}
@@ -2732,6 +3721,13 @@ snapshots:
2732 3721
2733 es-module-lexer@1.6.0: {}3722 es-module-lexer@1.6.0: {}
2734 3723
3724+ esbuild-register@3.6.0(esbuild@0.19.12):
3725+ dependencies:
3726+ debug: 4.4.0
3727+ esbuild: 0.19.12
3728+ transitivePeerDependencies:
3729+ - supports-color
3730+
2735 esbuild@0.17.19:3731 esbuild@0.17.19:
2736 optionalDependencies:3732 optionalDependencies:
2737 '@esbuild/android-arm': 0.17.193733 '@esbuild/android-arm': 0.17.19
@@ -2757,6 +3753,84 @@ snapshots:
2757 '@esbuild/win32-ia32': 0.17.193753 '@esbuild/win32-ia32': 0.17.19
2758 '@esbuild/win32-x64': 0.17.193754 '@esbuild/win32-x64': 0.17.19
2759 3755
3756+ esbuild@0.18.20:
3757+ optionalDependencies:
3758+ '@esbuild/android-arm': 0.18.20
3759+ '@esbuild/android-arm64': 0.18.20
3760+ '@esbuild/android-x64': 0.18.20
3761+ '@esbuild/darwin-arm64': 0.18.20
3762+ '@esbuild/darwin-x64': 0.18.20
3763+ '@esbuild/freebsd-arm64': 0.18.20
3764+ '@esbuild/freebsd-x64': 0.18.20
3765+ '@esbuild/linux-arm': 0.18.20
3766+ '@esbuild/linux-arm64': 0.18.20
3767+ '@esbuild/linux-ia32': 0.18.20
3768+ '@esbuild/linux-loong64': 0.18.20
3769+ '@esbuild/linux-mips64el': 0.18.20
3770+ '@esbuild/linux-ppc64': 0.18.20
3771+ '@esbuild/linux-riscv64': 0.18.20
3772+ '@esbuild/linux-s390x': 0.18.20
3773+ '@esbuild/linux-x64': 0.18.20
3774+ '@esbuild/netbsd-x64': 0.18.20
3775+ '@esbuild/openbsd-x64': 0.18.20
3776+ '@esbuild/sunos-x64': 0.18.20
3777+ '@esbuild/win32-arm64': 0.18.20
3778+ '@esbuild/win32-ia32': 0.18.20
3779+ '@esbuild/win32-x64': 0.18.20
3780+
3781+ esbuild@0.19.12:
3782+ optionalDependencies:
3783+ '@esbuild/aix-ppc64': 0.19.12
3784+ '@esbuild/android-arm': 0.19.12
3785+ '@esbuild/android-arm64': 0.19.12
3786+ '@esbuild/android-x64': 0.19.12
3787+ '@esbuild/darwin-arm64': 0.19.12
3788+ '@esbuild/darwin-x64': 0.19.12
3789+ '@esbuild/freebsd-arm64': 0.19.12
3790+ '@esbuild/freebsd-x64': 0.19.12
3791+ '@esbuild/linux-arm': 0.19.12
3792+ '@esbuild/linux-arm64': 0.19.12
3793+ '@esbuild/linux-ia32': 0.19.12
3794+ '@esbuild/linux-loong64': 0.19.12
3795+ '@esbuild/linux-mips64el': 0.19.12
3796+ '@esbuild/linux-ppc64': 0.19.12
3797+ '@esbuild/linux-riscv64': 0.19.12
3798+ '@esbuild/linux-s390x': 0.19.12
3799+ '@esbuild/linux-x64': 0.19.12
3800+ '@esbuild/netbsd-x64': 0.19.12
3801+ '@esbuild/openbsd-x64': 0.19.12
3802+ '@esbuild/sunos-x64': 0.19.12
3803+ '@esbuild/win32-arm64': 0.19.12
3804+ '@esbuild/win32-ia32': 0.19.12
3805+ '@esbuild/win32-x64': 0.19.12
3806+
3807+ esbuild@0.23.1:
3808+ optionalDependencies:
3809+ '@esbuild/aix-ppc64': 0.23.1
3810+ '@esbuild/android-arm': 0.23.1
3811+ '@esbuild/android-arm64': 0.23.1
3812+ '@esbuild/android-x64': 0.23.1
3813+ '@esbuild/darwin-arm64': 0.23.1
3814+ '@esbuild/darwin-x64': 0.23.1
3815+ '@esbuild/freebsd-arm64': 0.23.1
3816+ '@esbuild/freebsd-x64': 0.23.1
3817+ '@esbuild/linux-arm': 0.23.1
3818+ '@esbuild/linux-arm64': 0.23.1
3819+ '@esbuild/linux-ia32': 0.23.1
3820+ '@esbuild/linux-loong64': 0.23.1
3821+ '@esbuild/linux-mips64el': 0.23.1
3822+ '@esbuild/linux-ppc64': 0.23.1
3823+ '@esbuild/linux-riscv64': 0.23.1
3824+ '@esbuild/linux-s390x': 0.23.1
3825+ '@esbuild/linux-x64': 0.23.1
3826+ '@esbuild/netbsd-x64': 0.23.1
3827+ '@esbuild/openbsd-arm64': 0.23.1
3828+ '@esbuild/openbsd-x64': 0.23.1
3829+ '@esbuild/sunos-x64': 0.23.1
3830+ '@esbuild/win32-arm64': 0.23.1
3831+ '@esbuild/win32-ia32': 0.23.1
3832+ '@esbuild/win32-x64': 0.23.1
3833+
2760 esbuild@0.24.2:3834 esbuild@0.24.2:
2761 optionalDependencies:3835 optionalDependencies:
2762 '@esbuild/aix-ppc64': 0.24.23836 '@esbuild/aix-ppc64': 0.24.2
@@ -2932,6 +4006,11 @@ snapshots:
2932 4006
2933 fdir@6.4.3: {}4007 fdir@6.4.3: {}
2934 4008
4009+ fetch-blob@3.2.0:
4010+ dependencies:
4011+ node-domexception: 1.0.0
4012+ web-streams-polyfill: 3.3.3
4013+
2935 file-entry-cache@8.0.0:4014 file-entry-cache@8.0.0:
2936 dependencies:4015 dependencies:
2937 flat-cache: 4.0.14016 flat-cache: 4.0.1
@@ -2957,6 +4036,10 @@ snapshots:
2957 cross-spawn: 7.0.64036 cross-spawn: 7.0.6
2958 signal-exit: 4.1.04037 signal-exit: 4.1.0
2959 4038
4039+ formdata-polyfill@4.0.10:
4040+ dependencies:
4041+ fetch-blob: 3.2.0
4042+
2960 fraction.js@4.3.7: {}4043 fraction.js@4.3.7: {}
2961 4044
2962 fsevents@2.3.3:4045 fsevents@2.3.3:
@@ -2969,6 +4052,10 @@ snapshots:
2969 data-uri-to-buffer: 2.0.24052 data-uri-to-buffer: 2.0.2
2970 source-map: 0.6.14053 source-map: 0.6.1
2971 4054
4055+ get-tsconfig@4.10.0:
4056+ dependencies:
4057+ resolve-pkg-maps: 1.0.0
4058+
2972 glob-parent@5.1.2:4059 glob-parent@5.1.2:
2973 dependencies:4060 dependencies:
2974 is-glob: 4.0.34061 is-glob: 4.0.3
@@ -3043,6 +4130,8 @@ snapshots:
3043 4130
3044 jiti@1.21.7: {}4131 jiti@1.21.7: {}
3045 4132
4133+ js-base64@3.7.7: {}
4134+
3046 js-yaml@4.1.0:4135 js-yaml@4.1.0:
3047 dependencies:4136 dependencies:
3048 argparse: 2.0.14137 argparse: 2.0.1
@@ -3066,6 +4155,19 @@ snapshots:
3066 prelude-ls: 1.2.14155 prelude-ls: 1.2.1
3067 type-check: 0.4.04156 type-check: 0.4.0
3068 4157
4158+ libsql@0.4.7:
4159+ dependencies:
4160+ '@neon-rs/load': 0.0.4
4161+ detect-libc: 2.0.2
4162+ optionalDependencies:
4163+ '@libsql/darwin-arm64': 0.4.7
4164+ '@libsql/darwin-x64': 0.4.7
4165+ '@libsql/linux-arm64-gnu': 0.4.7
4166+ '@libsql/linux-arm64-musl': 0.4.7
4167+ '@libsql/linux-x64-gnu': 0.4.7
4168+ '@libsql/linux-x64-musl': 0.4.7
4169+ '@libsql/win32-x64-msvc': 0.4.7
4170+
3069 lilconfig@2.1.0: {}4171 lilconfig@2.1.0: {}
3070 4172
3071 lilconfig@3.1.3: {}4173 lilconfig@3.1.3: {}
@@ -3159,6 +4261,14 @@ snapshots:
3159 4261
3160 natural-compare@1.4.0: {}4262 natural-compare@1.4.0: {}
3161 4263
4264+ node-domexception@1.0.0: {}
4265+
4266+ node-fetch@3.3.2:
4267+ dependencies:
4268+ data-uri-to-buffer: 4.0.1
4269+ fetch-blob: 3.2.0
4270+ formdata-polyfill: 4.0.10
4271+
3162 node-releases@2.0.19: {}4272 node-releases@2.0.19: {}
3163 4273
3164 normalize-path@3.0.0: {}4274 normalize-path@3.0.0: {}
@@ -3301,6 +4411,8 @@ snapshots:
3301 4411
3302 printable-characters@1.0.42: {}4412 printable-characters@1.0.42: {}
3303 4413
4414+ promise-limit@2.7.0: {}
4415+
3304 punycode@2.3.1: {}4416 punycode@2.3.1: {}
3305 4417
3306 queue-microtask@1.2.3: {}4418 queue-microtask@1.2.3: {}
@@ -3319,6 +4431,8 @@ snapshots:
3319 4431
3320 resolve-from@4.0.0: {}4432 resolve-from@4.0.0: {}
3321 4433
4434+ resolve-pkg-maps@1.0.0: {}
4435+
3322 resolve@1.22.10:4436 resolve@1.22.10:
3323 dependencies:4437 dependencies:
3324 is-core-module: 2.16.14438 is-core-module: 2.16.1
@@ -3396,6 +4510,11 @@ snapshots:
3396 4510
3397 source-map-js@1.2.1: {}4511 source-map-js@1.2.1: {}
3398 4512
4513+ source-map-support@0.5.21:
4514+ dependencies:
4515+ buffer-from: 1.1.2
4516+ source-map: 0.6.1
4517+
3399 source-map@0.6.1: {}4518 source-map@0.6.1: {}
3400 4519
3401 sourcemap-codec@1.4.8: {}4520 sourcemap-codec@1.4.8: {}
@@ -3545,6 +4664,13 @@ snapshots:
3545 4664
3546 ts-interface-checker@0.1.13: {}4665 ts-interface-checker@0.1.13: {}
3547 4666
4667+ tsx@4.19.2:
4668+ dependencies:
4669+ esbuild: 0.23.1
4670+ get-tsconfig: 4.10.0
4671+ optionalDependencies:
4672+ fsevents: 2.3.3
4673+
3548 type-check@0.4.0:4674 type-check@0.4.0:
3549 dependencies:4675 dependencies:
3550 prelude-ls: 1.2.14676 prelude-ls: 1.2.1
@@ -3563,6 +4689,8 @@ snapshots:
3563 4689
3564 ufo@1.5.4: {}4690 ufo@1.5.4: {}
3565 4691
4692+ undici-types@6.20.0: {}
4693+
3566 undici@5.28.5:4694 undici@5.28.5:
3567 dependencies:4695 dependencies:
3568 '@fastify/busboy': 2.1.14696 '@fastify/busboy': 2.1.1
@@ -3587,13 +4715,15 @@ snapshots:
3587 4715
3588 util-deprecate@1.0.2: {}4716 util-deprecate@1.0.2: {}
3589 4717
3590- vite-node@3.0.5(jiti@1.21.7)(yaml@2.7.0):4718+ uuid@11.0.5: {}
4719+
4720+ vite-node@3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
3591 dependencies:4721 dependencies:
3592 cac: 6.7.144722 cac: 6.7.14
3593 debug: 4.4.04723 debug: 4.4.0
3594 es-module-lexer: 1.6.04724 es-module-lexer: 1.6.0
3595 pathe: 2.0.24725 pathe: 2.0.2
3596- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)4726+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
3597 transitivePeerDependencies:4727 transitivePeerDependencies:
3598 - '@types/node'4728 - '@types/node'
3599 - jiti4729 - jiti
@@ -3608,24 +4738,26 @@ snapshots:
3608 - tsx4738 - tsx
3609 - yaml4739 - yaml
3610 4740
3611- vite@6.1.0(jiti@1.21.7)(yaml@2.7.0):4741+ vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
3612 dependencies:4742 dependencies:
3613 esbuild: 0.24.24743 esbuild: 0.24.2
3614 postcss: 8.5.14744 postcss: 8.5.1
3615 rollup: 4.34.64745 rollup: 4.34.6
3616 optionalDependencies:4746 optionalDependencies:
4747+ '@types/node': 22.13.1
3617 fsevents: 2.3.34748 fsevents: 2.3.3
3618 jiti: 1.21.74749 jiti: 1.21.7
4750+ tsx: 4.19.2
3619 yaml: 2.7.04751 yaml: 2.7.0
3620 4752
3621- vitefu@1.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0)):4753+ vitefu@1.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)):
3622 optionalDependencies:4754 optionalDependencies:
3623- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)4755+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
3624 4756
3625- vitest@3.0.5(jiti@1.21.7)(yaml@2.7.0):4757+ vitest@3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
3626 dependencies:4758 dependencies:
3627 '@vitest/expect': 3.0.54759 '@vitest/expect': 3.0.5
3628- '@vitest/mocker': 3.0.5(vite@6.1.0(jiti@1.21.7)(yaml@2.7.0))4760+ '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
3629 '@vitest/pretty-format': 3.0.54761 '@vitest/pretty-format': 3.0.5
3630 '@vitest/runner': 3.0.54762 '@vitest/runner': 3.0.5
3631 '@vitest/snapshot': 3.0.54763 '@vitest/snapshot': 3.0.5
@@ -3641,9 +4773,11 @@ snapshots:
3641 tinyexec: 0.3.24773 tinyexec: 0.3.2
3642 tinypool: 1.0.24774 tinypool: 1.0.2
3643 tinyrainbow: 2.0.04775 tinyrainbow: 2.0.0
3644- vite: 6.1.0(jiti@1.21.7)(yaml@2.7.0)4776+ vite: 6.1.0(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
3645- vite-node: 3.0.5(jiti@1.21.7)(yaml@2.7.0)4777+ vite-node: 3.0.5(@types/node@22.13.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
3646 why-is-node-running: 2.3.04778 why-is-node-running: 2.3.0
4779+ optionalDependencies:
4780+ '@types/node': 22.13.1
3647 transitivePeerDependencies:4781 transitivePeerDependencies:
3648 - jiti4782 - jiti
3649 - less4783 - less
@@ -3658,6 +4792,8 @@ snapshots:
3658 - tsx4792 - tsx
3659 - yaml4793 - yaml
3660 4794
4795+ web-streams-polyfill@3.3.3: {}
4796+
3661 which@2.0.2:4797 which@2.0.2:
3662 dependencies:4798 dependencies:
3663 isexe: 2.0.04799 isexe: 2.0.0
A scripts/setup-aim-assets.sh +22 -0
@@ -0,0 +1,22 @@
1+#!/bin/bash
2+
3+# Create the aim directory if it doesn't exist
4+mkdir -p static/aim
5+
6+# Create icons for the buttons
7+magick -size 24x24 xc:transparent \
8+ -fill black -stroke black -strokewidth 2 \
9+ -draw "circle 12,12 12,2" \
10+ -draw "path 'M12,8 L12,14 M12,16 L12,17'" \
11+ static/aim/help-icon.png
12+
13+magick -size 24x24 xc:transparent \
14+ -fill black -stroke black -strokewidth 2 \
15+ -draw "path 'M4,12 L20,12 M12,4 L12,20'" \
16+ static/aim/setup-icon.png
17+
18+magick -size 24x24 xc:transparent \
19+ -fill black -stroke black -strokewidth 2 \
20+ -draw "circle 12,12 12,2" \
21+ -draw "path 'M8,12 L16,12 M12,8 L12,16'" \
22+ static/aim/signin-icon.png ⏎̸
@@ -0,0 +1,22 @@
1+#!/bin/bash
2+
3+# Create the aim directory if it doesn't exist
4+mkdir -p static/aim
5+
6+# Create icons for the buttons
7+magick -size 24x24 xc:transparent \
8+ -fill black -stroke black -strokewidth 2 \
9+ -draw "circle 12,12 12,2" \
10+ -draw "path 'M12,8 L12,14 M12,16 L12,17'" \
11+ static/aim/help-icon.png
12+
13+magick -size 24x24 xc:transparent \
14+ -fill black -stroke black -strokewidth 2 \
15+ -draw "path 'M4,12 L20,12 M12,4 L12,20'" \
16+ static/aim/setup-icon.png
17+
18+magick -size 24x24 xc:transparent \
19+ -fill black -stroke black -strokewidth 2 \
20+ -draw "circle 12,12 12,2" \
21+ -draw "path 'M8,12 L16,12 M12,8 L12,16'" \
22+ static/aim/signin-icon.png ⏎̸
A src/lib/actions/draggable.ts +126 -0
@@ -0,0 +1,126 @@
1+import type { Action } from 'svelte/action';
2+
3+interface DraggableParameters {
4+ handle?: string;
5+ bounds?: 'parent' | 'window';
6+ enabled?: boolean;
7+}
8+
9+interface DraggableAttributes {
10+ ondragstart?: (e: CustomEvent<{ x: number; y: number }>) => void;
11+ ondragmove?: (e: CustomEvent<{ x: number; y: number }>) => void;
12+ ondragend?: (e: CustomEvent<{ x: number; y: number }>) => void;
13+}
14+
15+export const draggable: Action<HTMLElement, DraggableParameters, DraggableAttributes> = (node, params = {}) => {
16+ let x = 0;
17+ let y = 0;
18+ let startX = 0;
19+ let startY = 0;
20+ let isDragging = false;
21+
22+ let isEnabled = params.enabled !== undefined ? params.enabled : true;
23+ const handleSelector = params.handle ?? null;
24+ const bounds = params.bounds ?? 'window';
25+
26+ const handleElement = handleSelector ? node.querySelector<HTMLElement>(handleSelector) : node;
27+ if (!handleElement) {
28+ console.warn('Draggable handle element not found');
29+ return;
30+ }
31+
32+ // Set initial position from existing inline styles or computed styles
33+ const computedStyle = getComputedStyle(node);
34+ const existingLeft = node.style.left || computedStyle.left;
35+ const existingTop = node.style.top || computedStyle.top;
36+
37+ x = parseInt(existingLeft) || 0;
38+ y = parseInt(existingTop) || 0;
39+
40+ // Ensure the element is positioned
41+ const position = computedStyle.position;
42+ if (position !== 'relative' && position !== 'absolute' && position !== 'fixed') {
43+ node.style.position = 'fixed';
44+ }
45+
46+ node.style.left = `${x}px`;
47+ node.style.top = `${y}px`;
48+
49+ function onMouseDown(event: MouseEvent) {
50+ if (!isEnabled) return;
51+
52+ // Only handle left mouse button
53+ if (event.button !== 0) return;
54+
55+ isDragging = true;
56+ const rect = node.getBoundingClientRect();
57+
58+ x = rect.left;
59+ y = rect.top;
60+ startX = event.clientX - x;
61+ startY = event.clientY - y;
62+
63+ node.dispatchEvent(new CustomEvent('dragstart', {
64+ detail: { x, y }
65+ }));
66+
67+ // Prevent text selection while dragging
68+ event.preventDefault();
69+ }
70+
71+ function onMouseMove(event: MouseEvent) {
72+ if (!isDragging || !isEnabled) return;
73+
74+ let newX = event.clientX - startX;
75+ let newY = event.clientY - startY;
76+
77+ if (bounds === 'window') {
78+ // Keep within window bounds
79+ newX = Math.max(0, Math.min(newX, window.innerWidth - node.offsetWidth));
80+ newY = Math.max(0, Math.min(newY, window.innerHeight - node.offsetHeight));
81+ } else if (bounds === 'parent' && node.parentElement) {
82+ // Keep within parent bounds
83+ const parent = node.parentElement;
84+ newX = Math.max(0, Math.min(newX, parent.offsetWidth - node.offsetWidth));
85+ newY = Math.max(0, Math.min(newY, parent.offsetHeight - node.offsetHeight));
86+ }
87+
88+ x = newX;
89+ y = newY;
90+
91+ node.style.left = `${x}px`;
92+ node.style.top = `${y}px`;
93+
94+ node.dispatchEvent(new CustomEvent('dragmove', {
95+ detail: { x, y }
96+ }));
97+ }
98+
99+ function onMouseUp() {
100+ if (!isDragging) return;
101+ isDragging = false;
102+
103+ node.dispatchEvent(new CustomEvent('dragend', {
104+ detail: { x, y }
105+ }));
106+ }
107+
108+ handleElement.style.cursor = isEnabled ? 'move' : 'default';
109+ handleElement.addEventListener('mousedown', onMouseDown as EventListener);
110+ window.addEventListener('mousemove', onMouseMove as EventListener);
111+ window.addEventListener('mouseup', onMouseUp as EventListener);
112+
113+ return {
114+ update(newParams: DraggableParameters) {
115+ const newEnabled = newParams.enabled !== undefined ? newParams.enabled : true;
116+ isEnabled = newEnabled;
117+ handleElement.style.cursor = isEnabled ? 'move' : 'default';
118+ Object.assign(params, newParams);
119+ },
120+ destroy() {
121+ handleElement.removeEventListener('mousedown', onMouseDown as EventListener);
122+ window.removeEventListener('mousemove', onMouseMove as EventListener);
123+ window.removeEventListener('mouseup', onMouseUp as EventListener);
124+ }
125+ };
126+}; ⏎̸
@@ -0,0 +1,126 @@
1+import type { Action } from 'svelte/action';
2+
3+interface DraggableParameters {
4+ handle?: string;
5+ bounds?: 'parent' | 'window';
6+ enabled?: boolean;
7+}
8+
9+interface DraggableAttributes {
10+ ondragstart?: (e: CustomEvent<{ x: number; y: number }>) => void;
11+ ondragmove?: (e: CustomEvent<{ x: number; y: number }>) => void;
12+ ondragend?: (e: CustomEvent<{ x: number; y: number }>) => void;
13+}
14+
15+export const draggable: Action<HTMLElement, DraggableParameters, DraggableAttributes> = (node, params = {}) => {
16+ let x = 0;
17+ let y = 0;
18+ let startX = 0;
19+ let startY = 0;
20+ let isDragging = false;
21+
22+ let isEnabled = params.enabled !== undefined ? params.enabled : true;
23+ const handleSelector = params.handle ?? null;
24+ const bounds = params.bounds ?? 'window';
25+
26+ const handleElement = handleSelector ? node.querySelector<HTMLElement>(handleSelector) : node;
27+ if (!handleElement) {
28+ console.warn('Draggable handle element not found');
29+ return;
30+ }
31+
32+ // Set initial position from existing inline styles or computed styles
33+ const computedStyle = getComputedStyle(node);
34+ const existingLeft = node.style.left || computedStyle.left;
35+ const existingTop = node.style.top || computedStyle.top;
36+
37+ x = parseInt(existingLeft) || 0;
38+ y = parseInt(existingTop) || 0;
39+
40+ // Ensure the element is positioned
41+ const position = computedStyle.position;
42+ if (position !== 'relative' && position !== 'absolute' && position !== 'fixed') {
43+ node.style.position = 'fixed';
44+ }
45+
46+ node.style.left = `${x}px`;
47+ node.style.top = `${y}px`;
48+
49+ function onMouseDown(event: MouseEvent) {
50+ if (!isEnabled) return;
51+
52+ // Only handle left mouse button
53+ if (event.button !== 0) return;
54+
55+ isDragging = true;
56+ const rect = node.getBoundingClientRect();
57+
58+ x = rect.left;
59+ y = rect.top;
60+ startX = event.clientX - x;
61+ startY = event.clientY - y;
62+
63+ node.dispatchEvent(new CustomEvent('dragstart', {
64+ detail: { x, y }
65+ }));
66+
67+ // Prevent text selection while dragging
68+ event.preventDefault();
69+ }
70+
71+ function onMouseMove(event: MouseEvent) {
72+ if (!isDragging || !isEnabled) return;
73+
74+ let newX = event.clientX - startX;
75+ let newY = event.clientY - startY;
76+
77+ if (bounds === 'window') {
78+ // Keep within window bounds
79+ newX = Math.max(0, Math.min(newX, window.innerWidth - node.offsetWidth));
80+ newY = Math.max(0, Math.min(newY, window.innerHeight - node.offsetHeight));
81+ } else if (bounds === 'parent' && node.parentElement) {
82+ // Keep within parent bounds
83+ const parent = node.parentElement;
84+ newX = Math.max(0, Math.min(newX, parent.offsetWidth - node.offsetWidth));
85+ newY = Math.max(0, Math.min(newY, parent.offsetHeight - node.offsetHeight));
86+ }
87+
88+ x = newX;
89+ y = newY;
90+
91+ node.style.left = `${x}px`;
92+ node.style.top = `${y}px`;
93+
94+ node.dispatchEvent(new CustomEvent('dragmove', {
95+ detail: { x, y }
96+ }));
97+ }
98+
99+ function onMouseUp() {
100+ if (!isDragging) return;
101+ isDragging = false;
102+
103+ node.dispatchEvent(new CustomEvent('dragend', {
104+ detail: { x, y }
105+ }));
106+ }
107+
108+ handleElement.style.cursor = isEnabled ? 'move' : 'default';
109+ handleElement.addEventListener('mousedown', onMouseDown as EventListener);
110+ window.addEventListener('mousemove', onMouseMove as EventListener);
111+ window.addEventListener('mouseup', onMouseUp as EventListener);
112+
113+ return {
114+ update(newParams: DraggableParameters) {
115+ const newEnabled = newParams.enabled !== undefined ? newParams.enabled : true;
116+ isEnabled = newEnabled;
117+ handleElement.style.cursor = isEnabled ? 'move' : 'default';
118+ Object.assign(params, newParams);
119+ },
120+ destroy() {
121+ handleElement.removeEventListener('mousedown', onMouseDown as EventListener);
122+ window.removeEventListener('mousemove', onMouseMove as EventListener);
123+ window.removeEventListener('mouseup', onMouseUp as EventListener);
124+ }
125+ };
126+}; ⏎̸
A src/lib/actions/maximizable.ts +109 -0
@@ -0,0 +1,109 @@
1+import type { Action } from 'svelte/action';
2+interface MaximizableParameters {
3+ enabled?: boolean;
4+ padding?: number;
5+}
6+
7+interface MaximizableAttributes {
8+ onmaximize?: (e: CustomEvent<{
9+ isMaximized: boolean;
10+ width: number;
11+ height: number;
12+ x: number;
13+ y: number;
14+ }>) => void;
15+}
16+
17+interface StoredState {
18+ width: number;
19+ height: number;
20+ x: number;
21+ y: number;
22+}
23+
24+export const maximizable: Action<HTMLDivElement, MaximizableParameters, MaximizableAttributes> = (node, params = {}) => {
25+ const {
26+ enabled = true,
27+ padding = 0
28+ } = params;
29+
30+ let isMaximized = false;
31+ let storedState: StoredState | null = null;
32+
33+ function maximize() {
34+ if (!enabled || isMaximized) return;
35+
36+ // Store current state
37+ storedState = {
38+ width: node.offsetWidth,
39+ height: node.offsetHeight,
40+ x: parseInt(node.style.left) || 0,
41+ y: parseInt(node.style.top) || 0
42+ };
43+
44+ // Set maximized state
45+ const maxWidth = window.innerWidth - (padding * 2);
46+ const maxHeight = window.innerHeight - (padding * 2);
47+
48+ node.style.width = `${maxWidth}px`;
49+ node.style.height = `${maxHeight}px`;
50+ node.style.left = `${padding}px`;
51+ node.style.top = `${padding}px`;
52+
53+ isMaximized = true;
54+
55+ node.dispatchEvent(new CustomEvent('maximize', {
56+ detail: {
57+ isMaximized: true,
58+ width: maxWidth,
59+ height: maxHeight,
60+ x: padding,
61+ y: padding
62+ }
63+ }));
64+ }
65+
66+ function restore() {
67+ if (!enabled || !isMaximized || !storedState) return;
68+
69+ // Restore previous state
70+ node.style.width = `${storedState.width}px`;
71+ node.style.height = `${storedState.height}px`;
72+ node.style.left = `${storedState.x}px`;
73+ node.style.top = `${storedState.y}px`;
74+
75+ isMaximized = false;
76+
77+ node.dispatchEvent(new CustomEvent('maximize', {
78+ detail: {
79+ isMaximized: false,
80+ ...storedState
81+ }
82+ }));
83+ }
84+
85+ function toggle() {
86+ if (isMaximized) {
87+ restore();
88+ } else {
89+ maximize();
90+ }
91+ }
92+
93+ // Expose methods to the node
94+ Object.assign(node, {
95+ maximize,
96+ restore,
97+ toggleMaximize: toggle,
98+ isMaximized: () => isMaximized
99+ });
100+
101+ return {
102+ update(newParams: MaximizableParameters) {
103+ Object.assign(params, newParams);
104+ },
105+ destroy() {
106+ // Clean up if needed
107+ }
108+ };
109+}; ⏎̸
@@ -0,0 +1,109 @@
1+import type { Action } from 'svelte/action';
2+interface MaximizableParameters {
3+ enabled?: boolean;
4+ padding?: number;
5+}
6+
7+interface MaximizableAttributes {
8+ onmaximize?: (e: CustomEvent<{
9+ isMaximized: boolean;
10+ width: number;
11+ height: number;
12+ x: number;
13+ y: number;
14+ }>) => void;
15+}
16+
17+interface StoredState {
18+ width: number;
19+ height: number;
20+ x: number;
21+ y: number;
22+}
23+
24+export const maximizable: Action<HTMLDivElement, MaximizableParameters, MaximizableAttributes> = (node, params = {}) => {
25+ const {
26+ enabled = true,
27+ padding = 0
28+ } = params;
29+
30+ let isMaximized = false;
31+ let storedState: StoredState | null = null;
32+
33+ function maximize() {
34+ if (!enabled || isMaximized) return;
35+
36+ // Store current state
37+ storedState = {
38+ width: node.offsetWidth,
39+ height: node.offsetHeight,
40+ x: parseInt(node.style.left) || 0,
41+ y: parseInt(node.style.top) || 0
42+ };
43+
44+ // Set maximized state
45+ const maxWidth = window.innerWidth - (padding * 2);
46+ const maxHeight = window.innerHeight - (padding * 2);
47+
48+ node.style.width = `${maxWidth}px`;
49+ node.style.height = `${maxHeight}px`;
50+ node.style.left = `${padding}px`;
51+ node.style.top = `${padding}px`;
52+
53+ isMaximized = true;
54+
55+ node.dispatchEvent(new CustomEvent('maximize', {
56+ detail: {
57+ isMaximized: true,
58+ width: maxWidth,
59+ height: maxHeight,
60+ x: padding,
61+ y: padding
62+ }
63+ }));
64+ }
65+
66+ function restore() {
67+ if (!enabled || !isMaximized || !storedState) return;
68+
69+ // Restore previous state
70+ node.style.width = `${storedState.width}px`;
71+ node.style.height = `${storedState.height}px`;
72+ node.style.left = `${storedState.x}px`;
73+ node.style.top = `${storedState.y}px`;
74+
75+ isMaximized = false;
76+
77+ node.dispatchEvent(new CustomEvent('maximize', {
78+ detail: {
79+ isMaximized: false,
80+ ...storedState
81+ }
82+ }));
83+ }
84+
85+ function toggle() {
86+ if (isMaximized) {
87+ restore();
88+ } else {
89+ maximize();
90+ }
91+ }
92+
93+ // Expose methods to the node
94+ Object.assign(node, {
95+ maximize,
96+ restore,
97+ toggleMaximize: toggle,
98+ isMaximized: () => isMaximized
99+ });
100+
101+ return {
102+ update(newParams: MaximizableParameters) {
103+ Object.assign(params, newParams);
104+ },
105+ destroy() {
106+ // Clean up if needed
107+ }
108+ };
109+}; ⏎̸
A src/lib/actions/resizable.ts +111 -0
@@ -0,0 +1,111 @@
1+import type { Action } from 'svelte/action';
2+
3+interface ResizableParameters {
4+ enabled?: boolean;
5+ minWidth?: number;
6+ minHeight?: number;
7+ maxWidth?: number;
8+ maxHeight?: number;
9+}
10+
11+interface ResizableAttributes {
12+ onresizestart?: (e: CustomEvent<{ width: number; height: number }>) => void;
13+ onresizemove?: (e: CustomEvent<{ width: number; height: number }>) => void;
14+ onresizeend?: (e: CustomEvent<{ width: number; height: number }>) => void;
15+}
16+
17+export const resizable: Action<HTMLElement, ResizableParameters, ResizableAttributes> = (node, params = {}) => {
18+ let isResizing = false;
19+ let startWidth = 0;
20+ let startHeight = 0;
21+ let startX = 0;
22+ let startY = 0;
23+
24+ const {
25+ enabled = true,
26+ minWidth = 200,
27+ minHeight = 200,
28+ maxWidth = window.innerWidth,
29+ maxHeight = window.innerHeight
30+ } = params;
31+
32+ // Create and append resize handle
33+ const handle = document.createElement('div');
34+ handle.className = 'resize-handle';
35+ Object.assign(handle.style, {
36+ position: 'absolute',
37+ bottom: '0',
38+ right: '0',
39+ width: '15px',
40+ height: '15px',
41+ cursor: 'se-resize',
42+ zIndex: '1000'
43+ });
44+ node.appendChild(handle);
45+
46+ // Ensure parent element has position
47+ if (getComputedStyle(node).position === 'static') {
48+ node.style.position = 'relative';
49+ }
50+
51+ function onMouseDown(event: MouseEvent) {
52+ if (!enabled) return;
53+
54+ isResizing = true;
55+ startX = event.clientX;
56+ startY = event.clientY;
57+ startWidth = node.offsetWidth;
58+ startHeight = node.offsetHeight;
59+
60+ node.dispatchEvent(new CustomEvent('resizestart', {
61+ detail: { width: startWidth, height: startHeight }
62+ }));
63+
64+ event.preventDefault();
65+ }
66+
67+ function onMouseMove(event: MouseEvent) {
68+ if (!isResizing || !enabled) return;
69+
70+ const deltaX = event.clientX - startX;
71+ const deltaY = event.clientY - startY;
72+
73+ const newWidth = Math.min(maxWidth, Math.max(minWidth, startWidth + deltaX));
74+ const newHeight = Math.min(maxHeight, Math.max(minHeight, startHeight + deltaY));
75+
76+ node.style.width = `${newWidth}px`;
77+ node.style.height = `${newHeight}px`;
78+
79+ node.dispatchEvent(new CustomEvent('resizemove', {
80+ detail: { width: newWidth, height: newHeight }
81+ }));
82+ }
83+
84+ function onMouseUp() {
85+ if (!isResizing) return;
86+
87+ isResizing = false;
88+ node.dispatchEvent(new CustomEvent('resizeend', {
89+ detail: {
90+ width: node.offsetWidth,
91+ height: node.offsetHeight
92+ }
93+ }));
94+ }
95+
96+ handle.addEventListener('mousedown', onMouseDown);
97+ window.addEventListener('mousemove', onMouseMove);
98+ window.addEventListener('mouseup', onMouseUp);
99+
100+ return {
101+ update(newParams: ResizableParameters) {
102+ Object.assign(params, newParams);
103+ },
104+ destroy() {
105+ handle.removeEventListener('mousedown', onMouseDown);
106+ window.removeEventListener('mousemove', onMouseMove);
107+ window.removeEventListener('mouseup', onMouseUp);
108+ node.removeChild(handle);
109+ }
110+ };
111+}; ⏎̸
@@ -0,0 +1,111 @@
1+import type { Action } from 'svelte/action';
2+
3+interface ResizableParameters {
4+ enabled?: boolean;
5+ minWidth?: number;
6+ minHeight?: number;
7+ maxWidth?: number;
8+ maxHeight?: number;
9+}
10+
11+interface ResizableAttributes {
12+ onresizestart?: (e: CustomEvent<{ width: number; height: number }>) => void;
13+ onresizemove?: (e: CustomEvent<{ width: number; height: number }>) => void;
14+ onresizeend?: (e: CustomEvent<{ width: number; height: number }>) => void;
15+}
16+
17+export const resizable: Action<HTMLElement, ResizableParameters, ResizableAttributes> = (node, params = {}) => {
18+ let isResizing = false;
19+ let startWidth = 0;
20+ let startHeight = 0;
21+ let startX = 0;
22+ let startY = 0;
23+
24+ const {
25+ enabled = true,
26+ minWidth = 200,
27+ minHeight = 200,
28+ maxWidth = window.innerWidth,
29+ maxHeight = window.innerHeight
30+ } = params;
31+
32+ // Create and append resize handle
33+ const handle = document.createElement('div');
34+ handle.className = 'resize-handle';
35+ Object.assign(handle.style, {
36+ position: 'absolute',
37+ bottom: '0',
38+ right: '0',
39+ width: '15px',
40+ height: '15px',
41+ cursor: 'se-resize',
42+ zIndex: '1000'
43+ });
44+ node.appendChild(handle);
45+
46+ // Ensure parent element has position
47+ if (getComputedStyle(node).position === 'static') {
48+ node.style.position = 'relative';
49+ }
50+
51+ function onMouseDown(event: MouseEvent) {
52+ if (!enabled) return;
53+
54+ isResizing = true;
55+ startX = event.clientX;
56+ startY = event.clientY;
57+ startWidth = node.offsetWidth;
58+ startHeight = node.offsetHeight;
59+
60+ node.dispatchEvent(new CustomEvent('resizestart', {
61+ detail: { width: startWidth, height: startHeight }
62+ }));
63+
64+ event.preventDefault();
65+ }
66+
67+ function onMouseMove(event: MouseEvent) {
68+ if (!isResizing || !enabled) return;
69+
70+ const deltaX = event.clientX - startX;
71+ const deltaY = event.clientY - startY;
72+
73+ const newWidth = Math.min(maxWidth, Math.max(minWidth, startWidth + deltaX));
74+ const newHeight = Math.min(maxHeight, Math.max(minHeight, startHeight + deltaY));
75+
76+ node.style.width = `${newWidth}px`;
77+ node.style.height = `${newHeight}px`;
78+
79+ node.dispatchEvent(new CustomEvent('resizemove', {
80+ detail: { width: newWidth, height: newHeight }
81+ }));
82+ }
83+
84+ function onMouseUp() {
85+ if (!isResizing) return;
86+
87+ isResizing = false;
88+ node.dispatchEvent(new CustomEvent('resizeend', {
89+ detail: {
90+ width: node.offsetWidth,
91+ height: node.offsetHeight
92+ }
93+ }));
94+ }
95+
96+ handle.addEventListener('mousedown', onMouseDown);
97+ window.addEventListener('mousemove', onMouseMove);
98+ window.addEventListener('mouseup', onMouseUp);
99+
100+ return {
101+ update(newParams: ResizableParameters) {
102+ Object.assign(params, newParams);
103+ },
104+ destroy() {
105+ handle.removeEventListener('mousedown', onMouseDown);
106+ window.removeEventListener('mousemove', onMouseMove);
107+ window.removeEventListener('mouseup', onMouseUp);
108+ node.removeChild(handle);
109+ }
110+ };
111+}; ⏎̸
A src/lib/components/aim-login.svelte +248 -0
@@ -0,0 +1,248 @@
1+<!-- AIM Login Component Updated for Svelte5 with Sign In/Sign Up Tabs -->
2+<script lang="ts">
3+ import { draggable } from '$lib/actions/draggable';
4+ import { createEventDispatcher } from 'svelte';
5+
6+ const dispatch = createEventDispatcher();
7+
8+ let activeTab = $state('signin');
9+
10+ // Sign In state
11+ let siUsername = $state('');
12+ let siPassword = $state('');
13+ let savePassword = $state(true);
14+ let autoLogin = $state(false);
15+ let error = $state('');
16+
17+ // Sign Up state
18+ let suUsername = $state('');
19+ let suPassword = $state('');
20+ let suConfirmPassword = $state('');
21+ let captchaAnswer = $state('');
22+ let signupError = $state('');
23+
24+ function handleSigninSubmit() {
25+ error = '';
26+ if (!siUsername || !siPassword) {
27+ error = 'Please enter both username and password';
28+ return;
29+ }
30+ // TODO: Implement authentication for sign in
31+ console.log('Sign in', siUsername, siPassword, savePassword, autoLogin);
32+ }
33+
34+ function handleSignupSubmit() {
35+ signupError = '';
36+ if (!suUsername || !suPassword || !suConfirmPassword || !captchaAnswer) {
37+ signupError = 'Please fill all fields';
38+ return;
39+ }
40+ if (suPassword !== suConfirmPassword) {
41+ signupError = 'Passwords do not match';
42+ return;
43+ }
44+ if (captchaAnswer.toLowerCase() !== 'personal digital repository') {
45+ signupError = 'Incorrect captcha answer';
46+ return;
47+ }
48+ // TODO: Implement registration for sign up
49+ console.log('Sign up', suUsername, suPassword);
50+ }
51+
52+ function switchTab(tab: string) {
53+ activeTab = tab;
54+ error = '';
55+ signupError = '';
56+ }
57+
58+ function handleClose() {
59+ dispatch('close');
60+ }
61+
62+ // Added dragging state and handler similar to chat-room
63+ let windowX = $state(0);
64+ let windowY = $state(0);
65+
66+ function handleDragMove(event: CustomEvent<{ x: number; y: number }>) {
67+ windowX = event.detail.x;
68+ windowY = event.detail.y;
69+ }
70+</script>
71+
72+<!-- Updated outer div to handle dragging with inline style and drag event -->
73+<div class="login-window window" use:draggable={{ handle: '.title-bar' }} ondragmove={handleDragMove} style="left: {windowX}px; top: {windowY}px;">
74+ <div class="title-bar">
75+ <div class="title-bar-text">
76+ <img src="/desktop/aim-desktop-icon.png" alt="AIM" class="title-icon" width="16" height="16" />
77+ {activeTab === 'signin' ? 'Sign In' : 'Sign Up'}
78+ </div>
79+ <div class="title-bar-controls">
80+ <button aria-label="Close" onclick={handleClose}>×</button>
81+ </div>
82+ </div>
83+
84+ <div class="tabs">
85+ <button class:active={activeTab === 'signin'} onclick={() => switchTab('signin')}>Sign In</button>
86+ <button class:active={activeTab === 'signup'} onclick={() => switchTab('signup')}>Sign Up</button>
87+ </div>
88+
89+ <div class="window-content">
90+ {#if activeTab === 'signin'}
91+ <form onsubmit={handleSigninSubmit}>
92+ <div class="form-group">
93+ <label for="si-username">Username</label>
94+ <input type="text" id="si-username" bind:value={siUsername} placeholder="Username" />
95+ </div>
96+ <div class="form-group">
97+ <label for="si-password">Password</label>
98+ <input type="password" id="si-password" bind:value={siPassword} placeholder="Password" />
99+ </div>
100+ <div class="checkboxes">
101+ <label>
102+ <input type="checkbox" bind:checked={savePassword} />
103+ Save password
104+ </label>
105+ <label>
106+ <input type="checkbox" bind:checked={autoLogin} />
107+ Auto-login
108+ </label>
109+ </div>
110+ {#if error}
111+ <div class="error">{error}</div>
112+ {/if}
113+ <div class="button-bar">
114+ <button type="submit" class="icon-button">
115+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
116+ <path d="M12 4C9.24 4 7 6.24 7 9c0 2.76 2.24 5 5 5s5-2.24 5-5c0-2.76-2.24-5-5-5zm0 2c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 10c-3.33 0-7 1.67-7 5v1h14v-1c0-3.33-3.67-5-7-5zm0 2c2.67 0 5 1.33 5 3H7c0-1.67 2.33-3 5-3z" fill="currentColor"/>
117+ </svg>
118+ Sign In
119+ </button>
120+ </div>
121+ </form>
122+ {:else}
123+ <form onsubmit={handleSignupSubmit}>
124+ <div class="form-group">
125+ <label for="su-username">Username</label>
126+ <input type="text" id="su-username" bind:value={suUsername} placeholder="Choose a username" />
127+ </div>
128+ <div class="form-group">
129+ <label for="su-password">Password</label>
130+ <input type="password" id="su-password" bind:value={suPassword} placeholder="Password" />
131+ </div>
132+ <div class="form-group">
133+ <label for="su-confirm-password">Confirm Password</label>
134+ <input type="password" id="su-confirm-password" bind:value={suConfirmPassword} placeholder="Confirm Password" />
135+ </div>
136+ <div class="form-group">
137+ <label for="captcha">What's the meaning of PDR?</label>
138+ <input type="text" id="captcha" bind:value={captchaAnswer} placeholder="Enter your answer" />
139+ </div>
140+ {#if signupError}
141+ <div class="error">{signupError}</div>
142+ {/if}
143+ <div class="button-bar">
144+ <button type="submit" class="icon-button">
145+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
146+ <path d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" fill="currentColor"/>
147+ </svg>
148+ Sign Up
149+ </button>
150+ </div>
151+ </form>
152+ {/if}
153+ </div>
154+</div>
155+
156+<style>
157+ .login-window {
158+ width: 300px;
159+ background: #ECE9D8;
160+ /* Changed to fixed positioning for correct dragging */
161+ position: fixed;
162+ }
163+ .title-bar {
164+ background: linear-gradient(180deg, #0054E3 0%, #0047AB 100%);
165+ padding: 4px 6px;
166+ display: flex;
167+ justify-content: space-between;
168+ align-items: center;
169+ color: white;
170+ font-weight: bold;
171+ user-select: none;
172+ position: relative;
173+ }
174+ .title-bar-text {
175+ display: flex;
176+ align-items: center;
177+ gap: 4px;
178+ font-size: 0.875rem;
179+ }
180+
181+ .tabs {
182+ padding: 0 3px;
183+ display: flex;
184+ border-bottom: 1px solid #0054E3;
185+ }
186+ .tabs button {
187+ flex: 1;
188+ padding: 8px;
189+ border: none;
190+ background: #ECE9D8;
191+ font-size: 1rem;
192+ cursor: pointer;
193+ }
194+ .tabs button.active {
195+ background: #fff;
196+ border-bottom: 2px solid #0054E3;
197+ font-weight: bold;
198+ }
199+ .window-content {
200+ padding: 16px;
201+ }
202+ .form-group {
203+ margin-bottom: 16px;
204+ }
205+ .form-group label {
206+ display: block;
207+ margin-bottom: 4px;
208+ font-size: 1rem;
209+ }
210+ .form-group input,
211+ .form-group select {
212+ width: 100%;
213+ padding: 4px;
214+ font-size: 1rem;
215+ }
216+ .checkboxes {
217+ display: flex;
218+ gap: 16px;
219+ margin-bottom: 16px;
220+ font-size: 1rem;
221+ }
222+ .checkboxes label {
223+ display: flex;
224+ align-items: center;
225+ gap: 4px;
226+ }
227+ .button-bar {
228+ display: flex;
229+ justify-content: center;
230+ margin-top: 20px;
231+ }
232+ .icon-button {
233+ display: flex;
234+ flex-direction: column;
235+ align-items: center;
236+ gap: 4px;
237+ background: none;
238+ border: none;
239+ cursor: pointer;
240+ font-size: 1rem;
241+ color: black;
242+ }
243+ .error {
244+ color: red;
245+ font-size: 1rem;
246+ margin-top: 8px;
247+ }
248+</style> ⏎̸
@@ -0,0 +1,248 @@
1+<!-- AIM Login Component Updated for Svelte5 with Sign In/Sign Up Tabs -->
2+<script lang="ts">
3+ import { draggable } from '$lib/actions/draggable';
4+ import { createEventDispatcher } from 'svelte';
5+
6+ const dispatch = createEventDispatcher();
7+
8+ let activeTab = $state('signin');
9+
10+ // Sign In state
11+ let siUsername = $state('');
12+ let siPassword = $state('');
13+ let savePassword = $state(true);
14+ let autoLogin = $state(false);
15+ let error = $state('');
16+
17+ // Sign Up state
18+ let suUsername = $state('');
19+ let suPassword = $state('');
20+ let suConfirmPassword = $state('');
21+ let captchaAnswer = $state('');
22+ let signupError = $state('');
23+
24+ function handleSigninSubmit() {
25+ error = '';
26+ if (!siUsername || !siPassword) {
27+ error = 'Please enter both username and password';
28+ return;
29+ }
30+ // TODO: Implement authentication for sign in
31+ console.log('Sign in', siUsername, siPassword, savePassword, autoLogin);
32+ }
33+
34+ function handleSignupSubmit() {
35+ signupError = '';
36+ if (!suUsername || !suPassword || !suConfirmPassword || !captchaAnswer) {
37+ signupError = 'Please fill all fields';
38+ return;
39+ }
40+ if (suPassword !== suConfirmPassword) {
41+ signupError = 'Passwords do not match';
42+ return;
43+ }
44+ if (captchaAnswer.toLowerCase() !== 'personal digital repository') {
45+ signupError = 'Incorrect captcha answer';
46+ return;
47+ }
48+ // TODO: Implement registration for sign up
49+ console.log('Sign up', suUsername, suPassword);
50+ }
51+
52+ function switchTab(tab: string) {
53+ activeTab = tab;
54+ error = '';
55+ signupError = '';
56+ }
57+
58+ function handleClose() {
59+ dispatch('close');
60+ }
61+
62+ // Added dragging state and handler similar to chat-room
63+ let windowX = $state(0);
64+ let windowY = $state(0);
65+
66+ function handleDragMove(event: CustomEvent<{ x: number; y: number }>) {
67+ windowX = event.detail.x;
68+ windowY = event.detail.y;
69+ }
70+</script>
71+
72+<!-- Updated outer div to handle dragging with inline style and drag event -->
73+<div class="login-window window" use:draggable={{ handle: '.title-bar' }} ondragmove={handleDragMove} style="left: {windowX}px; top: {windowY}px;">
74+ <div class="title-bar">
75+ <div class="title-bar-text">
76+ <img src="/desktop/aim-desktop-icon.png" alt="AIM" class="title-icon" width="16" height="16" />
77+ {activeTab === 'signin' ? 'Sign In' : 'Sign Up'}
78+ </div>
79+ <div class="title-bar-controls">
80+ <button aria-label="Close" onclick={handleClose}>×</button>
81+ </div>
82+ </div>
83+
84+ <div class="tabs">
85+ <button class:active={activeTab === 'signin'} onclick={() => switchTab('signin')}>Sign In</button>
86+ <button class:active={activeTab === 'signup'} onclick={() => switchTab('signup')}>Sign Up</button>
87+ </div>
88+
89+ <div class="window-content">
90+ {#if activeTab === 'signin'}
91+ <form onsubmit={handleSigninSubmit}>
92+ <div class="form-group">
93+ <label for="si-username">Username</label>
94+ <input type="text" id="si-username" bind:value={siUsername} placeholder="Username" />
95+ </div>
96+ <div class="form-group">
97+ <label for="si-password">Password</label>
98+ <input type="password" id="si-password" bind:value={siPassword} placeholder="Password" />
99+ </div>
100+ <div class="checkboxes">
101+ <label>
102+ <input type="checkbox" bind:checked={savePassword} />
103+ Save password
104+ </label>
105+ <label>
106+ <input type="checkbox" bind:checked={autoLogin} />
107+ Auto-login
108+ </label>
109+ </div>
110+ {#if error}
111+ <div class="error">{error}</div>
112+ {/if}
113+ <div class="button-bar">
114+ <button type="submit" class="icon-button">
115+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
116+ <path d="M12 4C9.24 4 7 6.24 7 9c0 2.76 2.24 5 5 5s5-2.24 5-5c0-2.76-2.24-5-5-5zm0 2c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 10c-3.33 0-7 1.67-7 5v1h14v-1c0-3.33-3.67-5-7-5zm0 2c2.67 0 5 1.33 5 3H7c0-1.67 2.33-3 5-3z" fill="currentColor"/>
117+ </svg>
118+ Sign In
119+ </button>
120+ </div>
121+ </form>
122+ {:else}
123+ <form onsubmit={handleSignupSubmit}>
124+ <div class="form-group">
125+ <label for="su-username">Username</label>
126+ <input type="text" id="su-username" bind:value={suUsername} placeholder="Choose a username" />
127+ </div>
128+ <div class="form-group">
129+ <label for="su-password">Password</label>
130+ <input type="password" id="su-password" bind:value={suPassword} placeholder="Password" />
131+ </div>
132+ <div class="form-group">
133+ <label for="su-confirm-password">Confirm Password</label>
134+ <input type="password" id="su-confirm-password" bind:value={suConfirmPassword} placeholder="Confirm Password" />
135+ </div>
136+ <div class="form-group">
137+ <label for="captcha">What's the meaning of PDR?</label>
138+ <input type="text" id="captcha" bind:value={captchaAnswer} placeholder="Enter your answer" />
139+ </div>
140+ {#if signupError}
141+ <div class="error">{signupError}</div>
142+ {/if}
143+ <div class="button-bar">
144+ <button type="submit" class="icon-button">
145+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
146+ <path d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" fill="currentColor"/>
147+ </svg>
148+ Sign Up
149+ </button>
150+ </div>
151+ </form>
152+ {/if}
153+ </div>
154+</div>
155+
156+<style>
157+ .login-window {
158+ width: 300px;
159+ background: #ECE9D8;
160+ /* Changed to fixed positioning for correct dragging */
161+ position: fixed;
162+ }
163+ .title-bar {
164+ background: linear-gradient(180deg, #0054E3 0%, #0047AB 100%);
165+ padding: 4px 6px;
166+ display: flex;
167+ justify-content: space-between;
168+ align-items: center;
169+ color: white;
170+ font-weight: bold;
171+ user-select: none;
172+ position: relative;
173+ }
174+ .title-bar-text {
175+ display: flex;
176+ align-items: center;
177+ gap: 4px;
178+ font-size: 0.875rem;
179+ }
180+
181+ .tabs {
182+ padding: 0 3px;
183+ display: flex;
184+ border-bottom: 1px solid #0054E3;
185+ }
186+ .tabs button {
187+ flex: 1;
188+ padding: 8px;
189+ border: none;
190+ background: #ECE9D8;
191+ font-size: 1rem;
192+ cursor: pointer;
193+ }
194+ .tabs button.active {
195+ background: #fff;
196+ border-bottom: 2px solid #0054E3;
197+ font-weight: bold;
198+ }
199+ .window-content {
200+ padding: 16px;
201+ }
202+ .form-group {
203+ margin-bottom: 16px;
204+ }
205+ .form-group label {
206+ display: block;
207+ margin-bottom: 4px;
208+ font-size: 1rem;
209+ }
210+ .form-group input,
211+ .form-group select {
212+ width: 100%;
213+ padding: 4px;
214+ font-size: 1rem;
215+ }
216+ .checkboxes {
217+ display: flex;
218+ gap: 16px;
219+ margin-bottom: 16px;
220+ font-size: 1rem;
221+ }
222+ .checkboxes label {
223+ display: flex;
224+ align-items: center;
225+ gap: 4px;
226+ }
227+ .button-bar {
228+ display: flex;
229+ justify-content: center;
230+ margin-top: 20px;
231+ }
232+ .icon-button {
233+ display: flex;
234+ flex-direction: column;
235+ align-items: center;
236+ gap: 4px;
237+ background: none;
238+ border: none;
239+ cursor: pointer;
240+ font-size: 1rem;
241+ color: black;
242+ }
243+ .error {
244+ color: red;
245+ font-size: 1rem;
246+ margin-top: 8px;
247+ }
248+</style> ⏎̸
M src/lib/components/chat-room.svelte +100 -17
@@ -1,17 +1,29 @@
11 <script lang="ts">
22 import { chatState } from '../states/chat.svelte';
3-import type { ChatMessage, User } from '../types/chat';
3+import type { MessageType, User, ChatRoom, Message, UserStatus } from '../types/chat';
44 import { onMount } from 'svelte';
55 import { browser } from '$app/environment';
6+import { draggable } from '$lib/actions/draggable';
7+import { resizable } from '$lib/actions/resizable';
8+import { maximizable } from '$lib/actions/maximizable';
69
710 // Initialize with default values for SSR
8-let windowWidth = $state(800);
9-let windowHeight = $state(600);
11+let windowWidth = $state(400);
12+let windowHeight = $state(500);
1013 let windowX = $state(0);
1114 let windowY = $state(0);
1215 let isMobile = $state(false);
1316 let currentMessage = $state('');
1417 let showUserList = $state(false);
18+let isMaximized = $state(false);
19+
20+
21+// let { value = $bindable(), ...props } = $props();
22+let { showChatRoom = $bindable() } = $props();
23+
24+function handleClose() {
25+ showChatRoom = false;
26+}
1527
1628 // Reactive state using derived values
1729 let messages = $derived(chatState.getMessages());
@@ -29,8 +41,8 @@ onMount(() => {
2941 windowX = 0;
3042 windowY = 0;
3143 } else {
32- windowWidth = Math.min(800, window.innerWidth * 0.8);
33- windowHeight = Math.min(600, window.innerHeight * 0.8);
44+ windowWidth = Math.min(800, Math.max(400, window.innerWidth * 0.8));
45+ windowHeight = Math.min(600, Math.max(500, window.innerHeight * 0.8));
3446 windowX = Math.max(0, (window.innerWidth - windowWidth) / 2);
3547 windowY = Math.max(0, (window.innerHeight - windowHeight) / 2);
3648 }
@@ -67,23 +79,69 @@ function getStatusIcon(status: User['status']) {
6779 default: return '⚫';
6880 }
6981 }
82+
83+function handleDragMove(event: CustomEvent<{ x: number; y: number }>) {
84+ windowX = event.detail.x;
85+ windowY = event.detail.y;
86+}
87+
88+interface MaximizableNode extends HTMLElement {
89+ toggleMaximize: () => void;
90+}
91+
92+function handleMaximize(event: MouseEvent) {
93+ const node = (event.currentTarget as HTMLElement).closest('.window') as MaximizableNode;
94+ if (node) {
95+ node.toggleMaximize();
96+ }
97+}
98+
99+function handleMaximizeEvent(event: CustomEvent<{
100+ isMaximized: boolean;
101+ width: number;
102+ height: number;
103+ x: number;
104+ y: number;
105+}>) {
106+ isMaximized = event.detail.isMaximized;
107+ windowWidth = event.detail.width;
108+ windowHeight = event.detail.height;
109+ windowX = event.detail.x;
110+ windowY = event.detail.y;
111+}
70112 </script>
71113
114+{#if showChatRoom}
72115 <div
73- class="window"
74- style:width="{windowWidth}px"
75- style:height="{windowHeight}px"
76- style:position="absolute"
77- style:left="{windowX}px"
78- style:top="{windowY}px"
116+ class="chat-window window"
117+ style="width: {windowWidth}px; height: {windowHeight}px; left: {windowX}px; top: {windowY}px;"
118+ use:draggable={{ handle: '.title-bar', enabled: !isMobile && !isMaximized }}
119+ use:resizable={{
120+ enabled: !isMobile && !isMaximized,
121+ minWidth: 400,
122+ minHeight: 500,
123+ maxWidth: window.innerWidth - 40,
124+ maxHeight: window.innerHeight - 40
125+ }}
126+ use:maximizable={{ enabled: !isMobile, padding: 4 }}
127+ onmaximize={handleMaximizeEvent}
128+ onresizemove={(e) => {
129+ windowWidth = Math.max(400, e.detail.width);
130+ windowHeight = Math.max(500, e.detail.height);
131+ }}
132+ ondragmove={handleDragMove}
79133 >
80134 <div class="title-bar">
81- <div class="title-bar-text">AIM Chat Room - {currentUser?.nickname}</div>
135+ <div class="title-bar-text">Pdr Aim - {currentUser?.nickname}</div>
82136 <div class="title-bar-controls">
83137 {#if !isMobile}
84138 <button aria-label="Minimize"></button>
85- <button aria-label="Maximize"></button>
86- <button aria-label="Close"></button>
139+ <button
140+ aria-label="Maximize"
141+ class:maximized={isMaximized}
142+ onclick={handleMaximize}
143+ ></button>
144+ <button onclick={handleClose} aria-label="Close"></button>
87145 {:else}
88146 <button
89147 aria-label="Toggle Buddy List"
@@ -139,8 +197,8 @@ function getStatusIcon(status: User['status']) {
139197 <span class="status-icon">{getStatusIcon(user.status)}</span>
140198 <div class="user-info">
141199 <div class="nickname">{user.nickname}</div>
142- {#if user.statusMessage}
143- <div class="status-message">{user.statusMessage}</div>
200+ {#if user.status === 'away'}
201+ <div class="status-message">Away</div>
144202 {/if}
145203 </div>
146204 </div>
@@ -148,18 +206,27 @@ function getStatusIcon(status: User['status']) {
148206 </div>
149207 </div>
150208 </div>
209+{/if}
151210
152211 <style>
153212 :global(*) {
154213 font-size: 1rem;
214+ font-family: 'Microsoft Sans Serif', 'Segoe UI', Tahoma, sans-serif;
155215 }
156216
157217 .title-bar {
158218 height: 2rem;
219+ position: relative;
220+ cursor: move;
221+ user-select: none;
222+ }
223+
224+ .chat-window {
225+ position: fixed;
226+ box-sizing: border-box;
159227 }
160228
161229 .chat-area {
162- font-family: 'Tahoma', sans-serif;
163230 line-height: 1.4;
164231 }
165232
@@ -243,6 +310,18 @@ function getStatusIcon(status: User['status']) {
243310 display: none !important;
244311 }
245312
313+ :global(.resize-handle) {
314+ position: absolute;
315+ bottom: 0;
316+ right: 0;
317+ width: 15px !important;
318+ height: 15px !important;
319+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='15' height='15'%3E%3Cpath d='M11 11v-2h2v2h-2zm0-4h2v2h-2V7zm-2 2V7h2v2H9zm0 2v-2h2v2H9zm-2 0v-2h2v2H7z' fill='%23000'/%3E%3C/svg%3E");
320+ background-position: bottom right;
321+ background-repeat: no-repeat;
322+ cursor: se-resize !important;
323+ }
324+
246325 @media (max-width: 768px) {
247326 .window {
248327 position: fixed !important;
@@ -280,5 +359,9 @@ function getStatusIcon(status: User['status']) {
280359 padding: 0.5rem;
281360 border-top: 0.125rem solid #dfdfdf;
282361 }
362+
363+ :global(.resize-handle) {
364+ display: none;
365+ }
283366 }
284367 </style>⏎̸
@@ -1,17 +1,29 @@
1 <script lang="ts">1 <script lang="ts">
2 import { chatState } from '../states/chat.svelte';2 import { chatState } from '../states/chat.svelte';
3-import type { ChatMessage, User } from '../types/chat';3+import type { MessageType, User, ChatRoom, Message, UserStatus } from '../types/chat';
4 import { onMount } from 'svelte';4 import { onMount } from 'svelte';
5 import { browser } from '$app/environment';5 import { browser } from '$app/environment';
6+import { draggable } from '$lib/actions/draggable';
7+import { resizable } from '$lib/actions/resizable';
8+import { maximizable } from '$lib/actions/maximizable';
6 9
7 // Initialize with default values for SSR10 // Initialize with default values for SSR
8-let windowWidth = $state(800);11+let windowWidth = $state(400);
9-let windowHeight = $state(600);12+let windowHeight = $state(500);
10 let windowX = $state(0);13 let windowX = $state(0);
11 let windowY = $state(0);14 let windowY = $state(0);
12 let isMobile = $state(false);15 let isMobile = $state(false);
13 let currentMessage = $state('');16 let currentMessage = $state('');
14 let showUserList = $state(false);17 let showUserList = $state(false);
18+let isMaximized = $state(false);
19+
20+
21+// let { value = $bindable(), ...props } = $props();
22+let { showChatRoom = $bindable() } = $props();
23+
24+function handleClose() {
25+ showChatRoom = false;
26+}
15 27
16 // Reactive state using derived values28 // Reactive state using derived values
17 let messages = $derived(chatState.getMessages());29 let messages = $derived(chatState.getMessages());
@@ -29,8 +41,8 @@ onMount(() => {
29 windowX = 0;41 windowX = 0;
30 windowY = 0;42 windowY = 0;
31 } else {43 } else {
32- windowWidth = Math.min(800, window.innerWidth * 0.8);44+ windowWidth = Math.min(800, Math.max(400, window.innerWidth * 0.8));
33- windowHeight = Math.min(600, window.innerHeight * 0.8);45+ windowHeight = Math.min(600, Math.max(500, window.innerHeight * 0.8));
34 windowX = Math.max(0, (window.innerWidth - windowWidth) / 2);46 windowX = Math.max(0, (window.innerWidth - windowWidth) / 2);
35 windowY = Math.max(0, (window.innerHeight - windowHeight) / 2);47 windowY = Math.max(0, (window.innerHeight - windowHeight) / 2);
36 }48 }
@@ -67,23 +79,69 @@ function getStatusIcon(status: User['status']) {
67 default: return '⚫';79 default: return '⚫';
68 }80 }
69 }81 }
82+
83+function handleDragMove(event: CustomEvent<{ x: number; y: number }>) {
84+ windowX = event.detail.x;
85+ windowY = event.detail.y;
86+}
87+
88+interface MaximizableNode extends HTMLElement {
89+ toggleMaximize: () => void;
90+}
91+
92+function handleMaximize(event: MouseEvent) {
93+ const node = (event.currentTarget as HTMLElement).closest('.window') as MaximizableNode;
94+ if (node) {
95+ node.toggleMaximize();
96+ }
97+}
98+
99+function handleMaximizeEvent(event: CustomEvent<{
100+ isMaximized: boolean;
101+ width: number;
102+ height: number;
103+ x: number;
104+ y: number;
105+}>) {
106+ isMaximized = event.detail.isMaximized;
107+ windowWidth = event.detail.width;
108+ windowHeight = event.detail.height;
109+ windowX = event.detail.x;
110+ windowY = event.detail.y;
111+}
70 </script>112 </script>
71 113
114+{#if showChatRoom}
72 <div 115 <div
73- class="window"116+ class="chat-window window"
74- style:width="{windowWidth}px"117+ style="width: {windowWidth}px; height: {windowHeight}px; left: {windowX}px; top: {windowY}px;"
75- style:height="{windowHeight}px"118+ use:draggable={{ handle: '.title-bar', enabled: !isMobile && !isMaximized }}
76- style:position="absolute"119+ use:resizable={{
77- style:left="{windowX}px"120+ enabled: !isMobile && !isMaximized,
78- style:top="{windowY}px"121+ minWidth: 400,
122+ minHeight: 500,
123+ maxWidth: window.innerWidth - 40,
124+ maxHeight: window.innerHeight - 40
125+ }}
126+ use:maximizable={{ enabled: !isMobile, padding: 4 }}
127+ onmaximize={handleMaximizeEvent}
128+ onresizemove={(e) => {
129+ windowWidth = Math.max(400, e.detail.width);
130+ windowHeight = Math.max(500, e.detail.height);
131+ }}
132+ ondragmove={handleDragMove}
79 >133 >
80 <div class="title-bar">134 <div class="title-bar">
81- <div class="title-bar-text">AIM Chat Room - {currentUser?.nickname}</div>135+ <div class="title-bar-text">Pdr Aim - {currentUser?.nickname}</div>
82 <div class="title-bar-controls">136 <div class="title-bar-controls">
83 {#if !isMobile}137 {#if !isMobile}
84 <button aria-label="Minimize"></button>138 <button aria-label="Minimize"></button>
85- <button aria-label="Maximize"></button>139+ <button
86- <button aria-label="Close"></button>140+ aria-label="Maximize"
141+ class:maximized={isMaximized}
142+ onclick={handleMaximize}
143+ ></button>
144+ <button onclick={handleClose} aria-label="Close"></button>
87 {:else}145 {:else}
88 <button 146 <button
89 aria-label="Toggle Buddy List"147 aria-label="Toggle Buddy List"
@@ -139,8 +197,8 @@ function getStatusIcon(status: User['status']) {
139 <span class="status-icon">{getStatusIcon(user.status)}</span>197 <span class="status-icon">{getStatusIcon(user.status)}</span>
140 <div class="user-info">198 <div class="user-info">
141 <div class="nickname">{user.nickname}</div>199 <div class="nickname">{user.nickname}</div>
142- {#if user.statusMessage}200+ {#if user.status === 'away'}
143- <div class="status-message">{user.statusMessage}</div>201+ <div class="status-message">Away</div>
144 {/if}202 {/if}
145 </div>203 </div>
146 </div>204 </div>
@@ -148,18 +206,27 @@ function getStatusIcon(status: User['status']) {
148 </div>206 </div>
149 </div>207 </div>
150 </div>208 </div>
209+{/if}
151 210
152 <style>211 <style>
153 :global(*) {212 :global(*) {
154 font-size: 1rem;213 font-size: 1rem;
214+ font-family: 'Microsoft Sans Serif', 'Segoe UI', Tahoma, sans-serif;
155 }215 }
156 216
157 .title-bar {217 .title-bar {
158 height: 2rem;218 height: 2rem;
219+ position: relative;
220+ cursor: move;
221+ user-select: none;
222+ }
223+
224+ .chat-window {
225+ position: fixed;
226+ box-sizing: border-box;
159 }227 }
160 228
161 .chat-area {229 .chat-area {
162- font-family: 'Tahoma', sans-serif;
163 line-height: 1.4;230 line-height: 1.4;
164 }231 }
165 232
@@ -243,6 +310,18 @@ function getStatusIcon(status: User['status']) {
243 display: none !important;310 display: none !important;
244 }311 }
245 312
313+ :global(.resize-handle) {
314+ position: absolute;
315+ bottom: 0;
316+ right: 0;
317+ width: 15px !important;
318+ height: 15px !important;
319+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='15' height='15'%3E%3Cpath d='M11 11v-2h2v2h-2zm0-4h2v2h-2V7zm-2 2V7h2v2H9zm0 2v-2h2v2H9zm-2 0v-2h2v2H7z' fill='%23000'/%3E%3C/svg%3E");
320+ background-position: bottom right;
321+ background-repeat: no-repeat;
322+ cursor: se-resize !important;
323+ }
324+
246 @media (max-width: 768px) {325 @media (max-width: 768px) {
247 .window {326 .window {
248 position: fixed !important;327 position: fixed !important;
@@ -280,5 +359,9 @@ function getStatusIcon(status: User['status']) {
280 padding: 0.5rem;359 padding: 0.5rem;
281 border-top: 0.125rem solid #dfdfdf;360 border-top: 0.125rem solid #dfdfdf;
282 }361 }
362+
363+ :global(.resize-handle) {
364+ display: none;
365+ }
283 }366 }
284 </style>⏎̸367 </style>⏎̸
A src/lib/components/desktop-icons.svelte +96 -0
@@ -0,0 +1,96 @@
1+<script lang="ts">
2+ let { showChatRoom = $bindable(), showAuth = $bindable() } = $props();
3+
4+ function handleKeydown(event: KeyboardEvent, action: () => void) {
5+ if (event.key === 'Enter' || event.key === ' ') {
6+ event.preventDefault();
7+ action();
8+ }
9+ }
10+
11+ function handleChatRoomClick() {
12+ console.log('handleChatRoomClick');
13+ showChatRoom = true
14+ }
15+
16+ function handleAuthClick() {
17+ console.log('handleAuthClick');
18+ showAuth = true;
19+ }
20+</script>
21+
22+<div class="desktop-icons">
23+ <div
24+ class="desktop-icon"
25+ ondblclick={handleChatRoomClick}
26+ onkeydown={(e) => handleKeydown(e, handleChatRoomClick)}
27+ role="button"
28+ tabindex="0"
29+ >
30+ <img src="/desktop/aim-desktop-icon.png" alt="Chat Room" />
31+ <span class="icon-label">Pdr Aim</span>
32+ </div>
33+
34+ <div
35+ class="desktop-icon"
36+ ondblclick={handleAuthClick}
37+ onkeydown={(e) => handleKeydown(e, handleAuthClick)}
38+ role="button"
39+ tabindex="0"
40+ >
41+ <img src="/desktop/application-x-shellscript.png" alt="Sign In" />
42+ <span class="icon-label">login</span>
43+ </div>
44+</div>
45+
46+<style>
47+ .desktop-icons {
48+ position: fixed;
49+ top: 20px;
50+ left: 20px;
51+ display: flex;
52+ flex-direction: column;
53+ gap: 20px;
54+ }
55+
56+ .desktop-icon {
57+ display: flex;
58+ flex-direction: column;
59+ align-items: center;
60+ cursor: pointer;
61+ width: 75px;
62+ text-align: center;
63+ padding: 8px;
64+ border: 1px dotted transparent;
65+ border-radius: 2px;
66+ margin: 2px;
67+ }
68+
69+ .desktop-icon:hover, .desktop-icon:focus {
70+ background: rgba(49, 106, 197, 0.2);
71+ border: 1px dotted rgba(255, 255, 255, 0.8);
72+ outline: 1px solid rgba(49, 106, 197, 0.6);
73+ outline-offset: -1px;
74+ }
75+
76+ .desktop-icon:active {
77+ background: rgba(49, 106, 197, 0.4);
78+ }
79+
80+ .desktop-icon img {
81+ width: 48px;
82+ height: 48px;
83+ margin-bottom: 5px;
84+ pointer-events: none; /* Prevents image from interfering with hover */
85+ }
86+
87+ .icon-label {
88+ color: white;
89+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8);
90+ font-size: 12px;
91+ user-select: none;
92+ pointer-events: none; /* Prevents text from interfering with hover */
93+ max-width: 100%;
94+ overflow-wrap: break-word;
95+ }
96+</style> ⏎̸
@@ -0,0 +1,96 @@
1+<script lang="ts">
2+ let { showChatRoom = $bindable(), showAuth = $bindable() } = $props();
3+
4+ function handleKeydown(event: KeyboardEvent, action: () => void) {
5+ if (event.key === 'Enter' || event.key === ' ') {
6+ event.preventDefault();
7+ action();
8+ }
9+ }
10+
11+ function handleChatRoomClick() {
12+ console.log('handleChatRoomClick');
13+ showChatRoom = true
14+ }
15+
16+ function handleAuthClick() {
17+ console.log('handleAuthClick');
18+ showAuth = true;
19+ }
20+</script>
21+
22+<div class="desktop-icons">
23+ <div
24+ class="desktop-icon"
25+ ondblclick={handleChatRoomClick}
26+ onkeydown={(e) => handleKeydown(e, handleChatRoomClick)}
27+ role="button"
28+ tabindex="0"
29+ >
30+ <img src="/desktop/aim-desktop-icon.png" alt="Chat Room" />
31+ <span class="icon-label">Pdr Aim</span>
32+ </div>
33+
34+ <div
35+ class="desktop-icon"
36+ ondblclick={handleAuthClick}
37+ onkeydown={(e) => handleKeydown(e, handleAuthClick)}
38+ role="button"
39+ tabindex="0"
40+ >
41+ <img src="/desktop/application-x-shellscript.png" alt="Sign In" />
42+ <span class="icon-label">login</span>
43+ </div>
44+</div>
45+
46+<style>
47+ .desktop-icons {
48+ position: fixed;
49+ top: 20px;
50+ left: 20px;
51+ display: flex;
52+ flex-direction: column;
53+ gap: 20px;
54+ }
55+
56+ .desktop-icon {
57+ display: flex;
58+ flex-direction: column;
59+ align-items: center;
60+ cursor: pointer;
61+ width: 75px;
62+ text-align: center;
63+ padding: 8px;
64+ border: 1px dotted transparent;
65+ border-radius: 2px;
66+ margin: 2px;
67+ }
68+
69+ .desktop-icon:hover, .desktop-icon:focus {
70+ background: rgba(49, 106, 197, 0.2);
71+ border: 1px dotted rgba(255, 255, 255, 0.8);
72+ outline: 1px solid rgba(49, 106, 197, 0.6);
73+ outline-offset: -1px;
74+ }
75+
76+ .desktop-icon:active {
77+ background: rgba(49, 106, 197, 0.4);
78+ }
79+
80+ .desktop-icon img {
81+ width: 48px;
82+ height: 48px;
83+ margin-bottom: 5px;
84+ pointer-events: none; /* Prevents image from interfering with hover */
85+ }
86+
87+ .icon-label {
88+ color: white;
89+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8);
90+ font-size: 12px;
91+ user-select: none;
92+ pointer-events: none; /* Prevents text from interfering with hover */
93+ max-width: 100%;
94+ overflow-wrap: break-word;
95+ }
96+</style> ⏎̸
A src/lib/db/db.server.ts +14 -0
@@ -0,0 +1,14 @@
1+import { drizzle } from 'drizzle-orm/libsql';
2+import { createClient } from '@libsql/client';
3+import { TURSO_AUTH_TOKEN, TURSO_DATABASE_URL } from '$env/static/private';
4+import * as schema from './schema';
5+
6+const client = createClient({ url: TURSO_DATABASE_URL, authToken: TURSO_AUTH_TOKEN });
7+const db = drizzle(client, { schema });
8+
9+export const testConnection = async () => {
10+ const result = await db.query.users.findMany();
11+ console.log(result);
12+};
13+
14+export default db;⏎̸
@@ -0,0 +1,14 @@
1+import { drizzle } from 'drizzle-orm/libsql';
2+import { createClient } from '@libsql/client';
3+import { TURSO_AUTH_TOKEN, TURSO_DATABASE_URL } from '$env/static/private';
4+import * as schema from './schema';
5+
6+const client = createClient({ url: TURSO_DATABASE_URL, authToken: TURSO_AUTH_TOKEN });
7+const db = drizzle(client, { schema });
8+
9+export const testConnection = async () => {
10+ const result = await db.query.users.findMany();
11+ console.log(result);
12+};
13+
14+export default db;⏎̸
A src/lib/db/schema.ts +87 -0
@@ -0,0 +1,87 @@
1+import { sqliteTable as table } from "drizzle-orm/sqlite-core";
2+import * as t from "drizzle-orm/sqlite-core";
3+import type { User, ChatRoom, Message, UserStatus, MessageType } from "../types/chat";
4+import { v4 as uuidv4 } from "uuid";
5+import { eq } from "drizzle-orm";
6+
7+export const users = table(
8+ "users",
9+ {
10+ id: t.text("id").primaryKey().$default(() => uuidv4()),
11+ email: t.text("email").notNull().unique(),
12+ password: t.text("password").notNull(),
13+ nickname: t.text("nickname").notNull(),
14+ status: t.text("status").$type<UserStatus>().default("offline"),
15+ avatarUrl: t.text("avatar_url"),
16+ createdAt: t.integer("created_at").notNull(),
17+ lastSeen: t.integer("last_seen"),
18+ }
19+);
20+
21+export const chatRooms = table(
22+ "chat_rooms",
23+ {
24+ id: t.text("id").primaryKey().$default(() => uuidv4()),
25+ name: t.text("name"),
26+ type: t.text("type").$type<"direct" | "group">().notNull().default("direct"),
27+ createdAt: t.integer("created_at").notNull(),
28+ }
29+);
30+
31+export const messages = table(
32+ "messages",
33+ {
34+ id: t.text("id").primaryKey().$default(() => uuidv4()),
35+ chatRoomId: t.text("chat_room_id").references(() => chatRooms.id).notNull(),
36+ senderId: t.text("sender_id").references(() => users.id).notNull(),
37+ content: t.text("content").notNull(),
38+ type: t.text("type").$type<MessageType>().notNull().default("chat"),
39+ timestamp: t.integer("timestamp").notNull(),
40+ }
41+);
42+
43+// Validate schema types against interfaces
44+type UsersTable = typeof users.$inferSelect;
45+type ChatRoomsTable = typeof chatRooms.$inferSelect;
46+type MessagesTable = typeof messages.$inferSelect;
47+
48+// These type assertions will fail if the schema doesn't match the interfaces
49+type _UsersValidation = Omit<User, keyof UsersTable> & Omit<UsersTable, keyof User>;
50+type _ChatRoomsValidation = Omit<ChatRoom, keyof ChatRoomsTable> & Omit<ChatRoomsTable, keyof ChatRoom>;
51+type _MessagesValidation = Omit<Message, keyof MessagesTable> & Omit<MessagesTable, keyof Message>;
52+
53+export const userView = t.sqliteView("user_view").as((qb) =>
54+ qb.select({
55+ id: users.id,
56+ nickname: users.nickname,
57+ status: users.status,
58+ avatarUrl: users.avatarUrl,
59+ lastSeen: users.lastSeen
60+ }).from(users)
61+);
62+
63+export const chatRoomView = t.sqliteView("chat_room_view").as((qb) =>
64+ qb.select({
65+ id: chatRooms.id,
66+ name: chatRooms.name,
67+ type: chatRooms.type,
68+ createdAt: chatRooms.createdAt
69+ }).from(chatRooms)
70+);
71+
72+export const messageView = t.sqliteView("message_view").as((qb) =>
73+ qb.select({
74+ id: messages.id,
75+ content: messages.content,
76+ type: messages.type,
77+ timestamp: messages.timestamp,
78+ sender: users.nickname,
79+ chatRoom: chatRooms.name
80+ })
81+ .from(messages)
82+ .leftJoin(users, eq(messages.senderId, users.id))
83+ .leftJoin(chatRooms, eq(messages.chatRoomId, chatRooms.id))
84+);
85+
86+
87+
@@ -0,0 +1,87 @@
1+import { sqliteTable as table } from "drizzle-orm/sqlite-core";
2+import * as t from "drizzle-orm/sqlite-core";
3+import type { User, ChatRoom, Message, UserStatus, MessageType } from "../types/chat";
4+import { v4 as uuidv4 } from "uuid";
5+import { eq } from "drizzle-orm";
6+
7+export const users = table(
8+ "users",
9+ {
10+ id: t.text("id").primaryKey().$default(() => uuidv4()),
11+ email: t.text("email").notNull().unique(),
12+ password: t.text("password").notNull(),
13+ nickname: t.text("nickname").notNull(),
14+ status: t.text("status").$type<UserStatus>().default("offline"),
15+ avatarUrl: t.text("avatar_url"),
16+ createdAt: t.integer("created_at").notNull(),
17+ lastSeen: t.integer("last_seen"),
18+ }
19+);
20+
21+export const chatRooms = table(
22+ "chat_rooms",
23+ {
24+ id: t.text("id").primaryKey().$default(() => uuidv4()),
25+ name: t.text("name"),
26+ type: t.text("type").$type<"direct" | "group">().notNull().default("direct"),
27+ createdAt: t.integer("created_at").notNull(),
28+ }
29+);
30+
31+export const messages = table(
32+ "messages",
33+ {
34+ id: t.text("id").primaryKey().$default(() => uuidv4()),
35+ chatRoomId: t.text("chat_room_id").references(() => chatRooms.id).notNull(),
36+ senderId: t.text("sender_id").references(() => users.id).notNull(),
37+ content: t.text("content").notNull(),
38+ type: t.text("type").$type<MessageType>().notNull().default("chat"),
39+ timestamp: t.integer("timestamp").notNull(),
40+ }
41+);
42+
43+// Validate schema types against interfaces
44+type UsersTable = typeof users.$inferSelect;
45+type ChatRoomsTable = typeof chatRooms.$inferSelect;
46+type MessagesTable = typeof messages.$inferSelect;
47+
48+// These type assertions will fail if the schema doesn't match the interfaces
49+type _UsersValidation = Omit<User, keyof UsersTable> & Omit<UsersTable, keyof User>;
50+type _ChatRoomsValidation = Omit<ChatRoom, keyof ChatRoomsTable> & Omit<ChatRoomsTable, keyof ChatRoom>;
51+type _MessagesValidation = Omit<Message, keyof MessagesTable> & Omit<MessagesTable, keyof Message>;
52+
53+export const userView = t.sqliteView("user_view").as((qb) =>
54+ qb.select({
55+ id: users.id,
56+ nickname: users.nickname,
57+ status: users.status,
58+ avatarUrl: users.avatarUrl,
59+ lastSeen: users.lastSeen
60+ }).from(users)
61+);
62+
63+export const chatRoomView = t.sqliteView("chat_room_view").as((qb) =>
64+ qb.select({
65+ id: chatRooms.id,
66+ name: chatRooms.name,
67+ type: chatRooms.type,
68+ createdAt: chatRooms.createdAt
69+ }).from(chatRooms)
70+);
71+
72+export const messageView = t.sqliteView("message_view").as((qb) =>
73+ qb.select({
74+ id: messages.id,
75+ content: messages.content,
76+ type: messages.type,
77+ timestamp: messages.timestamp,
78+ sender: users.nickname,
79+ chatRoom: chatRooms.name
80+ })
81+ .from(messages)
82+ .leftJoin(users, eq(messages.senderId, users.id))
83+ .leftJoin(chatRooms, eq(messages.chatRoomId, chatRooms.id))
84+);
85+
86+
87+
M src/lib/types/chat.ts +28 -11
@@ -1,19 +1,36 @@
1-export type UserStatus = 'online' | 'away' | 'busy' | 'offline';
1+/**
2+ * TypeScript interfaces for an AOL Instant Messenger–like project.
3+ * Each interface represents a table structure in your database.
4+ */
25
6+// Users table: holds authentication and profile details
37 export interface User {
48 id: string;
9+ email: string;
10+ password: string; // hashed password
511 nickname: string;
6- status: UserStatus;
7- statusMessage?: string;
12+ status: UserStatus; // default is 'offline'
813 avatarUrl?: string;
9-}
14+ createdAt: number; // Timestamp (e.g., Unix timestamp)
15+ lastSeen?: number; // Optional last active timestamp
16+ }
1017
11-export type MessageType = 'chat' | 'emote' | 'system';
12-
13-export interface ChatMessage {
18+export type UserStatus = 'offline' | 'online' | 'away' | string;
19+
20+ // Chat rooms table: supports both direct (private) and group chat conversations
21+ export interface ChatRoom {
22+ id: string;
23+ name?: string; // Optional for direct chats, required for groups
24+ type: 'direct' | 'group' | string; // Default is 'direct'
25+ createdAt: number; // Creation timestamp
26+ }
27+
28+ // Messages table: stores the conversation messages
29+ export interface Message {
1430 id: string;
15- userId: string;
31+ chatRoomId: string; // Reference to the chat room (ChatRoom.id)
32+ senderId: string; // Reference to the sender (User.id)
1633 content: string;
17- timestamp: Date;
18- type: MessageType;
19-} ⏎̸
34+ type: 'chat' | 'emote' | 'system' | string; // Default is 'chat'
35+ timestamp: number; // Timestamp when the message was sent
36+ }⏎̸
@@ -1,19 +1,36 @@
1-export type UserStatus = 'online' | 'away' | 'busy' | 'offline';1+/**
2+ * TypeScript interfaces for an AOL Instant Messenger–like project.
3+ * Each interface represents a table structure in your database.
4+ */
2 5
6+// Users table: holds authentication and profile details
3 export interface User {7 export interface User {
4 id: string;8 id: string;
9+ email: string;
10+ password: string; // hashed password
5 nickname: string;11 nickname: string;
6- status: UserStatus;12+ status: UserStatus; // default is 'offline'
7- statusMessage?: string;
8 avatarUrl?: string;13 avatarUrl?: string;
9-}14+ createdAt: number; // Timestamp (e.g., Unix timestamp)
15+ lastSeen?: number; // Optional last active timestamp
16+ }
10 17
11-export type MessageType = 'chat' | 'emote' | 'system';18+export type UserStatus = 'offline' | 'online' | 'away' | string;
12-19+
13-export interface ChatMessage {20+ // Chat rooms table: supports both direct (private) and group chat conversations
21+ export interface ChatRoom {
22+ id: string;
23+ name?: string; // Optional for direct chats, required for groups
24+ type: 'direct' | 'group' | string; // Default is 'direct'
25+ createdAt: number; // Creation timestamp
26+ }
27+
28+ // Messages table: stores the conversation messages
29+ export interface Message {
14 id: string;30 id: string;
15- userId: string;31+ chatRoomId: string; // Reference to the chat room (ChatRoom.id)
32+ senderId: string; // Reference to the sender (User.id)
16 content: string;33 content: string;
17- timestamp: Date;34+ type: 'chat' | 'emote' | 'system' | string; // Default is 'chat'
18- type: MessageType;35+ timestamp: number; // Timestamp when the message was sent
19-} ⏎̸36+ }⏎̸
M src/routes/+layout.svelte +22 -19
@@ -1,31 +1,34 @@
11 <script lang="ts">
22 import '../app.css';
3+ import DesktopIcons from '$lib/components/desktop-icons.svelte';
4+ import ChatRoom from '$lib/components/chat-room.svelte';
35 let { children } = $props();
6+
7+ let showChatRoom = $state(false);
8+ let showAuth = $state(false);
49 </script>
510
611 <div class="windows-xp-bg">
712 {@render children()}
813 </div>
914
10-
1115 <style>
1216 .windows-xp-bg {
13- position: fixed;
14- top: 0;
15- left: 0;
16- width: 100vw;
17- height: 100vh;
18- margin: 0;
19- padding: 0;
20- overflow: hidden;
21- background: linear-gradient(
22- to bottom,
23- #2195f2 0%, /* Lighter blue at the top */
24- #4aa6e2 25%, /* Mid-light blue */
25- #7ab8e0 50%, /* Mid blue */
26- #86c55c 75%, /* Blue-green transition */
27- #90d047 100% /* Bright green at the bottom */
28- );
29- }
30-
17+ position: fixed;
18+ top: 0;
19+ left: 0;
20+ width: 100vw;
21+ height: 100vh;
22+ margin: 0;
23+ padding: 0;
24+ overflow: hidden;
25+ background: linear-gradient(
26+ to bottom,
27+ #2195f2 0%, /* Lighter blue at the top */
28+ #4aa6e2 25%, /* Mid-light blue */
29+ #7ab8e0 50%, /* Mid blue */
30+ #86c55c 75%, /* Blue-green transition */
31+ #90d047 100% /* Bright green at the bottom */
32+ );
33+ }
3134 </style>⏎̸
@@ -1,31 +1,34 @@
1 <script lang="ts">1 <script lang="ts">
2 import '../app.css';2 import '../app.css';
3+ import DesktopIcons from '$lib/components/desktop-icons.svelte';
4+ import ChatRoom from '$lib/components/chat-room.svelte';
3 let { children } = $props();5 let { children } = $props();
6+
7+ let showChatRoom = $state(false);
8+ let showAuth = $state(false);
4 </script>9 </script>
5 10
6 <div class="windows-xp-bg">11 <div class="windows-xp-bg">
7 {@render children()}12 {@render children()}
8 </div>13 </div>
9 14
10-
11 <style>15 <style>
12 .windows-xp-bg {16 .windows-xp-bg {
13- position: fixed;17+ position: fixed;
14- top: 0;18+ top: 0;
15- left: 0;19+ left: 0;
16- width: 100vw;20+ width: 100vw;
17- height: 100vh;21+ height: 100vh;
18- margin: 0;22+ margin: 0;
19- padding: 0;23+ padding: 0;
20- overflow: hidden;24+ overflow: hidden;
21- background: linear-gradient(25+ background: linear-gradient(
22- to bottom,26+ to bottom,
23- #2195f2 0%, /* Lighter blue at the top */27+ #2195f2 0%, /* Lighter blue at the top */
24- #4aa6e2 25%, /* Mid-light blue */28+ #4aa6e2 25%, /* Mid-light blue */
25- #7ab8e0 50%, /* Mid blue */29+ #7ab8e0 50%, /* Mid blue */
26- #86c55c 75%, /* Blue-green transition */30+ #86c55c 75%, /* Blue-green transition */
27- #90d047 100% /* Bright green at the bottom */31+ #90d047 100% /* Bright green at the bottom */
28- );32+ );
29- }33+ }
30-
31 </style>⏎̸34 </style>⏎̸
M src/routes/+page.svelte +20 -2
@@ -1,9 +1,26 @@
11 <script lang="ts">
22 import ChatRoom from '$lib/components/chat-room.svelte';
3+ import DesktopIcons from '$lib/components/desktop-icons.svelte';
4+ import AimLogin from '$lib/components/aim-login.svelte';
5+
6+ let showChatRoom = $state(true);
7+ let showAuth = $state(false);
8+
9+ function handleAuthClose() {
10+ showAuth = false;
11+ }
312 </script>
413
5-<div class="content-wrapper">
6- <ChatRoom />
14+<div class="desktop content-wrapper">
15+ <DesktopIcons bind:showChatRoom bind:showAuth />
16+
17+ {#if showChatRoom}
18+ <ChatRoom bind:showChatRoom />
19+ {/if}
20+
21+ {#if showAuth}
22+ <AimLogin on:close={handleAuthClose} />
23+ {/if}
724 </div>
825
926 <style>
@@ -15,4 +32,5 @@
1532 justify-content: center;
1633 box-sizing: border-box;
1734 }
35+
1836 </style>⏎̸
@@ -1,9 +1,26 @@
1 <script lang="ts">1 <script lang="ts">
2 import ChatRoom from '$lib/components/chat-room.svelte';2 import ChatRoom from '$lib/components/chat-room.svelte';
3+ import DesktopIcons from '$lib/components/desktop-icons.svelte';
4+ import AimLogin from '$lib/components/aim-login.svelte';
5+
6+ let showChatRoom = $state(true);
7+ let showAuth = $state(false);
8+
9+ function handleAuthClose() {
10+ showAuth = false;
11+ }
3 </script>12 </script>
4 13
5-<div class="content-wrapper">14+<div class="desktop content-wrapper">
6- <ChatRoom />15+ <DesktopIcons bind:showChatRoom bind:showAuth />
16+
17+ {#if showChatRoom}
18+ <ChatRoom bind:showChatRoom />
19+ {/if}
20+
21+ {#if showAuth}
22+ <AimLogin on:close={handleAuthClose} />
23+ {/if}
7 </div>24 </div>
8 25
9 <style>26 <style>
@@ -15,4 +32,5 @@
15 justify-content: center;32 justify-content: center;
16 box-sizing: border-box;33 box-sizing: border-box;
17 }34 }
35+
18 </style>⏎̸36 </style>⏎̸
A static/aim/help-icon.png +0 -0 binary file: no text diff

binary file: no text diff

A static/aim/setup-icon.png +0 -0 binary file: no text diff

binary file: no text diff

A static/aim/signin-icon.png +0 -0 binary file: no text diff

binary file: no text diff

A static/desktop/aim-desktop-icon.png +0 -0 binary file: no text diff

binary file: no text diff

A static/desktop/application-x-shellscript.png +0 -0 binary file: no text diff

binary file: no text diff

M static/favicon.png +0 -0 binary file: no text diff

binary file: no text diff

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 3

Tags 9

↑↓ moveenter openesc close