0.0.3 • Published 2 years ago

fastify-apply v0.0.3

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

fastify-apply

Experimental shorthand syntax for Fastify.

Define hooks as functions or arrays of functions

export default {
  async onRequest (req, reply) {
    reply.send(`Hello from onRequest`)
  },
  preHandler: [
    async (req, reply) => {
      reply.send('Hello from the first preHandler')
    },
    async (req, reply) => {
      reply.send('Hello from the second preHandler')
    },
  ],
}

Supported hooks:

  • onRequest
  • preParsing
  • preValidation
  • preHandler
  • preSerialization
  • onError
  • onSend
  • onResponse
  • onTimeout
  • onReady
  • onClose
  • onRoute
  • onRegister

Define method(key, value) calls

export default {
  decorate: {
    helper () {
      console.log('Helper function')
    }
  },
}

Supported methods:

  • addHook
  • decorate
  • decorateRequest
  • decorateReply

Run a function before() or after() everything else in the plugin

export default {
  after({ get }) {
    get('/*', (req, reply) => {})
  },
  before({ get }) {
    get('/route', (req, reply) => {})
  },
}

The first argument to before() and after() is a Proxy instance that will return Fastify methods implictly bound to the current plugin context (the contextual fastify instance, that is).

Full list of methods that come with this implicit binding:

  • addSchema
  • addHook
  • decorateRequest
  • decorateReply
  • register
  • get
  • head
  • post
  • put
  • delete
  • options
  • patch
  • all

Encapsulation

Unless you set encapsulate to true, the plugin will be wrapped with fastify-plugin so it stays in the global context. To ensure the applied plugin object is encapsulated:

export default {
  encapsulate: true,
}

Hat off to Matteo Collina for suggesting this option's name.

Full example

async function main () {
  const fastify = require('fastify')()
  await fastify.register(require('./index'))

  fastify.apply({
    after ({ get }) {
      get('/*', (req, reply) => {
        reply.send('/* route properly registered')
      })
    },
    decorate: {
      someHelper () {
        return 'something'
      }
    },
    decorateRequest: {
      foobar: 'something else',
      dynamic: null
    },
    async onRequest (req, reply) {
      req.dynamic = this.someHelper()
      reply.header('x-hello-1', `Hello from hooks: ${req.foobar} - ${req.dynamic}`)
    },
    preHandler: [
      async (req, reply) => {
        reply.header('x-hello-2', 'Hello from the first preHandler')
      },
      async (req, reply) => {
        reply.header('x-hello-3', 'Hello from the second preHandler')
      }
    ],
    before ({ get }) {
      get('/before', (req, reply) => {
        reply.send('/before route properly registered')
      })
    }
  })

  return fastify
}