├── .gitignore ├── README.md ├── package.json ├── src ├── components.tsx └── index.tsx ├── todo.sql ├── tsconfig.json └── wrangler.sample.toml /.gitignore: -------------------------------------------------------------------------------- 1 | .wrangler 2 | node_modules 3 | yarn-error.log 4 | yarn.lock 5 | wrangler.toml -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Todo Example 2 | 3 | Stack: 4 | 5 | * Hono 6 | * JSX (Hono middleware) 7 | * htmx 8 | * Zod 9 | * Cloudflare Workers 10 | * Cloudflare D1 11 | 12 | ## Usage 13 | 14 | Install: 15 | 16 | ``` 17 | npm install 18 | ``` 19 | 20 | Setup: 21 | 22 | ``` 23 | wrangler d1 create todo 24 | wrangler d1 execute todo --local --file=todo.sql 25 | ``` 26 | 27 | Dev: 28 | 29 | ``` 30 | npm run dev 31 | ``` 32 | 33 | Deploy: 34 | 35 | ``` 36 | npm run deploy 37 | ``` 38 | 39 | ## Author 40 | 41 | Yusuke Wada 42 | 43 | ## License 44 | 45 | MIT -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "dev": "wrangler dev --live-reload src/index.tsx", 4 | "deploy": "wrangler deploy --minify src/index.tsx" 5 | }, 6 | "dependencies": { 7 | "@hono/zod-validator": "^0.1.9", 8 | "hono": "^3.8.0-rc.2", 9 | "zod": "^3.21.4" 10 | }, 11 | "devDependencies": { 12 | "@cloudflare/workers-types": "^4.20231002.0", 13 | "wrangler": "^3.11.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components.tsx: -------------------------------------------------------------------------------- 1 | import { html } from 'hono/html' 2 | import { jsxRenderer } from 'hono/jsx-renderer' 3 | 4 | export const renderer = jsxRenderer(({ children }) => { 5 | return html` 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 |42 | {title} 43 | 44 |
45 | ) 46 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import { Hono } from 'hono' 2 | import { z } from 'zod' 3 | import { zValidator } from '@hono/zod-validator' 4 | 5 | import { renderer, AddTodo, Item } from './components' 6 | 7 | type Bindings = { 8 | DB: D1Database 9 | } 10 | 11 | type Todo = { 12 | title: string 13 | id: string 14 | } 15 | 16 | const app = new Hono<{ Bindings: Bindings }>() 17 | 18 | app.get('*', renderer) 19 | 20 | app.get('/', async (c) => { 21 | const { results } = await c.env.DB.prepare(`SELECT id, title FROM todo;`).all