decentralised message store

feat: initial db schema

serenity 8b6760b7 bc349b34

+1
.example.env
···
# use ":memory:" if you want an in-memory store, or "file:path/to/file.db" for an embedded file on the server.
+
# if remote, it must point to a sqlite db (for now).
# defaults to ":memory:"
DB_URL=":memory:"
+10
drizzle.config.ts
···
+
import { defineConfig } from "drizzle-kit";
+
+
export default defineConfig({
+
schema: "./src/db/schema",
+
out: "./drizzle",
+
dialect: "sqlite",
+
dbCredentials: {
+
url: process.env.DB_URL!,
+
},
+
});
+10
drizzle/0000_powerful_professor_monster.sql
···
+
CREATE TABLE `messages` (
+
`id` text PRIMARY KEY NOT NULL,
+
`channel_at_uri` text,
+
`author_did` text NOT NULL,
+
`content` text NOT NULL,
+
`created_at` integer DEFAULT (unixepoch('now')) NOT NULL
+
);
+
--> statement-breakpoint
+
CREATE INDEX `messages_channel_idx` ON `messages` (`channel_at_uri`,`created_at`);--> statement-breakpoint
+
CREATE INDEX `messages_author_idx` ON `messages` (`author_did`);
+80
drizzle/meta/0000_snapshot.json
···
+
{
+
"version": "6",
+
"dialect": "sqlite",
+
"id": "0313582b-1157-40b9-a307-168f53b51012",
+
"prevId": "00000000-0000-0000-0000-000000000000",
+
"tables": {
+
"messages": {
+
"name": "messages",
+
"columns": {
+
"id": {
+
"name": "id",
+
"type": "text",
+
"primaryKey": true,
+
"notNull": true,
+
"autoincrement": false
+
},
+
"channel_at_uri": {
+
"name": "channel_at_uri",
+
"type": "text",
+
"primaryKey": false,
+
"notNull": false,
+
"autoincrement": false
+
},
+
"author_did": {
+
"name": "author_did",
+
"type": "text",
+
"primaryKey": false,
+
"notNull": true,
+
"autoincrement": false
+
},
+
"content": {
+
"name": "content",
+
"type": "text",
+
"primaryKey": false,
+
"notNull": true,
+
"autoincrement": false
+
},
+
"created_at": {
+
"name": "created_at",
+
"type": "integer",
+
"primaryKey": false,
+
"notNull": true,
+
"autoincrement": false,
+
"default": "(unixepoch('now'))"
+
}
+
},
+
"indexes": {
+
"messages_channel_idx": {
+
"name": "messages_channel_idx",
+
"columns": [
+
"channel_at_uri",
+
"created_at"
+
],
+
"isUnique": false
+
},
+
"messages_author_idx": {
+
"name": "messages_author_idx",
+
"columns": [
+
"author_did"
+
],
+
"isUnique": false
+
}
+
},
+
"foreignKeys": {},
+
"compositePrimaryKeys": {},
+
"uniqueConstraints": {},
+
"checkConstraints": {}
+
}
+
},
+
"views": {},
+
"enums": {},
+
"_meta": {
+
"schemas": {},
+
"tables": {},
+
"columns": {}
+
},
+
"internal": {
+
"indexes": {}
+
}
+
}
+13
drizzle/meta/_journal.json
···
+
{
+
"version": "7",
+
"dialect": "sqlite",
+
"entries": [
+
{
+
"idx": 0,
+
"version": "6",
+
"when": 1760861619063,
+
"tag": "0000_powerful_professor_monster",
+
"breakpoints": true
+
}
+
]
+
}
+11 -2
package.json
···
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
-
"dev": "tsc && tsc-alias && node dist/index.js"
+
"dev": "tsc && tsc-alias && node dist/index.js",
+
"db:generate": "drizzle-kit generate",
+
"db:migrate": "drizzle-kit migrate",
+
"db:push": "drizzle-kit push"
},
"keywords": [],
"author": "",
···
"devDependencies": {
"@eslint/js": "^9.37.0",
"@types/node": "^24.7.1",
+
"@types/ws": "^8.18.1",
+
"drizzle-kit": "^0.31.5",
"eslint": "^9.37.0",
"globals": "^16.4.0",
"jiti": "^2.6.1",
···
"typescript-eslint": "^8.46.0"
},
"dependencies": {
+
"@fastify/websocket": "^11.2.0",
"@libsql/client": "^0.15.15",
"dotenv": "^17.2.3",
-
"fastify": "^5.6.1"
+
"drizzle-orm": "^0.44.6",
+
"drizzle-zod": "^0.8.3",
+
"fastify": "^5.6.1",
+
"ws": "^8.18.3"
}
}
+776
pnpm-lock.yaml
···
.:
dependencies:
+
'@fastify/websocket':
+
specifier: ^11.2.0
+
version: 11.2.0
'@libsql/client':
specifier: ^0.15.15
version: 0.15.15
dotenv:
specifier: ^17.2.3
version: 17.2.3
+
drizzle-orm:
+
specifier: ^0.44.6
+
version: 0.44.6(@libsql/client@0.15.15)
+
drizzle-zod:
+
specifier: ^0.8.3
+
version: 0.8.3(drizzle-orm@0.44.6(@libsql/client@0.15.15))(zod@4.1.12)
fastify:
specifier: ^5.6.1
version: 5.6.1
+
ws:
+
specifier: ^8.18.3
+
version: 8.18.3
devDependencies:
'@eslint/js':
specifier: ^9.37.0
···
'@types/node':
specifier: ^24.7.1
version: 24.7.1
+
'@types/ws':
+
specifier: ^8.18.1
+
version: 8.18.1
+
drizzle-kit:
+
specifier: ^0.31.5
+
version: 0.31.5
eslint:
specifier: ^9.37.0
version: 9.37.0(jiti@2.6.1)
···
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
+
'@drizzle-team/brocli@0.10.2':
+
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
+
+
'@esbuild-kit/core-utils@3.3.2':
+
resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
+
deprecated: 'Merged into tsx: https://tsx.is'
+
+
'@esbuild-kit/esm-loader@2.6.5':
+
resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
+
deprecated: 'Merged into tsx: https://tsx.is'
+
+
'@esbuild/aix-ppc64@0.25.11':
+
resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
+
engines: {node: '>=18'}
+
cpu: [ppc64]
+
os: [aix]
+
+
'@esbuild/android-arm64@0.18.20':
+
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+
engines: {node: '>=12'}
+
cpu: [arm64]
+
os: [android]
+
+
'@esbuild/android-arm64@0.25.11':
+
resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [android]
+
+
'@esbuild/android-arm@0.18.20':
+
resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+
engines: {node: '>=12'}
+
cpu: [arm]
+
os: [android]
+
+
'@esbuild/android-arm@0.25.11':
+
resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
+
engines: {node: '>=18'}
+
cpu: [arm]
+
os: [android]
+
+
'@esbuild/android-x64@0.18.20':
+
resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [android]
+
+
'@esbuild/android-x64@0.25.11':
+
resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [android]
+
+
'@esbuild/darwin-arm64@0.18.20':
+
resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+
engines: {node: '>=12'}
+
cpu: [arm64]
+
os: [darwin]
+
+
'@esbuild/darwin-arm64@0.25.11':
+
resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [darwin]
+
+
'@esbuild/darwin-x64@0.18.20':
+
resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [darwin]
+
+
'@esbuild/darwin-x64@0.25.11':
+
resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [darwin]
+
+
'@esbuild/freebsd-arm64@0.18.20':
+
resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+
engines: {node: '>=12'}
+
cpu: [arm64]
+
os: [freebsd]
+
+
'@esbuild/freebsd-arm64@0.25.11':
+
resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [freebsd]
+
+
'@esbuild/freebsd-x64@0.18.20':
+
resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [freebsd]
+
+
'@esbuild/freebsd-x64@0.25.11':
+
resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [freebsd]
+
+
'@esbuild/linux-arm64@0.18.20':
+
resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+
engines: {node: '>=12'}
+
cpu: [arm64]
+
os: [linux]
+
+
'@esbuild/linux-arm64@0.25.11':
+
resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [linux]
+
+
'@esbuild/linux-arm@0.18.20':
+
resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+
engines: {node: '>=12'}
+
cpu: [arm]
+
os: [linux]
+
+
'@esbuild/linux-arm@0.25.11':
+
resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
+
engines: {node: '>=18'}
+
cpu: [arm]
+
os: [linux]
+
+
'@esbuild/linux-ia32@0.18.20':
+
resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+
engines: {node: '>=12'}
+
cpu: [ia32]
+
os: [linux]
+
+
'@esbuild/linux-ia32@0.25.11':
+
resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
+
engines: {node: '>=18'}
+
cpu: [ia32]
+
os: [linux]
+
+
'@esbuild/linux-loong64@0.18.20':
+
resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+
engines: {node: '>=12'}
+
cpu: [loong64]
+
os: [linux]
+
+
'@esbuild/linux-loong64@0.25.11':
+
resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
+
engines: {node: '>=18'}
+
cpu: [loong64]
+
os: [linux]
+
+
'@esbuild/linux-mips64el@0.18.20':
+
resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+
engines: {node: '>=12'}
+
cpu: [mips64el]
+
os: [linux]
+
+
'@esbuild/linux-mips64el@0.25.11':
+
resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
+
engines: {node: '>=18'}
+
cpu: [mips64el]
+
os: [linux]
+
+
'@esbuild/linux-ppc64@0.18.20':
+
resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+
engines: {node: '>=12'}
+
cpu: [ppc64]
+
os: [linux]
+
+
'@esbuild/linux-ppc64@0.25.11':
+
resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
+
engines: {node: '>=18'}
+
cpu: [ppc64]
+
os: [linux]
+
+
'@esbuild/linux-riscv64@0.18.20':
+
resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+
engines: {node: '>=12'}
+
cpu: [riscv64]
+
os: [linux]
+
+
'@esbuild/linux-riscv64@0.25.11':
+
resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
+
engines: {node: '>=18'}
+
cpu: [riscv64]
+
os: [linux]
+
+
'@esbuild/linux-s390x@0.18.20':
+
resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+
engines: {node: '>=12'}
+
cpu: [s390x]
+
os: [linux]
+
+
'@esbuild/linux-s390x@0.25.11':
+
resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
+
engines: {node: '>=18'}
+
cpu: [s390x]
+
os: [linux]
+
+
'@esbuild/linux-x64@0.18.20':
+
resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [linux]
+
+
'@esbuild/linux-x64@0.25.11':
+
resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [linux]
+
+
'@esbuild/netbsd-arm64@0.25.11':
+
resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [netbsd]
+
+
'@esbuild/netbsd-x64@0.18.20':
+
resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [netbsd]
+
+
'@esbuild/netbsd-x64@0.25.11':
+
resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [netbsd]
+
+
'@esbuild/openbsd-arm64@0.25.11':
+
resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [openbsd]
+
+
'@esbuild/openbsd-x64@0.18.20':
+
resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [openbsd]
+
+
'@esbuild/openbsd-x64@0.25.11':
+
resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [openbsd]
+
+
'@esbuild/openharmony-arm64@0.25.11':
+
resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [openharmony]
+
+
'@esbuild/sunos-x64@0.18.20':
+
resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [sunos]
+
+
'@esbuild/sunos-x64@0.25.11':
+
resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [sunos]
+
+
'@esbuild/win32-arm64@0.18.20':
+
resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+
engines: {node: '>=12'}
+
cpu: [arm64]
+
os: [win32]
+
+
'@esbuild/win32-arm64@0.25.11':
+
resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [win32]
+
+
'@esbuild/win32-ia32@0.18.20':
+
resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+
engines: {node: '>=12'}
+
cpu: [ia32]
+
os: [win32]
+
+
'@esbuild/win32-ia32@0.25.11':
+
resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
+
engines: {node: '>=18'}
+
cpu: [ia32]
+
os: [win32]
+
+
'@esbuild/win32-x64@0.18.20':
+
resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+
engines: {node: '>=12'}
+
cpu: [x64]
+
os: [win32]
+
+
'@esbuild/win32-x64@0.25.11':
+
resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [win32]
+
'@eslint-community/eslint-utils@4.9.0':
resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
···
'@fastify/proxy-addr@5.1.0':
resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==}
+
+
'@fastify/websocket@11.2.0':
+
resolution: {integrity: sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==}
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
···
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+
buffer-from@1.1.2:
+
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
···
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
+
drizzle-kit@0.31.5:
+
resolution: {integrity: sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==}
+
hasBin: true
+
+
drizzle-orm@0.44.6:
+
resolution: {integrity: sha512-uy6uarrrEOc9K1u5/uhBFJbdF5VJ5xQ/Yzbecw3eAYOunv5FDeYkR2m8iitocdHBOHbvorviKOW5GVw0U1j4LQ==}
+
peerDependencies:
+
'@aws-sdk/client-rds-data': '>=3'
+
'@cloudflare/workers-types': '>=4'
+
'@electric-sql/pglite': '>=0.2.0'
+
'@libsql/client': '>=0.10.0'
+
'@libsql/client-wasm': '>=0.10.0'
+
'@neondatabase/serverless': '>=0.10.0'
+
'@op-engineering/op-sqlite': '>=2'
+
'@opentelemetry/api': ^1.4.1
+
'@planetscale/database': '>=1.13'
+
'@prisma/client': '*'
+
'@tidbcloud/serverless': '*'
+
'@types/better-sqlite3': '*'
+
'@types/pg': '*'
+
'@types/sql.js': '*'
+
'@upstash/redis': '>=1.34.7'
+
'@vercel/postgres': '>=0.8.0'
+
'@xata.io/client': '*'
+
better-sqlite3: '>=7'
+
bun-types: '*'
+
expo-sqlite: '>=14.0.0'
+
gel: '>=2'
+
knex: '*'
+
kysely: '*'
+
mysql2: '>=2'
+
pg: '>=8'
+
postgres: '>=3'
+
prisma: '*'
+
sql.js: '>=1'
+
sqlite3: '>=5'
+
peerDependenciesMeta:
+
'@aws-sdk/client-rds-data':
+
optional: true
+
'@cloudflare/workers-types':
+
optional: true
+
'@electric-sql/pglite':
+
optional: true
+
'@libsql/client':
+
optional: true
+
'@libsql/client-wasm':
+
optional: true
+
'@neondatabase/serverless':
+
optional: true
+
'@op-engineering/op-sqlite':
+
optional: true
+
'@opentelemetry/api':
+
optional: true
+
'@planetscale/database':
+
optional: true
+
'@prisma/client':
+
optional: true
+
'@tidbcloud/serverless':
+
optional: true
+
'@types/better-sqlite3':
+
optional: true
+
'@types/pg':
+
optional: true
+
'@types/sql.js':
+
optional: true
+
'@upstash/redis':
+
optional: true
+
'@vercel/postgres':
+
optional: true
+
'@xata.io/client':
+
optional: true
+
better-sqlite3:
+
optional: true
+
bun-types:
+
optional: true
+
expo-sqlite:
+
optional: true
+
gel:
+
optional: true
+
knex:
+
optional: true
+
kysely:
+
optional: true
+
mysql2:
+
optional: true
+
pg:
+
optional: true
+
postgres:
+
optional: true
+
prisma:
+
optional: true
+
sql.js:
+
optional: true
+
sqlite3:
+
optional: true
+
+
drizzle-zod@0.8.3:
+
resolution: {integrity: sha512-66yVOuvGhKJnTdiqj1/Xaaz9/qzOdRJADpDa68enqS6g3t0kpNkwNYjUuaeXgZfO/UWuIM9HIhSlJ6C5ZraMww==}
+
peerDependencies:
+
drizzle-orm: '>=0.36.0'
+
zod: ^3.25.0 || ^4.0.0
+
+
duplexify@4.1.3:
+
resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
+
+
end-of-stream@1.4.5:
+
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
+
esbuild-register@3.6.0:
+
resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
+
peerDependencies:
+
esbuild: '>=0.12 <1'
+
+
esbuild@0.18.20:
+
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+
engines: {node: '>=12'}
+
hasBin: true
+
+
esbuild@0.25.11:
+
resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
+
engines: {node: '>=18'}
+
hasBin: true
+
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
···
fast-uri@3.1.0:
resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+
fastify-plugin@5.1.0:
+
resolution: {integrity: sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==}
fastify@5.6.1:
resolution: {integrity: sha512-WjjlOciBF0K8pDUPZoGPhqhKrQJ02I8DKaDIfO51EL0kbSMwQFl85cRwhOvmSDWoukNOdTo27gLN549pLCcH7Q==}
···
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
+
inherits@2.0.4:
+
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
ipaddr.js@2.2.0:
resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==}
engines: {node: '>= 10'}
···
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
engines: {node: '>=14.0.0'}
+
once@1.4.0:
+
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
···
quick-format-unescaped@4.0.4:
resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+
readable-stream@3.6.2:
+
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+
engines: {node: '>= 6'}
+
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
···
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
safe-buffer@5.2.1:
+
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
safe-regex2@5.0.0:
resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==}
···
sonic-boom@4.2.0:
resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==}
+
source-map-support@0.5.21:
+
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+
source-map@0.6.1:
+
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+
engines: {node: '>=0.10.0'}
+
split2@4.2.0:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'}
+
stream-shift@1.0.3:
+
resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+
+
string_decoder@1.3.0:
+
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
···
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
util-deprecate@1.0.2:
+
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
v8-compile-cache-lib@3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
···
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
+
wrappy@1.0.2:
+
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
ws@8.18.3:
resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
engines: {node: '>=10.0.0'}
···
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+
zod@4.1.12:
+
resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==}
+
snapshots:
'@cspotcode/source-map-support@0.8.1':
dependencies:
'@jridgewell/trace-mapping': 0.3.9
+
'@drizzle-team/brocli@0.10.2': {}
+
+
'@esbuild-kit/core-utils@3.3.2':
+
dependencies:
+
esbuild: 0.18.20
+
source-map-support: 0.5.21
+
+
'@esbuild-kit/esm-loader@2.6.5':
+
dependencies:
+
'@esbuild-kit/core-utils': 3.3.2
+
get-tsconfig: 4.12.0
+
+
'@esbuild/aix-ppc64@0.25.11':
+
optional: true
+
+
'@esbuild/android-arm64@0.18.20':
+
optional: true
+
+
'@esbuild/android-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/android-arm@0.18.20':
+
optional: true
+
+
'@esbuild/android-arm@0.25.11':
+
optional: true
+
+
'@esbuild/android-x64@0.18.20':
+
optional: true
+
+
'@esbuild/android-x64@0.25.11':
+
optional: true
+
+
'@esbuild/darwin-arm64@0.18.20':
+
optional: true
+
+
'@esbuild/darwin-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/darwin-x64@0.18.20':
+
optional: true
+
+
'@esbuild/darwin-x64@0.25.11':
+
optional: true
+
+
'@esbuild/freebsd-arm64@0.18.20':
+
optional: true
+
+
'@esbuild/freebsd-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/freebsd-x64@0.18.20':
+
optional: true
+
+
'@esbuild/freebsd-x64@0.25.11':
+
optional: true
+
+
'@esbuild/linux-arm64@0.18.20':
+
optional: true
+
+
'@esbuild/linux-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/linux-arm@0.18.20':
+
optional: true
+
+
'@esbuild/linux-arm@0.25.11':
+
optional: true
+
+
'@esbuild/linux-ia32@0.18.20':
+
optional: true
+
+
'@esbuild/linux-ia32@0.25.11':
+
optional: true
+
+
'@esbuild/linux-loong64@0.18.20':
+
optional: true
+
+
'@esbuild/linux-loong64@0.25.11':
+
optional: true
+
+
'@esbuild/linux-mips64el@0.18.20':
+
optional: true
+
+
'@esbuild/linux-mips64el@0.25.11':
+
optional: true
+
+
'@esbuild/linux-ppc64@0.18.20':
+
optional: true
+
+
'@esbuild/linux-ppc64@0.25.11':
+
optional: true
+
+
'@esbuild/linux-riscv64@0.18.20':
+
optional: true
+
+
'@esbuild/linux-riscv64@0.25.11':
+
optional: true
+
+
'@esbuild/linux-s390x@0.18.20':
+
optional: true
+
+
'@esbuild/linux-s390x@0.25.11':
+
optional: true
+
+
'@esbuild/linux-x64@0.18.20':
+
optional: true
+
+
'@esbuild/linux-x64@0.25.11':
+
optional: true
+
+
'@esbuild/netbsd-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/netbsd-x64@0.18.20':
+
optional: true
+
+
'@esbuild/netbsd-x64@0.25.11':
+
optional: true
+
+
'@esbuild/openbsd-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/openbsd-x64@0.18.20':
+
optional: true
+
+
'@esbuild/openbsd-x64@0.25.11':
+
optional: true
+
+
'@esbuild/openharmony-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/sunos-x64@0.18.20':
+
optional: true
+
+
'@esbuild/sunos-x64@0.25.11':
+
optional: true
+
+
'@esbuild/win32-arm64@0.18.20':
+
optional: true
+
+
'@esbuild/win32-arm64@0.25.11':
+
optional: true
+
+
'@esbuild/win32-ia32@0.18.20':
+
optional: true
+
+
'@esbuild/win32-ia32@0.25.11':
+
optional: true
+
+
'@esbuild/win32-x64@0.18.20':
+
optional: true
+
+
'@esbuild/win32-x64@0.25.11':
+
optional: true
+
'@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.1))':
dependencies:
eslint: 9.37.0(jiti@2.6.1)
···
dependencies:
'@fastify/forwarded': 3.0.1
ipaddr.js: 2.2.0
+
+
'@fastify/websocket@11.2.0':
+
dependencies:
+
duplexify: 4.1.3
+
fastify-plugin: 5.1.0
+
ws: 8.18.3
+
transitivePeerDependencies:
+
- bufferutil
+
- utf-8-validate
'@humanfs/core@0.19.1': {}
···
dependencies:
fill-range: 7.1.1
+
buffer-from@1.1.2: {}
+
callsites@3.1.0: {}
chalk@4.1.2:
···
dotenv@17.2.3: {}
+
drizzle-kit@0.31.5:
+
dependencies:
+
'@drizzle-team/brocli': 0.10.2
+
'@esbuild-kit/esm-loader': 2.6.5
+
esbuild: 0.25.11
+
esbuild-register: 3.6.0(esbuild@0.25.11)
+
transitivePeerDependencies:
+
- supports-color
+
+
drizzle-orm@0.44.6(@libsql/client@0.15.15):
+
optionalDependencies:
+
'@libsql/client': 0.15.15
+
+
drizzle-zod@0.8.3(drizzle-orm@0.44.6(@libsql/client@0.15.15))(zod@4.1.12):
+
dependencies:
+
drizzle-orm: 0.44.6(@libsql/client@0.15.15)
+
zod: 4.1.12
+
+
duplexify@4.1.3:
+
dependencies:
+
end-of-stream: 1.4.5
+
inherits: 2.0.4
+
readable-stream: 3.6.2
+
stream-shift: 1.0.3
+
+
end-of-stream@1.4.5:
+
dependencies:
+
once: 1.4.0
+
+
esbuild-register@3.6.0(esbuild@0.25.11):
+
dependencies:
+
debug: 4.4.3
+
esbuild: 0.25.11
+
transitivePeerDependencies:
+
- supports-color
+
+
esbuild@0.18.20:
+
optionalDependencies:
+
'@esbuild/android-arm': 0.18.20
+
'@esbuild/android-arm64': 0.18.20
+
'@esbuild/android-x64': 0.18.20
+
'@esbuild/darwin-arm64': 0.18.20
+
'@esbuild/darwin-x64': 0.18.20
+
'@esbuild/freebsd-arm64': 0.18.20
+
'@esbuild/freebsd-x64': 0.18.20
+
'@esbuild/linux-arm': 0.18.20
+
'@esbuild/linux-arm64': 0.18.20
+
'@esbuild/linux-ia32': 0.18.20
+
'@esbuild/linux-loong64': 0.18.20
+
'@esbuild/linux-mips64el': 0.18.20
+
'@esbuild/linux-ppc64': 0.18.20
+
'@esbuild/linux-riscv64': 0.18.20
+
'@esbuild/linux-s390x': 0.18.20
+
'@esbuild/linux-x64': 0.18.20
+
'@esbuild/netbsd-x64': 0.18.20
+
'@esbuild/openbsd-x64': 0.18.20
+
'@esbuild/sunos-x64': 0.18.20
+
'@esbuild/win32-arm64': 0.18.20
+
'@esbuild/win32-ia32': 0.18.20
+
'@esbuild/win32-x64': 0.18.20
+
+
esbuild@0.25.11:
+
optionalDependencies:
+
'@esbuild/aix-ppc64': 0.25.11
+
'@esbuild/android-arm': 0.25.11
+
'@esbuild/android-arm64': 0.25.11
+
'@esbuild/android-x64': 0.25.11
+
'@esbuild/darwin-arm64': 0.25.11
+
'@esbuild/darwin-x64': 0.25.11
+
'@esbuild/freebsd-arm64': 0.25.11
+
'@esbuild/freebsd-x64': 0.25.11
+
'@esbuild/linux-arm': 0.25.11
+
'@esbuild/linux-arm64': 0.25.11
+
'@esbuild/linux-ia32': 0.25.11
+
'@esbuild/linux-loong64': 0.25.11
+
'@esbuild/linux-mips64el': 0.25.11
+
'@esbuild/linux-ppc64': 0.25.11
+
'@esbuild/linux-riscv64': 0.25.11
+
'@esbuild/linux-s390x': 0.25.11
+
'@esbuild/linux-x64': 0.25.11
+
'@esbuild/netbsd-arm64': 0.25.11
+
'@esbuild/netbsd-x64': 0.25.11
+
'@esbuild/openbsd-arm64': 0.25.11
+
'@esbuild/openbsd-x64': 0.25.11
+
'@esbuild/openharmony-arm64': 0.25.11
+
'@esbuild/sunos-x64': 0.25.11
+
'@esbuild/win32-arm64': 0.25.11
+
'@esbuild/win32-ia32': 0.25.11
+
'@esbuild/win32-x64': 0.25.11
+
escape-string-regexp@4.0.0: {}
eslint-scope@8.4.0:
···
fast-decode-uri-component: 1.0.1
fast-uri@3.1.0: {}
+
+
fastify-plugin@5.1.0: {}
fastify@5.6.1:
dependencies:
···
imurmurhash@0.1.4: {}
+
inherits@2.0.4: {}
+
ipaddr.js@2.2.0: {}
is-binary-path@2.1.0:
···
on-exit-leak-free@2.1.2: {}
+
once@1.4.0:
+
dependencies:
+
wrappy: 1.0.2
+
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
···
quick-format-unescaped@4.0.4: {}
+
readable-stream@3.6.2:
+
dependencies:
+
inherits: 2.0.4
+
string_decoder: 1.3.0
+
util-deprecate: 1.0.2
+
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
···
dependencies:
queue-microtask: 1.2.3
+
safe-buffer@5.2.1: {}
+
safe-regex2@5.0.0:
dependencies:
ret: 0.5.0
···
sonic-boom@4.2.0:
dependencies:
atomic-sleep: 1.0.0
+
+
source-map-support@0.5.21:
+
dependencies:
+
buffer-from: 1.1.2
+
source-map: 0.6.1
+
+
source-map@0.6.1: {}
split2@4.2.0: {}
+
stream-shift@1.0.3: {}
+
+
string_decoder@1.3.0:
+
dependencies:
+
safe-buffer: 5.2.1
+
strip-bom@3.0.0: {}
strip-json-comments@3.1.1: {}
···
dependencies:
punycode: 2.3.1
+
util-deprecate@1.0.2: {}
+
v8-compile-cache-lib@3.0.1: {}
web-streams-polyfill@3.3.3: {}
···
word-wrap@1.2.5: {}
+
wrappy@1.0.2: {}
+
ws@8.18.3: {}
yn@3.1.1: {}
yocto-queue@0.1.0: {}
+
+
zod@4.1.12: {}
+13
src/db/index.ts
···
+
import { schema } from "@/db/schema";
+
import { AUTH_TOKEN, DB_URL } from "@/lib/env";
+
import { createClient } from "@libsql/client";
+
import { drizzle } from "drizzle-orm/libsql";
+
+
const dbClient = createClient({
+
url: DB_URL,
+
authToken: AUTH_TOKEN,
+
});
+
+
const db = drizzle(dbClient, { schema });
+
+
export default db;
+5
src/db/schema/index.ts
···
+
import { messagesTable } from "@/db/schema/messages";
+
+
export const schema = {
+
messagesTable,
+
};
+24
src/db/schema/messages.ts
···
+
import { sql } from "drizzle-orm";
+
import { integer, text, index } from "drizzle-orm/sqlite-core";
+
import { sqliteTable } from "drizzle-orm/sqlite-core";
+
+
// NOTE:: for an initial mvp, we are supporting only sqlite and storing all the messages in a single table.
+
// for an actual production release, we will likely be storing messages in separate tables or separate sqlite files (depending on config).
+
export const messagesTable = sqliteTable(
+
"messages",
+
{
+
// we do incrementing numbers for now but for goodness sake we need to come up with something better
+
// TODO: id by snowflakes or something more sane.
+
id: text("id").primaryKey(),
+
channelAtUri: text("channel_at_uri"),
+
authorDid: text("author_did").notNull(),
+
content: text("content").notNull(),
+
createdAt: integer("created_at", { mode: "timestamp" })
+
.notNull()
+
.default(sql`(unixepoch('now'))`),
+
},
+
(table) => [
+
index("messages_channel_idx").on(table.channelAtUri, table.createdAt),
+
index("messages_author_idx").on(table.authorDid),
+
],
+
);