1.1.0 • Published 3 months ago

@uscreen.de/fastify-app v1.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
3 months ago

fastify-app

Test CI Test Coverage Known Vulnerabilities NPM Version

Opinionated feature pack (of packages) to bootstrap a fastify app

Features

  • decorates your app with name, version and root-path read from package.json
  • decorates your app with any given config
  • provides OpenAPI 3.0 docs by use of @fastify/swagger
  • enables extra security headers as provided by helmet @fastify/helmet
  • provides extra sensible defaults provided by @fastify/sensible
  • uses @fastify/autoload to load plugins, models, services, whatever from configurable directories
  • provides monitoring healthcheck endpoint by use of under-pressure

All those features are ready setup with defaults, that may be customized further to your likings.

Get Started (cli)

Easy start by yarn create cli command to create a new fastify-app from scratch instead of manually setting up a new fastify instance, like so:

$ yarn create @uscreen.de/fastify-app new-app

and follow instructions. It will create a directory called new-app inside the current folder. Inside that directory, it will generate the initial project structure and install any dependencies:

new-app
├── Makefile
├── README.md
├── app
│   ├── app.js
│   ├── config.js
│   ├── plugins
│   │   └── noop.js
│   ├── schemas.js
│   ├── server.js
│   └── services
│       └── noop.js
├── package.json
├── pm2-dev.config.js
├── pm2.config.js
├── test
│   ├── helper.js
│   └── noop.test.js
└── yarn.lock

Install (manual)

$ yarn add @uscreen.de/fastify-app # or use npm -i

Example (manual)

Minimal example:

import defaultApp from '@uscreen.de/fastify-app'

// register with defaults
fastify.register(defaultApp)

With default server options for logging, etc.

import Fastify from 'fastify'
import defaultApp, { options } from '@uscreen.de/fastify-app'

// create fastify instance with default options
const fastify = Fastify(options())

// register with defaults
fastify.register(defaultApp)

This enables all default features and exposes some extra routes, like:

  • GET /documentation - autogenerated OpenAPI 3.0 documentation of all endpoint
  • GET /status - healthcheck endpoint return HTTP 200 {"status":"ok"}

Options

All options get validated and defaulted to a defined json-schema you can check in config.js Overview of options:

optionDescriptionDefaultExample
autoloadsarray of directories @fastify/autoload should load your fastify plugins from. Please consider reading Loading order of your plugins[]['./plugins', './services']
swaggerobject configuring @fastify/swagger to generate Swagger2/OpenAPI3 docs from your routes{exposeRoute: true, openapi:{}}{exposeRoute: '/docs'}
health (alias: healthCheck)object configuring under-pressure to provide a monitoring healthcheck route for your app{exposeStatusRoute: true}{exposeStatusRoute: '/health'}
contentSecurityPolicyobject configuring helmet to set CSR headers on each response{contentSecurityPolicy: false}{contentSecurityPolicy: {directives: {defaultSrc: ["'self'"]}}}

Howto add custom healthchecks

decorate your healthCheck option with a custom function returning truthy on success, ie.:

import fastifyApp from '@uscreen.de/fastify-app'
import fp from 'fastify-plugin'
import schemas from './schemas.js'

export default fp(async (fastify, opts, next) => {
  /**
   * add schemas
   */
  fastify.register(schemas)

  /**
   * configure healthcheck
   */
  opts.healthCheck = {
    ...opts.healthCheck,

    healthCheck: async () => {
      /**
       * check for proper mongo conenction
       */
      const collections = await fastify.mongo.db.collections()

      /**
       * check for proper nats connection
       */
      const natsConnected = await fastify.nats.testConnection()

      /**
       * check for proper redis connection
       */
      const redisConnected = await fastify.redis.ping()

      /**
       * true if all tests passed
       */
      return collections && natsConnected && redisConnected && true
    }
  }

  /**
   * register app
   */
  fastify.register(fastifyApp, opts)

  next()
})

Roadmap

  • TBD

Changelog

1.1.0

Changed

  • make options method pass through ajv property.

1.0.0

Changed

  • switch to ESM only
  • upgrade to fastify@4.x

Added

  • a server options factory providing defaults for logging and generateId options(config)

0.8.3

Changed

  • replaced fastify-module with their scoped versions (@fastify/autoload, @fastify/helmet, @fastify/sensible, @fastify/swagger)

Fixed

  • fixed deprecation warning
  • fixed swagger /docs routes

0.8.0

Changed

  • upgrade all deps including major versions, like fastify-helmet@4.x
  • replace fastify-swagger with fastify-swagger
  • upgrade node LTS (16)

0.7.0

Changed

  • upgraded all deps including major versions, like fastify-plugin@3.x
  • upgrade node LTS (14)

0.6.0

Changed

  • upgraded all deps including major versions, like fastify@3.6.x, env-schem@2.0.0
  • uses shared config @uscreen.de/eslint-config-prettystandard-node

0.5.1

Fixed

  • fastify 3.6.x decorates fastify.version which broke

Added

  • decorate fastify.app.version, fastify.app.name, and fastify.app.root

Changed

  • skip decoration of any fastify.<decorator> if already declared

0.5.0

  • upgraded to fastify 3.x with backward compatible defaults

0.4.0

  • added alias of health <-> healthCheck

0.3.0

  • moved cli to separate package @uscreen.de/create-fastify-app

0.2.0

  • added cli

0.1.0

  • added tests (100% coverage)

0.0.0

  • project setup, linting, guidlines

License

Licensed under MIT.

Published, Supported and Sponsored by u|screen

1.1.0

3 months ago

1.0.0

6 months ago

1.0.0-10

10 months ago

1.0.0-9

1 year ago

1.0.0-8

1 year ago

0.8.12

1 year ago

1.0.0-7

1 year ago

1.0.0-6

1 year ago

0.8.11

1 year ago

1.0.0-5

1 year ago

0.8.10

1 year ago

1.0.0-4

2 years ago

1.0.0-3

2 years ago

1.0.0-2

2 years ago

1.0.0-1

2 years ago

1.0.0-0

2 years ago

0.8.9

2 years ago

0.8.8

2 years ago

0.8.7

2 years ago

0.8.6

2 years ago

0.8.5

2 years ago

0.8.4

2 years ago

0.8.3

2 years ago

0.8.2

2 years ago

0.8.1

2 years ago

0.8.0

2 years ago

0.8.0-rc2

2 years ago

0.8.0-rc1

2 years ago

0.7.5

2 years ago

0.7.4

3 years ago

0.7.3

3 years ago

0.7.2

3 years ago

0.7.1

3 years ago

0.7.1-rc2

3 years ago

0.7.1-rc1

3 years ago

0.7.0

3 years ago

0.6.0

4 years ago

0.5.1

4 years ago

0.5.0

4 years ago

0.4.3

4 years ago

0.4.2

4 years ago

0.4.1

4 years ago

0.4.0

4 years ago

0.3.2

4 years ago

0.3.1

4 years ago

0.3.0

5 years ago

0.2.9

5 years ago

0.2.8

5 years ago

0.2.7

5 years ago

0.2.6

5 years ago

0.2.5

5 years ago

0.2.4

5 years ago

0.2.3

5 years ago

0.2.2

5 years ago

0.2.1

5 years ago

0.2.0

5 years ago

0.2.0-1

5 years ago

0.1.0

5 years ago

0.0.0

5 years ago