diff --git a/express-openapi/express-openapi-tests.ts b/express-openapi/express-openapi-tests.ts
new file mode 100644
index 0000000000..81cec3ee86
--- /dev/null
+++ b/express-openapi/express-openapi-tests.ts
@@ -0,0 +1,59 @@
+///
+///
+
+import express = require('express');
+import openapi = require('express-openapi');
+
+var app = express();
+
+var api:openapi.InitializedApi;
+api = openapi.initialize({
+ apiDoc: require('./api-doc.js'),
+ app: app,
+ routes: './api-routes'
+});
+
+app.listen(3000);
+
+// "./api-routes/user/{id}.ts"
+export var get: openapi.Operation = (req, res, next) => {
+};
+
+export var post: openapi.Operation = [(req, res, next) => {}];
+
+export var parameters = [
+ {
+ name: 'id',
+ in: 'path',
+ type: 'string'
+ }
+];
+
+get.apiDoc = {
+ description: 'get user information',
+ operationId: 'getUser',
+ parameters: [
+ {
+ name: 'includeDetail',
+ in: 'query',
+ type: 'boolean'
+ }
+ ],
+ responses: {
+ 200: {
+ description: "valid user object",
+ schema: {$ref: '#/definitions/user'}
+ },
+ default: {$ref: '#/definitions/error'}
+ },
+ "x-some-vendor-property": {}
+};
+
+post.apiDoc = {
+ description: 'post to user',
+ operationId: 'postToUser',
+ responses: {
+ default: {$ref: '#/definitions/error'}
+ },
+ "x-some-vendor-property": {}
+}
diff --git a/express-openapi/express-openapi.d.ts b/express-openapi/express-openapi.d.ts
new file mode 100644
index 0000000000..a28056c9fd
--- /dev/null
+++ b/express-openapi/express-openapi.d.ts
@@ -0,0 +1,319 @@
+// Type definitions for express-openapi 0.6.x
+// Project: https://github.com/kogosoftwarellc/express-openapi
+// Definitions by: TANAKA Koichi
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+/* =================== USAGE ===================
+ import express = require('express');
+ import bodyParser = require('body-parser');
+ import openapi = require('express-openapi');
+ import cors = require('cors');
+
+ var app = express();
+ app.use(cors());
+ app.use(bodyParser.json());
+
+ var api: openapi.InitializedApi;
+ api = openapi.initialize({
+ apiDoc: require('./api-doc.js'),
+ app: app,
+ routes: './api-routes'
+ });
+
+ app.use(function(err, req, res, next) {
+ res.status(err.status).json(err);
+ });
+
+ app.listen(3000);
+ =============================================== */
+
+///
+
+declare module "express-openapi" {
+ import express = require('express');
+
+ export function initialize(args:Args):InitializedApi;
+
+ export interface InitializedApi {
+ apiDoc: OpenApi.ApiDefinition;
+ }
+
+ export module OpenApi {
+ export interface ApiDefinition {
+ swagger: string
+ info: InfoObject
+ host?: string
+ basePath?: string
+ schemes?: string[]
+ consumes?: MimeTypes
+ produces?: MimeTypes
+ paths: PathsObject
+ definitions?: DefinitionsObject
+ parameters?: ParametersDefinitionsObject
+ responses?: ResponsesDefinitionsObject
+ securityDefinitions?: SecurityDefinitionsObject
+ security?: SecurityRequirementObject[]
+ tags?: TagObject[]
+ externalDocs?: ExternalDocumentationObject
+ }
+
+ type MimeTypes = string[]
+
+ export interface InfoObject {
+ title: string
+ description?: string
+ termsOfService?: string
+ contact?: ContactObject
+ license?: LicenseObject
+ version: string
+ }
+
+ export interface ContactObject {
+ name?: string
+ url?: string
+ email?: string
+ }
+
+ export interface LicenseObject {
+ name: string
+ url?: string
+ }
+
+ export interface PathsObject {
+ [index: string]: PathItemObject|any
+ }
+
+ export interface PathItemObject {
+ $ref?: string
+ get?: OperationObject
+ put?: OperationObject
+ post?: OperationObject
+ 'delete'?: OperationObject
+ options?: OperationObject
+ head?: OperationObject
+ patch?: OperationObject
+ parameters?: Parameters
+ }
+
+ export interface OperationObject {
+ tags?: string[]
+ summary?: string
+ description?: string
+ externalDocs?: ExternalDocumentationObject
+ operationId?: string
+ consumes?: MimeTypes
+ produces?: MimeTypes
+ parameters?: Parameters
+ responses: ResponsesObject
+ schemes?: string[]
+ deprecated?: boolean
+ security?: SecurityRequirementObject[],
+ [index: string]: any
+ }
+
+ export interface DefinitionsObject {
+ [index: string]: SchemaObject
+ }
+
+ export interface ResponsesObject {
+ [index: string]: Response|any
+ 'default': Response
+ }
+
+ type Response = ResponseObject|ReferenceObject
+
+ export interface ResponsesDefinitionsObject {
+ [index: string]: ResponseObject
+ }
+
+ export interface ResponseObject {
+ description: string
+ schema?: Schema
+ headers?: HeadersObject
+ examples?: ExampleObject
+ }
+
+ export interface HeadersObject {
+ [index: string]: HeaderObject
+ }
+
+ export interface HeaderObject extends ItemsObject {
+ }
+
+ export interface ExampleObject {
+ [index: string]: any
+ }
+
+ export interface SecurityDefinitionsObject {
+ [index: string]: SecuritySchemeObject
+ }
+
+ export interface SecuritySchemeObject {
+ type: string
+ description?: string
+ name: string
+ 'in': string
+ flow: string
+ authorizationUrl: string
+ tokenUrl: string
+ scopes: ScopesObject
+ }
+
+ export interface ScopesObject {
+ [index: string]: any
+ }
+
+ export interface SecurityRequirementObject {
+ [index: string]: string[]
+ }
+
+ export interface TagObject {
+ name: string
+ description?: string
+ externalDocs?: ExternalDocumentationObject
+ }
+
+ export interface ItemsObject {
+ type: string
+ format?: string
+ items?: ItemsObject
+ collectionFormat?: string
+ 'default'?: any
+ maximum?: number
+ exclusiveMaximum?: boolean
+ minimum?: number
+ exclusiveMinimum?: boolean
+ maxLength?: number
+ minLength?: number
+ pattern?: string
+ maxItems?: number
+ minItems?: number
+ uniqueItems?: boolean
+ 'enum'?: any[]
+ multipleOf?: number
+ }
+
+ export interface ParametersDefinitionsObject {
+ [index: string]: ParameterObject
+ }
+
+ type Parameters = (ReferenceObject|Parameter)[]
+
+ type Parameter = (InBodyParameterObject|GeneralParameterObject);
+
+ interface ParameterObject {
+ name: string
+ 'in': string
+ description?: string
+ required?: boolean
+ }
+
+ export interface InBodyParameterObject extends ParameterObject {
+ schema: Schema
+ }
+
+ export interface GeneralParameterObject extends ParameterObject, ItemsObject {
+ allowEmptyValue?: boolean
+ }
+
+ export interface ReferenceObject {
+ $ref: string
+ }
+
+ export interface ExternalDocumentationObject {
+ [index: string]: any
+ description?: string
+ url: string
+ }
+
+ type Schema = SchemaObject | ReferenceObject
+
+ export interface SchemaObject extends IJsonSchema {
+ [index: string]: any
+ discriminator?: string
+ readOnly?: boolean
+ xml?: XMLObject
+ externalDocs: ExternalDocumentationObject
+ example: any
+ }
+
+ export interface XMLObject {
+ [index: string]: any
+ name?: string
+ namespace?: string
+ prefix?: string
+ attribute?: boolean
+ wrapped?: boolean
+ }
+ }
+
+ export interface Args {
+ apiDoc: OpenApi.ApiDefinition,
+ app: express.Application,
+ routes: string
+ }
+
+ export interface OperationFunction extends express.RequestHandler {
+ apiDoc?: OpenApi.OperationObject;
+ }
+
+ export interface OperationHandlerArray {
+ apiDoc?: OpenApi.OperationObject;
+ [index: number]: express.RequestHandler;
+ }
+
+ export type Operation = OperationFunction | OperationHandlerArray;
+
+ export interface PathModule {
+ parameters?: OpenApi.Parameters;
+ get?: Operation;
+ put?: Operation;
+ post?: Operation;
+ delete?: Operation;
+ patch?: Operation;
+ options?: Operation;
+ head?: Operation;
+ }
+
+ interface IJsonSchema {
+ id?: string
+ $schema?: string
+ title?: string
+ description?: string
+ multipleOf?: number
+ maximum?: number
+ exclusiveMaximum?: boolean
+ minimum?: number
+ exclusiveMinimum?: boolean
+ maxLength?: number
+ minLength?: number
+ pattern?: string
+ additionalItems?: boolean | IJsonSchema
+ items?: IJsonSchema | IJsonSchema[]
+ maxItems?: number
+ minItems?: number
+ uniqueItems?: boolean
+ maxProperties?: number
+ minProperties?: number
+ required?: string[]
+ additionalProperties?: boolean | IJsonSchema
+ definitions?: {
+ [name: string]: IJsonSchema
+ }
+ properties?: {
+ [name: string]: IJsonSchema
+ }
+ patternProperties?: {
+ [name: string]: IJsonSchema
+ }
+ dependencies?: {
+ [name: string]: IJsonSchema | string[]
+ }
+ 'enum'?: any[]
+ type?: string | string[]
+ allOf?: IJsonSchema[]
+ anyOf?: IJsonSchema[]
+ oneOf?: IJsonSchema[]
+ not?: IJsonSchema
+ }
+}