Giter Site home page Giter Site logo

fastify-apply's Introduction

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
}

fastify-apply's People

Contributors

dependabot[bot] avatar galvez avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

fastify-apply's Issues

remove or improve proxy

I think The Proxy in

fastify-apply/index.js

Lines 65 to 73 in bbb4834

const proxy = new Proxy(fastify, {
get (_, prop) {
if (bind.includes(prop)) {
return fastify[prop].bind(fastify)
} else {
return fastify[prop]
}
}
})
is not strictly needed as a user can do app.get().

If you would really like to keep it, you should support all HTTP methods as well as route().

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.