main
Ethan Niser 2023-09-20 20:14:55 +00:00 committed by GitHub
parent 901172d43e
commit aab4bbb4dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 73 additions and 55 deletions

Binary file not shown.

@ -25,6 +25,7 @@
"bun-types": "latest",
"concurrently": "^8.2.1",
"drizzle-kit": "^0.19.13",
"pino": "^8.15.1",
"prettier": "^3.0.3",
"prettier-plugin-tailwindcss": "^0.5.4",
"typescript": "^5.2.2",
@ -36,7 +37,7 @@
"@elysiajs/static": "^0.6.0",
"@elysiajs/swagger": "^0.6.2",
"@iconify-json/logos": "^1.1.37",
"@libsql/client": "0.3.5-pre.8",
"@libsql/client": "0.3.5-pre.9",
"@lucia-auth/adapter-sqlite": "^2.0.0",
"@t3-oss/env-core": "^0.6.1",
"@tlscipher/holt": "^1.0.4",

@ -30,7 +30,7 @@ export const ctx = new Elysia({
.use(new HoltLogger().getLogger())
.use(
// @ts-expect-error
cron({
config.env.DATABASE_CONNECTION_TYPE === 'local-replica' ? cron({
name: "heartbeat",
pattern: "*/2 * * * * *",
run() {
@ -40,7 +40,7 @@ export const ctx = new Elysia({
console.log(`Database synced in ${performance.now() - now}ms`);
});
},
}),
}) : (a) => a,
)
.decorate("db", db)
.decorate("config", config)

@ -3,18 +3,25 @@ import { drizzle } from "drizzle-orm/libsql";
import { config } from "../config";
import * as schema from "./schema";
const remoteOptions = {
url: config.env.DATABASE_URL,
authToken: config.env.DATABASE_AUTH_TOKEN,
};
const localOptions = {
url: "file:local.sqlite",
authToken: config.env.DATABASE_AUTH_TOKEN,
syncUrl: config.env.DATABASE_URL,
};
const options = (() => {
switch (config.env.DATABASE_CONNECTION_TYPE) {
case 'local' : return {
url: 'file:local.sqlite',
}
case 'remote' : return {
url: config.env.DATABASE_URL,
authToken: config.env.DATABASE_AUTH_TOKEN!,
}
case 'local-replica' : return {
url: 'file:local.sqlite',
syncUrl: config.env.DATABASE_URL,
authToken: config.env.DATABASE_AUTH_TOKEN!,
}
}
})()
export const client = createClient(localOptions);
export const client = createClient(options);
await client.sync();

@ -2,38 +2,25 @@ 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(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(() => {
// @ts-expect-error
.use(staticPlugin())
.use(api)
.use(pages)
.onStart(({log}) => {
if (config.env.NODE_ENV === "development") {
void fetch("http://localhost:3001/restart");
console.log("🦊 Triggering Live Reload");
log.debug("🦊 Triggering Live Reload");
}
})
.onError(({ code, error, request }) => {
console.error(` ${request.method} ${request.url}`, code, error);
.onError(({ code, error, request, log }) => {
log.error(` ${request.method} ${request.url}`, code, error);
})
.listen(3000);
@ -41,4 +28,4 @@ export type App = typeof app;
console.log(
`app is listening on http://${app.server?.hostname}:${app.server?.port}`,
);
);

@ -1,9 +1,11 @@
import Elysia from "elysia";
import { authGroup } from "./(auth)/*";
import { index } from "./index";
import { user } from "./user/*";
export const pages = new Elysia({
name: "@pages/root",
})
.use(index)
.use(authGroup);
.use(authGroup)
.use(user);

@ -6,23 +6,11 @@ export const index = new Elysia({
name: "@pages/index",
})
.use(ctx)
.get("/", async ({ html, db, log, config }) => {
const start = performance.now();
// const todos = await db().query.todos.findMany();
log.info(`query took ${performance.now() - start}ms`);
const res = await fetch("https://api.turso.tech/v1/groups", {
headers: {
Authorization: `Bearer ${config.env.TURSO_API_TOKEN}`,
},
});
const json = await res.text();
.get("/", async ({html}) => {
return html(() => (
<BaseHtml>
<h1>hi!</h1>
{/* <p safe>{JSON.stringify(todos)}</p> */}
<p safe>{JSON.stringify(json)}</p>
</BaseHtml>
));
});

@ -0,0 +1,7 @@
import Elysia from "elysia";
import { id } from "./<id>";
export const user = new Elysia({
name: "@pages/user/*",
})
.use(id)

@ -0,0 +1,15 @@
import Elysia from "elysia";
import { BaseHtml } from "../../components/base";
import { ctx } from "../../context";
export const id = new Elysia({
name: "@pages/user/[id]",
})
.use(ctx)
.get("/user/:id", async ({ html, params: { id } }) => {
return html(() => (
<BaseHtml>
<h1>hi: {id}!</h1>
</BaseHtml>
));
});

@ -28,6 +28,14 @@ type RouterPattern<T extends string> =
? `${Start}${string}`
: T;
type StartsWithApi<T extends string> = T extends `${"/api"}${infer Rest}`
? T
: never;
type DoesntStartWithApi<T extends string> = T extends `${"/api"}${infer Rest}`
? never
: T;
type Schema = import("../main").App["schema"];
type PostRoutes = RoutesByType<Schema, "post">;
@ -38,12 +46,15 @@ type PatchRoutes = RoutesByType<Schema, "patch">;
declare namespace JSX {
interface HtmlTag extends Htmx.Attributes {
["hx-get"]?: GetRoutes;
["hx-post"]?: PostRoutes;
["hx-put"]?: PutRoutes;
["hx-delete"]?: DeleteRoutes;
["hx-patch"]?: PatchRoutes;
["hx-get"]?: StartsWithApi<GetRoutes>;
["hx-post"]?: StartsWithApi<PostRoutes>;
["hx-put"]?: StartsWithApi<PutRoutes>;
["hx-delete"]?: StartsWithApi<DeleteRoutes>;
["hx-patch"]?: StartsWithApi<PatchRoutes>;
_?: string;
["hx-revalidate"]?: string;
}
interface HtmlAnchorTag {
href?: DoesntStartWithApi<GetRoutes>;
}
}