diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 25fa621..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules/typescript/lib" -} diff --git a/bun.lockb b/bun.lockb index c9fb570..7bf28e8 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/drizzle.config.ts b/drizzle.config.ts index b59b589..45ef1dc 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,13 +1,17 @@ import type { Config } from "drizzle-kit"; import { config } from "./src/config"; + +const dbCredentials = { + url: config.env.DATABASE_URL, + authToken: config.env.DATABASE_AUTH_TOKEN!, +}; + export default { schema: "./src/db/schema/index.ts", driver: "turso", - dbCredentials: { - url: config.env.DATABASE_URL, - authToken: config.env.DATABASE_AUTH_TOKEN, - }, + dbCredentials, verbose: true, strict: true, -} satisfies Config; + tablesFilter: ["!libsql_wasm_func_table"], +} satisfies Config; \ No newline at end of file diff --git a/package.json b/package.json index ddce218..45bedca 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,10 @@ "@kitajs/ts-html-plugin": "^1.0.1", "@total-typescript/ts-reset": "^0.5.1", "@unocss/transformer-variant-group": "^0.55.7", + "better-sqlite3": "^8.6.0", "bun-types": "latest", "concurrently": "^8.2.1", - "drizzle-kit": "latest", + "drizzle-kit": "^0.19.13", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.4", "typescript": "^5.2.2", @@ -42,7 +43,8 @@ "beth-stack": "0.0.20", "drizzle-orm": "^0.28.6", "drizzle-typebox": "^0.1.1", - "elysia": "0.7.0-beta.1", + "elysia": "0.7.1", + "libsql": "^0.1.13", "lucia": "^2.6.0", "pino-pretty": "^10.2.0", "zod": "^3.22.2" diff --git a/src/config/index.ts b/src/config/index.ts index 67d3513..3adcc71 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -1,15 +1,18 @@ import { createEnv } from "@t3-oss/env-core"; import { z } from "zod"; + const env = createEnv({ server: { LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]), + DATABASE_CONNECTION_TYPE: z.enum(["local", "remote", "local-replica"]), DATABASE_URL: z.string().min(1), - DATABASE_AUTH_TOKEN: z.string().min(1), - SYNC_URL: z.string().optional(), + DATABASE_AUTH_TOKEN: z.string().optional().refine((s) => { + // not needed for local only + const type = process.env.DATABASE_CONNECTION_TYPE; + return type === "remote" || type === "local-replica" ? s && s.length > 0 : true; + }), NODE_ENV: z.enum(["development", "production"]), - COOKIE_SECRET: z.string().min(1), - TURSO_API_TOKEN: z.string().min(1), }, runtimeEnv: process.env, }); diff --git a/src/context/index.ts b/src/context/index.ts index 637b2c8..70887ac 100644 --- a/src/context/index.ts +++ b/src/context/index.ts @@ -1,4 +1,5 @@ import { logger } from "@bogeychan/elysia-logger"; +import { cron } from "@elysiajs/cron"; import { HoltLogger } from "@tlscipher/holt"; import { bethStack } from "beth-stack/elysia"; import { Elysia } from "elysia"; @@ -7,8 +8,6 @@ import { auth } from "../auth"; import { config } from "../config"; import { client, db } from "../db"; -// import { cron } from "@elysiajs/cron"; - const stream = pretty({ colorize: true, }); @@ -16,12 +15,12 @@ const stream = pretty({ export const ctx = new Elysia({ name: "@app/ctx", }) - .use( - bethStack({ - // log: false, - returnStaleWhileRevalidate: false, - }), - ) + // .use( + // bethStack({ + // // log: false, + // returnStaleWhileRevalidate: false, + // }), + // ) .use( logger({ level: config.env.LOG_LEVEL, @@ -29,22 +28,21 @@ export const ctx = new Elysia({ }), ) .use(new HoltLogger().getLogger()) - // .use( - // cron({ - // name: "heartbeat", - // pattern: "*/1 * * * * *", - // run() { - // if (config.env.SYNC_URL) { - // const now = performance.now(); - // console.log("Syncing database..."); - // void client.sync().then(() => { - // console.log(`Database synced in ${performance.now() - now}ms`); - // }); - // } - // }, - // }) - // ) - .decorate("db", () => db) + .use( + // @ts-expect-error + cron({ + name: "heartbeat", + pattern: "*/2 * * * * *", + run() { + const now = performance.now(); + console.log("Syncing database..."); + void client.sync().then(() => { + console.log(`Database synced in ${performance.now() - now}ms`); + }); + }, + }), + ) + .decorate("db", db) .decorate("config", config) .decorate("auth", auth); // .onStart(({ log }) => log.info("Server starting")); diff --git a/src/db/index.ts b/src/db/index.ts index a02e4e2..67aa616 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -8,14 +8,14 @@ const remoteOptions = { authToken: config.env.DATABASE_AUTH_TOKEN, }; -// const localOptions = { -// url: "file:local.sqlite", -// authToken: config.env.DATABASE_AUTH_TOKEN, -// syncUrl: config.env.DATABASE_URL, -// }; +const localOptions = { + url: "file:local.sqlite", + authToken: config.env.DATABASE_AUTH_TOKEN, + syncUrl: config.env.DATABASE_URL, +}; -export const client = createClient(remoteOptions); +export const client = createClient(localOptions); -// await client.sync(); +await client.sync(); export const db = drizzle(client, { schema, logger: true }); diff --git a/src/main.ts b/src/main.ts index 6df42fd..3b4ecb2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,17 +2,30 @@ import { staticPlugin } from "@elysiajs/static"; // import { swagger } from "@elysiajs/swagger"; import { Elysia } from "elysia"; import { config } from "./config"; +import { ctx } from "./context"; import { api } from "./controllers/*"; +import { todos } from "./db/schema"; import { pages } from "./pages/*"; + const app = new Elysia({ name: "@app/app", }) // .use(swagger()) //@ts-expect-error - .use(staticPlugin()) - .use(api) - .use(pages) + // .use(staticPlugin()) + // .use(api) + // .use(pages) + .use(ctx) + .get("/create", async (ctx) => { + const todo = await ctx.db.insert(todos).values({ content: "Hello World" }).returning(); + + return todo; + }) + .get("/all", async (ctx) => { + const result = await ctx.db.select().from(todos); + return result + }) .onStart(() => { if (config.env.NODE_ENV === "development") { void fetch("http://localhost:3001/restart"); @@ -28,4 +41,4 @@ export type App = typeof app; console.log( `app is listening on http://${app.server?.hostname}:${app.server?.port}`, -); +); \ No newline at end of file