Generate JavaScript or TypeScript code from Swagger/OpenAPI specification.
npm install -D @oapigen/cli
# or
pnpm add -D @oapigen/cli
# or
yarn add -D @oapigen/clipnpm oapi --file ../src/mocks/local-file-api.json
# or
pnpm oapi --file ../src/mocks/local-file-api.yaml
# or
pnpm oapi --file protocol://url/api.jsonpnpm oapi [options]
Options:
-V, --version output the version number
--output-dir <path> Path output directory js api with types (default: './api')
--config <path> Path to config
--mode <type> Mode for additional info: 'prod'|'dev' (default: 'prod')
--file <path> Path to file with api (*.json, *.yaml, url)
--authorization <value> Auth token for get api by url (it is header for request)
--deprecated <type> Action for deprecated methods: 'warning'|'ignore'|'exception' (default: 'warning')
--import-request Import request code in out code
--original-body Build with original request body
--ignore-description Print description of request
-h, --help display helpforcommandThis package use cosmiconfig for finding config.
TODO: config file may be renamed in the next major version
- a
openapiproperty inpackage.json - a
.openapircfile in JSON or YAML format - a
.openapirc.jsonfile - a
.openapirc.yaml,.openapirc.yml, or.openapirc.jsfile - a
openapi.config.jsfile exporting a JS object
module.exports={// Path to file with api (*.json, *.yaml, url)file: "./swagger-api.json",// string// Api in json (if not use option 'file', more important than path to file)apiJson: { ... },// Auth token for get api by url (it is header for request)authorization: "Token 123qwerty",// string// Path output directory js api with typesoutputDir: "./api",// string (default: "./api")// Mode for additional infomode: "prod",// "prod" | "dev" (default: "prod")// Action for deprecated methodsdeprecated: "warning",// "warning" | "ignore" | "exception" (default: "warning")// Import request code in out code// true — add import from `@oapigen/cli/request`// false — embed request to `outputDir` and import from it// "disabled" — completely disable imporing `request`, use `templateCodeBefore`importRequest: true,// (default: false)// Build with original request bodyoriginalBody: true,// (default: false)// Ignore description of requestsignoreDescription: true,// default: false// Completely disable generating types file (.d.ts)disableTypesGenerate: true,// (default: false)/** * Change file name for source code * Also it can be a function * @example * templateFileNameCode: ({ swaggerData, changeCase }) => string, */templateFileNameCode: 'my-api.js',// (default: 'index.js')/** * Change file name for typing * Also it can be a function * @example * templateFileNameTypes: ({ swaggerData, changeCase }) => string, */templateFileNameTypes: 'my-api.d.ts',// (default: 'index.d.js')/** * Load presets and merge local properties to it * If preset created as a function, options can be passed * @example * presets: [ * ['oapigen-preset-my-super', { passed: 'options' }], * ['@oapigen/preset-another', { beautiful: 'options' }], * ] * If no options passed or used simple form, empty object passed to functional preset */presets: ['oapigen-preset-my-super'],// (default: [])/** * Template before main block code * @param {{ * swaggerData: { info: object; paths: object; components: object; }; * changeCase: { paramCase: Function; camelCase: Function; pascalCase: Function; ... }; * }} extra */templateCodeBefore: (extra)=>"",/** * Template request code * @param {{ * name: string; * method: string; * url: string; * isWarningDeprecated: boolean; * isExistParams: boolean; * defaultParams: object; * }} params * @param {{ * swaggerData: { info: object; paths: object; components: object; }; * requestSwaggerData: { operationId: string; requestBody?: object; responses: object }; * changeCase: { paramCase: Function; camelCase: Function; pascalCase: Function; ... }; * }} extra */templateRequestCode: (params,extra)=>"",/** * Template after maon block code * @param {{ * swaggerData: { info: object; paths: object; components: object; }; * changeCase: { paramCase: Function; camelCase: Function; pascalCase: Function; ... }; * }} extra */templateCodeAfter: (extra)=>"",/** * Template before main block types * @param {{ * swaggerData: { info: object; paths: object; components: object; }; * changeCase: { paramCase: Function; camelCase: Function; pascalCase: Function; ... }; * }} extra */templateTypesBefore: (extra)=>"",/** * Template request types * @param {{ * name: string; * summary: string; * description: string; * countVariants: number; * index: number; * params: SwaggerData | null; * addedParams: SwaggerData | null; * result: SwaggerData | null; * }} params * * @param {{ * swaggerData: { info: object; paths: object; components: object; }; * requestSwaggerData: { operationId: string; requestBody?: object; responses: object }; * changeCase: { paramCase: Function; camelCase: Function; pascalCase: Function; ... }; * }} extra * * @type {https://swagger.io/docs/specification/data-models/} SwaggerData */templateRequestTypes: (param,extra)=>"",/** * Template after main block types * @param {{ * swaggerData: { info: object; paths: object; components: object; }; * changeCase: { paramCase: Function; camelCase: Function; pascalCase: Function; ... }; * }} extra */templateTypesAfter: (extra)=>"",};import{openapiGenerate}from"@oapigen/cli";const{ code, types }=openapiGenerate({file: "./swagger-api.json",});console.log(code);// => js codeconsole.log(types);// => typescript types- If you will use this package after application created, you will have problem with generated api, because current api in your app will have different with your swagger api maybe.
- Create new NPM package (create directory and
npm initthere) - Name your package with
oapigen-preset-prefix (ex.:oapigen-preset-effector) - Create
index.jsand set"main": "index.js"in your package.json - Fill your
index.jswith any properties from list before - Save and publish
- Use it like:
presets: ['oapigen-preset-example']
Hint: if you want to use local file as a preset, just use
require.resolve:presets: [require.resolve('./local-preset')]It is works only in.jsconfigs
- Export from your javascript file function with single argument
- Add valid options to your README.md
- Use nested array form to pass options to preset
module.exports=(options)=>({templateRequestCode: (request,extra)=>options.parseBody ? generatorWithParser(request,extra) : simpleGenerator(request,extra),});Usage openapi.config.js:
module.exports={file: "./swagger-api.json",presets: [["oapigen-preset-example",{parseBody: true}],["@oapigen/preset-another",{requestImport: {module: "./axios-fabric",name: "axios"}}],],};- 2.0
- 3.0.1
- 3.0.2
- Struct generated files by tags
- Detect
nullable - Validate by schema
- Combine types by
- Wait for release-drafter to generates a new draft release
- All PRs should have correct labels and useful titles. You can review available labels here.
- Update labels for PRs and titles, next manually run the release drafter action to regenerate the draft release.
- Review the new version and press "Publish"
- If required check "Create discussion for this release"