Ethan Niser 2023-09-20 16:05:34 +00:00 committed by GitHub
parent 342d294dbc
commit 901172d43e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 66 additions and 49 deletions

@ -1,3 +0,0 @@
{
"typescript.tsdk": "node_modules/typescript/lib"
}

Binary file not shown.

@ -1,13 +1,17 @@
import type { Config } from "drizzle-kit"; import type { Config } from "drizzle-kit";
import { config } from "./src/config"; import { config } from "./src/config";
const dbCredentials = {
url: config.env.DATABASE_URL,
authToken: config.env.DATABASE_AUTH_TOKEN!,
};
export default { export default {
schema: "./src/db/schema/index.ts", schema: "./src/db/schema/index.ts",
driver: "turso", driver: "turso",
dbCredentials: { dbCredentials,
url: config.env.DATABASE_URL,
authToken: config.env.DATABASE_AUTH_TOKEN,
},
verbose: true, verbose: true,
strict: true, strict: true,
} satisfies Config; tablesFilter: ["!libsql_wasm_func_table"],
} satisfies Config;

@ -21,9 +21,10 @@
"@kitajs/ts-html-plugin": "^1.0.1", "@kitajs/ts-html-plugin": "^1.0.1",
"@total-typescript/ts-reset": "^0.5.1", "@total-typescript/ts-reset": "^0.5.1",
"@unocss/transformer-variant-group": "^0.55.7", "@unocss/transformer-variant-group": "^0.55.7",
"better-sqlite3": "^8.6.0",
"bun-types": "latest", "bun-types": "latest",
"concurrently": "^8.2.1", "concurrently": "^8.2.1",
"drizzle-kit": "latest", "drizzle-kit": "^0.19.13",
"prettier": "^3.0.3", "prettier": "^3.0.3",
"prettier-plugin-tailwindcss": "^0.5.4", "prettier-plugin-tailwindcss": "^0.5.4",
"typescript": "^5.2.2", "typescript": "^5.2.2",
@ -42,7 +43,8 @@
"beth-stack": "0.0.20", "beth-stack": "0.0.20",
"drizzle-orm": "^0.28.6", "drizzle-orm": "^0.28.6",
"drizzle-typebox": "^0.1.1", "drizzle-typebox": "^0.1.1",
"elysia": "0.7.0-beta.1", "elysia": "0.7.1",
"libsql": "^0.1.13",
"lucia": "^2.6.0", "lucia": "^2.6.0",
"pino-pretty": "^10.2.0", "pino-pretty": "^10.2.0",
"zod": "^3.22.2" "zod": "^3.22.2"

@ -1,15 +1,18 @@
import { createEnv } from "@t3-oss/env-core"; import { createEnv } from "@t3-oss/env-core";
import { z } from "zod"; import { z } from "zod";
const env = createEnv({ const env = createEnv({
server: { server: {
LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]), LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]),
DATABASE_CONNECTION_TYPE: z.enum(["local", "remote", "local-replica"]),
DATABASE_URL: z.string().min(1), DATABASE_URL: z.string().min(1),
DATABASE_AUTH_TOKEN: z.string().min(1), DATABASE_AUTH_TOKEN: z.string().optional().refine((s) => {
SYNC_URL: z.string().optional(), // 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"]), NODE_ENV: z.enum(["development", "production"]),
COOKIE_SECRET: z.string().min(1),
TURSO_API_TOKEN: z.string().min(1),
}, },
runtimeEnv: process.env, runtimeEnv: process.env,
}); });

@ -1,4 +1,5 @@
import { logger } from "@bogeychan/elysia-logger"; import { logger } from "@bogeychan/elysia-logger";
import { cron } from "@elysiajs/cron";
import { HoltLogger } from "@tlscipher/holt"; import { HoltLogger } from "@tlscipher/holt";
import { bethStack } from "beth-stack/elysia"; import { bethStack } from "beth-stack/elysia";
import { Elysia } from "elysia"; import { Elysia } from "elysia";
@ -7,8 +8,6 @@ import { auth } from "../auth";
import { config } from "../config"; import { config } from "../config";
import { client, db } from "../db"; import { client, db } from "../db";
// import { cron } from "@elysiajs/cron";
const stream = pretty({ const stream = pretty({
colorize: true, colorize: true,
}); });
@ -16,12 +15,12 @@ const stream = pretty({
export const ctx = new Elysia({ export const ctx = new Elysia({
name: "@app/ctx", name: "@app/ctx",
}) })
.use( // .use(
bethStack({ // bethStack({
// log: false, // // log: false,
returnStaleWhileRevalidate: false, // returnStaleWhileRevalidate: false,
}), // }),
) // )
.use( .use(
logger({ logger({
level: config.env.LOG_LEVEL, level: config.env.LOG_LEVEL,
@ -29,22 +28,21 @@ export const ctx = new Elysia({
}), }),
) )
.use(new HoltLogger().getLogger()) .use(new HoltLogger().getLogger())
// .use( .use(
// cron({ // @ts-expect-error
// name: "heartbeat", cron({
// pattern: "*/1 * * * * *", name: "heartbeat",
// run() { pattern: "*/2 * * * * *",
// if (config.env.SYNC_URL) { run() {
// const now = performance.now(); const now = performance.now();
// console.log("Syncing database..."); console.log("Syncing database...");
// void client.sync().then(() => { void client.sync().then(() => {
// console.log(`Database synced in ${performance.now() - now}ms`); console.log(`Database synced in ${performance.now() - now}ms`);
// }); });
// } },
// }, }),
// }) )
// ) .decorate("db", db)
.decorate("db", () => db)
.decorate("config", config) .decorate("config", config)
.decorate("auth", auth); .decorate("auth", auth);
// .onStart(({ log }) => log.info("Server starting")); // .onStart(({ log }) => log.info("Server starting"));

@ -8,14 +8,14 @@ const remoteOptions = {
authToken: config.env.DATABASE_AUTH_TOKEN, authToken: config.env.DATABASE_AUTH_TOKEN,
}; };
// const localOptions = { const localOptions = {
// url: "file:local.sqlite", url: "file:local.sqlite",
// authToken: config.env.DATABASE_AUTH_TOKEN, authToken: config.env.DATABASE_AUTH_TOKEN,
// syncUrl: config.env.DATABASE_URL, 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 }); export const db = drizzle(client, { schema, logger: true });

@ -2,17 +2,30 @@ import { staticPlugin } from "@elysiajs/static";
// import { swagger } from "@elysiajs/swagger"; // import { swagger } from "@elysiajs/swagger";
import { Elysia } from "elysia"; import { Elysia } from "elysia";
import { config } from "./config"; import { config } from "./config";
import { ctx } from "./context";
import { api } from "./controllers/*"; import { api } from "./controllers/*";
import { todos } from "./db/schema";
import { pages } from "./pages/*"; import { pages } from "./pages/*";
const app = new Elysia({ const app = new Elysia({
name: "@app/app", name: "@app/app",
}) })
// .use(swagger()) // .use(swagger())
//@ts-expect-error //@ts-expect-error
.use(staticPlugin()) // .use(staticPlugin())
.use(api) // .use(api)
.use(pages) // .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(() => { .onStart(() => {
if (config.env.NODE_ENV === "development") { if (config.env.NODE_ENV === "development") {
void fetch("http://localhost:3001/restart"); void fetch("http://localhost:3001/restart");
@ -28,4 +41,4 @@ export type App = typeof app;
console.log( console.log(
`app is listening on http://${app.server?.hostname}:${app.server?.port}`, `app is listening on http://${app.server?.hostname}:${app.server?.port}`,
); );