diff --git a/modules/swagger-codegen/src/main/resources/typescript-angular/api.d.mustache b/modules/swagger-codegen/src/main/resources/typescript-angular/api.d.mustache
new file mode 100644
index 00000000000..a8bf1c58267
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-angular/api.d.mustache
@@ -0,0 +1,13 @@
+{{#models}}
+{{#model}}
+///
+{{/model}}
+{{/models}}
+
+{{#apiInfo}}
+{{#apis}}
+{{#operations}}
+///
+{{/operations}}
+{{/apis}}
+{{/apiInfo}}
diff --git a/modules/swagger-codegen/src/main/resources/typescript-angular/api.mustache b/modules/swagger-codegen/src/main/resources/typescript-angular/api.mustache
new file mode 100644
index 00000000000..427479cf675
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-angular/api.mustache
@@ -0,0 +1,98 @@
+///
+
+/* tslint:disable:no-unused-variable member-ordering */
+
+{{#operations}}
+namespace {{package}} {
+ 'use strict';
+
+{{#description}}
+ /**
+ * {{&description}}
+ */
+{{/description}}
+ export class {{classname}} {
+ protected basePath = '{{basePath}}';
+ public defaultHeaders : any = {};
+
+ static $inject: string[] = ['$http', '$httpParamSerializer'];
+
+ constructor(protected $http: ng.IHttpService, protected $httpParamSerializer?: (d: any) => any, basePath?: string) {
+ if (basePath) {
+ this.basePath = basePath;
+ }
+ }
+
+ private extendObj(objA: T1, objB: T2) {
+ for(let key in objB){
+ if(objB.hasOwnProperty(key)){
+ objA[key] = objB[key];
+ }
+ }
+ return objA;
+ }
+
+{{#operation}}
+ /**
+ * {{summary}}
+ * {{notes}}
+ {{#allParams}}* @param {{paramName}} {{description}}
+ {{/allParams}}*/
+ public {{nickname}} ({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/allParams}}extraHttpRequestParams?: any ) : ng.IHttpPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}{}{{/returnType}}> {
+ const localVarPath = this.basePath + '{{path}}'{{#pathParams}}
+ .replace('{' + '{{baseName}}' + '}', String({{paramName}})){{/pathParams}};
+
+ let queryParameters: any = {};
+ let headerParams: any = this.extendObj({}, this.defaultHeaders);
+{{#hasFormParams}}
+ let formParams: any = {};
+
+{{/hasFormParams}}
+{{#allParams}}
+{{#required}}
+ // verify required parameter '{{paramName}}' is set
+ if (!{{paramName}}) {
+ throw new Error('Missing required parameter {{paramName}} when calling {{nickname}}');
+ }
+{{/required}}
+{{/allParams}}
+{{#queryParams}}
+ if ({{paramName}} !== undefined) {
+ queryParameters['{{baseName}}'] = {{paramName}};
+ }
+
+{{/queryParams}}
+{{#headerParams}}
+ headerParams['{{baseName}}'] = {{paramName}};
+
+{{/headerParams}}
+{{#hasFormParams}}
+ headerParams['Content-Type'] = 'application/x-www-form-urlencoded';
+
+{{/hasFormParams}}
+{{#formParams}}
+ formParams['{{baseName}}'] = {{paramName}};
+
+{{/formParams}}
+ let httpRequestParams: any = {
+ method: '{{httpMethod}}',
+ url: localVarPath,
+ json: {{#hasFormParams}}false{{/hasFormParams}}{{^hasFormParams}}true{{/hasFormParams}},
+ {{#bodyParam}}data: {{paramName}},
+ {{/bodyParam}}
+ {{#hasFormParams}}data: this.$httpParamSerializer(formParams),
+ {{/hasFormParams}}
+ params: queryParameters,
+ headers: headerParams
+ };
+
+ if (extraHttpRequestParams) {
+ httpRequestParams = this.extendObj(httpRequestParams, extraHttpRequestParams);
+ }
+
+ return this.$http(httpRequestParams);
+ }
+{{/operation}}
+ }
+}
+{{/operations}}
diff --git a/modules/swagger-codegen/src/main/resources/typescript-angular/git_push.sh.mustache b/modules/swagger-codegen/src/main/resources/typescript-angular/git_push.sh.mustache
new file mode 100755
index 00000000000..e153ce23ecf
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-angular/git_push.sh.mustache
@@ -0,0 +1,52 @@
+#!/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"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="{{{gitUserId}}}"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="{{{gitRepoId}}}"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="{{{releaseNote}}}"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git crediential in your environment."
+ git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/modules/swagger-codegen/src/main/resources/typescript-angular/model.mustache b/modules/swagger-codegen/src/main/resources/typescript-angular/model.mustache
new file mode 100644
index 00000000000..b7d92962157
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-angular/model.mustache
@@ -0,0 +1,39 @@
+///
+
+namespace {{package}} {
+ 'use strict';
+
+{{#models}}
+{{#model}}
+{{#description}}
+ /**
+ * {{{description}}}
+ */
+{{/description}}
+ export interface {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{
+{{#vars}}
+
+{{#description}}
+ /**
+ * {{{description}}}
+ */
+{{/description}}
+ "{{name}}"{{^required}}?{{/required}}: {{#isEnum}}{{classname}}.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}};
+{{/vars}}
+ }
+
+{{#hasEnums}}
+ export namespace {{classname}} {
+{{#vars}}
+{{#isEnum}}
+
+ export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}}
+ {{.}} = '{{.}}'{{^-last}},{{/-last}}{{/values}}{{/allowableValues}}
+ }
+{{/isEnum}}
+{{/vars}}
+ }
+{{/hasEnums}}
+{{/model}}
+{{/models}}
+}
diff --git a/modules/swagger-codegen/src/main/resources/typescript-node/api.mustache b/modules/swagger-codegen/src/main/resources/typescript-node/api.mustache
new file mode 100644
index 00000000000..25e152a9e34
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-node/api.mustache
@@ -0,0 +1,264 @@
+import request = require('request');
+import promise = require('bluebird');
+import http = require('http');
+
+// ===============================================
+// This file is autogenerated - Please do not edit
+// ===============================================
+
+/* tslint:disable:no-unused-variable */
+
+{{#models}}
+{{#model}}
+{{#description}}
+/**
+* {{{description}}}
+*/
+{{/description}}
+export class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{
+{{#vars}}
+{{#description}}
+ /**
+ * {{{description}}}
+ */
+{{/description}}
+ "{{name}}": {{#isEnum}}{{classname}}.{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{/isEnum}};
+{{/vars}}
+}
+
+{{#hasEnums}}
+export namespace {{classname}} {
+{{#vars}}
+{{#isEnum}}
+ export enum {{datatypeWithEnum}} { {{#allowableValues}}{{#values}}
+ {{.}} = '{{.}}'{{^-last}},{{/-last}}{{/values}}{{/allowableValues}}
+ }
+{{/isEnum}}
+{{/vars}}
+}
+{{/hasEnums}}
+{{/model}}
+{{/models}}
+
+export interface Authentication {
+ /**
+ * Apply authentication settings to header and query params.
+ */
+ applyToRequest(requestOptions: request.Options): void;
+}
+
+export class HttpBasicAuth implements Authentication {
+ public username: string;
+ public password: string;
+ applyToRequest(requestOptions: request.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: request.Options): void {
+ if (this.location == "query") {
+ (requestOptions.qs)[this.paramName] = this.apiKey;
+ } else if (this.location == "header") {
+ requestOptions.headers[this.paramName] = this.apiKey;
+ }
+ }
+}
+
+export class OAuth implements Authentication {
+ public accessToken: string;
+
+ applyToRequest(requestOptions: request.Options): void {
+ requestOptions.headers["Authorization"] = "Bearer " + this.accessToken;
+ }
+}
+
+export class VoidAuth implements Authentication {
+ public username: string;
+ public password: string;
+ applyToRequest(requestOptions: request.Options): void {
+ // Do nothing
+ }
+}
+
+{{#apiInfo}}
+{{#apis}}
+{{#operations}}
+{{#description}}
+/**
+* {{&description}}
+*/
+{{/description}}
+export enum {{classname}}ApiKeys {
+{{#authMethods}}
+{{#isApiKey}}
+ {{name}},
+{{/isApiKey}}
+{{/authMethods}}
+}
+
+export class {{classname}} {
+ protected basePath = '{{basePath}}';
+ protected defaultHeaders : any = {};
+
+ protected authentications = {
+ 'default': 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
+ }
+ }
+ }
+
+ public setApiKey(key: {{classname}}ApiKeys, value: string) {
+ this.authentications[{{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}}
+ private extendObj(objA: T1, objB: T2) {
+ for(let key in objB){
+ if(objB.hasOwnProperty(key)){
+ objA[key] = objB[key];
+ }
+ }
+ return objA;
+ }
+{{#operation}}
+ /**
+ * {{summary}}
+ * {{notes}}
+ {{#allParams}}* @param {{paramName}} {{description}}
+ {{/allParams}}*/
+ public {{nickname}} ({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) : Promise<{ response: http.ClientResponse; {{#returnType}}body: {{{returnType}}}; {{/returnType}}{{^returnType}}body?: any; {{/returnType}} }> {
+ const localVarPath = this.basePath + '{{path}}'{{#pathParams}}
+ .replace('{' + '{{baseName}}' + '}', String({{paramName}})){{/pathParams}};
+ let queryParameters: any = {};
+ let headerParams: any = this.extendObj({}, this.defaultHeaders);
+ let formParams: 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) {
+ queryParameters['{{baseName}}'] = {{paramName}};
+ }
+
+{{/queryParams}}
+{{#headerParams}}
+ headerParams['{{baseName}}'] = {{paramName}};
+
+{{/headerParams}}
+ let useFormData = false;
+
+{{#formParams}}
+ if ({{paramName}} !== undefined) {
+ formParams['{{baseName}}'] = {{paramName}};
+ }
+{{#isFile}}
+ useFormData = true;
+{{/isFile}}
+
+{{/formParams}}
+ let localVarDeferred = promise.defer<{ response: http.ClientResponse; {{#returnType}}body: {{{returnType}}}; {{/returnType}}{{^returnType}}body?: any; {{/returnType}} }>();
+
+ let requestOptions: request.Options = {
+ method: '{{httpMethod}}',
+ qs: queryParameters,
+ headers: headerParams,
+ uri: localVarPath,
+ json: true,
+{{#bodyParam}}
+ body: {{paramName}},
+{{/bodyParam}}
+ }
+
+{{#authMethods}}
+ this.authentications.{{name}}.applyToRequest(requestOptions);
+
+{{/authMethods}}
+ this.authentications.default.applyToRequest(requestOptions);
+
+ if (Object.keys(formParams).length) {
+ if (useFormData) {
+ (requestOptions).formData = formParams;
+ } else {
+ requestOptions.form = formParams;
+ }
+ }
+
+ request(requestOptions, (error, response, body) => {
+ if (error) {
+ localVarDeferred.reject(error);
+ } else {
+ if (response.statusCode >= 200 && response.statusCode <= 299) {
+ localVarDeferred.resolve({ response: response, body: body });
+ } else {
+ localVarDeferred.reject({ response: response, body: body });
+ }
+ }
+ });
+
+ return localVarDeferred.promise;
+ }
+{{/operation}}
+}
+{{/operations}}
+{{/apis}}
+{{/apiInfo}}
diff --git a/modules/swagger-codegen/src/main/resources/typescript-node/git_push.sh.mustache b/modules/swagger-codegen/src/main/resources/typescript-node/git_push.sh.mustache
new file mode 100755
index 00000000000..e153ce23ecf
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-node/git_push.sh.mustache
@@ -0,0 +1,52 @@
+#!/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"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="{{{gitUserId}}}"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="{{{gitRepoId}}}"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="{{{releaseNote}}}"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git crediential in your environment."
+ git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/modules/swagger-codegen/src/main/resources/typescript-node/package.mustache b/modules/swagger-codegen/src/main/resources/typescript-node/package.mustache
new file mode 100644
index 00000000000..96714500208
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-node/package.mustache
@@ -0,0 +1,22 @@
+{
+ "name": "{{npmName}}",
+ "version": "{{npmVersion}}",
+ "description": "NodeJS client for {{npmName}}",
+ "main": "api.js",
+ "scripts": {
+ "build": "typings install && tsc"
+ },
+ "author": "Swagger Codegen Contributors",
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "^3.3.5",
+ "request": "^2.72.0"
+ },
+ "devDependencies": {
+ "typescript": "^1.8.10",
+ "typings": "^0.8.1"
+ }{{#npmRepository}},
+ "publishConfig":{
+ "registry":"{{npmRepository}}"
+ }{{/npmRepository}}
+}
diff --git a/modules/swagger-codegen/src/main/resources/typescript-node/tsconfig.mustache b/modules/swagger-codegen/src/main/resources/typescript-node/tsconfig.mustache
new file mode 100644
index 00000000000..2dd166566e9
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-node/tsconfig.mustache
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "noImplicitAny": false,
+ "suppressImplicitAnyIndexErrors": true,
+ "target": "ES5",
+ "moduleResolution": "node",
+ "removeComments": true,
+ "sourceMap": true,
+ "noLib": false,
+ "declaration": true
+ },
+ "files": [
+ "api.ts",
+ "typings/main.d.ts"
+ ]
+}
+
diff --git a/modules/swagger-codegen/src/main/resources/typescript-node/typings.mustache b/modules/swagger-codegen/src/main/resources/typescript-node/typings.mustache
new file mode 100644
index 00000000000..76c4cc8e6af
--- /dev/null
+++ b/modules/swagger-codegen/src/main/resources/typescript-node/typings.mustache
@@ -0,0 +1,10 @@
+{
+ "ambientDependencies": {
+ "bluebird": "registry:dt/bluebird#2.0.0+20160319051630",
+ "core-js": "registry:dt/core-js#0.0.0+20160317120654",
+ "node": "registry:dt/node#4.0.0+20160423143914"
+ },
+ "dependencies": {
+ "request": "registry:npm/request#2.69.0+20160304121250"
+ }
+}
\ No newline at end of file