diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java
index 4c97e1c04c8f7fe3ae1d2e763cdd8eb3fed30339..45f00f626be7e87cd62420875e70f13baa0e90db 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java
@@ -19,7 +19,7 @@ package org.openapitools.codegen.languages;
 
 import io.swagger.v3.oas.models.media.Schema;
 import io.swagger.v3.parser.util.SchemaTypeUtil;
-import org.openapitools.codegen.CliOption;
+import org.openapitools.codegen.*;
 import org.openapitools.codegen.SupportingFile;
 import org.openapitools.codegen.utils.ModelUtils;
 import org.slf4j.Logger;
@@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.*;
 
 public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen {
     private static final Logger LOGGER = LoggerFactory.getLogger(TypeScriptNodeClientCodegen.class);
@@ -41,11 +41,13 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
     protected String npmName = null;
     protected String npmVersion = "1.0.0";
     protected String npmRepository = null;
+    protected String apiSuffix = "Api";
 
     public TypeScriptNodeClientCodegen() {
         super();
 
         typeMapping.put("file", "Buffer");
+        languageSpecificPrimitives.add("Buffer");
 
         // clear import mapping (from default generator) as TS does not use it
         // at the moment
@@ -53,6 +55,10 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
 
         outputFolder = "generated-code/typescript-node";
         embeddedTemplateDir = templateDir = "typescript-node";
+        modelTemplateFiles.put("model.mustache", ".ts");
+        apiTemplateFiles.put("api-single.mustache", ".ts");
+        modelPackage = "model";
+        apiPackage = "api";
 
         this.cliOptions.add(new CliOption(NPM_NAME, "The name under which you want to publish generated npm package"));
         this.cliOptions.add(new CliOption(NPM_VERSION, "The version of your npm package"));
@@ -86,6 +92,101 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
         }
         return super.getTypeDeclaration(p);
     }
+    
+    @Override
+    public String toApiName(String name) {
+        if (name.length() == 0) {
+            return "Default" + apiSuffix;
+        }
+        return initialCaps(name) + apiSuffix;
+    }
+    
+    @Override
+    public String toApiFilename(String name) {
+        if (name.length() == 0) {
+            return "default" + apiSuffix;
+        }
+        return camelize(name, true) + apiSuffix;
+    }
+
+    @Override
+    public String toApiImport(String name) {
+        return apiPackage() + "/" + toApiFilename(name);
+    }
+
+    @Override
+    public String toModelFilename(String name) {
+        return camelize(toModelName(name), true);
+    }
+
+    @Override
+    public String toModelImport(String name) {
+        return modelPackage() + "/" + toModelFilename(name);
+    }
+    
+    @Override
+    public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
+        Map<String, Object> result = super.postProcessAllModels(objs);
+
+        for (Map.Entry<String, Object> entry : result.entrySet()) {
+            Map<String, Object> inner = (Map<String, Object>) entry.getValue();
+            List<Map<String, Object>> models = (List<Map<String, Object>>) inner.get("models");
+            for (Map<String, Object> mo : models) {
+                CodegenModel cm = (CodegenModel) mo.get("model");
+
+                // Add additional filename information for imports
+                mo.put("tsImports", toTsImports(cm, cm.imports));
+            }
+        }
+        return result;
+    }
+    
+    private List<Map<String, String>> toTsImports(CodegenModel cm, Set<String> imports) {
+        List<Map<String, String>> tsImports = new ArrayList<>();
+        for (String im : imports) {
+            if (!im.equals(cm.classname)) {
+                HashMap<String, String> tsImport = new HashMap<>();
+                tsImport.put("classname", im);
+                tsImport.put("filename", toModelFilename(im));
+                tsImports.add(tsImport);
+            }
+        }
+        return tsImports;
+    }
+    
+    @Override
+    public Map<String, Object> postProcessOperations(Map<String, Object> operations) {
+        Map<String, Object> objs = (Map<String, Object>) operations.get("operations");
+        
+        // The api.mustache template requires all of the auth methods for the whole api
+        // Loop over all the operations and pick out each unique auth method
+        Map<String, CodegenSecurity> authMethodsMap = new HashMap<>();
+        for (CodegenOperation op : (List<CodegenOperation>) objs.get("operation")) {
+            if(op.hasAuthMethods){
+                for(CodegenSecurity sec : op.authMethods){
+                    authMethodsMap.put(sec.name, sec);
+                }
+            }
+        }
+        
+        // If there wer any auth methods specified add them to the operations context
+        if (!authMethodsMap.isEmpty()) {
+            operations.put("authMethods", authMethodsMap.values());
+            operations.put("hasAuthMethods", true);
+        }
+        
+        // Add filename information for api imports
+        objs.put("apiFilename", getApiFilenameFromClassname(objs.get("classname").toString()));
+        
+        // Add additional filename information for model imports in the apis
+        List<Map<String, Object>> imports = (List<Map<String, Object>>) operations.get("imports");
+        for (Map<String, Object> im : imports) {
+            im.put("filename", im.get("import"));
+            im.put("classname", getModelnameFromModelFilename(im.get("filename").toString()));
+        }
+
+        return operations;
+    }
 
     public void setNpmName(String npmName) {
         this.npmName = npmName;
@@ -110,10 +211,12 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
     @Override
     public void processOpts() {
         super.processOpts();
-        supportingFiles.add(new SupportingFile("api.mustache", null, "api.ts"));
+        supportingFiles.add(new SupportingFile("models.mustache", modelPackage().replace('.', File.separatorChar), "models.ts"));
+        supportingFiles.add(new SupportingFile("api-all.mustache", apiPackage().replace('.', File.separatorChar), "apis.ts"));
+        supportingFiles.add(new SupportingFile("api.mustache", getIndexDirectory(), "api.ts"));
         supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
         supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
-
+        
         if (additionalProperties.containsKey(NPM_NAME)) {
             addNpmPackageGeneration();
         }
@@ -141,9 +244,57 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
         supportingFiles.add(new SupportingFile("package.mustache", getPackageRootDirectory(), "package.json"));
         supportingFiles.add(new SupportingFile("tsconfig.mustache", getPackageRootDirectory(), "tsconfig.json"));
     }
+    
+    private String getIndexDirectory() {
+        String indexPackage = modelPackage.substring(0, Math.max(0, modelPackage.lastIndexOf('.')));
+        return indexPackage.replace('.', File.separatorChar);
+    }
+
+    // The purpose of this override and associated methods is to allow for automatic conversion
+    // from 'file' type to the built in node 'Buffer' type
+    @Override
+    public String getSchemaType(Schema p) {
+        String openAPIType = super.getSchemaType(p);
+        if (isLanguagePrimitive(openAPIType) || isLanguageGenericType(openAPIType)) {
+            return openAPIType;
+        }
+        applyLocalTypeMapping(openAPIType);
+        return openAPIType;
+    }
+
+    private String applyLocalTypeMapping(String type) {
+        if (typeMapping.containsKey(type)) {
+            type = typeMapping.get(type);
+        }
+        return type;
+    }
+    
+    private boolean isLanguagePrimitive(String type) {
+        return languageSpecificPrimitives.contains(type);
+    }
+
+    // Determines if the given type is a generic/templated type (ie. ArrayList<String>)
+    private boolean isLanguageGenericType(String type) {
+        for (String genericType : languageGenericTypes) {
+            if (type.startsWith(genericType + "<")) {
+                return true;
+            }
+        }
+        return false;
+    }
 
     private String getPackageRootDirectory() {
         String indexPackage = modelPackage.substring(0, Math.max(0, modelPackage.lastIndexOf('.')));
         return indexPackage.replace('.', File.separatorChar);
     }
+    
+    private String getApiFilenameFromClassname(String classname) {
+        String name = classname.substring(0, classname.length() - apiSuffix.length());
+        return toApiFilename(name);
+    }
+    
+    private String getModelnameFromModelFilename(String filename) {
+        String name = filename.substring((modelPackage() + File.separator).length());
+        return camelize(name);
+    }
 }
