diff --git a/README.md b/README.md index 569360e4..606adbfd 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # Hono -Hono [炎] - Tiny web framework for Cloudflare Workers and others. +Hono [炎] - Ultrafast web framework for Cloudflare Workers. ```js -const { Hono } = require('hono') +import { Hono } from 'hono' const app = new Hono() app.get('/', (c) => c.text('Hono!!')) @@ -11,7 +11,7 @@ app.get('/', (c) => c.text('Hono!!')) app.fire() ``` -Hono[炎] - _**means flame🔥 in Japanese**_ - is small, simple, and ultrafast web flamework for a Service Workers API based serverless such as **Cloudflare Workers** and **Fastly Compute@Edge**. Hono does not depend on any npm packages. However, Hono has a router, context object, and middleware including the builtins. It's easy to make a web application. +Hono[炎] - _**means flame🔥 in Japanese**_ - is small, simple, and ultrafast web flamework for a Service Workers API based serverless such as **Cloudflare Workers** and **Fastly Compute@Edge**. Hono does not depend on any npm packages. But, Hono has a router, context object, and middleware including the builtins. Easy to make a web application. ## Features @@ -130,7 +130,7 @@ app.get('/fetch-url', async () => { ### Builtin Middleware ```js -const { Hono, Middleware } = require('hono') +import { Hono, Middleware } from 'hono' ... @@ -323,7 +323,7 @@ npm i hono Only 4 lines!! ```js -const { Hono } = require('hono') +import { Hono } from 'hono' const app = new Hono() app.get('/', (c) => c.text('Hello! Hono!')) diff --git a/example/basic/index.js b/example/basic/index.js index ced4b702..0ace338b 100644 --- a/example/basic/index.js +++ b/example/basic/index.js @@ -1,6 +1,7 @@ -const { Hono, Middleware } = require('../../dist/index') +import { Hono, Middleware } from '../../dist' // or install from npm: -// const { Hono, Middleware } = require('hono') +// import { Hono, Middleware } from 'hono' + const app = new Hono() // Mount Builtin Middleware @@ -41,7 +42,7 @@ app.get('/', (c) => c.text('Hono!!')) app.get('/hello', () => new Response('This is /hello')) app.get('/entry/:id', (c) => { const id = c.req.params('id') - return new Response(`Your ID is ${id}`) + return c.text(`Your ID is ${id}`) }) app.get('/auth/*', async (ctx) => ctx.text('You are authorized')) diff --git a/example/compute-at-edge/index.js b/example/compute-at-edge/index.js index 5e013764..401d5f25 100644 --- a/example/compute-at-edge/index.js +++ b/example/compute-at-edge/index.js @@ -1,4 +1,5 @@ -const { Hono } = require('hono') +import { Hono } from 'hono' + const app = new Hono() app.use('*', async (c, next) => { @@ -6,12 +7,10 @@ app.use('*', async (c, next) => { next() }) -app.get('/', () => { - return new Response('Hono!! Compute@Edge!!') -}) +app.get('/', (c) => c.text('Hono!! Compute@Edge!!')) app.get('/hello/:name', (c) => { - return new Response(`Hello ${c.req.params('name')}!!!!!`) + return c.text(`Hello ${c.req.params('name')}!!!!!`) }) app.fire() diff --git a/example/jsx-ssr/src/Footer.jsx b/example/jsx-ssr/src/Footer.jsx new file mode 100644 index 00000000..c9ee45af --- /dev/null +++ b/example/jsx-ssr/src/Footer.jsx @@ -0,0 +1,7 @@ +export const Footer = () => { + return ( + + ) +} \ No newline at end of file diff --git a/example/jsx-ssr/src/Header.jsx b/example/jsx-ssr/src/Header.jsx new file mode 100644 index 00000000..1f71c27b --- /dev/null +++ b/example/jsx-ssr/src/Header.jsx @@ -0,0 +1,7 @@ +export const Header = () => { + return ( +
+

Hono Example

