Generate JavaScript or TypeScript code from Swagger/OpenAPI specifications
npm install openapiGenerate JavaScript or TypeScript code from Swagger/OpenAPI specification.
``sh`
npm install openapior
yarn add openapior to global space
`sh`
yarn openapi --file ../src/mocks/local-file-api.jsonor
yarn openapi --file ../src/mocks/local-file-api.yamlor
yarn openapi --file protocol://url/api.json
`sh
yarn openapi [options]
Options:
-V, --version output the version number
--output-dir
--config
--mode
--file
--authorization
--deprecated
--import-request Import request code in out code
--original-body Build with original request body
--ignore-description Print description of request
-h, --help display help for command
`
This package use cosmiconfig for find config.
- a openapi property in package.json
- a .openapirc file in JSON or YAML format
- a .openapirc.json file
- a .openapirc.yaml, .openapirc.yml, or .openapirc.js file
- a openapi.config.js file exporting a JS object
`js
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 types
outputDir: "./api", // string (default: "./api")
// Mode for additional info
mode: "prod", // "prod" | "dev" (default: "prod")
// Action for deprecated methods
deprecated: "warning", // "warning" | "ignore" | "exception" (default: "warning")
// Import request code in out code
// true — add import from openapi/requestoutputDir
// false — embed request to and import from itrequest
// "disabled" — completely disable imporing , use templateCodeBefore
importRequest: true, // (default: false)
// Build with original request body
originalBody: true, // (default: false)
// Ignore description of requests
ignoreDescription: 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: [
* ['my-super-openapi-preset', { passed: 'options' }],
* ['another-openapi-preset', { beautiful: 'options' }],
* ]
* If no options passed or used simple form, empty object passed to functional preset
*/
presets: ['my-super-openapi-preset'], // (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) => "",
};
`
`js
import { openapiGenerate } from "openapi";
const { code, types } = openapiGenerate({
file: "./swagger-api.json",
});
console.log(code);
// => js code
console.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.
1. Create new NPM package (create directory and npm init there)openapi-preset-
1. Name your package with prefix (ex.: openapi-preset-effector)index.js
1. Create and set "main": "index.js" in your package.jsonindex.js
1. Fill your with any properties from list beforepresets: ['openapi-preset-example']
1. Save and publish
1. Use it like:
> Hint: if you want to use local file as a preset, just use require.resolve:presets: [require.resolve('./local-preset')]
> .js
> It is works only in configs
1. Export from your javascript file function with single argument
1. Add valid options to your README.md
1. Use nested array form to pass options to preset
#### Example preset with options
`js`
module.exports = (options) => ({
templateRequestCode: (request, extra) =>
options.parseBody
? generatorWithParser(request, extra)
: simpleGenerator(request, extra),
});
Usage openapi.config.js:
`js`
module.exports = {
file: "./swagger-api.json",
presets: [
["openapi-preset-example", { parseBody: true }],
[
"openapi-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
1. Wait for release-drafter to generates a new draft release
1. Pull all changes to local repository
1. Run tests yarn test && yarn test-packnpm version 1.2.3
1. Create a new tag and change package.json (use the version from a draft release)npm publish
1. Publish new version git push origin master --tags`
1. Push tags and changes
1. Go to Releases and press "Edit" on draft release
1. Check and fix release text
1. Press "Publish release" button