Skip to content

yusukebe/pico

Repository files navigation

Pico

Version Bundle Size Bundle Size

Pico is an ultra-tiny (~400 bytes 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

// 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

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

Author

Yusuke Wada https://github.com/yusukebe

License

MIT