swagger2
Version:
Typescript-based tools for working with Swagger v2.0 documents
141 lines (102 loc) • 3.5 kB
Markdown
# swagger2
Loading, parsing and validating requests to HTTP services based on Swagger v2.0 documents.
## Benefits
- Fast. Pre-compiled regular expressions and code generation used to validate the inputs and outputs
of Swagger 2.0 operations at run-time.
- Typed. swagger2 is implemented in TypeScript, including a fully annotated TypeScript definition of
the Swagger 2.0 document object. Makes working with Swagger objects more pleasant in the IDE of your
choosing (WebStorm, Atom, etc).
## Installation
```shell
$ npm add swagger2
```
## Usage
Basic loading and validation of swagger 2.0 document:
```
import * as swagger from 'swagger2';
// load YAML swagger file
const document = swagger.loadDocumentSync('./swagger.yml');
// validate document
if (!swagger.validateDocument(document)) {
throw Error(`./swagger.yml does not conform to the Swagger 2.0 schema`);
}
```
You can compile the document for fast validation of operation requests and responses within
the framework of your choosing. Koa 2 example:
```
let app = new Koa();
...
app.use(body());
app.use(createKoaMiddleware(document));
...
function createKoaMiddleware(document: swagger.Document) {
// construct a validation object, pre-compiling all schema and regex required
let compiled = swagger.compileDocument(document);
return async(context, next) => {
if (!context.path.startsWith(document.basePath)) {
// not a path that we care about
await next();
return;
}
let compiledPath = compiled(context.path);
if (compiledPath === undefined) {
// if there is no single matching path, return 404 (not found)
context.status = 404;
return;
}
// check the request matches the swagger schema
let validationErrors = swagger.validateRequest(compiledPath,
context.method, context.request.query, context.request.body);
if (validationErrors === undefined) {
// operation not defined, return 405 (method not allowed)
context.status = 405;
return;
}
if (validationErrors.length > 0) {
context.status = 400;
context.body = {
code: 'SWAGGER_REQUEST_VALIDATION_FAILED',
errors: validationErrors
};
return;
}
// wait for the operation to execute
await next();
// check the response matches the swagger schema
let error = swagger.validateResponse(compiledPath, context.method, context.status, context.body);
if (error) {
error.where = 'response';
context.status = 500;
context.body = {
code: 'SWAGGER_RESPONSE_VALIDATION_FAILED',
errors: [error]
};
}
};
}
```
There is a complete implementation of this example/use-case in the <a href="https://github.com/carlansley/swagger2-koa">swagger2-koa</a> module,
so if you're using Koa 2 it may make sense to use that instead of swagger2 directly.
## Limitations
- currently only supports synchronous loading of full documents (via swagger.loadDocumentSync)
- does not support validation of file attachments
- does not support validation of mime-types
- requires node v16.0 or above
## Development
First, grab the source from <a href="https://github.com/carlansley/swagger2">GitHub</a>.
From within the swagger2 directory, to run tests:
```shell
$ npm install
$ npm test
```
To see code coverage in a web-browser:
```shell
$ npm run ci:coverage
$ open coverage/lcov-report/index.html (on Mac)
```
To clean up:
```shell
$ npm run clean
```
## License
MIT