Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yusukebe/pico
Ultra-tiny router for Cloudflare Workers and Deno
https://github.com/yusukebe/pico
cloudflare cloudflare-workers deno router typescript
Last synced: 6 days ago
JSON representation
Ultra-tiny router for Cloudflare Workers and Deno
- Host: GitHub
- URL: https://github.com/yusukebe/pico
- Owner: yusukebe
- License: mit
- Created: 2022-11-23T13:23:00.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-01-28T21:34:46.000Z (12 months ago)
- Last Synced: 2025-01-10T10:17:27.083Z (12 days ago)
- Topics: cloudflare, cloudflare-workers, deno, router, typescript
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/@picojs/pico
- Size: 278 KB
- Stars: 169
- Watchers: 3
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Pico
[![Version](https://img.shields.io/npm/v/@picojs/pico.svg)](https://npmjs.com/package/@picojs/pico)
[![Bundle Size](https://img.shields.io/bundlephobia/min/@picojs/pico)](https://bundlephobia.com/result?p=@picojs/pico)
[![Bundle Size](https://img.shields.io/bundlephobia/minzip/@picojs/pico)](https://bundlephobia.com/result?p=@picojs/pico)Pico is an ultra-tiny ([~400 bytes](https://bundlephobia.com/package/@picojs/pico) compressed) router using `URLPattern`.
Pico works on Cloudflare Workers and Deno.**This project is still experimental. The API might be changed.**
## Install
```
npm i @picojs/pico
// Or
yarn add @picojs/pico
```Install `@cloudflare/workers-types` for supporting the types.
```
npm i -D @cloudflare/workers-types
// Or
yarn add -D @cloudflare/workers-types
```## Example
```ts
// index.ts
import { Pico } from '@picojs/pico'// create a router object, `new` is not needed
const router = Pico()// handle a GET request and return a TEXT response
router.get('/', (c) => new Response('Hello Pico!'))// capture path parameters and return a JSON response
router.post('/entry/:id', ({ result }) => {
const { id } = result.pathname.groups
return Response.json({
'your id is': id,
})
})// return a primitive Response object
router.get('/money', () => new Response('Payment required', { status: 402 }))// capture path parameters with RegExp
router.get('/post/:date(\\d+)/:title([a-z]+)', ({ result }) => {
const { date, title } = result.pathname.groups
return Response.json({ post: { date, title } })
})// get query parameters
router.get('/search', ({ result }) => {
const query = new URLSearchParams(result.search.input).get('q')
return new Response(`Your query is ${query}`)
})// handle a PURGE method and return a Redirect response
router.on('PURGE', '/cache', () => {
return new Response(null, {
status: 302,
headers: {
Location: '/',
},
})
})// get environment variables for Cloudflare Workers
router.get('/secret', ({ env }) => {
console.log(env.TOKEN)
return new Response('Welcome!')
})// use an executionContext for Cloudflare Workers
router.get('/log', ({ executionContext, req }) => {
executionContext.waitUntil((async () => console.log(`You access ${req.url.toString()}`))())
return new Response('log will be shown')
})// return a custom 404 response
router.all('*', () => new Response('Custom 404', { status: 404 }))// export the app for Cloudflare Workers
export default router
```## Develop with Wrangler
```
wrangler dev index.ts
```## Deploy to Cloudflare Workers
```
wrangler publish index.ts
```## Deno
```ts
import { serve } from 'https://deno.land/std/http/server.ts'
import { Pico } from 'https://esm.sh/@picojs/pico'const router = Pico()
router.get('/', () => new Response('Hi Deno!'))//...
serve(router.fetch)
``````
deno run --allow-net pico.ts
```## Related projects
- Hono
- itty-router## Author
Yusuke Wada
## License
MIT