npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

dekoa

v0.12.12

Published

Decorators for Koa

Downloads

229

Readme

dekoa - Decorators for Koa with :revolving_hearts:

build codecov Standard Version

JavaScript Style Guide Styled with Prettier Commitizen friendly dependencies npm version npm downloads

Handy decorators & middlewares dedicated for Koa, batteris included:

  • Class based routes supports (full HTTP method supports, RFC7231).
  • JSON Schema based validators (via koa-body).
  • Common middleware helpers.

Installation

npm install dekoa

Decorators

  • route.js#bind(server, files, options)

    • assuming we have all the view controllers under src/resources/.
    // src/server.js
    import Koa from 'koa'
    import glob from 'glob'
    import debug from 'debug'
    import * as dekoa from 'dekoa'
    
    const log = debug('debug')
    const server = new Koa()
    
    // all of the view controllers defined in `src/resources` will be automatically registered.
    const views = glob.sync(`${__dirname}/resources/*.js`)
    dekoa.bind(server, views, { prefix: '/v1' })
    
    const port = process.env.PORT || 9394;
    server.listen(port, () => {
      log(`Server started at port: ${port}`)
    })
    • sample view controllers with decorators supports.
    // src/resources/accounts.js
    import Status from 'http-status-codes'
    import { resource, get, post } from 'dekoa'
    
    @resource('accounts')
    export default class Account {
      @get('/:id')
      async findById(ctx) {
        const params = ctx.params
        ctx.status = Status.OK
        ctx.body = { id: params.id, username: '[email protected]' }
      }
    
      @post('/')
      async create(ctx) {
        ctx.status = Status.CREATED
        ctx.body = { username: '[email protected]' }
      }
    }
    import Status from 'http-status-codes'
    import { resource, post } from 'dekoa'
    
    // `resource` decorator without prefix will be injected as top level URL.
    @resource
    export default class Auth {
      @post('/login')
      async login(ctx) {
        ctx.status = Status.RESET_CONTENT
      }
    
      @post('/logout')
      async logout(ctx) {
        ctx.status = Status.RESET_CONTENT
      }
    }
  • JSON Schema, e.g. NewAccount.json.

    {
      "properties": {
        "username": {
          "type": "string",
          "format": "email",
          "minLength": 5,
          "maxLength": 255
        },
        "password": {
          "type": "string",
          "minLength": 6,
          "maxLength": 20
        }
      },
      "required": ["username", "password"]
    }
  • validate incoming form data

    const NewAccount = require('./NewAccount.json')
    
    @resource('inputs')
    export default class Input {
      @post('/', NewAccount)
      async create(ctx) {
        ctx.status = Status.CREATED
        ctx.body = { username: '[email protected]' }
      }
    }
  • validate incoming http query (GET|HEAD|DELETE ONLY)

    const Account = require('./Account.json')
    
    @resource('inputs')
    export default class Input {
      @get('/', Account)
      async find(ctx) {
        ctx.status = Status.OK
        ctx.body = { username: '[email protected]' }
      }
    }

Middlewares

  • XSRF (aka. CSRF) - built on top of CSRF, set for SPA without session dependency via cookie and header. Available options:
    • xsrfCookieName - cookie name for saving XSRF token (default xsrftoken).
    • xsrfHeaderName - http header name for responsing XSRF token, value is same as cookie's one (default X-XSRF-Token).
    • invalidTokenMessage - error message responded for client (default Invalid XSRF Token).
    • invalidTokenStatusCode - error http status code responded for client (default 403).
    • excludedMethods - methods bypass for XSRF token checking (default [ 'GET', 'HEAD', 'OPTIONS' ]).
    • renewPostWrite - whether XSRF token should be renew after each write (default: false).
import Koa from 'koa'
import { middleware } from 'dekoa'

const server = new Koa()
server.use(middleware.XSRF('<my-app-secret>'))
server.listen(port, () => {
  log(`Server started at port: ${port}`)
})

Regular Expression Helpers

  • dekoa.regex.chinese - chinese characters.
  • dekoa.regex.email - email address.
  • dekoa.regex.password - valid password (>= 6 bits, includes at least 1 lower & 1 upper letter, 1 number & 1 special character).
  • dekoa.regex.integer - positive/negative integer.
  • dekoa.regex.number - positive/negative number.
  • dekoa.regex.url - http/ftp/file address.
  • dekoa.regex.ipv4 - IP address version 4.