From ee095fa47fcaaac3597ea9dcf453257998d446ea Mon Sep 17 00:00:00 2001 From: Michael Mrowetz Date: Sat, 31 Dec 2016 02:34:55 +0900 Subject: [PATCH] add swagger-hapi (#13629) * add swagger-hapi * swagger-node-runner: fix hapi typings and add more tests --- swagger-hapi/index.d.ts | 51 +++++++++++++++++++ swagger-hapi/swagger-hapi-tests.ts | 51 +++++++++++++++++++ swagger-hapi/tsconfig.json | 20 ++++++++ swagger-hapi/tslint.json | 1 + swagger-node-runner/index.d.ts | 41 ++++++++------- .../swagger-node-runner-tests.ts | 36 +++++++++++-- 6 files changed, 176 insertions(+), 24 deletions(-) create mode 100644 swagger-hapi/index.d.ts create mode 100644 swagger-hapi/swagger-hapi-tests.ts create mode 100644 swagger-hapi/tsconfig.json create mode 100644 swagger-hapi/tslint.json diff --git a/swagger-hapi/index.d.ts b/swagger-hapi/index.d.ts new file mode 100644 index 0000000000..2c723cbf61 --- /dev/null +++ b/swagger-hapi/index.d.ts @@ -0,0 +1,51 @@ +// Type definitions for swagger-hapi 0.7 +// Project: https://github.com/apigee-127/swagger-hapi#readme +// Definitions by: Michael Mrowetz +// 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; diff --git a/swagger-hapi/swagger-hapi-tests.ts b/swagger-hapi/swagger-hapi-tests.ts new file mode 100644 index 0000000000..50d3954975 --- /dev/null +++ b/swagger-hapi/swagger-hapi-tests.ts @@ -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 +}; diff --git a/swagger-hapi/tsconfig.json b/swagger-hapi/tsconfig.json new file mode 100644 index 0000000000..d567fa1d44 --- /dev/null +++ b/swagger-hapi/tsconfig.json @@ -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" + ] +} diff --git a/swagger-hapi/tslint.json b/swagger-hapi/tslint.json new file mode 100644 index 0000000000..377cc837d4 --- /dev/null +++ b/swagger-hapi/tslint.json @@ -0,0 +1 @@ +{ "extends": "../tslint.json" } diff --git a/swagger-node-runner/index.d.ts b/swagger-node-runner/index.d.ts index 33bc753dbb..13962ccfb8 100644 --- a/swagger-node-runner/index.d.ts +++ b/swagger-node-runner/index.d.ts @@ -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 + } + } }; } diff --git a/swagger-node-runner/swagger-node-runner-tests.ts b/swagger-node-runner/swagger-node-runner-tests.ts index d919e8d9ee..73306f2f72 100644 --- a/swagger-node-runner/swagger-node-runner-tests.ts +++ b/swagger-node-runner/swagger-node-runner-tests.ts @@ -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 = {