Logonestjs-openapi
Advanced

Config Inheritance

Compose nestjs-openapi config files from a shared base object while keeping defineConfig type safety.

The extends field loads a base config and merges it under the child. Each path in a base config (output, files.entry, files.tsconfig, files.dtoGlob, options.overlay as a path) is relative to the file that declares it, so a base in another folder keeps pointing at its own files. See extends. Composing a shared object by hand, as below, also works.

Create a shared base object and spread/override it in each config file. This keeps type safety from defineConfig without relying on unimplemented inheritance.

// configs/base.config.ts
import { defineConfig } from 'nestjs-openapi';

export const baseConfig = defineConfig({
  files: {
    dtoGlob: 'src/**/*.dto.ts',
    tsconfig: 'tsconfig.json',
  },
  options: {
    extractValidation: true,
    excludeDecorators: ['ApiExcludeEndpoint'],
  },
});
// apps/api/openapi.config.ts
import { defineConfig } from 'nestjs-openapi';
import { baseConfig } from '../../configs/base.config';

export default defineConfig({
  ...baseConfig,
  output: 'openapi.api.json',
  files: {
    ...baseConfig.files,
    entry: 'src/app.module.ts',
  },
  openapi: {
    ...baseConfig.openapi,
    info: {
      ...baseConfig.openapi.info,
      title: 'Public API',
      version: '1.0.0',
    },
  },
});
// apps/admin/openapi.config.ts
import { defineConfig } from 'nestjs-openapi';
import { baseConfig } from '../../configs/base.config';

export default defineConfig({
  ...baseConfig,
  output: 'openapi.admin.json',
  files: {
    ...baseConfig.files,
    entry: 'src/admin.module.ts',
  },
  openapi: {
    ...baseConfig.openapi,
    info: {
      ...baseConfig.openapi.info,
      title: 'Admin API',
      version: '1.0.0',
    },
  },
});

On this page