diff --git a/.helix/languages.toml b/.helix/languages.toml
index b05ee97..51ddcf4 100644
--- a/.helix/languages.toml
+++ b/.helix/languages.toml
@@ -1,6 +1,6 @@
[language-server.deno]
command = "deno"
-args = ["lsp"]
+args = ["lsp", "--unstable-kv"]
config.hostInfo = "helix"
[[language]]
diff --git a/deno.json b/deno.json
index bf818c8..acc90d9 100644
--- a/deno.json
+++ b/deno.json
@@ -2,7 +2,7 @@
"lock": false,
"tasks": {
"check": "deno fmt --check && deno lint && deno check **/*.ts && deno check **/*.tsx",
- "cli": "echo \"import '\\$fresh/src/dev/cli.ts'\" | deno run --unstable -A -",
+ "cli": "echo \"import '\\$fresh/src/dev/cli.ts'\" | deno run -A -",
"manifest": "deno task cli manifest $(pwd)",
"start": "deno run -A --watch=static/,routes/ dev.ts",
"build": "deno run -A dev.ts build",
@@ -41,5 +41,6 @@
"semiColons": false,
"singleQuote": true
},
+ "unstable": ["kv"],
"nodeModulesDir": true
}
diff --git a/main.ts b/main.ts
index 13d2f71..11ebba6 100644
--- a/main.ts
+++ b/main.ts
@@ -3,6 +3,7 @@
///
///
///
+///
import '$std/dotenv/load.ts'
diff --git a/models.ts b/models.ts
index 4329fdd..57e3839 100644
--- a/models.ts
+++ b/models.ts
@@ -1,13 +1,59 @@
-type Name = string
+import { z } from 'https://deno.land/x/zod@v3.21.4/mod.ts'
+import { createPentagon } from 'https://deno.land/x/pentagon@v0.1.5/mod.ts'
+import { ulid } from 'https://deno.land/x/ulid@v0.3.0/mod.ts'
-export interface FamilyMember {
- name: Name
- avatarUrl?: URL
+const kv = await Deno.openKv()
+
+const User = z.object({
+ id: z.string().ulid().describe('primary'),
+ createdAt: z.date(),
+
+ name: z.string(),
+ avatarUrl: z.string().nullable(),
+})
+export type User = z.infer
+
+const Todo = z.object({
+ id: z.string().ulid().describe('primary'),
+ createdAt: z.date(),
+
+ description: z.string(),
+ emoji: z.string().nullable(),
+
+ doneAt: z.date().nullable(),
+ assigneeUserId: z.string().ulid().nullable(),
+})
+export type Todo = z.infer
+
+export const db = createPentagon(kv, {
+ users: {
+ schema: User,
+ relations: {
+ assignedTodos: ['todos', [Todo], 'id', 'assigneeUserId'],
+ },
+ },
+ todos: {
+ schema: Todo,
+ relations: {
+ assignee: ['users', User, 'assigneeUserId', 'id'],
+ },
+ },
+})
+
+const daddy: User = {
+ id: ulid(),
+ createdAt: new Date(),
+ name: 'Daddy',
+ avatarUrl: null,
+}
+const todo: Todo = {
+ emoji: null,
+ id: ulid(),
+ createdAt: new Date(),
+ description: 'Test Todo',
+ doneAt: null,
+ assigneeUserId: daddy.id,
}
-export interface ToDo {
- emoji?: string
- description: string
- doneAt?: Date
- assigneeName?: Name
-}
+db.todos.create({ data: todo })
+db.users.create({ data: daddy })
diff --git a/routes/_app.tsx b/routes/_app.tsx
index d716935..9f87bdf 100644
--- a/routes/_app.tsx
+++ b/routes/_app.tsx
@@ -8,7 +8,7 @@ export default function App({ Component }: PageProps) {
homeman-deno
-
+
meow
diff --git a/routes/index.tsx b/routes/index.tsx
index 583a9a0..c53f48a 100644
--- a/routes/index.tsx
+++ b/routes/index.tsx
@@ -1,25 +1,27 @@
-import { Handlers } from '$fresh/server.ts'
+import { Handlers, PageProps } from '$fresh/server.ts'
import { useSignal } from '@preact/signals'
import Counter from '../islands/Counter.tsx'
-import { FamilyMember, ToDo } from '$models'
+import { db, Todo, User } from '$models'
interface Data {
- familyMembers: FamilyMember[]
- todos: ToDo[]
+ users: User[]
+ unassignedTodos: Todo[]
}
export const handler: Handlers = {
async GET(_req, ctx) {
- const resp = await ctx.render()
- resp.headers.set('X-Custom-Header', 'Hello')
- return resp
+ const users = await db.users.findMany({ include: { assignedTodos: true } })
+ const unassignedTodos = await db.todos.findMany({
+ where: { assigneeUserId: null },
+ })
+ return ctx.render({ users, unassignedTodos })
},
}
-export default function Home() {
+export default function Home(props: PageProps) {
const count = useSignal(3)
return (
-