diff --git a/README.md b/README.md index 568c22d1..4e5ab36c 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,10 @@ In addition to the common options listed below, `getCustomCode()` *requires* a ` imports: type: array description: Typescript definition files to be imported. + promise: + type: string + description: Promise implementation to use [any-promise, native, q, bluebird, ...] + default: any-promise swagger: type: object required: true @@ -90,6 +94,9 @@ moduleName: className: type: string description: Provided by your options field +promise: + type: string + description: Expression that will return the chosen Promise implementation domain: type: string description: If all options defined: swagger.schemes[0] + '://' + swagger.host + swagger.basePath diff --git a/lib/codegen.js b/lib/codegen.js index 501c934b..b372f3e4 100644 --- a/lib/codegen.js +++ b/lib/codegen.js @@ -30,6 +30,18 @@ var getPathToMethodName = function(opts, m, path){ return m.toLowerCase() + result[0].toUpperCase() + result.substring(1); }; +var getPromiseImplementation = function(opts) { + var promise = opts.promise || 'any-promise'; + + if ( promise === 'native' ) { + return 'Promise'; + } else if ( promise === 'q' ) { + return 'require(\'q\').Promise'; + } else { + return 'require(\'' + promise + '\')'; + } +}; + var getViewForSwagger2 = function(opts, type){ var swagger = opts.swagger; var authorizedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'COPY', 'HEAD', 'OPTIONS', 'LINK', 'UNLIK', 'PURGE', 'LOCK', 'UNLOCK', 'PROPFIND']; @@ -40,6 +52,7 @@ var getViewForSwagger2 = function(opts, type){ moduleName: opts.moduleName, className: opts.className, imports: opts.imports, + promise: getPromiseImplementation(opts), domain: (swagger.schemes && swagger.schemes.length > 0 && swagger.host && swagger.basePath) ? swagger.schemes[0] + '://' + swagger.host + swagger.basePath.replace(/\/+$/g,'') : '', methods: [] }; @@ -144,6 +157,7 @@ var getViewForSwagger1 = function(opts, type){ description: swagger.description, moduleName: opts.moduleName, className: opts.className, + promise: getPromiseImplementation(opts), domain: swagger.basePath ? swagger.basePath : '', methods: [] }; diff --git a/package.json b/package.json index ee54fddc..93fe7fde 100644 --- a/package.json +++ b/package.json @@ -36,14 +36,15 @@ "mustache": "^2.0.0" }, "devDependencies": { + "any-promise": "^1.3.0", + "final-fs": "~1.6.0", "grunt": "~0.4.4", "grunt-contrib-jshint": "~0.9.2", + "grunt-jsonlint": "~1.0.4", "grunt-vows": "~0.4.1", - "q": "~1.0.1", - "final-fs": "~1.6.0", "matchdep": "~0.3.0", - "vows": "~0.7.0", - "grunt-jsonlint": "~1.0.4", - "request": "~2.40.0" + "q": "~1.0.1", + "request": "~2.40.0", + "vows": "~0.7.0" } } diff --git a/templates/angular-class.mustache b/templates/angular-class.mustache index e2e8ad52..9e1e5917 100644 --- a/templates/angular-class.mustache +++ b/templates/angular-class.mustache @@ -1,7 +1,7 @@ /*jshint -W069 */ /*global angular:false */ angular.module('{{&moduleName}}', []) -.factory('{{&className}}', ['$q', '$http', '$rootScope', function($q, $http, $rootScope){ +.factory('{{&className}}', ['$q', '$http', '$rootScope', function(P, $http, $rootScope){ 'use strict'; /** @@ -27,7 +27,7 @@ angular.module('{{&moduleName}}', []) {{/isSecure}} } - {{&className}}.prototype.request = function(method, url, parameters, body, headers, queryParameters, form, deferred){ + {{&className}}.prototype.request = function(method, url, parameters, body, headers, queryParameters, form){ {{#isGET}} var cached = parameters.$cache && parameters.$cache.get(url); if(cached !== undefined && parameters.$refresh !== true) { @@ -48,19 +48,22 @@ angular.module('{{&moduleName}}', []) options.headers['Content-Type'] = 'application/x-www-form-urlencoded'; options.transformRequest = {{&className}}.transformRequest; } - $http(options) - .success(function(data, status, headers, config){ - deferred.resolve(data); - if(parameters.$cache !== undefined) { - parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {}); - } - }) - .error(function(data, status, headers, config){ - deferred.reject({ - status: status, - headers: headers, - config: config, - body: data + + return new P(function(resolve, reject) { + $http(options) + .success(function(data, status, headers, config){ + resolve(data); + if(parameters.$cache !== undefined) { + parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {}); + } + }) + .error(function(data, status, headers, config){ + reject({ + status: status, + headers: headers, + config: config, + body: data + }); }); }); diff --git a/templates/method.mustache b/templates/method.mustache index 1c2b3433..72180ddf 100644 --- a/templates/method.mustache +++ b/templates/method.mustache @@ -11,8 +11,7 @@ if(parameters === undefined) { parameters = {}; } - var deferred = {{#isNode}}Q{{/isNode}}{{^isNode}}$q{{/isNode}}.defer(); - + var domain = this.domain; var path = '{{&path}}'; @@ -25,7 +24,7 @@ if (this.token.isQuery) { queryParameters[this.token.headerOrQueryName] = this.token.value; } else if (this.token.headerOrQueryName) { - headers[this.token.headerOrQueryName] = this.token.value; + headers[this.token.headerOrQueryName] = this.token.value; } else { headers['Authorization'] = 'Bearer ' + this.token.value; } @@ -91,8 +90,7 @@ {{#required}} if(parameters['{{&camelCaseName}}'] === undefined){ - deferred.reject(new Error('Missing required {{¶mType}} parameter: {{&camelCaseName}}')); - return deferred.promise; + return P.reject(new Error('Missing required {{¶mType}} parameter: {{&camelCaseName}}')); } {{/required}} @@ -106,7 +104,5 @@ }); } - this.request('{{method}}', domain + path, parameters, body, headers, queryParameters, form, deferred); - - return deferred.promise; + return this.request('{{method}}', domain + path, parameters, body, headers, queryParameters, form); }; diff --git a/templates/node-class.mustache b/templates/node-class.mustache index 8dfd098c..c48797fb 100644 --- a/templates/node-class.mustache +++ b/templates/node-class.mustache @@ -10,7 +10,7 @@ var {{&className}} = (function(){ 'use strict'; var request = require('request'); - var Q = require('q'); + var P = {{&promise}}; function {{&className}}(options){ var domain = (typeof options === 'object') ? options.domain : options; @@ -23,7 +23,7 @@ var {{&className}} = (function(){ {{/isSecure}} } - {{&className}}.prototype.request = function(method, url, parameters, body, headers, queryParameters, form, deferred){ + {{&className}}.prototype.request = function(method, url, parameters, body, headers, queryParameters, form){ var req = { method: method, uri: url, @@ -37,23 +37,26 @@ var {{&className}} = (function(){ if(typeof(body) === 'object' && !(body instanceof Buffer)) { req.json = true; } - request(req, function(error, response, body){ - if(error) { - deferred.reject(error); - } else { - if(/^application\/(.*\\+)?json/.test(response.headers['content-type'])) { - try { - body = JSON.parse(body); - } catch(e) {} - } - if(response.statusCode === 204) { - deferred.resolve({ response: response }); - } else if(response.statusCode >= 200 && response.statusCode <= 299) { - deferred.resolve({ response: response, body: body }); + + return new P(function(resolve, reject) { + request(req, function(error, response, body){ + if(error) { + reject(error); } else { - deferred.reject({ response: response, body: body }); + if(/^application\/(.*\\+)?json/.test(response.headers['content-type'])) { + try { + body = JSON.parse(body); + } catch(e) {} + } + if(response.statusCode === 204) { + resolve({ response: response }); + } else if(response.statusCode >= 200 && response.statusCode <= 299) { + resolve({ response: response, body: body }); + } else { + reject({ response: response, body: body }); + } } - } + }); }); };