Skip to content

Writing a plugin

Implement BananaPlugin from @banana-universe/bananajs (re-exported types are stable).

Minimal example

typescript
import type { BananaPlugin, AppContext } from '@banana-universe/bananajs'

export function RequestTimingPlugin(): BananaPlugin {
  return {
    name: 'request-timing',
    register(ctx: AppContext) {
      ctx.app.use((req, res, next) => {
        const start = Date.now()
        res.on('finish', () => {
          ctx.logger?.info(`${req.method} ${req.url} ${res.statusCode} ${Date.now() - start}ms`)
        })
        next()
      })
    },
  }
}

Async registration

Use async register for dynamic imports or network checks — consumers must use BananaApp.create.

Container integration

If ctx.container (tsyringe) exists, register shared singletons with registerInstance(token, value) or register(token, { useClass }) so controllers resolved from the container receive dependencies.

Peer dependencies

Declare optional integrations as peerDependencies with peerDependenciesMeta.optional: true so consumers only install what they use.

Released under the MIT License.