+
+ ) +} diff --git a/example/jsx-ssr/src/Post.jsx b/example/jsx-ssr/src/Post.jsx new file mode 100644 index 00000000..d2b81933 --- /dev/null +++ b/example/jsx-ssr/src/Post.jsx @@ -0,0 +1,15 @@ +import { Header } from './Header' +import { Footer } from './Footer' + +export const Post = (props) => { + return ( +
+
+
+

{props.post.title}

+

{props.post.body}

+
+
+ ) +} diff --git a/example/jsx-ssr/src/Top.jsx b/example/jsx-ssr/src/Top.jsx new file mode 100644 index 00000000..2189f4d0 --- /dev/null +++ b/example/jsx-ssr/src/Top.jsx @@ -0,0 +1,20 @@ +import { Header } from './Header' +import { Footer } from './Footer' + +export const Top = (props) => { + return ( +
+
+
+

Posts

+ {props.posts} +
    + {props.posts.map((post) => { + return
  • {post.title}
  • + })} +
+
+
+ ) +} diff --git a/example/jsx-ssr/src/app.jsx b/example/jsx-ssr/src/app.jsx deleted file mode 100644 index 06ef8739..00000000 --- a/example/jsx-ssr/src/app.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Component } from 'nano-jsx' -import { Link } from './Link' - -export class App extends Component { - render() { - return ( -
-
-

Hello! Hono!

-
-
- -
-
- ) - } -} diff --git a/example/jsx-ssr/src/index.js b/example/jsx-ssr/src/index.js index 815caa7e..3646bdf1 100644 --- a/example/jsx-ssr/src/index.js +++ b/example/jsx-ssr/src/index.js @@ -1,10 +1,11 @@ import { Hono } from '../../../dist/index' - import Nano from 'nano-jsx' -import { App } from './App' +import { Post } from './Post' +import { Top } from './Top' const app = new Hono() +// View const makeHTML = (body) => { return ` @@ -16,8 +17,43 @@ const makeHTML = (body) => { ` } +// Model +const posts = [ + { id: '1', title: 'Good Morning', body: 'Let us eat breakfast' }, + { id: '2', title: 'Good Afternoon', body: 'Let us eat Lunch' }, + { id: '3', title: 'Good Evening', body: 'Let us eat Dinner' }, + { id: '4', title: 'Good Night', body: 'Let us drink Beer' }, + { id: '5', title: 'こんにちは', body: '昼からビールを飲みます' }, +] + +// Logic +const getPosts = () => { + return posts +} + +const getPost = (id) => { + for (const post of posts) { + if (post.id === id) { + return post + } + } +} + +// Controller app.get('/', (c) => { - const body = Nano.renderSSR() + const posts = getPosts() + const body = Nano.renderSSR() + const html = makeHTML(body) + return c.html(html) +}) + +app.get('/post/:id{[0-9]+}', (c) => { + const id = c.req.params('id') + const post = getPost(id) + if (!post) { + return c.text('Not Found', 404) + } + const body = Nano.renderSSR() const html = makeHTML(body) return c.html(html) }) diff --git a/example/jsx-ssr/src/link.jsx b/example/jsx-ssr/src/link.jsx deleted file mode 100644 index 42a30f33..00000000 --- a/example/jsx-ssr/src/link.jsx +++ /dev/null @@ -1,7 +0,0 @@ -export const Link = (props) => { - return ( -
  • - {props.title} -
  • - ) -} diff --git a/package.json b/package.json index 63b70c8a..611ce09c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "hono", "version": "0.0.12", - "description": "Tiny web framework for Cloudflare Workers and others.", + "description": "Ultrafast web framework for Cloudflare Workers.", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ diff --git a/src/hono.ts b/src/hono.ts index 4ccc0626..b78679cf 100644 --- a/src/hono.ts +++ b/src/hono.ts @@ -11,13 +11,13 @@ const METHOD_NAME_OF_ALL = 'ALL' declare global { interface Request { - params: (key: string) => any + params: (key: string) => string query: (key: string) => string | null } } -type Handler = (c: Context, next?: Function) => Response | Promise -type MiddlwareHandler = (c: Context, next: Function) => Promise +export type Handler = (c: Context, next?: Function) => Response | Promise +export type MiddlwareHandler = (c: Context, next: Function) => Promise export class Router { node: Node @@ -149,7 +149,7 @@ export class Hono { await next() } - middleware.push(Middleware.defaultFilter) + middleware.push(Middleware.default) middleware.push(wrappedHandler) const composed = compose(middleware) diff --git a/src/index.ts b/src/index.ts index 7c05adb5..9b469a94 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,2 @@ -export { Hono, Middleware } from './hono' +export { Hono, Middleware, Handler, MiddlwareHandler } from './hono' export { Context } from './context' diff --git a/src/middleware.ts b/src/middleware.ts index 6ab9d9f8..a5af15c6 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,10 +1,10 @@ -import { defaultFilter } from './middleware/defaultFilter' -import { poweredBy } from './middleware/poweredBy/poweredBy' +import { defaultMiddleware } from './middleware/default' +import { poweredBy } from './middleware/powered-by/powered-by' import { logger } from './middleware/logger/logger' import { basicAuth } from './middleware/basic-auth/basic-auth' export class Middleware { - static defaultFilter = defaultFilter + static default = defaultMiddleware static poweredBy = poweredBy static logger = logger static basicAuth = basicAuth diff --git a/src/middleware/defaultFilter.ts b/src/middleware/default.ts similarity index 73% rename from src/middleware/defaultFilter.ts rename to src/middleware/default.ts index 3293c3f4..cfc3bbc5 100644 --- a/src/middleware/defaultFilter.ts +++ b/src/middleware/default.ts @@ -1,6 +1,6 @@ import type { Context } from '../context' -export const defaultFilter = async (c: Context, next: Function) => { +export const defaultMiddleware = async (c: Context, next: Function) => { c.req.query = (key: string) => { // eslint-disable-next-line const url = new URL(c.req.url) diff --git a/src/middleware/poweredBy/poweredBy.test.ts b/src/middleware/powered-by/powered-by.test.ts similarity index 100% rename from src/middleware/poweredBy/poweredBy.test.ts rename to src/middleware/powered-by/powered-by.test.ts diff --git a/src/middleware/poweredBy/poweredBy.ts b/src/middleware/powered-by/powered-by.ts similarity index 100% rename from src/middleware/poweredBy/poweredBy.ts rename to src/middleware/powered-by/powered-by.ts