ojoanalogo / nestjs-redoc

📘 ReDoc frontend for you NestJS swagger API documentation
MIT License
146 stars 55 forks source link

Error: Fastify is not implemented yet #9

Open bardak-dev opened 4 years ago

ojoanalogo commented 4 years ago

I'll try to add support for Fastify in the upcoming days, first I need to learn how Fastify serves a static file

icereval commented 4 years ago

https://github.com/fastify/fastify-static

AGPDev commented 3 years ago

nice

JoeyyT commented 3 years ago

Any updates regading the implementation of Fastify?

AGPDev commented 3 years ago

@JoeyyT you dont need this.

see example:

main.ts

import { join } from 'path';
import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from '@nestjs/common';
import {
  FastifyAdapter,
  NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create<NestFastifyApplication>(
    AppModule,
    new FastifyAdapter(),
  );

  app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
    }),
  );

  app.setGlobalPrefix('v1');

  app.useStaticAssets({
    root: join(__dirname, '..', 'public'),
    prefix: '/public/',
  });

  app.setViewEngine({
    engine: {
      handlebars: require('handlebars'),
    },
    templates: join(__dirname, '..', 'views'),
  });

  const config = new DocumentBuilder()
    .setTitle('Title')
    .setDescription('API description')
    .setVersion('1.0')
    .build();
  const document = SwaggerModule.createDocument(app, config);

  document.info['x-logo'] = {
    url: '/public/logo-light.svg',
    backgroundColor: '#F0F0F0',
    altText: 'Logo',
  };

  document.info['x-tagGroups'] = [
    {
      name: 'Catalog resources',
      tags: ['catalog'],
    },
  ];

  SwaggerModule.setup('api', app, document);

  await app.listen(3000, '0.0.0.0');
}
bootstrap();

app.controller.ts

import { Controller, Get, Header, Headers, Render } from '@nestjs/common';
import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  @ApiExcludeEndpoint()
  getHello(): string {
    return this.appService.getHello();
  }

  @Get('/docs')
  @Render('redoc.handlebars')
  @Header(
    'Content-Security-Policy',
    "default-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; child-src * 'unsafe-inline' 'unsafe-eval' blob:; worker-src * 'unsafe-inline' 'unsafe-eval' blob:; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * 'unsafe-inline';",
  )
  @ApiExcludeEndpoint()
  getDocs() {
    return {
      data: {
        docUrl: 'http://localhost:3000/api/json',
        favicon: '/public/icon.svg',
        options: JSON.stringify({
          theme: {
            logo: {
              gutter: '15px',
            },
          },
          sortPropsAlphabetically: true,
          hideDownloadButton: false,
          hideHostname: false,
          noAutoAuth: true,
          pathInMiddlePanel: true,
        }),
      },
    };
  }
}

views/redoc.handlebars

<!DOCTYPE html>
<html>

<head>
  <title>{{ data.title }}</title>
  <!-- needed for adaptive design -->
  <meta charset="utf-8" />
  {{#if data.favicon}}
  <link rel="shortcut icon" type="image/x-icon" href="{{ data.favicon }}" />
  {{/if}}
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
  <!--
    ReDoc doesn't change outer page styles
    -->
  <style>
    body {
      margin: 0;
      padding: 0;
    }
  </style>
</head>

<body>
  <!-- we provide is specification here -->
  <div id="redoc_container"></div>
  <script src="https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js"> </script>
  <script>
    Redoc.init(
      '{{ data.docUrl }}',
      JSON.parse('{{{ data.options }}}'),
      document.getElementById("redoc_container")
    );
  </script>
</body>

</html>

Just access /v1/docs and be happy

cerireyhan commented 2 years ago

Is there any progress on this?

red010182 commented 2 years ago

any progress on this? 2 years have passed... please

elicobanksbridge commented 1 year ago

@ojoanalogo is there any current progress or future road-map to support Fastify in nestjs-redoc ?

julianpoemp commented 5 months ago

Hi, I just created a library that supports Redoc using NestJS 10 and fastify: nestjs-redox