# Migration

## Migrating from version 7 to 8

As of version 8 `@fastify/swagger` is only responsible for generating valid
swagger/openapi-specifications. The new `@fastify/swagger-ui` plugin is
responsible for serving the swagger-ui frontend.

Options in version 7 of `@fastify/swagger` related to the configuration
of the swagger-ui frontend are now options of `@fastify/swagger-ui`.

The `exposeRoute` option is removed.

Following are the `@fastify/swagger-ui` options:

| Option             | Default          | Description                                                                                                               |
| ------------------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------- |
| baseDir            | undefined        | Only relevant if `@fastify/swagger` used in static-mode and additional schema-files contain referenced schemas. Specify the directory where all spec files that are included in the main one using $ref will be located. By default, this is the directory where the main spec file is located. Provided value should be an absolute path without trailing slash.     |
| initOAuth          | {}               | Configuration options for [Swagger UI initOAuth](https://swagger.io/docs/open-source-tools/swagger-ui/usage/oauth2/).     |
| routePrefix        | '/documentation' | Overwrite the default Swagger UI route prefix.                                                                            |
| staticCSP          | false            | Enable CSP header for static resources.                                                                                   |
| transformStaticCSP | undefined        | Synchronous function to transform CSP header for static resources if the header has been previously set.                  |
| uiConfig           | {}               | Configuration options for [Swagger UI](https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md). Must be literal values, see [#5710](https://github.com/swagger-api/swagger-ui/issues/5710).|
| uiHooks            | {}               | Additional hooks for the documentation's routes. You can provide the `onRequest` and `preHandler` hooks with the same [route's options](https://fastify.dev/docs/latest/Routes/#options) interface.|

The `baseDir` option is new and is only needed if external spec files should be
exposed. `baseDir` option of `@fastify/swagger-ui` should be set to the same
value as the `specification.baseDir` option of `@fastify/swagger`.

### Example (static-mode):

before:
```js
import Fastify from 'fastify'
import fastifySwagger from '@fastify/swagger'

const fastify = new Fastify()

await fastify.register(fastifySwagger, {
  mode: 'static',
  specification: {
    path: './examples/example-static-specification.yaml',
    postProcessor: function(swaggerObject) {
      return swaggerObject
    },
    baseDir: '/path/to/external/spec/files/location',
  },
  exposeRoute: true,
  routePrefix: '/documentation',
  initOAuth: { },
  uiConfig: {
    docExpansion: 'full',
    deepLinking: false
  },
  uiHooks: {
    onRequest: function (request, reply, next) { next() },
    preHandler: function (request, reply, next) { next() }
  },
  staticCSP: true,
  transformStaticCSP: (header) => header
})
```

after:
```js
import Fastify from 'fastify'
import fastifySwagger from '@fastify/swagger'
import fastifySwaggerUi from '@fastify/swagger-ui'

const fastify = new Fastify()

await fastify.register(fastifySwagger, {
  mode: 'static',
  specification: {
    path: './examples/example-static-specification.yaml',
    postProcessor: function(swaggerObject) {
      return swaggerObject
    },
    baseDir: '/path/to/external/spec/files/location'
  }
})

await fastify.register(fastifySwaggerUi, {
  baseDir: '/path/to/external/spec/files/location',
  routePrefix: '/documentation',
  initOAuth: { },
  uiConfig: {
    docExpansion: 'full',
    deepLinking: false
  },
  uiHooks: {
    onRequest: function (request, reply, next) { next() },
    preHandler: function (request, reply, next) { next() }
  },
  staticCSP: true,
  transformStaticCSP: (header) => header
})
```

### Example (dynamic-mode):

before:
```js
import Fastify from 'fastify'
import fastifySwagger from '@fastify/swagger'

const fastify = new Fastify()

await fastify.register(fastifySwagger, {
  mode: 'dynamic',
  openapi: {
    info: {
      title: String,
      description: String,
      version: String,
    },
    externalDocs: Object,
    servers: [ Object ],
    components: Object,
    security: [ Object ],
    tags: [ Object ]
  },
  exposeRoute: true,
  routePrefix: '/documentation',
  initOAuth: { },
  uiConfig: {
    docExpansion: 'full',
    deepLinking: false
  },
  uiHooks: {
    onRequest: function (request, reply, next) { next() },
    preHandler: function (request, reply, next) { next() }
  },
  staticCSP: true,
  transformStaticCSP: (header) => header
})
```

after:
```js
import Fastify from 'fastify'
import fastifySwagger from '@fastify/swagger'
import fastifySwaggerUi from '@fastify/swagger-ui'

const fastify = new Fastify()

await fastify.register(fastifySwagger, {
  mode: 'dynamic',
  openapi: {
    info: {
      title: String,
      description: String,
      version: String,
    },
    externalDocs: Object,
    servers: [ Object ],
    components: Object,
    security: [ Object ],
    tags: [ Object ]
  }
})

await fastify.register(fastifySwaggerUi, {
  routePrefix: '/documentation',
  initOAuth: { },
  uiConfig: {
    docExpansion: 'full',
    deepLinking: false
  },
  uiHooks: {
    onRequest: function (request, reply, next) { next() },
    preHandler: function (request, reply, next) { next() }
  },
  staticCSP: true,
  transformStaticCSP: (header) => header
})
```
