Skip to content

ng-openapi/ng-openapi

Repository files navigation

Logo

Angular OpenAPI Client Generator

💪 Made with ❤️ by Angular Devs for Angular Devs

⚡Examples  •  📝Documentation  •  🐛Issues

npm version MIT License Last commit CI status Number of open issues Netlify


Installation

npm install ng-openapi --save-dev
# or
yarn add ng-openapi --dev

CLI Usage

Using a Configuration File (Recommended)

Create a configuration file (e.g., openapi.config.ts):

import { GeneratorConfig } from 'ng-openapi';

const config: GeneratorConfig = {
  input: './swagger.json',
  output: './src/api',
  options: {
    dateType: 'Date',
    enumStyle: 'enum',
    generateEnumBasedOnDescription: true,
    generateServices: true,
    customHeaders: {
      'X-Requested-With': 'XMLHttpRequest',
      'Accept': 'application/json'
    },
    responseTypeMapping: {
      'application/pdf': 'blob',
      'application/zip': 'blob',
      'text/csv': 'text'
    },
    customizeMethodName: (operationId) => {
      const parts = operationId.split('_');
      return parts[parts.length - 1] || operationId;
    }
  }
};

export default config;

Then run:

# Direct command
ng-openapi -c openapi.config.ts

# Or with the generate subcommand
ng-openapi generate -c openapi.config.ts

Using Command Line Options

# Generate both types and services
ng-openapi -i ./swagger.json -o ./src/api

# Generate only types
ng-openapi -i ./swagger.json -o ./src/api --types-only

# Specify date type
ng-openapi -i ./swagger.json -o ./src/api --date-type string

Command Line Options

  • -c, --config <path> - Path to configuration file
  • -i, --input <path> - Path to Swagger/OpenAPI specification file
  • -o, --output <path> - Output directory (default: ./src/generated)
  • --types-only - Generate only TypeScript interfaces
  • --date-type <type> - Date type to use: string or Date (default: Date)

Configuration Options

Required Fields

  • input - Path to your Swagger/OpenAPI specification file
  • output - Output directory for generated files

Optional Fields

  • dateType - How to handle date types: 'string' or 'Date' (default: 'Date')
  • enumStyle - Enum generation style: 'enum' or 'union' (default: 'enum')
  • generateEnumBasedOnDescription - Parse enum values from description field (default: true)
  • generateServices - Generate Angular services (default: true)
  • customHeaders - Headers to add to all HTTP requests
  • responseTypeMapping - Map content types to Angular HttpClient response types
  • customizeMethodName - Function to customize generated method names
  • compilerOptions - TypeScript compiler options for code generation

Generated Files Structure

output/
├── models/
│   └── index.ts        # TypeScript interfaces/types
├── services/
│   ├── index.ts        # Service exports
│   └── *.service.ts    # Angular services
├── tokens/
│   └── index.ts        # Injection tokens
├── utils/
│   ├── date-transformer.ts  # Date transformation interceptor
│   └── file-download.ts     # File download helpers
├── providers.ts        # Provider functions for easy setup
└── index.ts           # Main exports

Angular Integration

🚀 Easy Setup (Recommended)

The simplest way to integrate ng-openapi is using the provider function:

// In your app.config.ts
import { ApplicationConfig } from '@angular/core';
import { provideNgOpenapi } from './api/providers';

export const appConfig: ApplicationConfig = {
  providers: [
    // One-line setup with automatic interceptor configuration
    provideNgOpenapi({
      basePath: 'https://api.example.com'
    }),
    // other providers...
  ]
};

That's it! This automatically configures:

  • ✅ BASE_PATH token
  • ✅ Date transformation interceptor (if using Date type)

Advanced Provider Options

// Disable date transformation
provideNgOpenapi({
  basePath: 'https://api.example.com',
  enableDateTransform: false
});

// Async configuration
provideNgOpenapiAsync({
  basePath: () => import('./config').then(c => c.apiConfig.baseUrl)
});

Using Generated Services

import { Component, inject } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { UserService } from './api/services';
import { User } from './api/models';

@Component({
  selector: 'app-users',
  template: `...`
})
export class UsersComponent {
  private readonly userService = inject(UserService);
  readonly users = toSignal(this.userService.getUsers());
}

File Download Example

import { Component, inject } from '@angular/core';
import { downloadFileOperator } from './api/utils/file-download';

export class ReportComponent {
  private readonly reportService = inject(ReportService);

  downloadReport() {
    this.reportService.getReport('pdf', { reportId: 123 })
      .pipe(
        downloadFileOperator('report.pdf')
      )
      .subscribe();
  }
}

Package.json Scripts

Add these scripts to your package.json:

{
  "scripts": {
    "generate:api": "ng-openapi -c openapi.config.ts"
  }
}

About

Angular OpenAPI Client Generator

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Contributors 2

  •  
  •