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.
Recommended pattern: manual composition
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',
},
},
});