diff --git a/modules/openapi-generator/src/main/resources/typescript-node/api-all.mustache b/modules/openapi-generator/src/main/resources/typescript-node/api-all.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..514b5e0d10fd6a00fc7cfd0b849dacc1857be689
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/typescript-node/api-all.mustache
@@ -0,0 +1,12 @@
+{{#apiInfo}}
+{{#apis}}
+{{#operations}}
+export * from './{{ classFilename }}';
+import { {{ classname }} } from './{{ classFilename }}';
+{{/operations}}
+{{#withInterfaces}}
+export * from './{{ classFilename }}Interface'
+{{/withInterfaces}}
+{{/apis}}
+export const APIS = [{{#apis}}{{#operations}}{{ classname }}{{/operations}}{{^-last}}, {{/-last}}{{/apis}}];
+{{/apiInfo}}
diff --git a/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache b/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..b3508727eb67b9a231edf4c56b983941169e8f45
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/typescript-node/api-single.mustache
@@ -0,0 +1,221 @@
+{{>licenseInfo}}
+import localVarRequest = require('request');
+import http = require('http');
+{{^supportsES6}}
+import Promise = require('bluebird');
+{{/supportsES6}}
+
+/* tslint:disable:no-unused-locals */
+{{#imports}}
+import { {{classname}} } from '../{{filename}}';
+{{/imports}}
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = '{{{basePath}}}';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+{{#operations}}
+{{#description}}
+/**
+* {{&description}}
+*/
+{{/description}}
+export enum {{classname}}ApiKeys {
+{{#authMethods}}
+{{#isApiKey}}
+    {{name}},
+{{/isApiKey}}
+{{/authMethods}}
+}
+
+export class {{classname}} {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+{{#hasAuthMethods}}
+{{#authMethods}}
+{{#isBasic}}
+        '{{name}}': new HttpBasicAuth(),
+{{/isBasic}}
+{{#isApiKey}}
+        '{{name}}': new ApiKeyAuth({{#isKeyInHeader}}'header'{{/isKeyInHeader}}{{^isKeyInHeader}}'query'{{/isKeyInHeader}}, '{{keyParamName}}'),
+{{/isApiKey}}
+{{#isOAuth}}
+        '{{name}}': new OAuth(),
+{{/isOAuth}}
+{{/authMethods}}
+{{/hasAuthMethods}}
+    }
+
+    constructor(basePath?: string);
+{{#authMethods}}
+{{#isBasic}}
+    constructor(username: string, password: string, basePath?: string);
+{{/isBasic}}
+{{/authMethods}}
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+{{#authMethods}}
+{{#isBasic}}
+            this.username = basePathOrUsername;
+            this.password = password
+{{/isBasic}}
+{{/authMethods}}
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: {{classname}}ApiKeys, value: string) {
+        (this.authentications as any)[{{classname}}ApiKeys[key]].apiKey = value;
+    }
+{{#hasAuthMethods}}
+{{#authMethods}}
+{{#isBasic}}
+    set username(username: string) {
+        this.authentications.{{name}}.username = username;
+    }
+
+    set password(password: string) {
+        this.authentications.{{name}}.password = password;
+    }
+{{/isBasic}}
+{{#isOAuth}}
+
+    set accessToken(token: string) {
+        this.authentications.{{name}}.accessToken = token;
+    }
+{{/isOAuth}}
+{{/authMethods}}
+{{/hasAuthMethods}}
+
+{{#operation}}
+    /**
+     * {{&notes}}
+     {{#summary}}
+     * @summary {{&summary}}
+     {{/summary}}
+     {{#allParams}}
+     * @param {{paramName}} {{description}}
+     {{/allParams}}
+     */
+    public {{nickname}} ({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) : Promise<{ response: http.{{#supportsES6}}IncomingMessage{{/supportsES6}}{{^supportsES6}}ClientResponse{{/supportsES6}}; {{#returnType}}body: {{{returnType}}}; {{/returnType}}{{^returnType}}body?: any; {{/returnType}} }> {
+        const localVarPath = this.basePath + '{{{path}}}'{{#pathParams}}
+            .replace('{' + '{{baseName}}' + '}', encodeURIComponent(String({{paramName}}))){{/pathParams}};
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+{{#allParams}}
+{{#required}}
+        // verify required parameter '{{paramName}}' is not null or undefined
+        if ({{paramName}} === null || {{paramName}} === undefined) {
+            throw new Error('Required parameter {{paramName}} was null or undefined when calling {{nickname}}.');
+        }
+
+{{/required}}
+{{/allParams}}
+{{#queryParams}}
+        if ({{paramName}} !== undefined) {
+            localVarQueryParameters['{{baseName}}'] = ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}");
+        }
+
+{{/queryParams}}
+{{#headerParams}}
+        localVarHeaderParams['{{baseName}}'] = ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}");
+{{/headerParams}}
+
+        let localVarUseFormData = false;
+
+{{#formParams}}
+        if ({{paramName}} !== undefined) {
+            {{#isFile}}
+            localVarFormParams['{{baseName}}'] = {{paramName}};
+            {{/isFile}}
+            {{^isFile}}
+            localVarFormParams['{{baseName}}'] = ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}");
+            {{/isFile}}
+        }
+{{#isFile}}
+        localVarUseFormData = true;
+{{/isFile}}
+
+{{/formParams}}
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: '{{httpMethod}}',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+{{^isResponseFile}}
+            json: true,
+{{/isResponseFile}}
+{{#isResponseFile}}
+            encoding: null,
+{{/isResponseFile}}
+{{#bodyParam}}
+            body: ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}")
+{{/bodyParam}}
+        };
+
+{{#authMethods}}
+        this.authentications.{{name}}.applyToRequest(localVarRequestOptions);
+
+{{/authMethods}}
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.{{#supportsES6}}IncomingMessage{{/supportsES6}}{{^supportsES6}}ClientResponse{{/supportsES6}}; {{#returnType}}body: {{{returnType}}}; {{/returnType}}{{^returnType}}body?: any; {{/returnType}} }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    {{#returnType}}
+                    body = ObjectSerializer.deserialize(body, "{{{returnType}}}");
+                    {{/returnType}}
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+{{/operation}}
+}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/typescript-node/api.mustache b/modules/openapi-generator/src/main/resources/typescript-node/api.mustache
index 50cb6cd7e4f563e4ac0b7ac93afee3a110348423..4b76122d807be1033564b07d69f475a8b4cbf959 100644
--- a/modules/openapi-generator/src/main/resources/typescript-node/api.mustache
+++ b/modules/openapi-generator/src/main/resources/typescript-node/api.mustache
@@ -1,476 +1,3 @@
-{{>licenseInfo}}
-import localVarRequest = require('request');
-import http = require('http');
-{{^supportsES6}}
-import Promise = require('bluebird');
-{{/supportsES6}}
-
-let defaultBasePath = '{{{basePath}}}';
-
-// ===============================================
-// This file is autogenerated - Please do not edit
-// ===============================================
-
-/* tslint:disable:no-unused-variable */
-let primitives = [
-                    "string",
-                    "boolean",
-                    "double",
-                    "integer",
-                    "long",
-                    "float",
-                    "number",
-                    "any"
-                 ];
-
-class ObjectSerializer {
-
-    public static findCorrectType(data: any, expectedType: string) {
-        if (data == undefined) {
-            return expectedType;
-        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
-            return expectedType;
-        } else if (expectedType === "Date") {
-            return expectedType;
-        } else {
-            if (enumsMap[expectedType]) {
-                return expectedType;
-            }
-
-            if (!typeMap[expectedType]) {
-                return expectedType; // w/e we don't know the type
-            }
-
-            // Check the discriminator
-            let discriminatorProperty = typeMap[expectedType].discriminator;
-            if (discriminatorProperty == null) {
-                return expectedType; // the type does not have a discriminator. use it.
-            } else {
-                if (data[discriminatorProperty]) {
-                    var discriminatorType = data[discriminatorProperty];
-                    if(typeMap[discriminatorType]){
-                        return discriminatorType; // use the type given in the discriminator
-                    } else {
-                        return expectedType; // discriminator did not map to a type
-                    }
-                } else {
-                    return expectedType; // discriminator was not present (or an empty string)
-                }
-            }
-        }
-    }
-
-    public static serialize(data: any, type: string) {
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.serialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return data.toString();
-        } else {
-            if (enumsMap[type]) {
-                return data;
-            }
-            if (!typeMap[type]) { // in case we dont know the type
-                return data;
-            }
-            
-            // Get the actual type of this object
-            type = this.findCorrectType(data, type);
-
-            // get the map for the correct type.
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            let instance: {[index: string]: any} = {};
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
-            }
-            return instance;
-        }
-    }
-
-    public static deserialize(data: any, type: string) {
-        // polymorphism may change the actual type.
-        type = ObjectSerializer.findCorrectType(data, type);
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.deserialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return new Date(data);
-        } else {
-            if (enumsMap[type]) {// is Enum
-                return data;
-            }
-
-            if (!typeMap[type]) { // dont know the type
-                return data;
-            }
-            let instance = new typeMap[type]();
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
-            }
-            return instance;
-        }
-    }
-}
-
-{{#models}}
-{{#model}}
-{{#description}}
-/**
-* {{{description}}}
-*/
-{{/description}}
-export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{
-{{#vars}}
-{{#description}}
-    /**
-    * {{{description}}}
-    */
-{{/description}}
-    '{{name}}'{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}};
-{{/vars}}
-
-    {{#discriminator}}
-    static discriminator: string | undefined = "{{discriminatorName}}";
-    {{/discriminator}}
-    {{^discriminator}}
-    static discriminator: string | undefined = undefined;
-    {{/discriminator}}
-
-    {{^isArrayModel}}
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {{#vars}}
-        {
-            "name": "{{name}}",
-            "baseName": "{{baseName}}",
-            "type": "{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}"
-        }{{#hasMore}},
-        {{/hasMore}}
-        {{/vars}}
-    ];
-
-    static getAttributeTypeMap() {
-        {{#parent}}
-        return super.getAttributeTypeMap().concat({{classname}}.attributeTypeMap);
-        {{/parent}}
-        {{^parent}}
-        return {{classname}}.attributeTypeMap;
-        {{/parent}}
-    }
-    {{/isArrayModel}}    
-}
-
-{{#hasEnums}}
-export namespace {{classname}} {
-{{#vars}}
-{{#isEnum}}
-    export enum {{enumName}} {
-        {{#allowableValues}}
-        {{#enumVars}}
-        {{name}} = <any> {{{value}}}{{^-last}},{{/-last}}
-        {{/enumVars}}
-        {{/allowableValues}}
-    }
-{{/isEnum}}
-{{/vars}}
-}
-{{/hasEnums}}
-{{/model}}
-{{/models}}
-
-let enumsMap: {[index: string]: any} = {
-    {{#models}}
-        {{#model}}
-            {{#hasEnums}}
-                {{#vars}}
-                    {{#isEnum}}
-        {{#isContainer}}"{{classname}}.{{enumName}}": {{classname}}.{{enumName}}{{/isContainer}}{{#isNotContainer}}"{{datatypeWithEnum}}": {{datatypeWithEnum}}{{/isNotContainer}},
-                    {{/isEnum}}
-                {{/vars}}
-            {{/hasEnums}}
-        {{/model}}
-    {{/models}}
-}
-
-let typeMap: {[index: string]: any} = {
-    {{#models}}
-        {{#model}}
-    "{{classname}}": {{classname}},
-        {{/model}}
-    {{/models}}
-}
-
-export interface Authentication {
-    /**
-    * Apply authentication settings to header and query params.
-    */
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-
-export class HttpBasicAuth implements Authentication {
-    public username: string = '';
-    public password: string = '';
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        requestOptions.auth = {
-            username: this.username, password: this.password
-        }
-    }
-}
-
-export class ApiKeyAuth implements Authentication {
-    public apiKey: string = '';
-
-    constructor(private location: string, private paramName: string) {
-    }
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (this.location == "query") {
-            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
-        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
-            requestOptions.headers[this.paramName] = this.apiKey;
-        }
-    }
-}
-
-export class OAuth implements Authentication {
-    public accessToken: string = '';
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (requestOptions && requestOptions.headers) {
-            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
-        }
-    }
-}
-
-export class VoidAuth implements Authentication {
-    public username: string = '';
-    public password: string = '';
-
-    applyToRequest(_: localVarRequest.Options): void {
-        // Do nothing
-    }
-}
-
-{{#apiInfo}}
-{{#apis}}
-{{#operations}}
-{{#description}}
-/**
-* {{&description}}
-*/
-{{/description}}
-export enum {{classname}}ApiKeys {
-{{#authMethods}}
-{{#isApiKey}}
-    {{name}},
-{{/isApiKey}}
-{{/authMethods}}
-}
-
-export class {{classname}} {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-{{#authMethods}}
-{{#isBasic}}
-        '{{name}}': new HttpBasicAuth(),
-{{/isBasic}}
-{{#isApiKey}}
-        '{{name}}': new ApiKeyAuth({{#isKeyInHeader}}'header'{{/isKeyInHeader}}{{^isKeyInHeader}}'query'{{/isKeyInHeader}}, '{{keyParamName}}'),
-{{/isApiKey}}
-{{#isOAuth}}
-        '{{name}}': new OAuth(),
-{{/isOAuth}}
-{{/authMethods}}
-    }
-
-    constructor(basePath?: string);
-{{#authMethods}}
-{{#isBasic}}
-    constructor(username: string, password: string, basePath?: string);
-{{/isBasic}}
-{{/authMethods}}
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-{{#authMethods}}
-{{#isBasic}}
-            this.username = basePathOrUsername;
-            this.password = password
-{{/isBasic}}
-{{/authMethods}}
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: {{classname}}ApiKeys, value: string) {
-        (this.authentications as any)[{{classname}}ApiKeys[key]].apiKey = value;
-    }
-{{#authMethods}}
-{{#isBasic}}
-    set username(username: string) {
-        this.authentications.{{name}}.username = username;
-    }
-
-    set password(password: string) {
-        this.authentications.{{name}}.password = password;
-    }
-{{/isBasic}}
-{{#isOAuth}}
-
-    set accessToken(token: string) {
-        this.authentications.{{name}}.accessToken = token;
-    }
-{{/isOAuth}}
-{{/authMethods}}
-{{#operation}}
-    /**
-     * {{&notes}}
-     {{#summary}}
-     * @summary {{&summary}}
-     {{/summary}}
-     {{#allParams}}
-     * @param {{paramName}} {{description}}
-     {{/allParams}}
-     */
-    public {{nickname}} ({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) : Promise<{ response: http.{{#supportsES6}}IncomingMessage{{/supportsES6}}{{^supportsES6}}ClientResponse{{/supportsES6}}; {{#returnType}}body: {{{returnType}}}; {{/returnType}}{{^returnType}}body?: any; {{/returnType}} }> {
-        const localVarPath = this.basePath + '{{{path}}}'{{#pathParams}}
-            .replace('{' + '{{baseName}}' + '}', encodeURIComponent(String({{paramName}}))){{/pathParams}};
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-{{#allParams}}
-{{#required}}
-        // verify required parameter '{{paramName}}' is not null or undefined
-        if ({{paramName}} === null || {{paramName}} === undefined) {
-            throw new Error('Required parameter {{paramName}} was null or undefined when calling {{nickname}}.');
-        }
-
-{{/required}}
-{{/allParams}}
-{{#queryParams}}
-        if ({{paramName}} !== undefined) {
-            localVarQueryParameters['{{baseName}}'] = ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}");
-        }
-
-{{/queryParams}}
-{{#headerParams}}
-        localVarHeaderParams['{{baseName}}'] = ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}");
-{{/headerParams}}
-
-        let localVarUseFormData = false;
-
-{{#formParams}}
-        if ({{paramName}} !== undefined) {
-            {{#isFile}}
-            localVarFormParams['{{baseName}}'] = {{paramName}};
-            {{/isFile}}
-            {{^isFile}}
-            localVarFormParams['{{baseName}}'] = ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}");
-            {{/isFile}}
-        }
-{{#isFile}}
-        localVarUseFormData = true;
-{{/isFile}}
-
-{{/formParams}}
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: '{{httpMethod}}',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-{{^isResponseFile}}
-            json: true,
-{{/isResponseFile}}
-{{#isResponseFile}}
-            encoding: null,
-{{/isResponseFile}}
-{{#bodyParam}}
-            body: ObjectSerializer.serialize({{paramName}}, "{{{dataType}}}")
-{{/bodyParam}}
-        };
-
-{{#authMethods}}
-        this.authentications.{{name}}.applyToRequest(localVarRequestOptions);
-
-{{/authMethods}}
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.{{#supportsES6}}IncomingMessage{{/supportsES6}}{{^supportsES6}}ClientResponse{{/supportsES6}}; {{#returnType}}body: {{{returnType}}}; {{/returnType}}{{^returnType}}body?: any; {{/returnType}} }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    {{#returnType}}
-                    body = ObjectSerializer.deserialize(body, "{{{returnType}}}");
-                    {{/returnType}}
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-{{/operation}}
-}
-{{/operations}}
-{{/apis}}
-{{/apiInfo}}
+// This is the entrypoint for the package
+export * from './api/apis';
+export * from './model/models';
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/typescript-node/model.mustache b/modules/openapi-generator/src/main/resources/typescript-node/model.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..0b3ca7589164659f7575037c6c7e35d555cb754b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/typescript-node/model.mustache
@@ -0,0 +1,69 @@
+{{>licenseInfo}}
+{{#models}}
+{{#model}}
+{{#tsImports}}
+import { {{classname}} } from './{{filename}}';
+{{/tsImports}}
+
+{{#description}}
+/**
+* {{{description}}}
+*/
+{{/description}}
+export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{
+{{#vars}}
+{{#description}}
+    /**
+    * {{{description}}}
+    */
+{{/description}}
+    '{{name}}'{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}};
+{{/vars}}
+
+    {{#discriminator}}
+    static discriminator: string | undefined = "{{discriminatorName}}";
+    {{/discriminator}}
+    {{^discriminator}}
+    static discriminator: string | undefined = undefined;
+    {{/discriminator}}
+
+    {{^isArrayModel}}
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {{#vars}}
+        {
+            "name": "{{name}}",
+            "baseName": "{{baseName}}",
+            "type": "{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}"
+        }{{#hasMore}},
+        {{/hasMore}}
+        {{/vars}}
+    ];
+
+    static getAttributeTypeMap() {
+        {{#parent}}
+        return super.getAttributeTypeMap().concat({{classname}}.attributeTypeMap);
+        {{/parent}}
+        {{^parent}}
+        return {{classname}}.attributeTypeMap;
+        {{/parent}}
+    }
+    {{/isArrayModel}}    
+}
+
+{{#hasEnums}}
+export namespace {{classname}} {
+{{#vars}}
+{{#isEnum}}
+    export enum {{enumName}} {
+        {{#allowableValues}}
+        {{#enumVars}}
+        {{name}} = <any> {{{value}}}{{^-last}},{{/-last}}
+        {{/enumVars}}
+        {{/allowableValues}}
+    }
+{{/isEnum}}
+{{/vars}}
+}
+{{/hasEnums}}
+{{/model}}
+{{/models}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/typescript-node/models.mustache b/modules/openapi-generator/src/main/resources/typescript-node/models.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..27934012161112a0643072bada5a461cedac03d5
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/typescript-node/models.mustache
@@ -0,0 +1,210 @@
+{{#models}}
+{{#model}}
+export * from './{{{ classFilename }}}';
+{{/model}}
+{{/models}}
+
+import localVarRequest = require('request');
+
+{{#models}}
+{{#model}}
+import { {{classname}} } from './{{{ classFilename }}}';
+{{/model}}
+{{/models}}
+
+/* tslint:disable:no-unused-variable */
+let primitives = [
+                    "string",
+                    "boolean",
+                    "double",
+                    "integer",
+                    "long",
+                    "float",
+                    "number",
+                    "any"
+                 ];
+                 
+let enumsMap: {[index: string]: any} = {
+    {{#models}}
+        {{#model}}
+            {{#hasEnums}}
+                {{#vars}}
+                    {{#isEnum}}
+        {{#isContainer}}"{{classname}}.{{enumName}}": {{classname}}.{{enumName}}{{/isContainer}}{{#isNotContainer}}"{{datatypeWithEnum}}": {{datatypeWithEnum}}{{/isNotContainer}},
+                    {{/isEnum}}
+                {{/vars}}
+            {{/hasEnums}}
+        {{/model}}
+    {{/models}}
+}
+
+let typeMap: {[index: string]: any} = {
+    {{#models}}
+        {{#model}}
+    "{{classname}}": {{classname}},
+        {{/model}}
+    {{/models}}
+}
+
+export class ObjectSerializer {
+    public static findCorrectType(data: any, expectedType: string) {
+        if (data == undefined) {
+            return expectedType;
+        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
+            return expectedType;
+        } else if (expectedType === "Date") {
+            return expectedType;
+        } else {
+            if (enumsMap[expectedType]) {
+                return expectedType;
+            }
+
+            if (!typeMap[expectedType]) {
+                return expectedType; // w/e we don't know the type
+            }
+
+            // Check the discriminator
+            let discriminatorProperty = typeMap[expectedType].discriminator;
+            if (discriminatorProperty == null) {
+                return expectedType; // the type does not have a discriminator. use it.
+            } else {
+                if (data[discriminatorProperty]) {
+                    var discriminatorType = data[discriminatorProperty];
+                    if(typeMap[discriminatorType]){
+                        return discriminatorType; // use the type given in the discriminator
+                    } else {
+                        return expectedType; // discriminator did not map to a type
+                    }
+                } else {
+                    return expectedType; // discriminator was not present (or an empty string)
+                }
+            }
+        }
+    }
+
+    public static serialize(data: any, type: string) {
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.serialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return data.toString();
+        } else {
+            if (enumsMap[type]) {
+                return data;
+            }
+            if (!typeMap[type]) { // in case we dont know the type
+                return data;
+            }
+            
+            // Get the actual type of this object
+            type = this.findCorrectType(data, type);
+
+            // get the map for the correct type.
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            let instance: {[index: string]: any} = {};
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
+            }
+            return instance;
+        }
+    }
+
+    public static deserialize(data: any, type: string) {
+        // polymorphism may change the actual type.
+        type = ObjectSerializer.findCorrectType(data, type);
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.deserialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return new Date(data);
+        } else {
+            if (enumsMap[type]) {// is Enum
+                return data;
+            }
+
+            if (!typeMap[type]) { // dont know the type
+                return data;
+            }
+            let instance = new typeMap[type]();
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
+            }
+            return instance;
+        }
+    }
+}
+
+export interface Authentication {
+    /**
+    * Apply authentication settings to header and query params.
+    */
+    applyToRequest(requestOptions: localVarRequest.Options): void;
+}
+
+export class HttpBasicAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        requestOptions.auth = {
+            username: this.username, password: this.password
+        }
+    }
+}
+
+export class ApiKeyAuth implements Authentication {
+    public apiKey: string = '';
+
+    constructor(private location: string, private paramName: string) {
+    }
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (this.location == "query") {
+            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
+        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
+            requestOptions.headers[this.paramName] = this.apiKey;
+        }
+    }
+}
+
+export class OAuth implements Authentication {
+    public accessToken: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (requestOptions && requestOptions.headers) {
+            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
+        }
+    }
+}
+
+export class VoidAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(_: localVarRequest.Options): void {
+        // Do nothing
+    }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/typescript-node/package.mustache b/modules/openapi-generator/src/main/resources/typescript-node/package.mustache
index 74936a63284e0543297634b0d49d20b089cb1e13..0bd3ae01df0b8abf88f680543e87a7f8cb768b29 100644
--- a/modules/openapi-generator/src/main/resources/typescript-node/package.mustache
+++ b/modules/openapi-generator/src/main/resources/typescript-node/package.mustache
@@ -16,12 +16,13 @@
         "bluebird": "^3.5.0",
         "request": "^2.81.0",
         "@types/bluebird": "*",
-        "@types/request": "*"
+        "@types/request": "*",
+        "rewire": "^3.0.2"
     },
     "devDependencies": {
         "typescript": "^2.4.2"
     }{{#npmRepository}},
-    "publishConfig":{
-        "registry":"{{npmRepository}}"
+    "publishConfig": {
+        "registry": "{{npmRepository}}"
     }{{/npmRepository}}
 }
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptNodeClientOptionsProvider.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptNodeClientOptionsProvider.java
index 9ae03f9399197e37233647d9152ef6e5067dfd3c..75a18e87d9e4c708ae10a1322e612bff09fb15be 100644
--- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptNodeClientOptionsProvider.java
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptNodeClientOptionsProvider.java
@@ -33,6 +33,7 @@ public class TypeScriptNodeClientOptionsProvider implements OptionsProvider {
     public static final String NMP_NAME = "npmName";
     public static final String NMP_VERSION = "1.1.2";
     public static final String NPM_REPOSITORY = "https://registry.npmjs.org";
+    public static final String API_SUFFIX = "Api";
     public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
     public static final String PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = "true";
 
diff --git a/samples/client/petstore-security-test/typescript-node/.openapi-generator-ignore b/samples/client/petstore-security-test/typescript-node/.openapi-generator-ignore
index c5fa491b4c557bf997d5dd21797de782545dc9e5..7484ee590a3894506cf063799b885428f95a71be 100644
--- a/samples/client/petstore-security-test/typescript-node/.openapi-generator-ignore
+++ b/samples/client/petstore-security-test/typescript-node/.openapi-generator-ignore
@@ -1,11 +1,11 @@
-# Swagger Codegen Ignore
-# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
 
 # Use this file to prevent files from being overwritten by the generator.
 # The patterns follow closely to .gitignore or .dockerignore.
 
 # As an example, the C# client generator defines ApiClient.cs.
-# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
 #ApiClient.cs
 
 # You can match any string of characters against a directory, file or extension with a single asterisk (*):
diff --git a/samples/client/petstore-security-test/typescript-node/.openapi-generator/VERSION b/samples/client/petstore-security-test/typescript-node/.openapi-generator/VERSION
index f9f7450d1359c082233b7926304d9af245dbc0ca..82602aa4190d566de11d01dd77a97d3a3d19515d 100644
--- a/samples/client/petstore-security-test/typescript-node/.openapi-generator/VERSION
+++ b/samples/client/petstore-security-test/typescript-node/.openapi-generator/VERSION
@@ -1 +1 @@
-2.3.0-SNAPSHOT
\ No newline at end of file
+3.0.3-SNAPSHOT
\ No newline at end of file
diff --git a/samples/client/petstore-security-test/typescript-node/api.ts b/samples/client/petstore-security-test/typescript-node/api.ts
index ed9c4082078ed15d49296abcd9c5c62658848907..4b76122d807be1033564b07d69f475a8b4cbf959 100644
--- a/samples/client/petstore-security-test/typescript-node/api.ts
+++ b/samples/client/petstore-security-test/typescript-node/api.ts
@@ -1,321 +1,3 @@
-/**
- * Swagger Petstore *_/ ' \" =end -- \\r\\n \\n \\r
- * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  *_/ ' \" =end --       
- *
- * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r
- * Contact: apiteam@swagger.io *_/ ' \" =end -- \\r\\n \\n \\r
- *
- * NOTE: This class is auto generated by the swagger code generator program.
- * https://github.com/swagger-api/swagger-codegen.git
- * Do not edit the class manually.
- */
-
-import localVarRequest = require('request');
-import http = require('http');
-import Promise = require('bluebird');
-
-let defaultBasePath = 'https://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r';
-
-// ===============================================
-// This file is autogenerated - Please do not edit
-// ===============================================
-
-/* tslint:disable:no-unused-variable */
-let primitives = [
-                    "string",
-                    "boolean",
-                    "double",
-                    "integer",
-                    "long",
-                    "float",
-                    "number",
-                    "any"
-                 ];
-
-class ObjectSerializer {
-
-    public static findCorrectType(data: any, expectedType: string) {
-        if (data == undefined) {
-            return expectedType;
-        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
-            return expectedType;
-        } else if (expectedType === "Date") {
-            return expectedType;
-        } else {
-            if (enumsMap[expectedType]) {
-                return expectedType;
-            }
-
-            if (!typeMap[expectedType]) {
-                return expectedType; // w/e we don't know the type
-            }
-
-            // Check the discriminator
-            let discriminatorProperty = typeMap[expectedType].discriminator;
-            if (discriminatorProperty == null) {
-                return expectedType; // the type does not have a discriminator. use it.
-            } else {
-                if (data[discriminatorProperty]) {
-                    return data[discriminatorProperty]; // use the type given in the discriminator
-                } else {
-                    return expectedType; // discriminator was not present (or an empty string)
-                }
-            }
-        }
-    }
-
-    public static serialize(data: any, type: string) {
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.serialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return data.toString();
-        } else {
-            if (enumsMap[type]) {
-                return data;
-            }
-            if (!typeMap[type]) { // in case we dont know the type
-                return data;
-            }
-
-            // get the map for the correct type.
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            let instance: {[index: string]: any} = {};
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
-            }
-            return instance;
-        }
-    }
-
-    public static deserialize(data: any, type: string) {
-        // polymorphism may change the actual type.
-        type = ObjectSerializer.findCorrectType(data, type);
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.deserialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return new Date(data);
-        } else {
-            if (enumsMap[type]) {// is Enum
-                return data;
-            }
-
-            if (!typeMap[type]) { // dont know the type
-                return data;
-            }
-            let instance = new typeMap[type]();
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
-            }
-            return instance;
-        }
-    }
-}
-
-/**
-* Model for testing reserved words  *_/ ' \" =end -- \\r\\n \\n \\r
-*/
-export class ModelReturn {
-    /**
-    * property description  *_/ ' \" =end -- \\r\\n \\n \\r
-    */
-    'return': number;
-
-    static discriminator = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "return",
-            "baseName": "return",
-            "type": "number"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return ModelReturn.attributeTypeMap;
-    }
-}
-
-
-let enumsMap: {[index: string]: any} = {
-}
-
-let typeMap: {[index: string]: any} = {
-    "ModelReturn": ModelReturn,
-}
-
-export interface Authentication {
-    /**
-    * Apply authentication settings to header and query params.
-    */
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-
-export class HttpBasicAuth implements Authentication {
-    public username: string;
-    public password: string;
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        requestOptions.auth = {
-            username: this.username, password: this.password
-        }
-    }
-}
-
-export class ApiKeyAuth implements Authentication {
-    public apiKey: string;
-
-    constructor(private location: string, private paramName: string) {
-    }
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (this.location == "query") {
-            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
-        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
-            requestOptions.headers[this.paramName] = this.apiKey;
-        }
-    }
-}
-
-export class OAuth implements Authentication {
-    public accessToken: string;
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (requestOptions && requestOptions.headers) {
-            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
-        }
-    }
-}
-
-export class VoidAuth implements Authentication {
-    public username: string;
-    public password: string;
-    applyToRequest(_: localVarRequest.Options): void {
-        // Do nothing
-    }
-}
-
-export enum FakeApiApiKeys {
-    api_key,
-}
-
-export class FakeApi {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-        'api_key': new ApiKeyAuth('header', 'api_key  */ &#39; &quot; &#x3D;end -- \r\n \n \r'),
-        'petstore_auth': new OAuth(),
-    }
-
-    constructor(basePath?: string);
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: FakeApiApiKeys, value: string) {
-        (this.authentications as any)[FakeApiApiKeys[key]].apiKey = value;
-    }
-
-    set accessToken(token: string) {
-        this.authentications.petstore_auth.accessToken = token;
-    }
-    /**
-     * 
-     * @summary To test code injection *_/ ' \" =end -- \\r\\n \\n \\r
-     * @param test code inject * &#39; &quot; &#x3D;end  rn n r To test code injection *_/ &#39; \&quot; &#x3D;end -- \\r\\n \\n \\r
-     */
-    public testCodeInjectEndRnNR (test code inject * &#39; &quot; &#x3D;end  rn n r?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/fake';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-
-        let localVarUseFormData = false;
-
-        if (test code inject * &#39; &quot; &#x3D;end  rn n r !== undefined) {
-            localVarFormParams['test code inject */ &#39; &quot; &#x3D;end -- \r\n \n \r'] = ObjectSerializer.serialize(test code inject * &#39; &quot; &#x3D;end  rn n r, "string");
-        }
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'PUT',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-}
+// This is the entrypoint for the package
+export * from './api/apis';
+export * from './model/models';
\ No newline at end of file
diff --git a/samples/client/petstore-security-test/typescript-node/api/apis.ts b/samples/client/petstore-security-test/typescript-node/api/apis.ts
new file mode 100644
index 0000000000000000000000000000000000000000..192d350dd3a284214e91d409356bfa9a0c2c293c
--- /dev/null
+++ b/samples/client/petstore-security-test/typescript-node/api/apis.ts
@@ -0,0 +1,3 @@
+export * from './fakeApi';
+import { FakeApi } from './fakeApi';
+export const APIS = [FakeApi];
diff --git a/samples/client/petstore-security-test/typescript-node/api/fakeApi.ts b/samples/client/petstore-security-test/typescript-node/api/fakeApi.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e40f35702d40a01d54520fb919bb815d10e67282
--- /dev/null
+++ b/samples/client/petstore-security-test/typescript-node/api/fakeApi.ts
@@ -0,0 +1,119 @@
+/**
+ * OpenAPI Petstore *_/ ' \" =end -- \\r\\n \\n \\r
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  *_/ ' \" =end --       
+ *
+ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r
+ * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import localVarRequest = require('request');
+import http = require('http');
+import Promise = require('bluebird');
+
+/* tslint:disable:no-unused-locals */
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = 'petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum FakeApiApiKeys {
+}
+
+export class FakeApi {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+    }
+
+    constructor(basePath?: string);
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: FakeApiApiKeys, value: string) {
+        (this.authentications as any)[FakeApiApiKeys[key]].apiKey = value;
+    }
+
+    /**
+     * 
+     * @summary To test code injection *_/ ' \" =end -- \\r\\n \\n \\r
+     * @param UNKNOWN_BASE_TYPE 
+     */
+    public testCodeInjectEndRnNR (UNKNOWN_BASE_TYPE?: any) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/fake';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'PUT',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(UNKNOWN_BASE_TYPE, "any")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+}
diff --git a/samples/client/petstore-security-test/typescript-node/git_push.sh b/samples/client/petstore-security-test/typescript-node/git_push.sh
index ae01b182ae9eb047d0999a496b060e62d7b01e5c..8442b80bb4456c20d67f6442dbbeacd991a066d2 100644
--- a/samples/client/petstore-security-test/typescript-node/git_push.sh
+++ b/samples/client/petstore-security-test/typescript-node/git_push.sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
 #
-# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"
+# Usage example: /bin/sh ./git_push.sh wing328 openapi-pestore-perl "minor update"
 
 git_user_id=$1
 git_repo_id=$2
diff --git a/samples/client/petstore-security-test/typescript-node/model/modelReturn.ts b/samples/client/petstore-security-test/typescript-node/model/modelReturn.ts
new file mode 100644
index 0000000000000000000000000000000000000000..38c7c6ed19525be31dfcb9491eeedc27d6732085
--- /dev/null
+++ b/samples/client/petstore-security-test/typescript-node/model/modelReturn.ts
@@ -0,0 +1,36 @@
+/**
+ * OpenAPI Petstore *_/ ' \" =end -- \\r\\n \\n \\r
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  *_/ ' \" =end --       
+ *
+ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r
+ * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* Model for testing reserved words  *_/ ' \" =end -- \\r\\n \\n \\r
+*/
+export class ModelReturn {
+    /**
+    * property description  *_/ ' \" =end -- \\r\\n \\n \\r
+    */
+    '_return'?: number;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "_return",
+            "baseName": "return",
+            "type": "number"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return ModelReturn.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore-security-test/typescript-node/model/models.ts b/samples/client/petstore-security-test/typescript-node/model/models.ts
new file mode 100644
index 0000000000000000000000000000000000000000..37288a0f189f55fdd51aeb4373e443e5683cc39c
--- /dev/null
+++ b/samples/client/petstore-security-test/typescript-node/model/models.ts
@@ -0,0 +1,187 @@
+export * from './modelReturn';
+
+import localVarRequest = require('request');
+
+import { ModelReturn } from './modelReturn';
+
+/* tslint:disable:no-unused-variable */
+let primitives = [
+                    "string",
+                    "boolean",
+                    "double",
+                    "integer",
+                    "long",
+                    "float",
+                    "number",
+                    "any"
+                 ];
+                 
+let enumsMap: {[index: string]: any} = {
+}
+
+let typeMap: {[index: string]: any} = {
+    "ModelReturn": ModelReturn,
+}
+
+export class ObjectSerializer {
+    public static findCorrectType(data: any, expectedType: string) {
+        if (data == undefined) {
+            return expectedType;
+        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
+            return expectedType;
+        } else if (expectedType === "Date") {
+            return expectedType;
+        } else {
+            if (enumsMap[expectedType]) {
+                return expectedType;
+            }
+
+            if (!typeMap[expectedType]) {
+                return expectedType; // w/e we don't know the type
+            }
+
+            // Check the discriminator
+            let discriminatorProperty = typeMap[expectedType].discriminator;
+            if (discriminatorProperty == null) {
+                return expectedType; // the type does not have a discriminator. use it.
+            } else {
+                if (data[discriminatorProperty]) {
+                    var discriminatorType = data[discriminatorProperty];
+                    if(typeMap[discriminatorType]){
+                        return discriminatorType; // use the type given in the discriminator
+                    } else {
+                        return expectedType; // discriminator did not map to a type
+                    }
+                } else {
+                    return expectedType; // discriminator was not present (or an empty string)
+                }
+            }
+        }
+    }
+
+    public static serialize(data: any, type: string) {
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.serialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return data.toString();
+        } else {
+            if (enumsMap[type]) {
+                return data;
+            }
+            if (!typeMap[type]) { // in case we dont know the type
+                return data;
+            }
+            
+            // Get the actual type of this object
+            type = this.findCorrectType(data, type);
+
+            // get the map for the correct type.
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            let instance: {[index: string]: any} = {};
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
+            }
+            return instance;
+        }
+    }
+
+    public static deserialize(data: any, type: string) {
+        // polymorphism may change the actual type.
+        type = ObjectSerializer.findCorrectType(data, type);
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.deserialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return new Date(data);
+        } else {
+            if (enumsMap[type]) {// is Enum
+                return data;
+            }
+
+            if (!typeMap[type]) { // dont know the type
+                return data;
+            }
+            let instance = new typeMap[type]();
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
+            }
+            return instance;
+        }
+    }
+}
+
+export interface Authentication {
+    /**
+    * Apply authentication settings to header and query params.
+    */
+    applyToRequest(requestOptions: localVarRequest.Options): void;
+}
+
+export class HttpBasicAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        requestOptions.auth = {
+            username: this.username, password: this.password
+        }
+    }
+}
+
+export class ApiKeyAuth implements Authentication {
+    public apiKey: string = '';
+
+    constructor(private location: string, private paramName: string) {
+    }
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (this.location == "query") {
+            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
+        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
+            requestOptions.headers[this.paramName] = this.apiKey;
+        }
+    }
+}
+
+export class OAuth implements Authentication {
+    public accessToken: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (requestOptions && requestOptions.headers) {
+            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
+        }
+    }
+}
+
+export class VoidAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(_: localVarRequest.Options): void {
+        // Do nothing
+    }
+}
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/default/.openapi-generator/VERSION b/samples/client/petstore/typescript-node/default/.openapi-generator/VERSION
index 096bf47efe318864bcd257dd33de7b12f82321cb..82602aa4190d566de11d01dd77a97d3a3d19515d 100644
--- a/samples/client/petstore/typescript-node/default/.openapi-generator/VERSION
+++ b/samples/client/petstore/typescript-node/default/.openapi-generator/VERSION
@@ -1 +1 @@
-3.0.0-SNAPSHOT
\ No newline at end of file
+3.0.3-SNAPSHOT
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/default/api.js b/samples/client/petstore/typescript-node/default/api.js
deleted file mode 100644
index 3860eec145e227970c6dfd13fec1caeec96b7582..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/default/api.js
+++ /dev/null
@@ -1,1502 +0,0 @@
-/**
- * Swagger Petstore
- * This is a sample server Petstore server.  You can find out more about Swagger at <a href=\"http://swagger.io\">http://swagger.io</a> or on irc.freenode.net, #swagger.  For this sample, you can use the api key \"special-key\" to test the authorization filters
- *
- * OpenAPI spec version: 1.0.0
- * Contact: apiteam@wordnik.com
- *
- * NOTE: This class is auto generated by the swagger code generator program.
- * https://github.com/swagger-api/swagger-codegen.git
- * Do not edit the class manually.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-"use strict";
-var request = require('request');
-var Promise = require('bluebird');
-var defaultBasePath = 'http://petstore.swagger.io/v2';
-// ===============================================
-// This file is autogenerated - Please do not edit
-// ===============================================
-/* tslint:disable:no-unused-variable */
-var primitives = ["string",
-    "String",
-    "boolean",
-    "Boolean",
-    "Double",
-    "Integer",
-    "Long",
-    "Float",
-    "number",
-    "any"];
-var ObjectSerializer = (function () {
-    function ObjectSerializer() {
-    }
-    ObjectSerializer.serialize = function (data, type) {
-        if (data == null) {
-            return data;
-        }
-        else if (primitives.indexOf(type) !== -1) {
-            return data.toString(); // i hope the cast is done automatically			
-        }
-        else if (type.lastIndexOf("Array<", 0) === 0) {
-            var subType = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            var transformedData = [];
-            for (var index in data) {
-                var date = data[index];
-                transformedData.push(ObjectSerializer.serialize(date, subType)); // TODO: fix
-            }
-            return transformedData;
-        }
-        else if (type === "Date") {
-            return data.toString();
-        }
-        else {
-            if (!instanceFunctionsMap[type]) {
-                console.log("Couldn't parse type " + type);
-                return data;
-            }
-            var instance = instanceFunctionsMap[type]();
-            if (typeof instance.getAttributeTypeMap === "undefined") {
-                return instance[data];
-            }
-            var attributeTypes = instance.getAttributeTypeMap();
-            for (var index in attributeTypes) {
-                var attributeType = attributeTypes[index];
-                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
-            }
-            return instance;
-        }
-    };
-    ObjectSerializer.deserialize = function (data, type) {
-        if (data == null) {
-            return data;
-        }
-        else if (primitives.indexOf(type) !== -1) {
-            return data; // i hope the cast is done automatically			
-        }
-        else if (type.lastIndexOf("Array<", 0) === 0) {
-            var subType = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            var transformedData = [];
-            for (var index in data) {
-                var date = data[index];
-                transformedData.push(ObjectSerializer.deserialize(date, subType)); // TODO: fix
-            }
-            return transformedData;
-        }
-        else if (type === "Date") {
-            return new Date(data);
-        }
-        else {
-            if (!instanceFunctionsMap[type]) {
-                console.log("Couldn't parse type " + type);
-                return data;
-            }
-            var instance = instanceFunctionsMap[type]();
-            if (typeof instance.getAttributeTypeMap === "undefined") {
-                return instance[data];
-            }
-            var attributeTypes = instance.getAttributeTypeMap();
-            for (var index in attributeTypes) {
-                var attributeType = attributeTypes[index];
-                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
-            }
-            return instance;
-        }
-    };
-    return ObjectSerializer;
-}());
-var instanceFunctionsMap = {
-    "Category": function () { return new Category(); },
-    "Order.StatusEnum": function () { return Order.StatusEnum; },
-    "Order": function () { return new Order(); },
-    "Pet.StatusEnum": function () { return Pet.StatusEnum; },
-    "Pet": function () { return new Pet(); },
-    "Tag": function () { return new Tag(); },
-    "User": function () { return new User(); },
-};
-var Category = (function () {
-    function Category() {
-    }
-    Category.prototype.getAttributeTypeMap = function () {
-        return Category.attributeTypeMap;
-    };
-    Category.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }];
-    return Category;
-}());
-exports.Category = Category;
-var Order = (function () {
-    function Order() {
-    }
-    Order.prototype.getAttributeTypeMap = function () {
-        return Order.attributeTypeMap;
-    };
-    Order.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "petId",
-            "baseName": "petId",
-            "type": "number"
-        },
-        {
-            "name": "quantity",
-            "baseName": "quantity",
-            "type": "number"
-        },
-        {
-            "name": "shipDate",
-            "baseName": "shipDate",
-            "type": "Date"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Order.StatusEnum"
-        },
-        {
-            "name": "complete",
-            "baseName": "complete",
-            "type": "boolean"
-        }];
-    return Order;
-}());
-exports.Order = Order;
-var Order;
-(function (Order) {
-    (function (StatusEnum) {
-        StatusEnum[StatusEnum["Placed"] = 'placed'] = "Placed";
-        StatusEnum[StatusEnum["Approved"] = 'approved'] = "Approved";
-        StatusEnum[StatusEnum["Delivered"] = 'delivered'] = "Delivered";
-    })(Order.StatusEnum || (Order.StatusEnum = {}));
-    var StatusEnum = Order.StatusEnum;
-})(Order = exports.Order || (exports.Order = {}));
-var Pet = (function () {
-    function Pet() {
-    }
-    Pet.prototype.getAttributeTypeMap = function () {
-        return Pet.attributeTypeMap;
-    };
-    Pet.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "category",
-            "baseName": "category",
-            "type": "Category"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        },
-        {
-            "name": "photoUrls",
-            "baseName": "photoUrls",
-            "type": "Array<string>"
-        },
-        {
-            "name": "tags",
-            "baseName": "tags",
-            "type": "Array<Tag>"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Pet.StatusEnum"
-        }];
-    return Pet;
-}());
-exports.Pet = Pet;
-var Pet;
-(function (Pet) {
-    (function (StatusEnum) {
-        StatusEnum[StatusEnum["Available"] = 'available'] = "Available";
-        StatusEnum[StatusEnum["Pending"] = 'pending'] = "Pending";
-        StatusEnum[StatusEnum["Sold"] = 'sold'] = "Sold";
-    })(Pet.StatusEnum || (Pet.StatusEnum = {}));
-    var StatusEnum = Pet.StatusEnum;
-})(Pet = exports.Pet || (exports.Pet = {}));
-var Tag = (function () {
-    function Tag() {
-    }
-    Tag.prototype.getAttributeTypeMap = function () {
-        return Tag.attributeTypeMap;
-    };
-    Tag.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }];
-    return Tag;
-}());
-exports.Tag = Tag;
-var User = (function () {
-    function User() {
-    }
-    User.prototype.getAttributeTypeMap = function () {
-        return User.attributeTypeMap;
-    };
-    User.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "username",
-            "baseName": "username",
-            "type": "string"
-        },
-        {
-            "name": "firstName",
-            "baseName": "firstName",
-            "type": "string"
-        },
-        {
-            "name": "lastName",
-            "baseName": "lastName",
-            "type": "string"
-        },
-        {
-            "name": "email",
-            "baseName": "email",
-            "type": "string"
-        },
-        {
-            "name": "password",
-            "baseName": "password",
-            "type": "string"
-        },
-        {
-            "name": "phone",
-            "baseName": "phone",
-            "type": "string"
-        },
-        {
-            "name": "userStatus",
-            "baseName": "userStatus",
-            "type": "number"
-        }];
-    return User;
-}());
-exports.User = User;
-var HttpBasicAuth = (function () {
-    function HttpBasicAuth() {
-    }
-    HttpBasicAuth.prototype.applyToRequest = function (requestOptions) {
-        requestOptions.auth = {
-            username: this.username, password: this.password
-        };
-    };
-    return HttpBasicAuth;
-}());
-exports.HttpBasicAuth = HttpBasicAuth;
-var ApiKeyAuth = (function () {
-    function ApiKeyAuth(location, paramName) {
-        this.location = location;
-        this.paramName = paramName;
-    }
-    ApiKeyAuth.prototype.applyToRequest = function (requestOptions) {
-        if (this.location == "query") {
-            requestOptions.qs[this.paramName] = this.apiKey;
-        }
-        else if (this.location == "header") {
-            requestOptions.headers[this.paramName] = this.apiKey;
-        }
-    };
-    return ApiKeyAuth;
-}());
-exports.ApiKeyAuth = ApiKeyAuth;
-var OAuth = (function () {
-    function OAuth() {
-    }
-    OAuth.prototype.applyToRequest = function (requestOptions) {
-        requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
-    };
-    return OAuth;
-}());
-exports.OAuth = OAuth;
-var VoidAuth = (function () {
-    function VoidAuth() {
-    }
-    VoidAuth.prototype.applyToRequest = function (requestOptions) {
-        // Do nothing
-    };
-    return VoidAuth;
-}());
-exports.VoidAuth = VoidAuth;
-(function (PetApiApiKeys) {
-    PetApiApiKeys[PetApiApiKeys["api_key"] = 0] = "api_key";
-})(exports.PetApiApiKeys || (exports.PetApiApiKeys = {}));
-var PetApiApiKeys = exports.PetApiApiKeys;
-var PetApi = (function () {
-    function PetApi(basePathOrUsername, password, basePath) {
-        this.basePath = defaultBasePath;
-        this.defaultHeaders = {};
-        this._useQuerystring = false;
-        this.authentications = {
-            'default': new VoidAuth(),
-            'api_key': new ApiKeyAuth('header', 'api_key'),
-            'petstore_auth': new OAuth(),
-        };
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        }
-        else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername;
-            }
-        }
-    }
-    Object.defineProperty(PetApi.prototype, "useQuerystring", {
-        set: function (value) {
-            this._useQuerystring = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    PetApi.prototype.setApiKey = function (key, value) {
-        this.authentications[PetApiApiKeys[key]].apiKey = value;
-    };
-    Object.defineProperty(PetApi.prototype, "accessToken", {
-        set: function (token) {
-            this.authentications.petstore_auth.accessToken = token;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    PetApi.prototype.extendObj = function (objA, objB) {
-        for (var key in objB) {
-            if (objB.hasOwnProperty(key)) {
-                objA[key] = objB[key];
-            }
-        }
-        return objA;
-    };
-    /**
-     * Add a new pet to the store
-     *
-     * @param body Pet object that needs to be added to the store
-     */
-    PetApi.prototype.addPet = function (body) {
-        var localVarPath = this.basePath + '/pet';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'POST',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(body, "Pet")
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Deletes a pet
-     *
-     * @param petId Pet id to delete
-     * @param apiKey
-     */
-    PetApi.prototype.deletePet = function (petId, apiKey) {
-        var localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', String(petId));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling deletePet.');
-        }
-        headerParams['api_key'] = ObjectSerializer.serialize(apiKey, "string");
-        var useFormData = false;
-        var requestOptions = {
-            method: 'DELETE',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Finds Pets by status
-     * Multiple status values can be provided with comma separated strings
-     * @param status Status values that need to be considered for filter
-     */
-    PetApi.prototype.findPetsByStatus = function (status) {
-        var localVarPath = this.basePath + '/pet/findByStatus';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        if (status !== undefined) {
-            queryParameters['status'] = ObjectSerializer.serialize(status, "Array&lt;string&gt;");
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Finds Pets by tags
-     * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
-     * @param tags Tags to filter by
-     */
-    PetApi.prototype.findPetsByTags = function (tags) {
-        var localVarPath = this.basePath + '/pet/findByTags';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        if (tags !== undefined) {
-            queryParameters['tags'] = ObjectSerializer.serialize(tags, "Array&lt;string&gt;");
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Find pet by ID
-     * Returns a pet when ID &lt; 10.  ID &gt; 10 or nonintegers will simulate API error conditions
-     * @param petId ID of pet that needs to be fetched
-     */
-    PetApi.prototype.getPetById = function (petId) {
-        var localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', String(petId));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling getPetById.');
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.api_key.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Pet");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Update an existing pet
-     *
-     * @param body Pet object that needs to be added to the store
-     */
-    PetApi.prototype.updatePet = function (body) {
-        var localVarPath = this.basePath + '/pet';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'PUT',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(body, "Pet")
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Updates a pet in the store with form data
-     *
-     * @param petId ID of pet that needs to be updated
-     * @param name Updated name of the pet
-     * @param status Updated status of the pet
-     */
-    PetApi.prototype.updatePetWithForm = function (petId, name, status) {
-        var localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', String(petId));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling updatePetWithForm.');
-        }
-        var useFormData = false;
-        if (name !== undefined) {
-            formParams['name'] = ObjectSerializer.serialize(name, "string");
-        }
-        if (status !== undefined) {
-            formParams['status'] = ObjectSerializer.serialize(status, "string");
-        }
-        var requestOptions = {
-            method: 'POST',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * uploads an image
-     *
-     * @param petId ID of pet to update
-     * @param additionalMetadata Additional data to pass to server
-     * @param file file to upload
-     */
-    PetApi.prototype.uploadFile = function (petId, additionalMetadata, file) {
-        var localVarPath = this.basePath + '/pet/{petId}/uploadImage'
-            .replace('{' + 'petId' + '}', String(petId));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling uploadFile.');
-        }
-        var useFormData = false;
-        if (additionalMetadata !== undefined) {
-            formParams['additionalMetadata'] = ObjectSerializer.serialize(additionalMetadata, "string");
-        }
-        if (file !== undefined) {
-            formParams['file'] = file;
-        }
-        useFormData = true;
-        var requestOptions = {
-            method: 'POST',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    return PetApi;
-}());
-exports.PetApi = PetApi;
-(function (StoreApiApiKeys) {
-    StoreApiApiKeys[StoreApiApiKeys["api_key"] = 0] = "api_key";
-})(exports.StoreApiApiKeys || (exports.StoreApiApiKeys = {}));
-var StoreApiApiKeys = exports.StoreApiApiKeys;
-var StoreApi = (function () {
-    function StoreApi(basePathOrUsername, password, basePath) {
-        this.basePath = defaultBasePath;
-        this.defaultHeaders = {};
-        this._useQuerystring = false;
-        this.authentications = {
-            'default': new VoidAuth(),
-            'api_key': new ApiKeyAuth('header', 'api_key'),
-            'petstore_auth': new OAuth(),
-        };
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        }
-        else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername;
-            }
-        }
-    }
-    Object.defineProperty(StoreApi.prototype, "useQuerystring", {
-        set: function (value) {
-            this._useQuerystring = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StoreApi.prototype.setApiKey = function (key, value) {
-        this.authentications[StoreApiApiKeys[key]].apiKey = value;
-    };
-    Object.defineProperty(StoreApi.prototype, "accessToken", {
-        set: function (token) {
-            this.authentications.petstore_auth.accessToken = token;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StoreApi.prototype.extendObj = function (objA, objB) {
-        for (var key in objB) {
-            if (objB.hasOwnProperty(key)) {
-                objA[key] = objB[key];
-            }
-        }
-        return objA;
-    };
-    /**
-     * Delete purchase order by ID
-     * For valid response try integer IDs with value &lt; 1000. Anything above 1000 or nonintegers will generate API errors
-     * @param orderId ID of the order that needs to be deleted
-     */
-    StoreApi.prototype.deleteOrder = function (orderId) {
-        var localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', String(orderId));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'orderId' is not null or undefined
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling deleteOrder.');
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'DELETE',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Returns pet inventories by status
-     * Returns a map of status codes to quantities
-     */
-    StoreApi.prototype.getInventory = function () {
-        var localVarPath = this.basePath + '/store/inventory';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.api_key.applyToRequest(requestOptions);
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "{ [key: string]: number; }");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Find purchase order by ID
-     * For valid response try integer IDs with value &lt;&#x3D; 5 or &gt; 10. Other values will generated exceptions
-     * @param orderId ID of pet that needs to be fetched
-     */
-    StoreApi.prototype.getOrderById = function (orderId) {
-        var localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', String(orderId));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'orderId' is not null or undefined
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling getOrderById.');
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Place an order for a pet
-     *
-     * @param body order placed for purchasing the pet
-     */
-    StoreApi.prototype.placeOrder = function (body) {
-        var localVarPath = this.basePath + '/store/order';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'POST',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(body, "Order")
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    return StoreApi;
-}());
-exports.StoreApi = StoreApi;
-(function (UserApiApiKeys) {
-    UserApiApiKeys[UserApiApiKeys["api_key"] = 0] = "api_key";
-})(exports.UserApiApiKeys || (exports.UserApiApiKeys = {}));
-var UserApiApiKeys = exports.UserApiApiKeys;
-var UserApi = (function () {
-    function UserApi(basePathOrUsername, password, basePath) {
-        this.basePath = defaultBasePath;
-        this.defaultHeaders = {};
-        this._useQuerystring = false;
-        this.authentications = {
-            'default': new VoidAuth(),
-            'api_key': new ApiKeyAuth('header', 'api_key'),
-            'petstore_auth': new OAuth(),
-        };
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        }
-        else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername;
-            }
-        }
-    }
-    Object.defineProperty(UserApi.prototype, "useQuerystring", {
-        set: function (value) {
-            this._useQuerystring = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    UserApi.prototype.setApiKey = function (key, value) {
-        this.authentications[UserApiApiKeys[key]].apiKey = value;
-    };
-    Object.defineProperty(UserApi.prototype, "accessToken", {
-        set: function (token) {
-            this.authentications.petstore_auth.accessToken = token;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    UserApi.prototype.extendObj = function (objA, objB) {
-        for (var key in objB) {
-            if (objB.hasOwnProperty(key)) {
-                objA[key] = objB[key];
-            }
-        }
-        return objA;
-    };
-    /**
-     * Create user
-     * This can only be done by the logged in user.
-     * @param body Created user object
-     */
-    UserApi.prototype.createUser = function (body) {
-        var localVarPath = this.basePath + '/user';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'POST',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(body, "User")
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Creates list of users with given input array
-     *
-     * @param body List of user object
-     */
-    UserApi.prototype.createUsersWithArrayInput = function (body) {
-        var localVarPath = this.basePath + '/user/createWithArray';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'POST',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(body, "Array&lt;User&gt;")
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Creates list of users with given input array
-     *
-     * @param body List of user object
-     */
-    UserApi.prototype.createUsersWithListInput = function (body) {
-        var localVarPath = this.basePath + '/user/createWithList';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'POST',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(body, "Array&lt;User&gt;")
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Delete user
-     * This can only be done by the logged in user.
-     * @param username The name that needs to be deleted
-     */
-    UserApi.prototype.deleteUser = function (username) {
-        var localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', String(username));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling deleteUser.');
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'DELETE',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Get user by user name
-     *
-     * @param username The name that needs to be fetched. Use user1 for testing.
-     */
-    UserApi.prototype.getUserByName = function (username) {
-        var localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', String(username));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling getUserByName.');
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "User");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Logs user into the system
-     *
-     * @param username The user name for login
-     * @param password The password for login in clear text
-     */
-    UserApi.prototype.loginUser = function (username, password) {
-        var localVarPath = this.basePath + '/user/login';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        if (username !== undefined) {
-            queryParameters['username'] = ObjectSerializer.serialize(username, "string");
-        }
-        if (password !== undefined) {
-            queryParameters['password'] = ObjectSerializer.serialize(password, "string");
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "string");
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Logs out current logged in user session
-     *
-     */
-    UserApi.prototype.logoutUser = function () {
-        var localVarPath = this.basePath + '/user/logout';
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        var useFormData = false;
-        var requestOptions = {
-            method: 'GET',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    /**
-     * Updated user
-     * This can only be done by the logged in user.
-     * @param username name that need to be deleted
-     * @param body Updated user object
-     */
-    UserApi.prototype.updateUser = function (username, body) {
-        var localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', String(username));
-        var queryParameters = {};
-        var headerParams = this.extendObj({}, this.defaultHeaders);
-        var formParams = {};
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling updateUser.');
-        }
-        var useFormData = false;
-        var requestOptions = {
-            method: 'PUT',
-            qs: queryParameters,
-            headers: headerParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(body, "User")
-        };
-        this.authentications.default.applyToRequest(requestOptions);
-        if (Object.keys(formParams).length) {
-            if (useFormData) {
-                requestOptions.formData = formParams;
-            }
-            else {
-                requestOptions.form = formParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            request(requestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    return UserApi;
-}());
-exports.UserApi = UserApi;
diff --git a/samples/client/petstore/typescript-node/default/api.ts b/samples/client/petstore/typescript-node/default/api.ts
index a6e6c97eb3402b6504514f783c34b24fbf1bb5d7..4b76122d807be1033564b07d69f475a8b4cbf959 100644
--- a/samples/client/petstore/typescript-node/default/api.ts
+++ b/samples/client/petstore/typescript-node/default/api.ts
@@ -1,1740 +1,3 @@
-/**
- * OpenAPI Petstore
- * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
- *
- * OpenAPI spec version: 1.0.0
- * 
- *
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
- * https://openapi-generator.tech
- * Do not edit the class manually.
- */
-
-import localVarRequest = require('request');
-import http = require('http');
-import Promise = require('bluebird');
-
-let defaultBasePath = 'http://petstore.swagger.io/v2';
-
-// ===============================================
-// This file is autogenerated - Please do not edit
-// ===============================================
-
-/* tslint:disable:no-unused-variable */
-let primitives = [
-                    "string",
-                    "boolean",
-                    "double",
-                    "integer",
-                    "long",
-                    "float",
-                    "number",
-                    "any"
-                 ];
-
-class ObjectSerializer {
-
-    public static findCorrectType(data: any, expectedType: string) {
-        if (data == undefined) {
-            return expectedType;
-        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
-            return expectedType;
-        } else if (expectedType === "Date") {
-            return expectedType;
-        } else {
-            if (enumsMap[expectedType]) {
-                return expectedType;
-            }
-
-            if (!typeMap[expectedType]) {
-                return expectedType; // w/e we don't know the type
-            }
-
-            // Check the discriminator
-            let discriminatorProperty = typeMap[expectedType].discriminator;
-            if (discriminatorProperty == null) {
-                return expectedType; // the type does not have a discriminator. use it.
-            } else {
-                if (data[discriminatorProperty]) {
-                    var discriminatorType = data[discriminatorProperty];
-                    if(typeMap[discriminatorType]){
-                        return discriminatorType; // use the type given in the discriminator
-                    } else {
-                        return expectedType; // discriminator did not map to a type
-                    }
-                } else {
-                    return expectedType; // discriminator was not present (or an empty string)
-                }
-            }
-        }
-    }
-
-    public static serialize(data: any, type: string) {
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.serialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return data.toString();
-        } else {
-            if (enumsMap[type]) {
-                return data;
-            }
-            if (!typeMap[type]) { // in case we dont know the type
-                return data;
-            }
-            
-            // Get the actual type of this object
-            type = this.findCorrectType(data, type);
-
-            // get the map for the correct type.
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            let instance: {[index: string]: any} = {};
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
-            }
-            return instance;
-        }
-    }
-
-    public static deserialize(data: any, type: string) {
-        // polymorphism may change the actual type.
-        type = ObjectSerializer.findCorrectType(data, type);
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.deserialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return new Date(data);
-        } else {
-            if (enumsMap[type]) {// is Enum
-                return data;
-            }
-
-            if (!typeMap[type]) { // dont know the type
-                return data;
-            }
-            let instance = new typeMap[type]();
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
-            }
-            return instance;
-        }
-    }
-}
-
-/**
-* Describes the result of uploading an image resource
-*/
-export class ApiResponse {
-    'code'?: number;
-    'type'?: string;
-    'message'?: string;
-
-    static discriminator: string | undefined = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "code",
-            "baseName": "code",
-            "type": "number"
-        },
-        {
-            "name": "type",
-            "baseName": "type",
-            "type": "string"
-        },
-        {
-            "name": "message",
-            "baseName": "message",
-            "type": "string"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return ApiResponse.attributeTypeMap;
-    }
-}
-
-/**
-* A category for a pet
-*/
-export class Category {
-    'id'?: number;
-    'name'?: string;
-
-    static discriminator: string | undefined = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Category.attributeTypeMap;
-    }
-}
-
-/**
-* An order for a pets from the pet store
-*/
-export class Order {
-    'id'?: number;
-    'petId'?: number;
-    'quantity'?: number;
-    'shipDate'?: Date;
-    /**
-    * Order Status
-    */
-    'status'?: Order.StatusEnum;
-    'complete'?: boolean;
-
-    static discriminator: string | undefined = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "petId",
-            "baseName": "petId",
-            "type": "number"
-        },
-        {
-            "name": "quantity",
-            "baseName": "quantity",
-            "type": "number"
-        },
-        {
-            "name": "shipDate",
-            "baseName": "shipDate",
-            "type": "Date"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Order.StatusEnum"
-        },
-        {
-            "name": "complete",
-            "baseName": "complete",
-            "type": "boolean"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Order.attributeTypeMap;
-    }
-}
-
-export namespace Order {
-    export enum StatusEnum {
-        Placed = <any> 'placed',
-        Approved = <any> 'approved',
-        Delivered = <any> 'delivered'
-    }
-}
-/**
-* A pet for sale in the pet store
-*/
-export class Pet {
-    'id'?: number;
-    'category'?: Category;
-    'name': string;
-    'photoUrls': Array<string>;
-    'tags'?: Array<Tag>;
-    /**
-    * pet status in the store
-    */
-    'status'?: Pet.StatusEnum;
-
-    static discriminator: string | undefined = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "category",
-            "baseName": "category",
-            "type": "Category"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        },
-        {
-            "name": "photoUrls",
-            "baseName": "photoUrls",
-            "type": "Array<string>"
-        },
-        {
-            "name": "tags",
-            "baseName": "tags",
-            "type": "Array<Tag>"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Pet.StatusEnum"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Pet.attributeTypeMap;
-    }
-}
-
-export namespace Pet {
-    export enum StatusEnum {
-        Available = <any> 'available',
-        Pending = <any> 'pending',
-        Sold = <any> 'sold'
-    }
-}
-/**
-* A tag for a pet
-*/
-export class Tag {
-    'id'?: number;
-    'name'?: string;
-
-    static discriminator: string | undefined = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Tag.attributeTypeMap;
-    }
-}
-
-/**
-* A User who is purchasing from the pet store
-*/
-export class User {
-    'id'?: number;
-    'username'?: string;
-    'firstName'?: string;
-    'lastName'?: string;
-    'email'?: string;
-    'password'?: string;
-    'phone'?: string;
-    /**
-    * User Status
-    */
-    'userStatus'?: number;
-
-    static discriminator: string | undefined = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "username",
-            "baseName": "username",
-            "type": "string"
-        },
-        {
-            "name": "firstName",
-            "baseName": "firstName",
-            "type": "string"
-        },
-        {
-            "name": "lastName",
-            "baseName": "lastName",
-            "type": "string"
-        },
-        {
-            "name": "email",
-            "baseName": "email",
-            "type": "string"
-        },
-        {
-            "name": "password",
-            "baseName": "password",
-            "type": "string"
-        },
-        {
-            "name": "phone",
-            "baseName": "phone",
-            "type": "string"
-        },
-        {
-            "name": "userStatus",
-            "baseName": "userStatus",
-            "type": "number"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return User.attributeTypeMap;
-    }
-}
-
-
-let enumsMap: {[index: string]: any} = {
-        "Order.StatusEnum": Order.StatusEnum,
-        "Pet.StatusEnum": Pet.StatusEnum,
-}
-
-let typeMap: {[index: string]: any} = {
-    "ApiResponse": ApiResponse,
-    "Category": Category,
-    "Order": Order,
-    "Pet": Pet,
-    "Tag": Tag,
-    "User": User,
-}
-
-export interface Authentication {
-    /**
-    * Apply authentication settings to header and query params.
-    */
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-
-export class HttpBasicAuth implements Authentication {
-    public username: string = '';
-    public password: string = '';
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        requestOptions.auth = {
-            username: this.username, password: this.password
-        }
-    }
-}
-
-export class ApiKeyAuth implements Authentication {
-    public apiKey: string = '';
-
-    constructor(private location: string, private paramName: string) {
-    }
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (this.location == "query") {
-            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
-        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
-            requestOptions.headers[this.paramName] = this.apiKey;
-        }
-    }
-}
-
-export class OAuth implements Authentication {
-    public accessToken: string = '';
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (requestOptions && requestOptions.headers) {
-            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
-        }
-    }
-}
-
-export class VoidAuth implements Authentication {
-    public username: string = '';
-    public password: string = '';
-
-    applyToRequest(_: localVarRequest.Options): void {
-        // Do nothing
-    }
-}
-
-export enum PetApiApiKeys {
-    api_key,
-}
-
-export class PetApi {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-        'api_key': new ApiKeyAuth('header', 'api_key'),
-        'petstore_auth': new OAuth(),
-    }
-
-    constructor(basePath?: string);
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: PetApiApiKeys, value: string) {
-        (this.authentications as any)[PetApiApiKeys[key]].apiKey = value;
-    }
-
-    set accessToken(token: string) {
-        this.authentications.petstore_auth.accessToken = token;
-    }
-    /**
-     * 
-     * @summary Add a new pet to the store
-     * @param pet Pet object that needs to be added to the store
-     */
-    public addPet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'pet' is not null or undefined
-        if (pet === null || pet === undefined) {
-            throw new Error('Required parameter pet was null or undefined when calling addPet.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(pet, "Pet")
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Deletes a pet
-     * @param petId Pet id to delete
-     * @param apiKey 
-     */
-    public deletePet (petId: number, apiKey?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling deletePet.');
-        }
-
-        localVarHeaderParams['api_key'] = ObjectSerializer.serialize(apiKey, "string");
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Multiple status values can be provided with comma separated strings
-     * @summary Finds Pets by status
-     * @param status Status values that need to be considered for filter
-     */
-    public findPetsByStatus (status: Array<'available' | 'pending' | 'sold'>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
-        const localVarPath = this.basePath + '/pet/findByStatus';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'status' is not null or undefined
-        if (status === null || status === undefined) {
-            throw new Error('Required parameter status was null or undefined when calling findPetsByStatus.');
-        }
-
-        if (status !== undefined) {
-            localVarQueryParameters['status'] = ObjectSerializer.serialize(status, "Array<'available' | 'pending' | 'sold'>");
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
-     * @summary Finds Pets by tags
-     * @param tags Tags to filter by
-     */
-    public findPetsByTags (tags: Array<string>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
-        const localVarPath = this.basePath + '/pet/findByTags';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'tags' is not null or undefined
-        if (tags === null || tags === undefined) {
-            throw new Error('Required parameter tags was null or undefined when calling findPetsByTags.');
-        }
-
-        if (tags !== undefined) {
-            localVarQueryParameters['tags'] = ObjectSerializer.serialize(tags, "Array<string>");
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Returns a single pet
-     * @summary Find pet by ID
-     * @param petId ID of pet to return
-     */
-    public getPetById (petId: number) : Promise<{ response: http.ClientResponse; body: Pet;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling getPetById.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.api_key.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Pet;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Pet");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Update an existing pet
-     * @param pet Pet object that needs to be added to the store
-     */
-    public updatePet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'pet' is not null or undefined
-        if (pet === null || pet === undefined) {
-            throw new Error('Required parameter pet was null or undefined when calling updatePet.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'PUT',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(pet, "Pet")
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Updates a pet in the store with form data
-     * @param petId ID of pet that needs to be updated
-     * @param name Updated name of the pet
-     * @param status Updated status of the pet
-     */
-    public updatePetWithForm (petId: number, name?: string, status?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling updatePetWithForm.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        if (name !== undefined) {
-            localVarFormParams['name'] = ObjectSerializer.serialize(name, "string");
-        }
-
-        if (status !== undefined) {
-            localVarFormParams['status'] = ObjectSerializer.serialize(status, "string");
-        }
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary uploads an image
-     * @param petId ID of pet to update
-     * @param additionalMetadata Additional data to pass to server
-     * @param file file to upload
-     */
-    public uploadFile (petId: number, additionalMetadata?: string, file?: Buffer) : Promise<{ response: http.ClientResponse; body: ApiResponse;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}/uploadImage'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling uploadFile.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        if (additionalMetadata !== undefined) {
-            localVarFormParams['additionalMetadata'] = ObjectSerializer.serialize(additionalMetadata, "string");
-        }
-
-        if (file !== undefined) {
-            localVarFormParams['file'] = file;
-        }
-        localVarUseFormData = true;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: ApiResponse;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "ApiResponse");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-}
-export enum StoreApiApiKeys {
-    api_key,
-}
-
-export class StoreApi {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-        'api_key': new ApiKeyAuth('header', 'api_key'),
-        'petstore_auth': new OAuth(),
-    }
-
-    constructor(basePath?: string);
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: StoreApiApiKeys, value: string) {
-        (this.authentications as any)[StoreApiApiKeys[key]].apiKey = value;
-    }
-
-    set accessToken(token: string) {
-        this.authentications.petstore_auth.accessToken = token;
-    }
-    /**
-     * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
-     * @summary Delete purchase order by ID
-     * @param orderId ID of the order that needs to be deleted
-     */
-    public deleteOrder (orderId: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'orderId' is not null or undefined
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling deleteOrder.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Returns a map of status codes to quantities
-     * @summary Returns pet inventories by status
-     */
-    public getInventory () : Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }> {
-        const localVarPath = this.basePath + '/store/inventory';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.api_key.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "{ [key: string]: number; }");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
-     * @summary Find purchase order by ID
-     * @param orderId ID of pet that needs to be fetched
-     */
-    public getOrderById (orderId: number) : Promise<{ response: http.ClientResponse; body: Order;  }> {
-        const localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'orderId' is not null or undefined
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling getOrderById.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Place an order for a pet
-     * @param order order placed for purchasing the pet
-     */
-    public placeOrder (order: Order) : Promise<{ response: http.ClientResponse; body: Order;  }> {
-        const localVarPath = this.basePath + '/store/order';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'order' is not null or undefined
-        if (order === null || order === undefined) {
-            throw new Error('Required parameter order was null or undefined when calling placeOrder.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(order, "Order")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-}
-export enum UserApiApiKeys {
-    api_key,
-}
-
-export class UserApi {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-        'api_key': new ApiKeyAuth('header', 'api_key'),
-        'petstore_auth': new OAuth(),
-    }
-
-    constructor(basePath?: string);
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: UserApiApiKeys, value: string) {
-        (this.authentications as any)[UserApiApiKeys[key]].apiKey = value;
-    }
-
-    set accessToken(token: string) {
-        this.authentications.petstore_auth.accessToken = token;
-    }
-    /**
-     * This can only be done by the logged in user.
-     * @summary Create user
-     * @param user Created user object
-     */
-    public createUser (user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUser.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "User")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Creates list of users with given input array
-     * @param user List of user object
-     */
-    public createUsersWithArrayInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/createWithArray';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUsersWithArrayInput.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "Array<User>")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Creates list of users with given input array
-     * @param user List of user object
-     */
-    public createUsersWithListInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/createWithList';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUsersWithListInput.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "Array<User>")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * This can only be done by the logged in user.
-     * @summary Delete user
-     * @param username The name that needs to be deleted
-     */
-    public deleteUser (username: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling deleteUser.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Get user by user name
-     * @param username The name that needs to be fetched. Use user1 for testing.
-     */
-    public getUserByName (username: string) : Promise<{ response: http.ClientResponse; body: User;  }> {
-        const localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling getUserByName.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: User;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "User");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Logs user into the system
-     * @param username The user name for login
-     * @param password The password for login in clear text
-     */
-    public loginUser (username: string, password: string) : Promise<{ response: http.ClientResponse; body: string;  }> {
-        const localVarPath = this.basePath + '/user/login';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling loginUser.');
-        }
-
-        // verify required parameter 'password' is not null or undefined
-        if (password === null || password === undefined) {
-            throw new Error('Required parameter password was null or undefined when calling loginUser.');
-        }
-
-        if (username !== undefined) {
-            localVarQueryParameters['username'] = ObjectSerializer.serialize(username, "string");
-        }
-
-        if (password !== undefined) {
-            localVarQueryParameters['password'] = ObjectSerializer.serialize(password, "string");
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: string;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "string");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Logs out current logged in user session
-     */
-    public logoutUser () : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/logout';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * This can only be done by the logged in user.
-     * @summary Updated user
-     * @param username name that need to be deleted
-     * @param user Updated user object
-     */
-    public updateUser (username: string, user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling updateUser.');
-        }
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling updateUser.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'PUT',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "User")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-}
+// This is the entrypoint for the package
+export * from './api/apis';
+export * from './model/models';
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/default/api/apis.ts b/samples/client/petstore/typescript-node/default/api/apis.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2bbfc445eaf05ffc1c80992e51a165a5a09561fe
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/api/apis.ts
@@ -0,0 +1,7 @@
+export * from './petApi';
+import { PetApi } from './petApi';
+export * from './storeApi';
+import { StoreApi } from './storeApi';
+export * from './userApi';
+import { UserApi } from './userApi';
+export const APIS = [PetApi, StoreApi, UserApi];
diff --git a/samples/client/petstore/typescript-node/default/api/petApi.ts b/samples/client/petstore/typescript-node/default/api/petApi.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c367b489d22bc940a2bfdaf68dfa04298fadd073
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/api/petApi.ts
@@ -0,0 +1,546 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import localVarRequest = require('request');
+import http = require('http');
+import Promise = require('bluebird');
+
+/* tslint:disable:no-unused-locals */
+import { ApiResponse } from '../model/apiResponse';
+import { Pet } from '../model/pet';
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = 'http://petstore.swagger.io/v2';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum PetApiApiKeys {
+    api_key,
+}
+
+export class PetApi {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+        'petstore_auth': new OAuth(),
+        'api_key': new ApiKeyAuth('header', 'api_key'),
+    }
+
+    constructor(basePath?: string);
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: PetApiApiKeys, value: string) {
+        (this.authentications as any)[PetApiApiKeys[key]].apiKey = value;
+    }
+
+    set accessToken(token: string) {
+        this.authentications.petstore_auth.accessToken = token;
+    }
+
+    /**
+     * 
+     * @summary Add a new pet to the store
+     * @param pet Pet object that needs to be added to the store
+     */
+    public addPet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'pet' is not null or undefined
+        if (pet === null || pet === undefined) {
+            throw new Error('Required parameter pet was null or undefined when calling addPet.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(pet, "Pet")
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Deletes a pet
+     * @param petId Pet id to delete
+     * @param apiKey 
+     */
+    public deletePet (petId: number, apiKey?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling deletePet.');
+        }
+
+        localVarHeaderParams['api_key'] = ObjectSerializer.serialize(apiKey, "string");
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'DELETE',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Multiple status values can be provided with comma separated strings
+     * @summary Finds Pets by status
+     * @param status Status values that need to be considered for filter
+     */
+    public findPetsByStatus (status: Array<'available' | 'pending' | 'sold'>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
+        const localVarPath = this.basePath + '/pet/findByStatus';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'status' is not null or undefined
+        if (status === null || status === undefined) {
+            throw new Error('Required parameter status was null or undefined when calling findPetsByStatus.');
+        }
+
+        if (status !== undefined) {
+            localVarQueryParameters['status'] = ObjectSerializer.serialize(status, "Array<'available' | 'pending' | 'sold'>");
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
+     * @summary Finds Pets by tags
+     * @param tags Tags to filter by
+     */
+    public findPetsByTags (tags: Array<string>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
+        const localVarPath = this.basePath + '/pet/findByTags';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'tags' is not null or undefined
+        if (tags === null || tags === undefined) {
+            throw new Error('Required parameter tags was null or undefined when calling findPetsByTags.');
+        }
+
+        if (tags !== undefined) {
+            localVarQueryParameters['tags'] = ObjectSerializer.serialize(tags, "Array<string>");
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Returns a single pet
+     * @summary Find pet by ID
+     * @param petId ID of pet to return
+     */
+    public getPetById (petId: number) : Promise<{ response: http.ClientResponse; body: Pet;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling getPetById.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.api_key.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Pet;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Pet");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Update an existing pet
+     * @param pet Pet object that needs to be added to the store
+     */
+    public updatePet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'pet' is not null or undefined
+        if (pet === null || pet === undefined) {
+            throw new Error('Required parameter pet was null or undefined when calling updatePet.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'PUT',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(pet, "Pet")
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Updates a pet in the store with form data
+     * @param petId ID of pet that needs to be updated
+     * @param name Updated name of the pet
+     * @param status Updated status of the pet
+     */
+    public updatePetWithForm (petId: number, name?: string, status?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling updatePetWithForm.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        if (name !== undefined) {
+            localVarFormParams['name'] = ObjectSerializer.serialize(name, "string");
+        }
+
+        if (status !== undefined) {
+            localVarFormParams['status'] = ObjectSerializer.serialize(status, "string");
+        }
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary uploads an image
+     * @param petId ID of pet to update
+     * @param additionalMetadata Additional data to pass to server
+     * @param file file to upload
+     */
+    public uploadFile (petId: number, additionalMetadata?: string, file?: Buffer) : Promise<{ response: http.ClientResponse; body: ApiResponse;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}/uploadImage'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling uploadFile.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        if (additionalMetadata !== undefined) {
+            localVarFormParams['additionalMetadata'] = ObjectSerializer.serialize(additionalMetadata, "string");
+        }
+
+        if (file !== undefined) {
+            localVarFormParams['file'] = file;
+        }
+        localVarUseFormData = true;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: ApiResponse;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "ApiResponse");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+}
diff --git a/samples/client/petstore/typescript-node/default/api/storeApi.ts b/samples/client/petstore/typescript-node/default/api/storeApi.ts
new file mode 100644
index 0000000000000000000000000000000000000000..39a1b21f2383e91b27effb98f6a3e8ee1ffa27b4
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/api/storeApi.ts
@@ -0,0 +1,281 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import localVarRequest = require('request');
+import http = require('http');
+import Promise = require('bluebird');
+
+/* tslint:disable:no-unused-locals */
+import { Order } from '../model/order';
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = 'http://petstore.swagger.io/v2';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum StoreApiApiKeys {
+    api_key,
+}
+
+export class StoreApi {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+        'api_key': new ApiKeyAuth('header', 'api_key'),
+    }
+
+    constructor(basePath?: string);
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: StoreApiApiKeys, value: string) {
+        (this.authentications as any)[StoreApiApiKeys[key]].apiKey = value;
+    }
+
+    /**
+     * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
+     * @summary Delete purchase order by ID
+     * @param orderId ID of the order that needs to be deleted
+     */
+    public deleteOrder (orderId: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/store/order/{orderId}'
+            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'orderId' is not null or undefined
+        if (orderId === null || orderId === undefined) {
+            throw new Error('Required parameter orderId was null or undefined when calling deleteOrder.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'DELETE',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Returns a map of status codes to quantities
+     * @summary Returns pet inventories by status
+     */
+    public getInventory () : Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }> {
+        const localVarPath = this.basePath + '/store/inventory';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.api_key.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "{ [key: string]: number; }");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
+     * @summary Find purchase order by ID
+     * @param orderId ID of pet that needs to be fetched
+     */
+    public getOrderById (orderId: number) : Promise<{ response: http.ClientResponse; body: Order;  }> {
+        const localVarPath = this.basePath + '/store/order/{orderId}'
+            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'orderId' is not null or undefined
+        if (orderId === null || orderId === undefined) {
+            throw new Error('Required parameter orderId was null or undefined when calling getOrderById.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Order");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Place an order for a pet
+     * @param order order placed for purchasing the pet
+     */
+    public placeOrder (order: Order) : Promise<{ response: http.ClientResponse; body: Order;  }> {
+        const localVarPath = this.basePath + '/store/order';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'order' is not null or undefined
+        if (order === null || order === undefined) {
+            throw new Error('Required parameter order was null or undefined when calling placeOrder.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(order, "Order")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Order");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+}
diff --git a/samples/client/petstore/typescript-node/default/api/userApi.ts b/samples/client/petstore/typescript-node/default/api/userApi.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fbdb95cb49344bd085e9c5caa6379ea07a3401b8
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/api/userApi.ts
@@ -0,0 +1,504 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import localVarRequest = require('request');
+import http = require('http');
+import Promise = require('bluebird');
+
+/* tslint:disable:no-unused-locals */
+import { User } from '../model/user';
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = 'http://petstore.swagger.io/v2';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum UserApiApiKeys {
+}
+
+export class UserApi {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+    }
+
+    constructor(basePath?: string);
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: UserApiApiKeys, value: string) {
+        (this.authentications as any)[UserApiApiKeys[key]].apiKey = value;
+    }
+
+    /**
+     * This can only be done by the logged in user.
+     * @summary Create user
+     * @param user Created user object
+     */
+    public createUser (user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling createUser.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "User")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Creates list of users with given input array
+     * @param user List of user object
+     */
+    public createUsersWithArrayInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/createWithArray';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling createUsersWithArrayInput.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "Array<User>")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Creates list of users with given input array
+     * @param user List of user object
+     */
+    public createUsersWithListInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/createWithList';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling createUsersWithListInput.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "Array<User>")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * This can only be done by the logged in user.
+     * @summary Delete user
+     * @param username The name that needs to be deleted
+     */
+    public deleteUser (username: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/{username}'
+            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling deleteUser.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'DELETE',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Get user by user name
+     * @param username The name that needs to be fetched. Use user1 for testing.
+     */
+    public getUserByName (username: string) : Promise<{ response: http.ClientResponse; body: User;  }> {
+        const localVarPath = this.basePath + '/user/{username}'
+            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling getUserByName.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: User;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "User");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Logs user into the system
+     * @param username The user name for login
+     * @param password The password for login in clear text
+     */
+    public loginUser (username: string, password: string) : Promise<{ response: http.ClientResponse; body: string;  }> {
+        const localVarPath = this.basePath + '/user/login';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling loginUser.');
+        }
+
+        // verify required parameter 'password' is not null or undefined
+        if (password === null || password === undefined) {
+            throw new Error('Required parameter password was null or undefined when calling loginUser.');
+        }
+
+        if (username !== undefined) {
+            localVarQueryParameters['username'] = ObjectSerializer.serialize(username, "string");
+        }
+
+        if (password !== undefined) {
+            localVarQueryParameters['password'] = ObjectSerializer.serialize(password, "string");
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: string;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "string");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Logs out current logged in user session
+     */
+    public logoutUser () : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/logout';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * This can only be done by the logged in user.
+     * @summary Updated user
+     * @param username name that need to be deleted
+     * @param user Updated user object
+     */
+    public updateUser (username: string, user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/{username}'
+            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling updateUser.');
+        }
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling updateUser.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'PUT',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "User")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+}
diff --git a/samples/client/petstore/typescript-node/default/model/apiResponse.ts b/samples/client/petstore/typescript-node/default/model/apiResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5abc5ef236456110f130069d8c017b9b93b226b8
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/model/apiResponse.ts
@@ -0,0 +1,45 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* Describes the result of uploading an image resource
+*/
+export class ApiResponse {
+    'code'?: number;
+    'type'?: string;
+    'message'?: string;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "code",
+            "baseName": "code",
+            "type": "number"
+        },
+        {
+            "name": "type",
+            "baseName": "type",
+            "type": "string"
+        },
+        {
+            "name": "message",
+            "baseName": "message",
+            "type": "string"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return ApiResponse.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/default/model/category.ts b/samples/client/petstore/typescript-node/default/model/category.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5a2f620f64c3791bf5df5fce77f3aa5b73a3d9c6
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/model/category.ts
@@ -0,0 +1,39 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* A category for a pet
+*/
+export class Category {
+    'id'?: number;
+    'name'?: string;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "name",
+            "baseName": "name",
+            "type": "string"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Category.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/default/model/models.ts b/samples/client/petstore/typescript-node/default/model/models.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8ed47b194d736d1887a567b6a280e4a23c79bb1f
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/model/models.ts
@@ -0,0 +1,204 @@
+export * from './apiResponse';
+export * from './category';
+export * from './order';
+export * from './pet';
+export * from './tag';
+export * from './user';
+
+import localVarRequest = require('request');
+
+import { ApiResponse } from './apiResponse';
+import { Category } from './category';
+import { Order } from './order';
+import { Pet } from './pet';
+import { Tag } from './tag';
+import { User } from './user';
+
+/* tslint:disable:no-unused-variable */
+let primitives = [
+                    "string",
+                    "boolean",
+                    "double",
+                    "integer",
+                    "long",
+                    "float",
+                    "number",
+                    "any"
+                 ];
+                 
+let enumsMap: {[index: string]: any} = {
+        "Order.StatusEnum": Order.StatusEnum,
+        "Pet.StatusEnum": Pet.StatusEnum,
+}
+
+let typeMap: {[index: string]: any} = {
+    "ApiResponse": ApiResponse,
+    "Category": Category,
+    "Order": Order,
+    "Pet": Pet,
+    "Tag": Tag,
+    "User": User,
+}
+
+export class ObjectSerializer {
+    public static findCorrectType(data: any, expectedType: string) {
+        if (data == undefined) {
+            return expectedType;
+        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
+            return expectedType;
+        } else if (expectedType === "Date") {
+            return expectedType;
+        } else {
+            if (enumsMap[expectedType]) {
+                return expectedType;
+            }
+
+            if (!typeMap[expectedType]) {
+                return expectedType; // w/e we don't know the type
+            }
+
+            // Check the discriminator
+            let discriminatorProperty = typeMap[expectedType].discriminator;
+            if (discriminatorProperty == null) {
+                return expectedType; // the type does not have a discriminator. use it.
+            } else {
+                if (data[discriminatorProperty]) {
+                    var discriminatorType = data[discriminatorProperty];
+                    if(typeMap[discriminatorType]){
+                        return discriminatorType; // use the type given in the discriminator
+                    } else {
+                        return expectedType; // discriminator did not map to a type
+                    }
+                } else {
+                    return expectedType; // discriminator was not present (or an empty string)
+                }
+            }
+        }
+    }
+
+    public static serialize(data: any, type: string) {
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.serialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return data.toString();
+        } else {
+            if (enumsMap[type]) {
+                return data;
+            }
+            if (!typeMap[type]) { // in case we dont know the type
+                return data;
+            }
+            
+            // Get the actual type of this object
+            type = this.findCorrectType(data, type);
+
+            // get the map for the correct type.
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            let instance: {[index: string]: any} = {};
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
+            }
+            return instance;
+        }
+    }
+
+    public static deserialize(data: any, type: string) {
+        // polymorphism may change the actual type.
+        type = ObjectSerializer.findCorrectType(data, type);
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.deserialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return new Date(data);
+        } else {
+            if (enumsMap[type]) {// is Enum
+                return data;
+            }
+
+            if (!typeMap[type]) { // dont know the type
+                return data;
+            }
+            let instance = new typeMap[type]();
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
+            }
+            return instance;
+        }
+    }
+}
+
+export interface Authentication {
+    /**
+    * Apply authentication settings to header and query params.
+    */
+    applyToRequest(requestOptions: localVarRequest.Options): void;
+}
+
+export class HttpBasicAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        requestOptions.auth = {
+            username: this.username, password: this.password
+        }
+    }
+}
+
+export class ApiKeyAuth implements Authentication {
+    public apiKey: string = '';
+
+    constructor(private location: string, private paramName: string) {
+    }
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (this.location == "query") {
+            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
+        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
+            requestOptions.headers[this.paramName] = this.apiKey;
+        }
+    }
+}
+
+export class OAuth implements Authentication {
+    public accessToken: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (requestOptions && requestOptions.headers) {
+            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
+        }
+    }
+}
+
+export class VoidAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(_: localVarRequest.Options): void {
+        // Do nothing
+    }
+}
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/default/model/order.ts b/samples/client/petstore/typescript-node/default/model/order.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8670f6aef573146ddc22e7cc53001b39aceda9e7
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/model/order.ts
@@ -0,0 +1,73 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* An order for a pets from the pet store
+*/
+export class Order {
+    'id'?: number;
+    'petId'?: number;
+    'quantity'?: number;
+    'shipDate'?: Date;
+    /**
+    * Order Status
+    */
+    'status'?: Order.StatusEnum;
+    'complete'?: boolean;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "petId",
+            "baseName": "petId",
+            "type": "number"
+        },
+        {
+            "name": "quantity",
+            "baseName": "quantity",
+            "type": "number"
+        },
+        {
+            "name": "shipDate",
+            "baseName": "shipDate",
+            "type": "Date"
+        },
+        {
+            "name": "status",
+            "baseName": "status",
+            "type": "Order.StatusEnum"
+        },
+        {
+            "name": "complete",
+            "baseName": "complete",
+            "type": "boolean"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Order.attributeTypeMap;
+    }
+}
+
+export namespace Order {
+    export enum StatusEnum {
+        Placed = <any> 'placed',
+        Approved = <any> 'approved',
+        Delivered = <any> 'delivered'
+    }
+}
diff --git a/samples/client/petstore/typescript-node/default/model/pet.ts b/samples/client/petstore/typescript-node/default/model/pet.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a91c4252fe3446dde514fb9efd0ebf62be96b80c
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/model/pet.ts
@@ -0,0 +1,75 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { Category } from './category';
+import { Tag } from './tag';
+
+/**
+* A pet for sale in the pet store
+*/
+export class Pet {
+    'id'?: number;
+    'category'?: Category;
+    'name': string;
+    'photoUrls': Array<string>;
+    'tags'?: Array<Tag>;
+    /**
+    * pet status in the store
+    */
+    'status'?: Pet.StatusEnum;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "category",
+            "baseName": "category",
+            "type": "Category"
+        },
+        {
+            "name": "name",
+            "baseName": "name",
+            "type": "string"
+        },
+        {
+            "name": "photoUrls",
+            "baseName": "photoUrls",
+            "type": "Array<string>"
+        },
+        {
+            "name": "tags",
+            "baseName": "tags",
+            "type": "Array<Tag>"
+        },
+        {
+            "name": "status",
+            "baseName": "status",
+            "type": "Pet.StatusEnum"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Pet.attributeTypeMap;
+    }
+}
+
+export namespace Pet {
+    export enum StatusEnum {
+        Available = <any> 'available',
+        Pending = <any> 'pending',
+        Sold = <any> 'sold'
+    }
+}
diff --git a/samples/client/petstore/typescript-node/default/model/tag.ts b/samples/client/petstore/typescript-node/default/model/tag.ts
new file mode 100644
index 0000000000000000000000000000000000000000..26d1dc741c57fa8ab592d347754fceb684e5e124
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/model/tag.ts
@@ -0,0 +1,39 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* A tag for a pet
+*/
+export class Tag {
+    'id'?: number;
+    'name'?: string;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "name",
+            "baseName": "name",
+            "type": "string"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Tag.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/default/model/user.ts b/samples/client/petstore/typescript-node/default/model/user.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b683fb5debc529d42c9e6c463e559ce7fb3d918b
--- /dev/null
+++ b/samples/client/petstore/typescript-node/default/model/user.ts
@@ -0,0 +1,78 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* A User who is purchasing from the pet store
+*/
+export class User {
+    'id'?: number;
+    'username'?: string;
+    'firstName'?: string;
+    'lastName'?: string;
+    'email'?: string;
+    'password'?: string;
+    'phone'?: string;
+    /**
+    * User Status
+    */
+    'userStatus'?: number;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "username",
+            "baseName": "username",
+            "type": "string"
+        },
+        {
+            "name": "firstName",
+            "baseName": "firstName",
+            "type": "string"
+        },
+        {
+            "name": "lastName",
+            "baseName": "lastName",
+            "type": "string"
+        },
+        {
+            "name": "email",
+            "baseName": "email",
+            "type": "string"
+        },
+        {
+            "name": "password",
+            "baseName": "password",
+            "type": "string"
+        },
+        {
+            "name": "phone",
+            "baseName": "phone",
+            "type": "string"
+        },
+        {
+            "name": "userStatus",
+            "baseName": "userStatus",
+            "type": "number"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return User.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/npm/.openapi-generator/VERSION b/samples/client/petstore/typescript-node/npm/.openapi-generator/VERSION
index 096bf47efe318864bcd257dd33de7b12f82321cb..82602aa4190d566de11d01dd77a97d3a3d19515d 100644
--- a/samples/client/petstore/typescript-node/npm/.openapi-generator/VERSION
+++ b/samples/client/petstore/typescript-node/npm/.openapi-generator/VERSION
@@ -1 +1 @@
-3.0.0-SNAPSHOT
\ No newline at end of file
+3.0.3-SNAPSHOT
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/npm/api.d.ts b/samples/client/petstore/typescript-node/npm/api.d.ts
deleted file mode 100644
index 31795b1aa51e6eb23c32d6bd670d051ad31ab5e1..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/npm/api.d.ts
+++ /dev/null
@@ -1,288 +0,0 @@
-/// <reference types="request" />
-/// <reference types="bluebird" />
-/// <reference types="node" />
-import localVarRequest = require('request');
-import http = require('http');
-import Promise = require('bluebird');
-export declare class ApiResponse {
-    'code'?: number;
-    'type'?: string;
-    'message'?: string;
-    static discriminator: undefined;
-    static attributeTypeMap: Array<{
-        name: string;
-        baseName: string;
-        type: string;
-    }>;
-    static getAttributeTypeMap(): {
-        name: string;
-        baseName: string;
-        type: string;
-    }[];
-}
-export declare class Category {
-    'id'?: number;
-    'name'?: string;
-    static discriminator: undefined;
-    static attributeTypeMap: Array<{
-        name: string;
-        baseName: string;
-        type: string;
-    }>;
-    static getAttributeTypeMap(): {
-        name: string;
-        baseName: string;
-        type: string;
-    }[];
-}
-export declare class Order {
-    'id'?: number;
-    'petId'?: number;
-    'quantity'?: number;
-    'shipDate'?: Date;
-    'status'?: Order.StatusEnum;
-    'complete'?: boolean;
-    static discriminator: undefined;
-    static attributeTypeMap: Array<{
-        name: string;
-        baseName: string;
-        type: string;
-    }>;
-    static getAttributeTypeMap(): {
-        name: string;
-        baseName: string;
-        type: string;
-    }[];
-}
-export declare namespace Order {
-    enum StatusEnum {
-        Placed,
-        Approved,
-        Delivered,
-    }
-}
-export declare class Pet {
-    'id'?: number;
-    'category'?: Category;
-    'name': string;
-    'photoUrls': Array<string>;
-    'tags'?: Array<Tag>;
-    'status'?: Pet.StatusEnum;
-    static discriminator: undefined;
-    static attributeTypeMap: Array<{
-        name: string;
-        baseName: string;
-        type: string;
-    }>;
-    static getAttributeTypeMap(): {
-        name: string;
-        baseName: string;
-        type: string;
-    }[];
-}
-export declare namespace Pet {
-    enum StatusEnum {
-        Available,
-        Pending,
-        Sold,
-    }
-}
-export declare class Tag {
-    'id'?: number;
-    'name'?: string;
-    static discriminator: undefined;
-    static attributeTypeMap: Array<{
-        name: string;
-        baseName: string;
-        type: string;
-    }>;
-    static getAttributeTypeMap(): {
-        name: string;
-        baseName: string;
-        type: string;
-    }[];
-}
-export declare class User {
-    'id'?: number;
-    'username'?: string;
-    'firstName'?: string;
-    'lastName'?: string;
-    'email'?: string;
-    'password'?: string;
-    'phone'?: string;
-    'userStatus'?: number;
-    static discriminator: undefined;
-    static attributeTypeMap: Array<{
-        name: string;
-        baseName: string;
-        type: string;
-    }>;
-    static getAttributeTypeMap(): {
-        name: string;
-        baseName: string;
-        type: string;
-    }[];
-}
-export interface Authentication {
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-export declare class HttpBasicAuth implements Authentication {
-    username: string;
-    password: string;
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-export declare class ApiKeyAuth implements Authentication {
-    private location;
-    private paramName;
-    apiKey: string;
-    constructor(location: string, paramName: string);
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-export declare class OAuth implements Authentication {
-    accessToken: string;
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-export declare class VoidAuth implements Authentication {
-    username: string;
-    password: string;
-    applyToRequest(_: localVarRequest.Options): void;
-}
-export declare enum PetApiApiKeys {
-    api_key = 0,
-}
-export declare class PetApi {
-    protected _basePath: string;
-    protected defaultHeaders: any;
-    protected _useQuerystring: boolean;
-    protected authentications: {
-        'default': Authentication;
-        'api_key': ApiKeyAuth;
-        'petstore_auth': OAuth;
-    };
-    constructor(basePath?: string);
-    useQuerystring: boolean;
-    basePath: string;
-    setDefaultAuthentication(auth: Authentication): void;
-    setApiKey(key: PetApiApiKeys, value: string): void;
-    accessToken: string;
-    addPet(pet: Pet): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    deletePet(petId: number, apiKey?: string): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    findPetsByStatus(status: Array<'available' | 'pending' | 'sold'>): Promise<{
-        response: http.ClientResponse;
-        body: Array<Pet>;
-    }>;
-    findPetsByTags(tags: Array<string>): Promise<{
-        response: http.ClientResponse;
-        body: Array<Pet>;
-    }>;
-    getPetById(petId: number): Promise<{
-        response: http.ClientResponse;
-        body: Pet;
-    }>;
-    updatePet(pet: Pet): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    updatePetWithForm(petId: number, name?: string, status?: string): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    uploadFile(petId: number, additionalMetadata?: string, file?: Buffer): Promise<{
-        response: http.ClientResponse;
-        body: ApiResponse;
-    }>;
-}
-export declare enum StoreApiApiKeys {
-    api_key = 0,
-}
-export declare class StoreApi {
-    protected _basePath: string;
-    protected defaultHeaders: any;
-    protected _useQuerystring: boolean;
-    protected authentications: {
-        'default': Authentication;
-        'api_key': ApiKeyAuth;
-        'petstore_auth': OAuth;
-    };
-    constructor(basePath?: string);
-    useQuerystring: boolean;
-    basePath: string;
-    setDefaultAuthentication(auth: Authentication): void;
-    setApiKey(key: StoreApiApiKeys, value: string): void;
-    accessToken: string;
-    deleteOrder(orderId: string): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    getInventory(): Promise<{
-        response: http.ClientResponse;
-        body: {
-            [key: string]: number;
-        };
-    }>;
-    getOrderById(orderId: number): Promise<{
-        response: http.ClientResponse;
-        body: Order;
-    }>;
-    placeOrder(order: Order): Promise<{
-        response: http.ClientResponse;
-        body: Order;
-    }>;
-}
-export declare enum UserApiApiKeys {
-    api_key = 0,
-}
-export declare class UserApi {
-    protected _basePath: string;
-    protected defaultHeaders: any;
-    protected _useQuerystring: boolean;
-    protected authentications: {
-        'default': Authentication;
-        'api_key': ApiKeyAuth;
-        'petstore_auth': OAuth;
-    };
-    constructor(basePath?: string);
-    useQuerystring: boolean;
-    basePath: string;
-    setDefaultAuthentication(auth: Authentication): void;
-    setApiKey(key: UserApiApiKeys, value: string): void;
-    accessToken: string;
-    createUser(user: User): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    createUsersWithArrayInput(user: Array<User>): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    createUsersWithListInput(user: Array<User>): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    deleteUser(username: string): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    getUserByName(username: string): Promise<{
-        response: http.ClientResponse;
-        body: User;
-    }>;
-    loginUser(username: string, password: string): Promise<{
-        response: http.ClientResponse;
-        body: string;
-    }>;
-    logoutUser(): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-    updateUser(username: string, user: User): Promise<{
-        response: http.ClientResponse;
-        body?: any;
-    }>;
-}
diff --git a/samples/client/petstore/typescript-node/npm/api.js b/samples/client/petstore/typescript-node/npm/api.js
deleted file mode 100644
index dc93dcc090ea7c548ab199d5db6891f0fcf42a0d..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/npm/api.js
+++ /dev/null
@@ -1,1488 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var localVarRequest = require("request");
-var Promise = require("bluebird");
-var defaultBasePath = 'http://petstore.swagger.io/v2';
-var primitives = [
-    "string",
-    "boolean",
-    "double",
-    "integer",
-    "long",
-    "float",
-    "number",
-    "any"
-];
-var ObjectSerializer = (function () {
-    function ObjectSerializer() {
-    }
-    ObjectSerializer.findCorrectType = function (data, expectedType) {
-        if (data == undefined) {
-            return expectedType;
-        }
-        else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
-            return expectedType;
-        }
-        else if (expectedType === "Date") {
-            return expectedType;
-        }
-        else {
-            if (enumsMap[expectedType]) {
-                return expectedType;
-            }
-            if (!typeMap[expectedType]) {
-                return expectedType;
-            }
-            var discriminatorProperty = typeMap[expectedType].discriminator;
-            if (discriminatorProperty == null) {
-                return expectedType;
-            }
-            else {
-                if (data[discriminatorProperty]) {
-                    return data[discriminatorProperty];
-                }
-                else {
-                    return expectedType;
-                }
-            }
-        }
-    };
-    ObjectSerializer.serialize = function (data, type) {
-        if (data == undefined) {
-            return data;
-        }
-        else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        }
-        else if (type.lastIndexOf("Array<", 0) === 0) {
-            var subType = type.replace("Array<", "");
-            subType = subType.substring(0, subType.length - 1);
-            var transformedData = [];
-            for (var index in data) {
-                var date = data[index];
-                transformedData.push(ObjectSerializer.serialize(date, subType));
-            }
-            return transformedData;
-        }
-        else if (type === "Date") {
-            return data.toString();
-        }
-        else {
-            if (enumsMap[type]) {
-                return data;
-            }
-            if (!typeMap[type]) {
-                return data;
-            }
-            var attributeTypes = typeMap[type].getAttributeTypeMap();
-            var instance = {};
-            for (var index in attributeTypes) {
-                var attributeType = attributeTypes[index];
-                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
-            }
-            return instance;
-        }
-    };
-    ObjectSerializer.deserialize = function (data, type) {
-        type = ObjectSerializer.findCorrectType(data, type);
-        if (data == undefined) {
-            return data;
-        }
-        else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        }
-        else if (type.lastIndexOf("Array<", 0) === 0) {
-            var subType = type.replace("Array<", "");
-            subType = subType.substring(0, subType.length - 1);
-            var transformedData = [];
-            for (var index in data) {
-                var date = data[index];
-                transformedData.push(ObjectSerializer.deserialize(date, subType));
-            }
-            return transformedData;
-        }
-        else if (type === "Date") {
-            return new Date(data);
-        }
-        else {
-            if (enumsMap[type]) {
-                return data;
-            }
-            if (!typeMap[type]) {
-                return data;
-            }
-            var instance = new typeMap[type]();
-            var attributeTypes = typeMap[type].getAttributeTypeMap();
-            for (var index in attributeTypes) {
-                var attributeType = attributeTypes[index];
-                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
-            }
-            return instance;
-        }
-    };
-    return ObjectSerializer;
-}());
-var ApiResponse = (function () {
-    function ApiResponse() {
-    }
-    ApiResponse.getAttributeTypeMap = function () {
-        return ApiResponse.attributeTypeMap;
-    };
-    ApiResponse.discriminator = undefined;
-    ApiResponse.attributeTypeMap = [
-        {
-            "name": "code",
-            "baseName": "code",
-            "type": "number"
-        },
-        {
-            "name": "type",
-            "baseName": "type",
-            "type": "string"
-        },
-        {
-            "name": "message",
-            "baseName": "message",
-            "type": "string"
-        }
-    ];
-    return ApiResponse;
-}());
-exports.ApiResponse = ApiResponse;
-var Category = (function () {
-    function Category() {
-    }
-    Category.getAttributeTypeMap = function () {
-        return Category.attributeTypeMap;
-    };
-    Category.discriminator = undefined;
-    Category.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }
-    ];
-    return Category;
-}());
-exports.Category = Category;
-var Order = (function () {
-    function Order() {
-    }
-    Order.getAttributeTypeMap = function () {
-        return Order.attributeTypeMap;
-    };
-    Order.discriminator = undefined;
-    Order.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "petId",
-            "baseName": "petId",
-            "type": "number"
-        },
-        {
-            "name": "quantity",
-            "baseName": "quantity",
-            "type": "number"
-        },
-        {
-            "name": "shipDate",
-            "baseName": "shipDate",
-            "type": "Date"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Order.StatusEnum"
-        },
-        {
-            "name": "complete",
-            "baseName": "complete",
-            "type": "boolean"
-        }
-    ];
-    return Order;
-}());
-exports.Order = Order;
-(function (Order) {
-    var StatusEnum;
-    (function (StatusEnum) {
-        StatusEnum[StatusEnum["Placed"] = 'placed'] = "Placed";
-        StatusEnum[StatusEnum["Approved"] = 'approved'] = "Approved";
-        StatusEnum[StatusEnum["Delivered"] = 'delivered'] = "Delivered";
-    })(StatusEnum = Order.StatusEnum || (Order.StatusEnum = {}));
-})(Order = exports.Order || (exports.Order = {}));
-exports.Order = Order;
-var Pet = (function () {
-    function Pet() {
-    }
-    Pet.getAttributeTypeMap = function () {
-        return Pet.attributeTypeMap;
-    };
-    Pet.discriminator = undefined;
-    Pet.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "category",
-            "baseName": "category",
-            "type": "Category"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        },
-        {
-            "name": "photoUrls",
-            "baseName": "photoUrls",
-            "type": "Array<string>"
-        },
-        {
-            "name": "tags",
-            "baseName": "tags",
-            "type": "Array<Tag>"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Pet.StatusEnum"
-        }
-    ];
-    return Pet;
-}());
-exports.Pet = Pet;
-(function (Pet) {
-    var StatusEnum;
-    (function (StatusEnum) {
-        StatusEnum[StatusEnum["Available"] = 'available'] = "Available";
-        StatusEnum[StatusEnum["Pending"] = 'pending'] = "Pending";
-        StatusEnum[StatusEnum["Sold"] = 'sold'] = "Sold";
-    })(StatusEnum = Pet.StatusEnum || (Pet.StatusEnum = {}));
-})(Pet = exports.Pet || (exports.Pet = {}));
-exports.Pet = Pet;
-var Tag = (function () {
-    function Tag() {
-    }
-    Tag.getAttributeTypeMap = function () {
-        return Tag.attributeTypeMap;
-    };
-    Tag.discriminator = undefined;
-    Tag.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }
-    ];
-    return Tag;
-}());
-exports.Tag = Tag;
-var User = (function () {
-    function User() {
-    }
-    User.getAttributeTypeMap = function () {
-        return User.attributeTypeMap;
-    };
-    User.discriminator = undefined;
-    User.attributeTypeMap = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "username",
-            "baseName": "username",
-            "type": "string"
-        },
-        {
-            "name": "firstName",
-            "baseName": "firstName",
-            "type": "string"
-        },
-        {
-            "name": "lastName",
-            "baseName": "lastName",
-            "type": "string"
-        },
-        {
-            "name": "email",
-            "baseName": "email",
-            "type": "string"
-        },
-        {
-            "name": "password",
-            "baseName": "password",
-            "type": "string"
-        },
-        {
-            "name": "phone",
-            "baseName": "phone",
-            "type": "string"
-        },
-        {
-            "name": "userStatus",
-            "baseName": "userStatus",
-            "type": "number"
-        }
-    ];
-    return User;
-}());
-exports.User = User;
-var enumsMap = {
-    "Order.StatusEnum": Order.StatusEnum,
-    "Pet.StatusEnum": Pet.StatusEnum,
-};
-var typeMap = {
-    "ApiResponse": ApiResponse,
-    "Category": Category,
-    "Order": Order,
-    "Pet": Pet,
-    "Tag": Tag,
-    "User": User,
-};
-var HttpBasicAuth = (function () {
-    function HttpBasicAuth() {
-        this.username = '';
-        this.password = '';
-    }
-    HttpBasicAuth.prototype.applyToRequest = function (requestOptions) {
-        requestOptions.auth = {
-            username: this.username, password: this.password
-        };
-    };
-    return HttpBasicAuth;
-}());
-exports.HttpBasicAuth = HttpBasicAuth;
-var ApiKeyAuth = (function () {
-    function ApiKeyAuth(location, paramName) {
-        this.location = location;
-        this.paramName = paramName;
-        this.apiKey = '';
-    }
-    ApiKeyAuth.prototype.applyToRequest = function (requestOptions) {
-        if (this.location == "query") {
-            requestOptions.qs[this.paramName] = this.apiKey;
-        }
-        else if (this.location == "header" && requestOptions && requestOptions.headers) {
-            requestOptions.headers[this.paramName] = this.apiKey;
-        }
-    };
-    return ApiKeyAuth;
-}());
-exports.ApiKeyAuth = ApiKeyAuth;
-var OAuth = (function () {
-    function OAuth() {
-        this.accessToken = '';
-    }
-    OAuth.prototype.applyToRequest = function (requestOptions) {
-        if (requestOptions && requestOptions.headers) {
-            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
-        }
-    };
-    return OAuth;
-}());
-exports.OAuth = OAuth;
-var VoidAuth = (function () {
-    function VoidAuth() {
-        this.username = '';
-        this.password = '';
-    }
-    VoidAuth.prototype.applyToRequest = function (_) {
-    };
-    return VoidAuth;
-}());
-exports.VoidAuth = VoidAuth;
-var PetApiApiKeys;
-(function (PetApiApiKeys) {
-    PetApiApiKeys[PetApiApiKeys["api_key"] = 0] = "api_key";
-})(PetApiApiKeys = exports.PetApiApiKeys || (exports.PetApiApiKeys = {}));
-var PetApi = (function () {
-    function PetApi(basePathOrUsername, password, basePath) {
-        this._basePath = defaultBasePath;
-        this.defaultHeaders = {};
-        this._useQuerystring = false;
-        this.authentications = {
-            'default': new VoidAuth(),
-            'api_key': new ApiKeyAuth('header', 'api_key'),
-            'petstore_auth': new OAuth(),
-        };
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        }
-        else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername;
-            }
-        }
-    }
-    Object.defineProperty(PetApi.prototype, "useQuerystring", {
-        set: function (value) {
-            this._useQuerystring = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(PetApi.prototype, "basePath", {
-        get: function () {
-            return this._basePath;
-        },
-        set: function (basePath) {
-            this._basePath = basePath;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    PetApi.prototype.setDefaultAuthentication = function (auth) {
-        this.authentications.default = auth;
-    };
-    PetApi.prototype.setApiKey = function (key, value) {
-        this.authentications[PetApiApiKeys[key]].apiKey = value;
-    };
-    Object.defineProperty(PetApi.prototype, "accessToken", {
-        set: function (token) {
-            this.authentications.petstore_auth.accessToken = token;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    PetApi.prototype.addPet = function (pet) {
-        var localVarPath = this.basePath + '/pet';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (pet === null || pet === undefined) {
-            throw new Error('Required parameter pet was null or undefined when calling addPet.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(pet, "Pet")
-        };
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    PetApi.prototype.deletePet = function (petId, apiKey) {
-        var localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling deletePet.');
-        }
-        localVarHeaderParams['api_key'] = ObjectSerializer.serialize(apiKey, "string");
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    PetApi.prototype.findPetsByStatus = function (status) {
-        var localVarPath = this.basePath + '/pet/findByStatus';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (status === null || status === undefined) {
-            throw new Error('Required parameter status was null or undefined when calling findPetsByStatus.');
-        }
-        if (status !== undefined) {
-            localVarQueryParameters['status'] = ObjectSerializer.serialize(status, "Array<'available' | 'pending' | 'sold'>");
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    PetApi.prototype.findPetsByTags = function (tags) {
-        var localVarPath = this.basePath + '/pet/findByTags';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (tags === null || tags === undefined) {
-            throw new Error('Required parameter tags was null or undefined when calling findPetsByTags.');
-        }
-        if (tags !== undefined) {
-            localVarQueryParameters['tags'] = ObjectSerializer.serialize(tags, "Array<string>");
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    PetApi.prototype.getPetById = function (petId) {
-        var localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling getPetById.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.api_key.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Pet");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    PetApi.prototype.updatePet = function (pet) {
-        var localVarPath = this.basePath + '/pet';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (pet === null || pet === undefined) {
-            throw new Error('Required parameter pet was null or undefined when calling updatePet.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'PUT',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(pet, "Pet")
-        };
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    PetApi.prototype.updatePetWithForm = function (petId, name, status) {
-        var localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling updatePetWithForm.');
-        }
-        var localVarUseFormData = false;
-        if (name !== undefined) {
-            localVarFormParams['name'] = ObjectSerializer.serialize(name, "string");
-        }
-        if (status !== undefined) {
-            localVarFormParams['status'] = ObjectSerializer.serialize(status, "string");
-        }
-        var localVarRequestOptions = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    PetApi.prototype.uploadFile = function (petId, additionalMetadata, file) {
-        var localVarPath = this.basePath + '/pet/{petId}/uploadImage'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling uploadFile.');
-        }
-        var localVarUseFormData = false;
-        if (additionalMetadata !== undefined) {
-            localVarFormParams['additionalMetadata'] = ObjectSerializer.serialize(additionalMetadata, "string");
-        }
-        if (file !== undefined) {
-            localVarFormParams['file'] = file;
-        }
-        localVarUseFormData = true;
-        var localVarRequestOptions = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "ApiResponse");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    return PetApi;
-}());
-exports.PetApi = PetApi;
-var StoreApiApiKeys;
-(function (StoreApiApiKeys) {
-    StoreApiApiKeys[StoreApiApiKeys["api_key"] = 0] = "api_key";
-})(StoreApiApiKeys = exports.StoreApiApiKeys || (exports.StoreApiApiKeys = {}));
-var StoreApi = (function () {
-    function StoreApi(basePathOrUsername, password, basePath) {
-        this._basePath = defaultBasePath;
-        this.defaultHeaders = {};
-        this._useQuerystring = false;
-        this.authentications = {
-            'default': new VoidAuth(),
-            'api_key': new ApiKeyAuth('header', 'api_key'),
-            'petstore_auth': new OAuth(),
-        };
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        }
-        else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername;
-            }
-        }
-    }
-    Object.defineProperty(StoreApi.prototype, "useQuerystring", {
-        set: function (value) {
-            this._useQuerystring = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StoreApi.prototype, "basePath", {
-        get: function () {
-            return this._basePath;
-        },
-        set: function (basePath) {
-            this._basePath = basePath;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StoreApi.prototype.setDefaultAuthentication = function (auth) {
-        this.authentications.default = auth;
-    };
-    StoreApi.prototype.setApiKey = function (key, value) {
-        this.authentications[StoreApiApiKeys[key]].apiKey = value;
-    };
-    Object.defineProperty(StoreApi.prototype, "accessToken", {
-        set: function (token) {
-            this.authentications.petstore_auth.accessToken = token;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StoreApi.prototype.deleteOrder = function (orderId) {
-        var localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling deleteOrder.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    StoreApi.prototype.getInventory = function () {
-        var localVarPath = this.basePath + '/store/inventory';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.api_key.applyToRequest(localVarRequestOptions);
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "{ [key: string]: number; }");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    StoreApi.prototype.getOrderById = function (orderId) {
-        var localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling getOrderById.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    StoreApi.prototype.placeOrder = function (order) {
-        var localVarPath = this.basePath + '/store/order';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (order === null || order === undefined) {
-            throw new Error('Required parameter order was null or undefined when calling placeOrder.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(order, "Order")
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    return StoreApi;
-}());
-exports.StoreApi = StoreApi;
-var UserApiApiKeys;
-(function (UserApiApiKeys) {
-    UserApiApiKeys[UserApiApiKeys["api_key"] = 0] = "api_key";
-})(UserApiApiKeys = exports.UserApiApiKeys || (exports.UserApiApiKeys = {}));
-var UserApi = (function () {
-    function UserApi(basePathOrUsername, password, basePath) {
-        this._basePath = defaultBasePath;
-        this.defaultHeaders = {};
-        this._useQuerystring = false;
-        this.authentications = {
-            'default': new VoidAuth(),
-            'api_key': new ApiKeyAuth('header', 'api_key'),
-            'petstore_auth': new OAuth(),
-        };
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        }
-        else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername;
-            }
-        }
-    }
-    Object.defineProperty(UserApi.prototype, "useQuerystring", {
-        set: function (value) {
-            this._useQuerystring = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(UserApi.prototype, "basePath", {
-        get: function () {
-            return this._basePath;
-        },
-        set: function (basePath) {
-            this._basePath = basePath;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    UserApi.prototype.setDefaultAuthentication = function (auth) {
-        this.authentications.default = auth;
-    };
-    UserApi.prototype.setApiKey = function (key, value) {
-        this.authentications[UserApiApiKeys[key]].apiKey = value;
-    };
-    Object.defineProperty(UserApi.prototype, "accessToken", {
-        set: function (token) {
-            this.authentications.petstore_auth.accessToken = token;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    UserApi.prototype.createUser = function (user) {
-        var localVarPath = this.basePath + '/user';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUser.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "User")
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    UserApi.prototype.createUsersWithArrayInput = function (user) {
-        var localVarPath = this.basePath + '/user/createWithArray';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUsersWithArrayInput.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "Array<User>")
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    UserApi.prototype.createUsersWithListInput = function (user) {
-        var localVarPath = this.basePath + '/user/createWithList';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUsersWithListInput.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "Array<User>")
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    UserApi.prototype.deleteUser = function (username) {
-        var localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling deleteUser.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    UserApi.prototype.getUserByName = function (username) {
-        var localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling getUserByName.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "User");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    UserApi.prototype.loginUser = function (username, password) {
-        var localVarPath = this.basePath + '/user/login';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling loginUser.');
-        }
-        if (password === null || password === undefined) {
-            throw new Error('Required parameter password was null or undefined when calling loginUser.');
-        }
-        if (username !== undefined) {
-            localVarQueryParameters['username'] = ObjectSerializer.serialize(username, "string");
-        }
-        if (password !== undefined) {
-            localVarQueryParameters['password'] = ObjectSerializer.serialize(password, "string");
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    body = ObjectSerializer.deserialize(body, "string");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    UserApi.prototype.logoutUser = function () {
-        var localVarPath = this.basePath + '/user/logout';
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    UserApi.prototype.updateUser = function (username, user) {
-        var localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        var localVarQueryParameters = {};
-        var localVarHeaderParams = Object.assign({}, this.defaultHeaders);
-        var localVarFormParams = {};
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling updateUser.');
-        }
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling updateUser.');
-        }
-        var localVarUseFormData = false;
-        var localVarRequestOptions = {
-            method: 'PUT',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "User")
-        };
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                localVarRequestOptions.formData = localVarFormParams;
-            }
-            else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise(function (resolve, reject) {
-            localVarRequest(localVarRequestOptions, function (error, response, body) {
-                if (error) {
-                    reject(error);
-                }
-                else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    }
-                    else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    };
-    return UserApi;
-}());
-exports.UserApi = UserApi;
-//# sourceMappingURL=api.js.map
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/npm/api.js.map b/samples/client/petstore/typescript-node/npm/api.js.map
deleted file mode 100644
index a6ed6bbada3076fe8398f817c12f48ef317a0ca3..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/npm/api.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"api.js","sourceRoot":"","sources":["api.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/npm/api.ts b/samples/client/petstore/typescript-node/npm/api.ts
index 13b8db92be6f410a1dcb0be96b03588c60333749..4b76122d807be1033564b07d69f475a8b4cbf959 100644
--- a/samples/client/petstore/typescript-node/npm/api.ts
+++ b/samples/client/petstore/typescript-node/npm/api.ts
@@ -1,1732 +1,3 @@
-/**
- * OpenAPI Petstore
- * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
- *
- * OpenAPI spec version: 1.0.0
- * 
- *
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
- * https://openapi-generator.tech
- * Do not edit the class manually.
- */
-
-import localVarRequest = require('request');
-import http = require('http');
-import Promise = require('bluebird');
-
-let defaultBasePath = 'http://petstore.swagger.io/v2';
-
-// ===============================================
-// This file is autogenerated - Please do not edit
-// ===============================================
-
-/* tslint:disable:no-unused-variable */
-let primitives = [
-                    "string",
-                    "boolean",
-                    "double",
-                    "integer",
-                    "long",
-                    "float",
-                    "number",
-                    "any"
-                 ];
-
-class ObjectSerializer {
-
-    public static findCorrectType(data: any, expectedType: string) {
-        if (data == undefined) {
-            return expectedType;
-        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
-            return expectedType;
-        } else if (expectedType === "Date") {
-            return expectedType;
-        } else {
-            if (enumsMap[expectedType]) {
-                return expectedType;
-            }
-
-            if (!typeMap[expectedType]) {
-                return expectedType; // w/e we don't know the type
-            }
-
-            // Check the discriminator
-            let discriminatorProperty = typeMap[expectedType].discriminator;
-            if (discriminatorProperty == null) {
-                return expectedType; // the type does not have a discriminator. use it.
-            } else {
-                if (data[discriminatorProperty]) {
-                    return data[discriminatorProperty]; // use the type given in the discriminator
-                } else {
-                    return expectedType; // discriminator was not present (or an empty string)
-                }
-            }
-        }
-    }
-
-    public static serialize(data: any, type: string) {
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.serialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return data.toString();
-        } else {
-            if (enumsMap[type]) {
-                return data;
-            }
-            if (!typeMap[type]) { // in case we dont know the type
-                return data;
-            }
-
-            // get the map for the correct type.
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            let instance: {[index: string]: any} = {};
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
-            }
-            return instance;
-        }
-    }
-
-    public static deserialize(data: any, type: string) {
-        // polymorphism may change the actual type.
-        type = ObjectSerializer.findCorrectType(data, type);
-        if (data == undefined) {
-            return data;
-        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
-            return data;
-        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
-            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
-            subType = subType.substring(0, subType.length - 1); // Type> => Type
-            let transformedData: any[] = [];
-            for (let index in data) {
-                let date = data[index];
-                transformedData.push(ObjectSerializer.deserialize(date, subType));
-            }
-            return transformedData;
-        } else if (type === "Date") {
-            return new Date(data);
-        } else {
-            if (enumsMap[type]) {// is Enum
-                return data;
-            }
-
-            if (!typeMap[type]) { // dont know the type
-                return data;
-            }
-            let instance = new typeMap[type]();
-            let attributeTypes = typeMap[type].getAttributeTypeMap();
-            for (let index in attributeTypes) {
-                let attributeType = attributeTypes[index];
-                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
-            }
-            return instance;
-        }
-    }
-}
-
-/**
-* Describes the result of uploading an image resource
-*/
-export class ApiResponse {
-    'code'?: number;
-    'type'?: string;
-    'message'?: string;
-
-    static discriminator = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "code",
-            "baseName": "code",
-            "type": "number"
-        },
-        {
-            "name": "type",
-            "baseName": "type",
-            "type": "string"
-        },
-        {
-            "name": "message",
-            "baseName": "message",
-            "type": "string"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return ApiResponse.attributeTypeMap;
-    }
-}
-
-/**
-* A category for a pet
-*/
-export class Category {
-    'id'?: number;
-    'name'?: string;
-
-    static discriminator = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Category.attributeTypeMap;
-    }
-}
-
-/**
-* An order for a pets from the pet store
-*/
-export class Order {
-    'id'?: number;
-    'petId'?: number;
-    'quantity'?: number;
-    'shipDate'?: Date;
-    /**
-    * Order Status
-    */
-    'status'?: Order.StatusEnum;
-    'complete'?: boolean;
-
-    static discriminator = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "petId",
-            "baseName": "petId",
-            "type": "number"
-        },
-        {
-            "name": "quantity",
-            "baseName": "quantity",
-            "type": "number"
-        },
-        {
-            "name": "shipDate",
-            "baseName": "shipDate",
-            "type": "Date"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Order.StatusEnum"
-        },
-        {
-            "name": "complete",
-            "baseName": "complete",
-            "type": "boolean"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Order.attributeTypeMap;
-    }
-}
-
-export namespace Order {
-    export enum StatusEnum {
-        Placed = <any> 'placed',
-        Approved = <any> 'approved',
-        Delivered = <any> 'delivered'
-    }
-}
-/**
-* A pet for sale in the pet store
-*/
-export class Pet {
-    'id'?: number;
-    'category'?: Category;
-    'name': string;
-    'photoUrls': Array<string>;
-    'tags'?: Array<Tag>;
-    /**
-    * pet status in the store
-    */
-    'status'?: Pet.StatusEnum;
-
-    static discriminator = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "category",
-            "baseName": "category",
-            "type": "Category"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        },
-        {
-            "name": "photoUrls",
-            "baseName": "photoUrls",
-            "type": "Array<string>"
-        },
-        {
-            "name": "tags",
-            "baseName": "tags",
-            "type": "Array<Tag>"
-        },
-        {
-            "name": "status",
-            "baseName": "status",
-            "type": "Pet.StatusEnum"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Pet.attributeTypeMap;
-    }
-}
-
-export namespace Pet {
-    export enum StatusEnum {
-        Available = <any> 'available',
-        Pending = <any> 'pending',
-        Sold = <any> 'sold'
-    }
-}
-/**
-* A tag for a pet
-*/
-export class Tag {
-    'id'?: number;
-    'name'?: string;
-
-    static discriminator = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "name",
-            "baseName": "name",
-            "type": "string"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return Tag.attributeTypeMap;
-    }
-}
-
-/**
-* A User who is purchasing from the pet store
-*/
-export class User {
-    'id'?: number;
-    'username'?: string;
-    'firstName'?: string;
-    'lastName'?: string;
-    'email'?: string;
-    'password'?: string;
-    'phone'?: string;
-    /**
-    * User Status
-    */
-    'userStatus'?: number;
-
-    static discriminator = undefined;
-
-    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
-        {
-            "name": "id",
-            "baseName": "id",
-            "type": "number"
-        },
-        {
-            "name": "username",
-            "baseName": "username",
-            "type": "string"
-        },
-        {
-            "name": "firstName",
-            "baseName": "firstName",
-            "type": "string"
-        },
-        {
-            "name": "lastName",
-            "baseName": "lastName",
-            "type": "string"
-        },
-        {
-            "name": "email",
-            "baseName": "email",
-            "type": "string"
-        },
-        {
-            "name": "password",
-            "baseName": "password",
-            "type": "string"
-        },
-        {
-            "name": "phone",
-            "baseName": "phone",
-            "type": "string"
-        },
-        {
-            "name": "userStatus",
-            "baseName": "userStatus",
-            "type": "number"
-        }    ];
-
-    static getAttributeTypeMap() {
-        return User.attributeTypeMap;
-    }
-}
-
-
-let enumsMap: {[index: string]: any} = {
-        "Order.StatusEnum": Order.StatusEnum,
-        "Pet.StatusEnum": Pet.StatusEnum,
-}
-
-let typeMap: {[index: string]: any} = {
-    "ApiResponse": ApiResponse,
-    "Category": Category,
-    "Order": Order,
-    "Pet": Pet,
-    "Tag": Tag,
-    "User": User,
-}
-
-export interface Authentication {
-    /**
-    * Apply authentication settings to header and query params.
-    */
-    applyToRequest(requestOptions: localVarRequest.Options): void;
-}
-
-export class HttpBasicAuth implements Authentication {
-    public username: string = '';
-    public password: string = '';
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        requestOptions.auth = {
-            username: this.username, password: this.password
-        }
-    }
-}
-
-export class ApiKeyAuth implements Authentication {
-    public apiKey: string = '';
-
-    constructor(private location: string, private paramName: string) {
-    }
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (this.location == "query") {
-            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
-        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
-            requestOptions.headers[this.paramName] = this.apiKey;
-        }
-    }
-}
-
-export class OAuth implements Authentication {
-    public accessToken: string = '';
-
-    applyToRequest(requestOptions: localVarRequest.Options): void {
-        if (requestOptions && requestOptions.headers) {
-            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
-        }
-    }
-}
-
-export class VoidAuth implements Authentication {
-    public username: string = '';
-    public password: string = '';
-
-    applyToRequest(_: localVarRequest.Options): void {
-        // Do nothing
-    }
-}
-
-export enum PetApiApiKeys {
-    api_key,
-}
-
-export class PetApi {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-        'api_key': new ApiKeyAuth('header', 'api_key'),
-        'petstore_auth': new OAuth(),
-    }
-
-    constructor(basePath?: string);
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: PetApiApiKeys, value: string) {
-        (this.authentications as any)[PetApiApiKeys[key]].apiKey = value;
-    }
-
-    set accessToken(token: string) {
-        this.authentications.petstore_auth.accessToken = token;
-    }
-    /**
-     * 
-     * @summary Add a new pet to the store
-     * @param pet Pet object that needs to be added to the store
-     */
-    public addPet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'pet' is not null or undefined
-        if (pet === null || pet === undefined) {
-            throw new Error('Required parameter pet was null or undefined when calling addPet.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(pet, "Pet")
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Deletes a pet
-     * @param petId Pet id to delete
-     * @param apiKey 
-     */
-    public deletePet (petId: number, apiKey?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling deletePet.');
-        }
-
-        localVarHeaderParams['api_key'] = ObjectSerializer.serialize(apiKey, "string");
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Multiple status values can be provided with comma separated strings
-     * @summary Finds Pets by status
-     * @param status Status values that need to be considered for filter
-     */
-    public findPetsByStatus (status: Array<'available' | 'pending' | 'sold'>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
-        const localVarPath = this.basePath + '/pet/findByStatus';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'status' is not null or undefined
-        if (status === null || status === undefined) {
-            throw new Error('Required parameter status was null or undefined when calling findPetsByStatus.');
-        }
-
-        if (status !== undefined) {
-            localVarQueryParameters['status'] = ObjectSerializer.serialize(status, "Array<'available' | 'pending' | 'sold'>");
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
-     * @summary Finds Pets by tags
-     * @param tags Tags to filter by
-     */
-    public findPetsByTags (tags: Array<string>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
-        const localVarPath = this.basePath + '/pet/findByTags';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'tags' is not null or undefined
-        if (tags === null || tags === undefined) {
-            throw new Error('Required parameter tags was null or undefined when calling findPetsByTags.');
-        }
-
-        if (tags !== undefined) {
-            localVarQueryParameters['tags'] = ObjectSerializer.serialize(tags, "Array<string>");
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Returns a single pet
-     * @summary Find pet by ID
-     * @param petId ID of pet to return
-     */
-    public getPetById (petId: number) : Promise<{ response: http.ClientResponse; body: Pet;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling getPetById.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.api_key.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Pet;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Pet");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Update an existing pet
-     * @param pet Pet object that needs to be added to the store
-     */
-    public updatePet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'pet' is not null or undefined
-        if (pet === null || pet === undefined) {
-            throw new Error('Required parameter pet was null or undefined when calling updatePet.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'PUT',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(pet, "Pet")
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Updates a pet in the store with form data
-     * @param petId ID of pet that needs to be updated
-     * @param name Updated name of the pet
-     * @param status Updated status of the pet
-     */
-    public updatePetWithForm (petId: number, name?: string, status?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling updatePetWithForm.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        if (name !== undefined) {
-            localVarFormParams['name'] = ObjectSerializer.serialize(name, "string");
-        }
-
-        if (status !== undefined) {
-            localVarFormParams['status'] = ObjectSerializer.serialize(status, "string");
-        }
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary uploads an image
-     * @param petId ID of pet to update
-     * @param additionalMetadata Additional data to pass to server
-     * @param file file to upload
-     */
-    public uploadFile (petId: number, additionalMetadata?: string, file?: Buffer) : Promise<{ response: http.ClientResponse; body: ApiResponse;  }> {
-        const localVarPath = this.basePath + '/pet/{petId}/uploadImage'
-            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'petId' is not null or undefined
-        if (petId === null || petId === undefined) {
-            throw new Error('Required parameter petId was null or undefined when calling uploadFile.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        if (additionalMetadata !== undefined) {
-            localVarFormParams['additionalMetadata'] = ObjectSerializer.serialize(additionalMetadata, "string");
-        }
-
-        if (file !== undefined) {
-            localVarFormParams['file'] = file;
-        }
-        localVarUseFormData = true;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: ApiResponse;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "ApiResponse");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-}
-export enum StoreApiApiKeys {
-    api_key,
-}
-
-export class StoreApi {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-        'api_key': new ApiKeyAuth('header', 'api_key'),
-        'petstore_auth': new OAuth(),
-    }
-
-    constructor(basePath?: string);
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: StoreApiApiKeys, value: string) {
-        (this.authentications as any)[StoreApiApiKeys[key]].apiKey = value;
-    }
-
-    set accessToken(token: string) {
-        this.authentications.petstore_auth.accessToken = token;
-    }
-    /**
-     * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
-     * @summary Delete purchase order by ID
-     * @param orderId ID of the order that needs to be deleted
-     */
-    public deleteOrder (orderId: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'orderId' is not null or undefined
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling deleteOrder.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * Returns a map of status codes to quantities
-     * @summary Returns pet inventories by status
-     */
-    public getInventory () : Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }> {
-        const localVarPath = this.basePath + '/store/inventory';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.api_key.applyToRequest(localVarRequestOptions);
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "{ [key: string]: number; }");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
-     * @summary Find purchase order by ID
-     * @param orderId ID of pet that needs to be fetched
-     */
-    public getOrderById (orderId: number) : Promise<{ response: http.ClientResponse; body: Order;  }> {
-        const localVarPath = this.basePath + '/store/order/{orderId}'
-            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'orderId' is not null or undefined
-        if (orderId === null || orderId === undefined) {
-            throw new Error('Required parameter orderId was null or undefined when calling getOrderById.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Place an order for a pet
-     * @param order order placed for purchasing the pet
-     */
-    public placeOrder (order: Order) : Promise<{ response: http.ClientResponse; body: Order;  }> {
-        const localVarPath = this.basePath + '/store/order';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'order' is not null or undefined
-        if (order === null || order === undefined) {
-            throw new Error('Required parameter order was null or undefined when calling placeOrder.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(order, "Order")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "Order");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-}
-export enum UserApiApiKeys {
-    api_key,
-}
-
-export class UserApi {
-    protected _basePath = defaultBasePath;
-    protected defaultHeaders : any = {};
-    protected _useQuerystring : boolean = false;
-
-    protected authentications = {
-        'default': <Authentication>new VoidAuth(),
-        'api_key': new ApiKeyAuth('header', 'api_key'),
-        'petstore_auth': new OAuth(),
-    }
-
-    constructor(basePath?: string);
-    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
-        if (password) {
-            if (basePath) {
-                this.basePath = basePath;
-            }
-        } else {
-            if (basePathOrUsername) {
-                this.basePath = basePathOrUsername
-            }
-        }
-    }
-
-    set useQuerystring(value: boolean) {
-        this._useQuerystring = value;
-    }
-
-    set basePath(basePath: string) {
-        this._basePath = basePath;
-    }
-
-    get basePath() {
-        return this._basePath;
-    }
-
-    public setDefaultAuthentication(auth: Authentication) {
-	this.authentications.default = auth;
-    }
-
-    public setApiKey(key: UserApiApiKeys, value: string) {
-        (this.authentications as any)[UserApiApiKeys[key]].apiKey = value;
-    }
-
-    set accessToken(token: string) {
-        this.authentications.petstore_auth.accessToken = token;
-    }
-    /**
-     * This can only be done by the logged in user.
-     * @summary Create user
-     * @param user Created user object
-     */
-    public createUser (user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUser.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "User")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Creates list of users with given input array
-     * @param user List of user object
-     */
-    public createUsersWithArrayInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/createWithArray';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUsersWithArrayInput.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "Array<User>")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Creates list of users with given input array
-     * @param user List of user object
-     */
-    public createUsersWithListInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/createWithList';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling createUsersWithListInput.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'POST',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "Array<User>")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * This can only be done by the logged in user.
-     * @summary Delete user
-     * @param username The name that needs to be deleted
-     */
-    public deleteUser (username: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling deleteUser.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'DELETE',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Get user by user name
-     * @param username The name that needs to be fetched. Use user1 for testing.
-     */
-    public getUserByName (username: string) : Promise<{ response: http.ClientResponse; body: User;  }> {
-        const localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling getUserByName.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: User;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "User");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Logs user into the system
-     * @param username The user name for login
-     * @param password The password for login in clear text
-     */
-    public loginUser (username: string, password: string) : Promise<{ response: http.ClientResponse; body: string;  }> {
-        const localVarPath = this.basePath + '/user/login';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling loginUser.');
-        }
-
-        // verify required parameter 'password' is not null or undefined
-        if (password === null || password === undefined) {
-            throw new Error('Required parameter password was null or undefined when calling loginUser.');
-        }
-
-        if (username !== undefined) {
-            localVarQueryParameters['username'] = ObjectSerializer.serialize(username, "string");
-        }
-
-        if (password !== undefined) {
-            localVarQueryParameters['password'] = ObjectSerializer.serialize(password, "string");
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body: string;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    body = ObjectSerializer.deserialize(body, "string");
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * 
-     * @summary Logs out current logged in user session
-     */
-    public logoutUser () : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/logout';
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'GET',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-    /**
-     * This can only be done by the logged in user.
-     * @summary Updated user
-     * @param username name that need to be deleted
-     * @param user Updated user object
-     */
-    public updateUser (username: string, user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
-        const localVarPath = this.basePath + '/user/{username}'
-            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
-        let localVarQueryParameters: any = {};
-        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
-        let localVarFormParams: any = {};
-
-        // verify required parameter 'username' is not null or undefined
-        if (username === null || username === undefined) {
-            throw new Error('Required parameter username was null or undefined when calling updateUser.');
-        }
-
-        // verify required parameter 'user' is not null or undefined
-        if (user === null || user === undefined) {
-            throw new Error('Required parameter user was null or undefined when calling updateUser.');
-        }
-
-
-        let localVarUseFormData = false;
-
-        let localVarRequestOptions: localVarRequest.Options = {
-            method: 'PUT',
-            qs: localVarQueryParameters,
-            headers: localVarHeaderParams,
-            uri: localVarPath,
-            useQuerystring: this._useQuerystring,
-            json: true,
-            body: ObjectSerializer.serialize(user, "User")
-        };
-
-        this.authentications.default.applyToRequest(localVarRequestOptions);
-
-        if (Object.keys(localVarFormParams).length) {
-            if (localVarUseFormData) {
-                (<any>localVarRequestOptions).formData = localVarFormParams;
-            } else {
-                localVarRequestOptions.form = localVarFormParams;
-            }
-        }
-        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
-            localVarRequest(localVarRequestOptions, (error, response, body) => {
-                if (error) {
-                    reject(error);
-                } else {
-                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
-                        resolve({ response: response, body: body });
-                    } else {
-                        reject({ response: response, body: body });
-                    }
-                }
-            });
-        });
-    }
-}
+// This is the entrypoint for the package
+export * from './api/apis';
+export * from './model/models';
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/npm/api/apis.ts b/samples/client/petstore/typescript-node/npm/api/apis.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2bbfc445eaf05ffc1c80992e51a165a5a09561fe
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/api/apis.ts
@@ -0,0 +1,7 @@
+export * from './petApi';
+import { PetApi } from './petApi';
+export * from './storeApi';
+import { StoreApi } from './storeApi';
+export * from './userApi';
+import { UserApi } from './userApi';
+export const APIS = [PetApi, StoreApi, UserApi];
diff --git a/samples/client/petstore/typescript-node/npm/api/petApi.ts b/samples/client/petstore/typescript-node/npm/api/petApi.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c367b489d22bc940a2bfdaf68dfa04298fadd073
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/api/petApi.ts
@@ -0,0 +1,546 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import localVarRequest = require('request');
+import http = require('http');
+import Promise = require('bluebird');
+
+/* tslint:disable:no-unused-locals */
+import { ApiResponse } from '../model/apiResponse';
+import { Pet } from '../model/pet';
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = 'http://petstore.swagger.io/v2';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum PetApiApiKeys {
+    api_key,
+}
+
+export class PetApi {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+        'petstore_auth': new OAuth(),
+        'api_key': new ApiKeyAuth('header', 'api_key'),
+    }
+
+    constructor(basePath?: string);
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: PetApiApiKeys, value: string) {
+        (this.authentications as any)[PetApiApiKeys[key]].apiKey = value;
+    }
+
+    set accessToken(token: string) {
+        this.authentications.petstore_auth.accessToken = token;
+    }
+
+    /**
+     * 
+     * @summary Add a new pet to the store
+     * @param pet Pet object that needs to be added to the store
+     */
+    public addPet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'pet' is not null or undefined
+        if (pet === null || pet === undefined) {
+            throw new Error('Required parameter pet was null or undefined when calling addPet.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(pet, "Pet")
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Deletes a pet
+     * @param petId Pet id to delete
+     * @param apiKey 
+     */
+    public deletePet (petId: number, apiKey?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling deletePet.');
+        }
+
+        localVarHeaderParams['api_key'] = ObjectSerializer.serialize(apiKey, "string");
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'DELETE',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Multiple status values can be provided with comma separated strings
+     * @summary Finds Pets by status
+     * @param status Status values that need to be considered for filter
+     */
+    public findPetsByStatus (status: Array<'available' | 'pending' | 'sold'>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
+        const localVarPath = this.basePath + '/pet/findByStatus';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'status' is not null or undefined
+        if (status === null || status === undefined) {
+            throw new Error('Required parameter status was null or undefined when calling findPetsByStatus.');
+        }
+
+        if (status !== undefined) {
+            localVarQueryParameters['status'] = ObjectSerializer.serialize(status, "Array<'available' | 'pending' | 'sold'>");
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
+     * @summary Finds Pets by tags
+     * @param tags Tags to filter by
+     */
+    public findPetsByTags (tags: Array<string>) : Promise<{ response: http.ClientResponse; body: Array<Pet>;  }> {
+        const localVarPath = this.basePath + '/pet/findByTags';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'tags' is not null or undefined
+        if (tags === null || tags === undefined) {
+            throw new Error('Required parameter tags was null or undefined when calling findPetsByTags.');
+        }
+
+        if (tags !== undefined) {
+            localVarQueryParameters['tags'] = ObjectSerializer.serialize(tags, "Array<string>");
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Array<Pet>;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Array<Pet>");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Returns a single pet
+     * @summary Find pet by ID
+     * @param petId ID of pet to return
+     */
+    public getPetById (petId: number) : Promise<{ response: http.ClientResponse; body: Pet;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling getPetById.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.api_key.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Pet;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Pet");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Update an existing pet
+     * @param pet Pet object that needs to be added to the store
+     */
+    public updatePet (pet: Pet) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'pet' is not null or undefined
+        if (pet === null || pet === undefined) {
+            throw new Error('Required parameter pet was null or undefined when calling updatePet.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'PUT',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(pet, "Pet")
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Updates a pet in the store with form data
+     * @param petId ID of pet that needs to be updated
+     * @param name Updated name of the pet
+     * @param status Updated status of the pet
+     */
+    public updatePetWithForm (petId: number, name?: string, status?: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling updatePetWithForm.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        if (name !== undefined) {
+            localVarFormParams['name'] = ObjectSerializer.serialize(name, "string");
+        }
+
+        if (status !== undefined) {
+            localVarFormParams['status'] = ObjectSerializer.serialize(status, "string");
+        }
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary uploads an image
+     * @param petId ID of pet to update
+     * @param additionalMetadata Additional data to pass to server
+     * @param file file to upload
+     */
+    public uploadFile (petId: number, additionalMetadata?: string, file?: Buffer) : Promise<{ response: http.ClientResponse; body: ApiResponse;  }> {
+        const localVarPath = this.basePath + '/pet/{petId}/uploadImage'
+            .replace('{' + 'petId' + '}', encodeURIComponent(String(petId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'petId' is not null or undefined
+        if (petId === null || petId === undefined) {
+            throw new Error('Required parameter petId was null or undefined when calling uploadFile.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        if (additionalMetadata !== undefined) {
+            localVarFormParams['additionalMetadata'] = ObjectSerializer.serialize(additionalMetadata, "string");
+        }
+
+        if (file !== undefined) {
+            localVarFormParams['file'] = file;
+        }
+        localVarUseFormData = true;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.petstore_auth.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: ApiResponse;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "ApiResponse");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+}
diff --git a/samples/client/petstore/typescript-node/npm/api/storeApi.ts b/samples/client/petstore/typescript-node/npm/api/storeApi.ts
new file mode 100644
index 0000000000000000000000000000000000000000..39a1b21f2383e91b27effb98f6a3e8ee1ffa27b4
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/api/storeApi.ts
@@ -0,0 +1,281 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import localVarRequest = require('request');
+import http = require('http');
+import Promise = require('bluebird');
+
+/* tslint:disable:no-unused-locals */
+import { Order } from '../model/order';
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = 'http://petstore.swagger.io/v2';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum StoreApiApiKeys {
+    api_key,
+}
+
+export class StoreApi {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+        'api_key': new ApiKeyAuth('header', 'api_key'),
+    }
+
+    constructor(basePath?: string);
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: StoreApiApiKeys, value: string) {
+        (this.authentications as any)[StoreApiApiKeys[key]].apiKey = value;
+    }
+
+    /**
+     * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
+     * @summary Delete purchase order by ID
+     * @param orderId ID of the order that needs to be deleted
+     */
+    public deleteOrder (orderId: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/store/order/{orderId}'
+            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'orderId' is not null or undefined
+        if (orderId === null || orderId === undefined) {
+            throw new Error('Required parameter orderId was null or undefined when calling deleteOrder.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'DELETE',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * Returns a map of status codes to quantities
+     * @summary Returns pet inventories by status
+     */
+    public getInventory () : Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }> {
+        const localVarPath = this.basePath + '/store/inventory';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.api_key.applyToRequest(localVarRequestOptions);
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: { [key: string]: number; };  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "{ [key: string]: number; }");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
+     * @summary Find purchase order by ID
+     * @param orderId ID of pet that needs to be fetched
+     */
+    public getOrderById (orderId: number) : Promise<{ response: http.ClientResponse; body: Order;  }> {
+        const localVarPath = this.basePath + '/store/order/{orderId}'
+            .replace('{' + 'orderId' + '}', encodeURIComponent(String(orderId)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'orderId' is not null or undefined
+        if (orderId === null || orderId === undefined) {
+            throw new Error('Required parameter orderId was null or undefined when calling getOrderById.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Order");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Place an order for a pet
+     * @param order order placed for purchasing the pet
+     */
+    public placeOrder (order: Order) : Promise<{ response: http.ClientResponse; body: Order;  }> {
+        const localVarPath = this.basePath + '/store/order';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'order' is not null or undefined
+        if (order === null || order === undefined) {
+            throw new Error('Required parameter order was null or undefined when calling placeOrder.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(order, "Order")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: Order;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "Order");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+}
diff --git a/samples/client/petstore/typescript-node/npm/api/userApi.ts b/samples/client/petstore/typescript-node/npm/api/userApi.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fbdb95cb49344bd085e9c5caa6379ea07a3401b8
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/api/userApi.ts
@@ -0,0 +1,504 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import localVarRequest = require('request');
+import http = require('http');
+import Promise = require('bluebird');
+
+/* tslint:disable:no-unused-locals */
+import { User } from '../model/user';
+
+import { ObjectSerializer, Authentication, HttpBasicAuth, ApiKeyAuth, OAuth, VoidAuth } from '../model/models';
+
+let defaultBasePath = 'http://petstore.swagger.io/v2';
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+export enum UserApiApiKeys {
+}
+
+export class UserApi {
+    protected _basePath = defaultBasePath;
+    protected defaultHeaders : any = {};
+    protected _useQuerystring : boolean = false;
+
+    protected authentications = {
+        'default': <Authentication>new VoidAuth(),
+    }
+
+    constructor(basePath?: string);
+    constructor(basePathOrUsername: string, password?: string, basePath?: string) {
+        if (password) {
+            if (basePath) {
+                this.basePath = basePath;
+            }
+        } else {
+            if (basePathOrUsername) {
+                this.basePath = basePathOrUsername
+            }
+        }
+    }
+
+    set useQuerystring(value: boolean) {
+        this._useQuerystring = value;
+    }
+
+    set basePath(basePath: string) {
+        this._basePath = basePath;
+    }
+
+    get basePath() {
+        return this._basePath;
+    }
+
+    public setDefaultAuthentication(auth: Authentication) {
+        this.authentications.default = auth;
+    }
+
+    public setApiKey(key: UserApiApiKeys, value: string) {
+        (this.authentications as any)[UserApiApiKeys[key]].apiKey = value;
+    }
+
+    /**
+     * This can only be done by the logged in user.
+     * @summary Create user
+     * @param user Created user object
+     */
+    public createUser (user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling createUser.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "User")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Creates list of users with given input array
+     * @param user List of user object
+     */
+    public createUsersWithArrayInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/createWithArray';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling createUsersWithArrayInput.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "Array<User>")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Creates list of users with given input array
+     * @param user List of user object
+     */
+    public createUsersWithListInput (user: Array<User>) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/createWithList';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling createUsersWithListInput.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'POST',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "Array<User>")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * This can only be done by the logged in user.
+     * @summary Delete user
+     * @param username The name that needs to be deleted
+     */
+    public deleteUser (username: string) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/{username}'
+            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling deleteUser.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'DELETE',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Get user by user name
+     * @param username The name that needs to be fetched. Use user1 for testing.
+     */
+    public getUserByName (username: string) : Promise<{ response: http.ClientResponse; body: User;  }> {
+        const localVarPath = this.basePath + '/user/{username}'
+            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling getUserByName.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: User;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "User");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Logs user into the system
+     * @param username The user name for login
+     * @param password The password for login in clear text
+     */
+    public loginUser (username: string, password: string) : Promise<{ response: http.ClientResponse; body: string;  }> {
+        const localVarPath = this.basePath + '/user/login';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling loginUser.');
+        }
+
+        // verify required parameter 'password' is not null or undefined
+        if (password === null || password === undefined) {
+            throw new Error('Required parameter password was null or undefined when calling loginUser.');
+        }
+
+        if (username !== undefined) {
+            localVarQueryParameters['username'] = ObjectSerializer.serialize(username, "string");
+        }
+
+        if (password !== undefined) {
+            localVarQueryParameters['password'] = ObjectSerializer.serialize(password, "string");
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body: string;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    body = ObjectSerializer.deserialize(body, "string");
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * 
+     * @summary Logs out current logged in user session
+     */
+    public logoutUser () : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/logout';
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'GET',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+    /**
+     * This can only be done by the logged in user.
+     * @summary Updated user
+     * @param username name that need to be deleted
+     * @param user Updated user object
+     */
+    public updateUser (username: string, user: User) : Promise<{ response: http.ClientResponse; body?: any;  }> {
+        const localVarPath = this.basePath + '/user/{username}'
+            .replace('{' + 'username' + '}', encodeURIComponent(String(username)));
+        let localVarQueryParameters: any = {};
+        let localVarHeaderParams: any = (<any>Object).assign({}, this.defaultHeaders);
+        let localVarFormParams: any = {};
+
+        // verify required parameter 'username' is not null or undefined
+        if (username === null || username === undefined) {
+            throw new Error('Required parameter username was null or undefined when calling updateUser.');
+        }
+
+        // verify required parameter 'user' is not null or undefined
+        if (user === null || user === undefined) {
+            throw new Error('Required parameter user was null or undefined when calling updateUser.');
+        }
+
+
+        let localVarUseFormData = false;
+
+        let localVarRequestOptions: localVarRequest.Options = {
+            method: 'PUT',
+            qs: localVarQueryParameters,
+            headers: localVarHeaderParams,
+            uri: localVarPath,
+            useQuerystring: this._useQuerystring,
+            json: true,
+            body: ObjectSerializer.serialize(user, "User")
+        };
+
+        this.authentications.default.applyToRequest(localVarRequestOptions);
+
+        if (Object.keys(localVarFormParams).length) {
+            if (localVarUseFormData) {
+                (<any>localVarRequestOptions).formData = localVarFormParams;
+            } else {
+                localVarRequestOptions.form = localVarFormParams;
+            }
+        }
+        return new Promise<{ response: http.ClientResponse; body?: any;  }>((resolve, reject) => {
+            localVarRequest(localVarRequestOptions, (error, response, body) => {
+                if (error) {
+                    reject(error);
+                } else {
+                    if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
+                        resolve({ response: response, body: body });
+                    } else {
+                        reject({ response: response, body: body });
+                    }
+                }
+            });
+        });
+    }
+}
diff --git a/samples/client/petstore/typescript-node/npm/client.d.ts b/samples/client/petstore/typescript-node/npm/client.d.ts
deleted file mode 100644
index cb0ff5c3b541f646105198ee23ac0fc3d805023e..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/npm/client.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/samples/client/petstore/typescript-node/npm/client.js b/samples/client/petstore/typescript-node/npm/client.js
deleted file mode 100644
index f5813b8c25acd8141dceb945a287652f48ee683f..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/npm/client.js
+++ /dev/null
@@ -1,142 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var api = require("./api");
-var fs = require("fs");
-function deepCheck(objectA, objectB) {
-    var a = objectA;
-    var b = objectB;
-    var isString = (typeof a === "string" && typeof b === "string");
-    var isBool = (typeof a === "boolean" && typeof b === "boolean");
-    var isNumber = (typeof a === "number" && typeof b === "number");
-    if (a instanceof Array && b instanceof Array) {
-        for (var i = 0; i < a.length; i++) {
-            if (!deepCheck(a[i], b[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-    else if (isString || isBool || isNumber) {
-        return a === b;
-    }
-    else if (typeof a === "object" && typeof b === "object") {
-        for (var key in a) {
-            if (!deepCheck(a[key], b[key])) {
-                return false;
-            }
-        }
-        return true;
-    }
-    else {
-        return a === b;
-    }
-}
-var petApi = new api.PetApi();
-petApi.setApiKey(api.PetApiApiKeys.api_key, 'special-key');
-var tag1 = new api.Tag();
-tag1.id = 18291;
-tag1.name = 'TS tag 1';
-var pet = new api.Pet();
-pet.name = 'TypeScriptDoggie';
-pet.id = 18291;
-pet.photoUrls = ["http://url1", "http://url2"];
-pet.tags = [tag1];
-var petId;
-var exitCode = 0;
-var rewire = require("rewire");
-var rewiredApi = rewire("./api");
-var objectSerializer = rewiredApi.__get__("ObjectSerializer");
-console.log("Checking deserialization.");
-var serializedPet = {
-    "id": pet.id,
-    "category": {
-        "id": 18291,
-        "name": "TS category 1"
-    },
-    "name": pet.name,
-    "photoUrls": pet.photoUrls,
-    "tags": [
-        {
-            "id": 18291,
-            "name": "TS tag 1"
-        }
-    ],
-    "status": "available"
-};
-var deserializedPet = objectSerializer.deserialize(serializedPet, "Pet");
-var petType = deserializedPet instanceof rewiredApi.Pet;
-var tagType1 = deserializedPet.tags[0] instanceof rewiredApi.Tag;
-var categoryType = deserializedPet.category instanceof rewiredApi.Category;
-var checks = {};
-for (var key in deserializedPet) {
-    checks[key] = {};
-    checks[key]["isCorrect"] = deepCheck(deserializedPet[key], serializedPet[key]);
-    checks[key]["is"] = deserializedPet[key];
-    checks[key]["should"] = serializedPet[key];
-}
-var correctTypes = petType && tagType1 && categoryType;
-if (!correctTypes) {
-    exitCode = 1;
-    console.log("PetType correct: ", petType);
-    console.log("TagType1 correct: ", tagType1);
-    console.log("CategoryType correct: ", categoryType);
-}
-for (var key in checks) {
-    var check = checks[key];
-    if (!check["isCorrect"]) {
-        exitCode = 1;
-        console.log(key, " incorrect ", "\nis:\n ", check["is"], "\nshould:\n ", check["should"]);
-    }
-}
-console.log("Checking serialization");
-var category = new api.Category();
-category.id = 18291;
-category.name = "TS category 1";
-pet.category = category;
-pet.status = api.Pet.StatusEnum.Available;
-var reserializedData = objectSerializer.serialize(pet, "Pet");
-if (!deepCheck(reserializedData, serializedPet)) {
-    exitCode = 1;
-    console.log("Reserialized Data incorrect! \nis:\n ", reserializedData, "\nshould:\n ", serializedPet);
-}
-petApi.addPet(pet)
-    .then(function (res) {
-    var newPet = res.body;
-    petId = newPet.id;
-    console.log("Created pet with ID " + petId);
-    newPet.status = api.Pet.StatusEnum.Available;
-    return petApi.updatePet(newPet);
-})
-    .then(function (res) {
-    console.log('Updated pet using POST body');
-    return petApi.updatePetWithForm(petId, undefined, "pending");
-})
-    .then(function (res) {
-    console.log('Updated pet using POST form');
-    return petApi.uploadFile(petId, undefined, fs.readFileSync('sample.png'));
-})
-    .then(function (res) {
-    console.log('Uploaded image');
-    return petApi.getPetById(petId);
-})
-    .then(function (res) {
-    console.log('Got pet by ID: ' + JSON.stringify(res.body));
-    console.log("EnumValue: ", api.Pet.StatusEnum.Pending);
-    console.log("Typeof EnumValue:", typeof api.Pet.StatusEnum.Pending);
-    console.log("Res:", res.body.status);
-    if (res.body.status != api.Pet.StatusEnum.Pending) {
-        throw new Error("Unexpected pet status");
-    }
-})
-    .catch(function (err) {
-    console.error(err);
-    exitCode = 1;
-})
-    .then(function () {
-    return petApi.deletePet(petId);
-})
-    .then(function (res) {
-    console.log('Deleted pet');
-    process.exit(exitCode);
-});
-//# sourceMappingURL=client.js.map
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/npm/client.js.map b/samples/client/petstore/typescript-node/npm/client.js.map
deleted file mode 100644
index 26a3202975b227f0aab3c459cfea605662389656..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/npm/client.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"client.js","sourceRoot":"","sources":["client.ts"],"names":[],"mappings":";;AAAA,2BAA8B;AAC9B,uBAA0B;AAG1B,mBAAmB,OAAY,EAAE,OAAY;IACzC,IAAI,CAAC,GAAG,OAAO,CAAC;IAChB,IAAI,CAAC,GAAG,OAAO,CAAC;IAChB,IAAI,QAAQ,GAAY,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACzE,IAAI,MAAM,GAAY,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;IACzE,IAAI,QAAQ,GAAY,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAEzE,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,KAAK,EAAE;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACxB,OAAO,KAAK,CAAC;aAChB;SACJ;QACD,OAAO,IAAI,CAAC;KACf;SAAM,IAAI,QAAQ,IAAI,MAAM,IAAI,QAAQ,EAAE;QACvC,OAAO,CAAC,KAAK,CAAC,CAAC;KAClB;SAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QACvD,KAAK,IAAI,GAAG,IAAI,CAAC,EAAE;YACf,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC5B,OAAO,KAAK,CAAC;aAChB;SACJ;QACD,OAAO,IAAI,CAAC;KACf;SAAM;QACH,OAAO,CAAC,KAAK,CAAC,CAAC;KAClB;AACL,CAAC;AAED,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;AAC9B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAG3D,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;AACzB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;AAChB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;AAEvB,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;AACxB,GAAG,CAAC,IAAI,GAAG,kBAAkB,CAAC;AAC9B,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;AACf,GAAG,CAAC,SAAS,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAC/C,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;AAElB,IAAI,KAAU,CAAC;AAEf,IAAI,QAAQ,GAAG,CAAC,CAAC;AAGjB,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC/B,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AACjC,IAAI,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC9D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AACzC,IAAI,aAAa,GAAG;IACI,IAAI,EAAE,GAAG,CAAC,EAAE;IACZ,UAAU,EAAE;QACI,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,eAAe;KAC1B;IACb,MAAM,EAAE,GAAG,CAAC,IAAI;IAChB,WAAW,EAAE,GAAG,CAAC,SAAS;IAC1B,MAAM,EAAE;QACI;YACI,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,UAAU;SACrB;KACJ;IACT,QAAQ,EAAE,WAAW;CACxB,CAAC;AACtB,IAAI,eAAe,GAAG,gBAAgB,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAEzE,IAAI,OAAO,GAAY,eAAe,YAAY,UAAU,CAAC,GAAG,CAAC;AACjE,IAAI,QAAQ,GAAY,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,GAAG,CAAC;AAC1E,IAAI,YAAY,GAAY,eAAe,CAAC,QAAQ,YAAY,UAAU,CAAC,QAAQ,CAAC;AAEpF,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,KAAK,IAAI,GAAG,IAAI,eAAe,EAAE;IAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;CAC9C;AACD,IAAI,YAAY,GAAY,OAAO,IAAI,QAAQ,IAAI,YAAY,CAAC;AAEhE,IAAI,CAAC,YAAY,EAAE;IACf,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;CACvD;AAED,KAAK,IAAI,GAAG,IAAI,MAAM,EAAE;IACpB,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,EAAC,UAAU,EACb,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC7E;CACJ;AAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAGtC,IAAI,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;AAClC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC;AACpB,QAAQ,CAAC,IAAI,GAAG,eAAe,CAAC;AAChC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACxB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;AAE1C,IAAI,gBAAgB,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9D,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAE;IAC7C,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,gBAAgB,EACzB,cAAc,EAAE,aAAa,CAAC,CAAC;CAC9E;AAGD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;KACb,IAAI,CAAC,UAAC,GAAG;IACN,IAAI,MAAM,GAAY,GAAG,CAAC,IAAI,CAAC;IAC/B,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,yBAAuB,KAAO,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;IAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,CAAC;KACD,IAAI,CAAC,UAAC,GAAG;IACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC,CAAC;KACD,IAAI,CAAC,UAAC,GAAG;IACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;AAC9E,CAAC,CAAC;KACD,IAAI,CAAC,UAAC,GAAG;IACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC,CAAC;KACD,IAAI,CAAC,UAAC,GAAG;IACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE;QAC/C,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;KAC5C;AACL,CAAC,CAAC;KACD,KAAK,CAAC,UAAC,GAAQ;IACZ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,QAAQ,GAAG,CAAC,CAAC;AACjB,CAAC,CAAC;KACD,IAAI,CAAC;IACF,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC;KACD,IAAI,CAAC,UAAC,GAAG;IACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/npm/client.ts b/samples/client/petstore/typescript-node/npm/client.ts
index e3c7b7c8b3320d7c5637fe1e997cc7356a29934b..1dc7593c31c3d355c55aafe337e02dc776cb4d33 100644
--- a/samples/client/petstore/typescript-node/npm/client.ts
+++ b/samples/client/petstore/typescript-node/npm/client.ts
@@ -51,7 +51,7 @@ var exitCode = 0;
 // Test Object Serializer
 var rewire = require("rewire");
 var rewiredApi = rewire("./api");
-var objectSerializer = rewiredApi.__get__("ObjectSerializer");
+var objectSerializer = rewiredApi.ObjectSerializer;
 console.log("Checking deserialization.");
 var serializedPet = {
                         "id": pet.id,
diff --git a/samples/client/petstore/typescript-node/npm/model/apiResponse.ts b/samples/client/petstore/typescript-node/npm/model/apiResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5abc5ef236456110f130069d8c017b9b93b226b8
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/model/apiResponse.ts
@@ -0,0 +1,45 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* Describes the result of uploading an image resource
+*/
+export class ApiResponse {
+    'code'?: number;
+    'type'?: string;
+    'message'?: string;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "code",
+            "baseName": "code",
+            "type": "number"
+        },
+        {
+            "name": "type",
+            "baseName": "type",
+            "type": "string"
+        },
+        {
+            "name": "message",
+            "baseName": "message",
+            "type": "string"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return ApiResponse.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/npm/model/category.ts b/samples/client/petstore/typescript-node/npm/model/category.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5a2f620f64c3791bf5df5fce77f3aa5b73a3d9c6
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/model/category.ts
@@ -0,0 +1,39 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* A category for a pet
+*/
+export class Category {
+    'id'?: number;
+    'name'?: string;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "name",
+            "baseName": "name",
+            "type": "string"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Category.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/npm/model/models.ts b/samples/client/petstore/typescript-node/npm/model/models.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8ed47b194d736d1887a567b6a280e4a23c79bb1f
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/model/models.ts
@@ -0,0 +1,204 @@
+export * from './apiResponse';
+export * from './category';
+export * from './order';
+export * from './pet';
+export * from './tag';
+export * from './user';
+
+import localVarRequest = require('request');
+
+import { ApiResponse } from './apiResponse';
+import { Category } from './category';
+import { Order } from './order';
+import { Pet } from './pet';
+import { Tag } from './tag';
+import { User } from './user';
+
+/* tslint:disable:no-unused-variable */
+let primitives = [
+                    "string",
+                    "boolean",
+                    "double",
+                    "integer",
+                    "long",
+                    "float",
+                    "number",
+                    "any"
+                 ];
+                 
+let enumsMap: {[index: string]: any} = {
+        "Order.StatusEnum": Order.StatusEnum,
+        "Pet.StatusEnum": Pet.StatusEnum,
+}
+
+let typeMap: {[index: string]: any} = {
+    "ApiResponse": ApiResponse,
+    "Category": Category,
+    "Order": Order,
+    "Pet": Pet,
+    "Tag": Tag,
+    "User": User,
+}
+
+export class ObjectSerializer {
+    public static findCorrectType(data: any, expectedType: string) {
+        if (data == undefined) {
+            return expectedType;
+        } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
+            return expectedType;
+        } else if (expectedType === "Date") {
+            return expectedType;
+        } else {
+            if (enumsMap[expectedType]) {
+                return expectedType;
+            }
+
+            if (!typeMap[expectedType]) {
+                return expectedType; // w/e we don't know the type
+            }
+
+            // Check the discriminator
+            let discriminatorProperty = typeMap[expectedType].discriminator;
+            if (discriminatorProperty == null) {
+                return expectedType; // the type does not have a discriminator. use it.
+            } else {
+                if (data[discriminatorProperty]) {
+                    var discriminatorType = data[discriminatorProperty];
+                    if(typeMap[discriminatorType]){
+                        return discriminatorType; // use the type given in the discriminator
+                    } else {
+                        return expectedType; // discriminator did not map to a type
+                    }
+                } else {
+                    return expectedType; // discriminator was not present (or an empty string)
+                }
+            }
+        }
+    }
+
+    public static serialize(data: any, type: string) {
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.serialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return data.toString();
+        } else {
+            if (enumsMap[type]) {
+                return data;
+            }
+            if (!typeMap[type]) { // in case we dont know the type
+                return data;
+            }
+            
+            // Get the actual type of this object
+            type = this.findCorrectType(data, type);
+
+            // get the map for the correct type.
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            let instance: {[index: string]: any} = {};
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type);
+            }
+            return instance;
+        }
+    }
+
+    public static deserialize(data: any, type: string) {
+        // polymorphism may change the actual type.
+        type = ObjectSerializer.findCorrectType(data, type);
+        if (data == undefined) {
+            return data;
+        } else if (primitives.indexOf(type.toLowerCase()) !== -1) {
+            return data;
+        } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6
+            let subType: string = type.replace("Array<", ""); // Array<Type> => Type>
+            subType = subType.substring(0, subType.length - 1); // Type> => Type
+            let transformedData: any[] = [];
+            for (let index in data) {
+                let date = data[index];
+                transformedData.push(ObjectSerializer.deserialize(date, subType));
+            }
+            return transformedData;
+        } else if (type === "Date") {
+            return new Date(data);
+        } else {
+            if (enumsMap[type]) {// is Enum
+                return data;
+            }
+
+            if (!typeMap[type]) { // dont know the type
+                return data;
+            }
+            let instance = new typeMap[type]();
+            let attributeTypes = typeMap[type].getAttributeTypeMap();
+            for (let index in attributeTypes) {
+                let attributeType = attributeTypes[index];
+                instance[attributeType.name] = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type);
+            }
+            return instance;
+        }
+    }
+}
+
+export interface Authentication {
+    /**
+    * Apply authentication settings to header and query params.
+    */
+    applyToRequest(requestOptions: localVarRequest.Options): void;
+}
+
+export class HttpBasicAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        requestOptions.auth = {
+            username: this.username, password: this.password
+        }
+    }
+}
+
+export class ApiKeyAuth implements Authentication {
+    public apiKey: string = '';
+
+    constructor(private location: string, private paramName: string) {
+    }
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (this.location == "query") {
+            (<any>requestOptions.qs)[this.paramName] = this.apiKey;
+        } else if (this.location == "header" && requestOptions && requestOptions.headers) {
+            requestOptions.headers[this.paramName] = this.apiKey;
+        }
+    }
+}
+
+export class OAuth implements Authentication {
+    public accessToken: string = '';
+
+    applyToRequest(requestOptions: localVarRequest.Options): void {
+        if (requestOptions && requestOptions.headers) {
+            requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
+        }
+    }
+}
+
+export class VoidAuth implements Authentication {
+    public username: string = '';
+    public password: string = '';
+
+    applyToRequest(_: localVarRequest.Options): void {
+        // Do nothing
+    }
+}
\ No newline at end of file
diff --git a/samples/client/petstore/typescript-node/npm/model/order.ts b/samples/client/petstore/typescript-node/npm/model/order.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8670f6aef573146ddc22e7cc53001b39aceda9e7
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/model/order.ts
@@ -0,0 +1,73 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* An order for a pets from the pet store
+*/
+export class Order {
+    'id'?: number;
+    'petId'?: number;
+    'quantity'?: number;
+    'shipDate'?: Date;
+    /**
+    * Order Status
+    */
+    'status'?: Order.StatusEnum;
+    'complete'?: boolean;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "petId",
+            "baseName": "petId",
+            "type": "number"
+        },
+        {
+            "name": "quantity",
+            "baseName": "quantity",
+            "type": "number"
+        },
+        {
+            "name": "shipDate",
+            "baseName": "shipDate",
+            "type": "Date"
+        },
+        {
+            "name": "status",
+            "baseName": "status",
+            "type": "Order.StatusEnum"
+        },
+        {
+            "name": "complete",
+            "baseName": "complete",
+            "type": "boolean"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Order.attributeTypeMap;
+    }
+}
+
+export namespace Order {
+    export enum StatusEnum {
+        Placed = <any> 'placed',
+        Approved = <any> 'approved',
+        Delivered = <any> 'delivered'
+    }
+}
diff --git a/samples/client/petstore/typescript-node/npm/model/pet.ts b/samples/client/petstore/typescript-node/npm/model/pet.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a91c4252fe3446dde514fb9efd0ebf62be96b80c
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/model/pet.ts
@@ -0,0 +1,75 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+import { Category } from './category';
+import { Tag } from './tag';
+
+/**
+* A pet for sale in the pet store
+*/
+export class Pet {
+    'id'?: number;
+    'category'?: Category;
+    'name': string;
+    'photoUrls': Array<string>;
+    'tags'?: Array<Tag>;
+    /**
+    * pet status in the store
+    */
+    'status'?: Pet.StatusEnum;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "category",
+            "baseName": "category",
+            "type": "Category"
+        },
+        {
+            "name": "name",
+            "baseName": "name",
+            "type": "string"
+        },
+        {
+            "name": "photoUrls",
+            "baseName": "photoUrls",
+            "type": "Array<string>"
+        },
+        {
+            "name": "tags",
+            "baseName": "tags",
+            "type": "Array<Tag>"
+        },
+        {
+            "name": "status",
+            "baseName": "status",
+            "type": "Pet.StatusEnum"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Pet.attributeTypeMap;
+    }
+}
+
+export namespace Pet {
+    export enum StatusEnum {
+        Available = <any> 'available',
+        Pending = <any> 'pending',
+        Sold = <any> 'sold'
+    }
+}
diff --git a/samples/client/petstore/typescript-node/npm/model/tag.ts b/samples/client/petstore/typescript-node/npm/model/tag.ts
new file mode 100644
index 0000000000000000000000000000000000000000..26d1dc741c57fa8ab592d347754fceb684e5e124
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/model/tag.ts
@@ -0,0 +1,39 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* A tag for a pet
+*/
+export class Tag {
+    'id'?: number;
+    'name'?: string;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "name",
+            "baseName": "name",
+            "type": "string"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return Tag.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/npm/model/user.ts b/samples/client/petstore/typescript-node/npm/model/user.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b683fb5debc529d42c9e6c463e559ce7fb3d918b
--- /dev/null
+++ b/samples/client/petstore/typescript-node/npm/model/user.ts
@@ -0,0 +1,78 @@
+/**
+ * OpenAPI Petstore
+ * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+/**
+* A User who is purchasing from the pet store
+*/
+export class User {
+    'id'?: number;
+    'username'?: string;
+    'firstName'?: string;
+    'lastName'?: string;
+    'email'?: string;
+    'password'?: string;
+    'phone'?: string;
+    /**
+    * User Status
+    */
+    'userStatus'?: number;
+
+    static discriminator: string | undefined = undefined;
+
+    static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [
+        {
+            "name": "id",
+            "baseName": "id",
+            "type": "number"
+        },
+        {
+            "name": "username",
+            "baseName": "username",
+            "type": "string"
+        },
+        {
+            "name": "firstName",
+            "baseName": "firstName",
+            "type": "string"
+        },
+        {
+            "name": "lastName",
+            "baseName": "lastName",
+            "type": "string"
+        },
+        {
+            "name": "email",
+            "baseName": "email",
+            "type": "string"
+        },
+        {
+            "name": "password",
+            "baseName": "password",
+            "type": "string"
+        },
+        {
+            "name": "phone",
+            "baseName": "phone",
+            "type": "string"
+        },
+        {
+            "name": "userStatus",
+            "baseName": "userStatus",
+            "type": "number"
+        }    ];
+
+    static getAttributeTypeMap() {
+        return User.attributeTypeMap;
+    }
+}
+
diff --git a/samples/client/petstore/typescript-node/npm/package-lock.json b/samples/client/petstore/typescript-node/npm/package-lock.json
deleted file mode 100644
index 4e1c2957991d6670499332cda4f86b03a96afe01..0000000000000000000000000000000000000000
--- a/samples/client/petstore/typescript-node/npm/package-lock.json
+++ /dev/null
@@ -1,835 +0,0 @@
-{
-    "name": "@swagger/angular2-typescript-petstore",
-    "version": "0.0.1",
-    "lockfileVersion": 1,
-    "requires": true,
-    "dependencies": {
-        "@types/bluebird": {
-            "version": "3.5.20",
-            "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz",
-            "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA=="
-        },
-        "@types/caseless": {
-            "version": "0.12.1",
-            "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz",
-            "integrity": "sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A=="
-        },
-        "@types/form-data": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz",
-            "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==",
-            "requires": {
-                "@types/node": "*"
-            }
-        },
-        "@types/node": {
-            "version": "10.0.6",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.6.tgz",
-            "integrity": "sha512-2whhQUfDHRBiZ3L54Ulyl1X+fZWbWabxPYRDAsibgOAtE6adwusD15Xv0Bw/D7cPah35Z/wKTdW3iAKsevw1uw=="
-        },
-        "@types/request": {
-            "version": "2.47.0",
-            "resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.0.tgz",
-            "integrity": "sha512-/KXM5oev+nNCLIgBjkwbk8VqxmzI56woD4VUxn95O+YeQ8hJzcSmIZ1IN3WexiqBb6srzDo2bdMbsXxgXNkz5Q==",
-            "requires": {
-                "@types/caseless": "*",
-                "@types/form-data": "*",
-                "@types/node": "*",
-                "@types/tough-cookie": "*"
-            }
-        },
-        "@types/tough-cookie": {
-            "version": "2.3.3",
-            "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz",
-            "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ=="
-        },
-        "ajv": {
-            "version": "5.5.2",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-            "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-            "requires": {
-                "co": "^4.6.0",
-                "fast-deep-equal": "^1.0.0",
-                "fast-json-stable-stringify": "^2.0.0",
-                "json-schema-traverse": "^0.3.0"
-            }
-        },
-        "ansi-regex": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
-        },
-        "ansi-styles": {
-            "version": "2.2.1",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-            "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
-        },
-        "asn1": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
-            "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
-        },
-        "assert-plus": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-            "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
-        },
-        "asynckit": {
-            "version": "0.4.0",
-            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
-        },
-        "aws-sign2": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-            "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
-        },
-        "aws4": {
-            "version": "1.7.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
-            "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
-        },
-        "babel-code-frame": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-            "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-            "requires": {
-                "chalk": "^1.1.3",
-                "esutils": "^2.0.2",
-                "js-tokens": "^3.0.2"
-            }
-        },
-        "babel-core": {
-            "version": "6.26.3",
-            "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
-            "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
-            "requires": {
-                "babel-code-frame": "^6.26.0",
-                "babel-generator": "^6.26.0",
-                "babel-helpers": "^6.24.1",
-                "babel-messages": "^6.23.0",
-                "babel-register": "^6.26.0",
-                "babel-runtime": "^6.26.0",
-                "babel-template": "^6.26.0",
-                "babel-traverse": "^6.26.0",
-                "babel-types": "^6.26.0",
-                "babylon": "^6.18.0",
-                "convert-source-map": "^1.5.1",
-                "debug": "^2.6.9",
-                "json5": "^0.5.1",
-                "lodash": "^4.17.4",
-                "minimatch": "^3.0.4",
-                "path-is-absolute": "^1.0.1",
-                "private": "^0.1.8",
-                "slash": "^1.0.0",
-                "source-map": "^0.5.7"
-            }
-        },
-        "babel-generator": {
-            "version": "6.26.1",
-            "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-            "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
-            "requires": {
-                "babel-messages": "^6.23.0",
-                "babel-runtime": "^6.26.0",
-                "babel-types": "^6.26.0",
-                "detect-indent": "^4.0.0",
-                "jsesc": "^1.3.0",
-                "lodash": "^4.17.4",
-                "source-map": "^0.5.7",
-                "trim-right": "^1.0.1"
-            }
-        },
-        "babel-helpers": {
-            "version": "6.24.1",
-            "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
-            "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
-            "requires": {
-                "babel-runtime": "^6.22.0",
-                "babel-template": "^6.24.1"
-            }
-        },
-        "babel-messages": {
-            "version": "6.23.0",
-            "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-            "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-            "requires": {
-                "babel-runtime": "^6.22.0"
-            }
-        },
-        "babel-plugin-transform-es2015-block-scoping": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
-            "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
-            "requires": {
-                "babel-runtime": "^6.26.0",
-                "babel-template": "^6.26.0",
-                "babel-traverse": "^6.26.0",
-                "babel-types": "^6.26.0",
-                "lodash": "^4.17.4"
-            }
-        },
-        "babel-register": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
-            "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
-            "requires": {
-                "babel-core": "^6.26.0",
-                "babel-runtime": "^6.26.0",
-                "core-js": "^2.5.0",
-                "home-or-tmp": "^2.0.0",
-                "lodash": "^4.17.4",
-                "mkdirp": "^0.5.1",
-                "source-map-support": "^0.4.15"
-            }
-        },
-        "babel-runtime": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-            "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-            "requires": {
-                "core-js": "^2.4.0",
-                "regenerator-runtime": "^0.11.0"
-            }
-        },
-        "babel-template": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
-            "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-            "requires": {
-                "babel-runtime": "^6.26.0",
-                "babel-traverse": "^6.26.0",
-                "babel-types": "^6.26.0",
-                "babylon": "^6.18.0",
-                "lodash": "^4.17.4"
-            }
-        },
-        "babel-traverse": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-            "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-            "requires": {
-                "babel-code-frame": "^6.26.0",
-                "babel-messages": "^6.23.0",
-                "babel-runtime": "^6.26.0",
-                "babel-types": "^6.26.0",
-                "babylon": "^6.18.0",
-                "debug": "^2.6.8",
-                "globals": "^9.18.0",
-                "invariant": "^2.2.2",
-                "lodash": "^4.17.4"
-            }
-        },
-        "babel-types": {
-            "version": "6.26.0",
-            "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-            "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-            "requires": {
-                "babel-runtime": "^6.26.0",
-                "esutils": "^2.0.2",
-                "lodash": "^4.17.4",
-                "to-fast-properties": "^1.0.3"
-            }
-        },
-        "babylon": {
-            "version": "6.18.0",
-            "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-            "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
-        },
-        "balanced-match": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-            "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-        },
-        "bcrypt-pbkdf": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
-            "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
-            "optional": true,
-            "requires": {
-                "tweetnacl": "^0.14.3"
-            }
-        },
-        "bluebird": {
-            "version": "3.5.1",
-            "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
-            "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
-        },
-        "boom": {
-            "version": "4.3.1",
-            "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
-            "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
-            "requires": {
-                "hoek": "4.x.x"
-            }
-        },
-        "brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "requires": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
-        },
-        "caseless": {
-            "version": "0.12.0",
-            "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-            "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
-        },
-        "chalk": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-            "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-            "requires": {
-                "ansi-styles": "^2.2.1",
-                "escape-string-regexp": "^1.0.2",
-                "has-ansi": "^2.0.0",
-                "strip-ansi": "^3.0.0",
-                "supports-color": "^2.0.0"
-            }
-        },
-        "co": {
-            "version": "4.6.0",
-            "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-            "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
-        },
-        "combined-stream": {
-            "version": "1.0.6",
-            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
-            "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
-            "requires": {
-                "delayed-stream": "~1.0.0"
-            }
-        },
-        "concat-map": {
-            "version": "0.0.1",
-            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-        },
-        "convert-source-map": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
-            "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
-        },
-        "core-js": {
-            "version": "2.5.6",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz",
-            "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ=="
-        },
-        "core-util-is": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-        },
-        "cryptiles": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
-            "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
-            "requires": {
-                "boom": "5.x.x"
-            },
-            "dependencies": {
-                "boom": {
-                    "version": "5.2.0",
-                    "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
-                    "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
-                    "requires": {
-                        "hoek": "4.x.x"
-                    }
-                }
-            }
-        },
-        "dashdash": {
-            "version": "1.14.1",
-            "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-            "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-            "requires": {
-                "assert-plus": "^1.0.0"
-            }
-        },
-        "debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-            "requires": {
-                "ms": "2.0.0"
-            }
-        },
-        "delayed-stream": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
-        },
-        "detect-indent": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-            "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-            "requires": {
-                "repeating": "^2.0.0"
-            }
-        },
-        "ecc-jsbn": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
-            "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
-            "optional": true,
-            "requires": {
-                "jsbn": "~0.1.0"
-            }
-        },
-        "escape-string-regexp": {
-            "version": "1.0.5",
-            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-            "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-        },
-        "esutils": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-            "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
-        },
-        "extend": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
-            "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
-        },
-        "extsprintf": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-            "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
-        },
-        "fast-deep-equal": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-            "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
-        },
-        "fast-json-stable-stringify": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-            "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
-        },
-        "forever-agent": {
-            "version": "0.6.1",
-            "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-            "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
-        },
-        "form-data": {
-            "version": "2.3.2",
-            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
-            "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
-            "requires": {
-                "asynckit": "^0.4.0",
-                "combined-stream": "1.0.6",
-                "mime-types": "^2.1.12"
-            }
-        },
-        "getpass": {
-            "version": "0.1.7",
-            "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-            "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-            "requires": {
-                "assert-plus": "^1.0.0"
-            }
-        },
-        "globals": {
-            "version": "9.18.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-            "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
-        },
-        "har-schema": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-            "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
-        },
-        "har-validator": {
-            "version": "5.0.3",
-            "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
-            "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
-            "requires": {
-                "ajv": "^5.1.0",
-                "har-schema": "^2.0.0"
-            }
-        },
-        "has-ansi": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-            "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-            "requires": {
-                "ansi-regex": "^2.0.0"
-            }
-        },
-        "hawk": {
-            "version": "6.0.2",
-            "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
-            "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
-            "requires": {
-                "boom": "4.x.x",
-                "cryptiles": "3.x.x",
-                "hoek": "4.x.x",
-                "sntp": "2.x.x"
-            }
-        },
-        "hoek": {
-            "version": "4.2.1",
-            "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
-            "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA=="
-        },
-        "home-or-tmp": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
-            "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
-            "requires": {
-                "os-homedir": "^1.0.0",
-                "os-tmpdir": "^1.0.1"
-            }
-        },
-        "http-signature": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-            "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-            "requires": {
-                "assert-plus": "^1.0.0",
-                "jsprim": "^1.2.2",
-                "sshpk": "^1.7.0"
-            }
-        },
-        "invariant": {
-            "version": "2.2.4",
-            "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
-            "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
-            "requires": {
-                "loose-envify": "^1.0.0"
-            }
-        },
-        "is-finite": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-            "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-            "requires": {
-                "number-is-nan": "^1.0.0"
-            }
-        },
-        "is-typedarray": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
-        },
-        "isstream": {
-            "version": "0.1.2",
-            "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-            "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
-        },
-        "js-tokens": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-            "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
-        },
-        "jsbn": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-            "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-            "optional": true
-        },
-        "jsesc": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-            "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
-        },
-        "json-schema": {
-            "version": "0.2.3",
-            "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-            "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
-        },
-        "json-schema-traverse": {
-            "version": "0.3.1",
-            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-            "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
-        },
-        "json-stringify-safe": {
-            "version": "5.0.1",
-            "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-            "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
-        },
-        "json5": {
-            "version": "0.5.1",
-            "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-            "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
-        },
-        "jsprim": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-            "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-            "requires": {
-                "assert-plus": "1.0.0",
-                "extsprintf": "1.3.0",
-                "json-schema": "0.2.3",
-                "verror": "1.10.0"
-            }
-        },
-        "lodash": {
-            "version": "4.17.10",
-            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
-            "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
-        },
-        "loose-envify": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
-            "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
-            "requires": {
-                "js-tokens": "^3.0.0"
-            }
-        },
-        "mime-db": {
-            "version": "1.33.0",
-            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
-            "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
-        },
-        "mime-types": {
-            "version": "2.1.18",
-            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
-            "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
-            "requires": {
-                "mime-db": "~1.33.0"
-            }
-        },
-        "minimatch": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-            "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-            "requires": {
-                "brace-expansion": "^1.1.7"
-            }
-        },
-        "minimist": {
-            "version": "0.0.8",
-            "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-            "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-        },
-        "mkdirp": {
-            "version": "0.5.1",
-            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-            "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-            "requires": {
-                "minimist": "0.0.8"
-            }
-        },
-        "ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-        },
-        "number-is-nan": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-            "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
-        },
-        "oauth-sign": {
-            "version": "0.8.2",
-            "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
-            "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
-        },
-        "os-homedir": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-            "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
-        },
-        "os-tmpdir": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-            "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
-        },
-        "path-is-absolute": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-            "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-        },
-        "performance-now": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-            "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
-        },
-        "private": {
-            "version": "0.1.8",
-            "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-            "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
-        },
-        "punycode": {
-            "version": "1.4.1",
-            "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-            "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
-        },
-        "qs": {
-            "version": "6.5.2",
-            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-            "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
-        },
-        "regenerator-runtime": {
-            "version": "0.11.1",
-            "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-            "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
-        },
-        "repeating": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-            "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-            "requires": {
-                "is-finite": "^1.0.0"
-            }
-        },
-        "request": {
-            "version": "2.85.0",
-            "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
-            "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
-            "requires": {
-                "aws-sign2": "~0.7.0",
-                "aws4": "^1.6.0",
-                "caseless": "~0.12.0",
-                "combined-stream": "~1.0.5",
-                "extend": "~3.0.1",
-                "forever-agent": "~0.6.1",
-                "form-data": "~2.3.1",
-                "har-validator": "~5.0.3",
-                "hawk": "~6.0.2",
-                "http-signature": "~1.2.0",
-                "is-typedarray": "~1.0.0",
-                "isstream": "~0.1.2",
-                "json-stringify-safe": "~5.0.1",
-                "mime-types": "~2.1.17",
-                "oauth-sign": "~0.8.2",
-                "performance-now": "^2.1.0",
-                "qs": "~6.5.1",
-                "safe-buffer": "^5.1.1",
-                "stringstream": "~0.0.5",
-                "tough-cookie": "~2.3.3",
-                "tunnel-agent": "^0.6.0",
-                "uuid": "^3.1.0"
-            }
-        },
-        "rewire": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/rewire/-/rewire-3.0.2.tgz",
-            "integrity": "sha512-ejkkt3qYnsQ38ifc9llAAzuHiGM7kR8N5/mL3aHWgmWwet0OMFcmJB8aTsMV2PBHCWxNVTLCeRfBpEa8X2+1fw==",
-            "requires": {
-                "babel-core": "^6.26.0",
-                "babel-plugin-transform-es2015-block-scoping": "^6.26.0"
-            }
-        },
-        "safe-buffer": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-            "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-        },
-        "slash": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-            "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
-        },
-        "sntp": {
-            "version": "2.1.0",
-            "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
-            "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
-            "requires": {
-                "hoek": "4.x.x"
-            }
-        },
-        "source-map": {
-            "version": "0.5.7",
-            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-            "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        },
-        "source-map-support": {
-            "version": "0.4.18",
-            "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
-            "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
-            "requires": {
-                "source-map": "^0.5.6"
-            }
-        },
-        "sshpk": {
-            "version": "1.14.1",
-            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
-            "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
-            "requires": {
-                "asn1": "~0.2.3",
-                "assert-plus": "^1.0.0",
-                "bcrypt-pbkdf": "^1.0.0",
-                "dashdash": "^1.12.0",
-                "ecc-jsbn": "~0.1.1",
-                "getpass": "^0.1.1",
-                "jsbn": "~0.1.0",
-                "tweetnacl": "~0.14.0"
-            }
-        },
-        "stringstream": {
-            "version": "0.0.5",
-            "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-            "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
-        },
-        "strip-ansi": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-            "requires": {
-                "ansi-regex": "^2.0.0"
-            }
-        },
-        "supports-color": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-            "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-        },
-        "to-fast-properties": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-            "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
-        },
-        "tough-cookie": {
-            "version": "2.3.4",
-            "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
-            "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
-            "requires": {
-                "punycode": "^1.4.1"
-            }
-        },
-        "trim-right": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-            "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
-        },
-        "tunnel-agent": {
-            "version": "0.6.0",
-            "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-            "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-            "requires": {
-                "safe-buffer": "^5.0.1"
-            }
-        },
-        "tweetnacl": {
-            "version": "0.14.5",
-            "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-            "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-            "optional": true
-        },
-        "typescript": {
-            "version": "2.8.3",
-            "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz",
-            "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==",
-            "dev": true
-        },
-        "uuid": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
-            "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
-        },
-        "verror": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-            "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-            "requires": {
-                "assert-plus": "^1.0.0",
-                "core-util-is": "1.0.2",
-                "extsprintf": "^1.2.0"
-            }
-        }
-    }
-}