add swagger-hapi (#13629)

* add swagger-hapi

* swagger-node-runner: fix hapi typings and add more tests
This commit is contained in:
Michael Mrowetz
2016-12-31 02:34:55 +09:00
committed by Andy
parent 4942f142b6
commit ee095fa47f
6 changed files with 176 additions and 24 deletions

51
swagger-hapi/index.d.ts vendored Normal file
View File

@@ -0,0 +1,51 @@
// Type definitions for swagger-hapi 0.7
// Project: https://github.com/apigee-127/swagger-hapi#readme
// Definitions by: Michael Mrowetz <https://github.com/micmro/>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/* =================== USAGE ===================
import * as SwaggerHapi from "swagger-hapi";
import * as Hapi from "hapi";
var app = new Hapi.Server();
let config: SwaggerHapi.Config = {
appRoot: __dirname
};
SwaggerHapi.create(config, (err, middleware) => {
if (err) {
throw err; // or handle error
}
var port = process.env.PORT || 10010;
app.connection({ port });
app.register(middleware.plugin, function(err) {
if (err) { return console.error("Failed to load plugin:", err); }
app.start(function() {
if (middleware.runner.swagger.paths['/hello']) {
console.log('try this:\ncurl http://127.0.0.1:' + port + '/hello?name=Scott');
}
});
});
});
=============================================== */
import { Config, HapiMiddleware } from "swagger-node-runner";
/** export interfaces */
export { Config, HapiMiddleware } from "swagger-node-runner";
/**
* Create a new instance of a Hapi specific `SwaggerNodeRunner` middleware
*
* The `swagger-node-runner` module has the following config priority:
* 1. `swagger_*` environment vars
* 2. `config` passed to `create()`
* 3. read from swagger node in `default.yaml` in config directory
* 4. module defaults
*
* @see @link{https://github.com/apigee-127/swagger-express|Github}
*/
export function create(config: Config, cb: (err: Error | undefined, middleware: HapiMiddleware) => void ): void;

View File

@@ -0,0 +1,51 @@
import * as SwaggerHapi from "swagger-hapi";
import * as Hapi from "hapi";
var app = new Hapi.Server();
module.exports = app; // for testing
var config = {
appRoot: __dirname // required config
} as SwaggerHapi.Config;
SwaggerHapi.create(config, function(err, swaggerHapi) {
if (err) { throw err; }
var port = process.env.PORT || 10010;
app.connection({ port });
// app.address = function() {
// return { port };
// };
if (swaggerHapi.config.swagger !== undefined) {
let appRootFromMw = swaggerHapi.config.swagger.appRoot;
}
app.register(swaggerHapi.plugin, function(err) {
if (err) { return console.error("Failed to load plugin:", err); }
// stat app etc..
});
});
let swaggerSecurityHandlerCb = (err: Error) => {
//do nothing
};
let configComplex: SwaggerHapi.Config = {
appRoot: __dirname,
configDir: "some/directory",
controllersDirs: ["some/directory"],
fittingsDirs: ["some/directory"],
mockMode: true,
swaggerControllerPipe: 'swagger_controllers',
swaggerSecurityHandlers: {
// did not manage to research the typings of first 3 arguments
someHandlerName: ({}, {}, {}, swaggerSecurityHandlerCb) => {
//do nothing
}
},
validateResponse: true
};

View File

@@ -0,0 +1,20 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"swagger-hapi-tests.ts"
]
}

1
swagger-hapi/tslint.json Normal file
View File

@@ -0,0 +1 @@
{ "extends": "../tslint.json" }

View File

@@ -33,6 +33,7 @@ SwaggerNodeRunner.create(config, (err, runner) => {
import { Express, NextFunction } from "express";
import { Spec } from "swagger-schema-official";
import { EventEmitter } from "events";
import * as Hapi from "hapi";
/**
* Config object for SwaggerNodeRunner
@@ -223,32 +224,34 @@ export interface SailsMiddleware extends Middleware {
chain: () => (req: Express.Request, res: Express.Response, next: NextFunction) => void;
}
/** Simplified interface of Hapi Server object */
interface HapiServerMock {
// tslint:disable-next-line:forbidden-types
ext: (name: string, cb: Function) => void;
// tslint:disable-next-line:forbidden-types
on: (name: string, cb: Function) => void;
}
/** Hapi specific Middleware */
export interface HapiMiddleware extends Middleware {
/** Back-reference to Config object of `Runner` that has created this middleware */
config: ConfigInternal;
/** swagger spec */
sysConfig: Config;
/** Register this Middleware with `app` */
// tslint:disable-next-line:forbidden-types
register: (app: any, cb: Function) => void;
/** Hapi Plugin */
plugin: {
/**
* Registers middleware with `onRequest` and traces `request-error` callbacks
* @param {HapiServerMock} server - Hapi server
* @param {any} options - not used in the moment
* @param {Function} next - callback called when register is done
* Hapi plugin `register` implementation.
* @see {@link https://hapijs.com/tutorials/plugins|Hapi Docs}
*/
// tslint:disable-next-line:forbidden-types
register: (server: HapiServerMock, options: any, next: Function) => void
register: {
/**
* Registers Plugin with `onRequest` and traces `request-error` callbacks
* *
* @param {Hapi.Server} server - Hapi server
* @param {any} options - options for plugin (not used in the moment)
* @param {()=>void} next - callback called when register is done
*/
(server: Hapi.Server, options: any, next: () => void): void;
/** Object attached to `register` function to provide hapi with some additional information about the plugin */
attributes: {
/** Name of Plugin (e.g. `swagger-node-runner`) */
name: string
/** Version of Plugin*/
version: string
}
}
};
}

View File

@@ -1,27 +1,53 @@
import * as SwaggerNodeRunner from "swagger-node-runner";
import * as express from "express";
import * as Hapi from "hapi";
let app = express();
let config: SwaggerNodeRunner.Config = {
appRoot: __dirname
};
// Express middleware
let expressApp = express();
SwaggerNodeRunner.create(config, (err, runner) => {
if (err) {
throw err; // or handle error
}
let middleware = runner.expressMiddleware();
middleware.register(app);
let expressMiddleware = runner.expressMiddleware();
expressMiddleware.register(expressApp);
const port = process.env.PORT || 10010;
app.listen(port);
expressApp.listen(port);
});
//Hapi Middleware
var hapiapp = new Hapi.Server();
SwaggerNodeRunner.create(config, function(err, runner) {
if (err) { throw err; }
var port = process.env.PORT || 10010;
hapiapp.connection({ port });
// hapiapp.address = function() {
// return { port };
// };
let hapiMiddleware = runner.hapiMiddleware();
if (hapiMiddleware.config.swagger !== undefined) {
let appRootFromMw = hapiMiddleware.config.swagger.appRoot;
}
let pluginAttributes = hapiMiddleware.plugin.register.attributes.name + hapiMiddleware.plugin.register.attributes.version;
hapiapp.register(hapiMiddleware.plugin, function(err) {
if (err) { return console.error("Failed to load plugin:", err); }
// stat app etc..
});
});
let swaggerSecurityHandlerCb = (err: Error) => {
//do nothing
}
};
let configComplex: SwaggerNodeRunner.Config = {