rest-gen 0.17.1.2 → 0.17.1.3
raw patch · 6 files changed
+229/−200 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- CHANGELOG.md +13/−2
- files/Javascript/base.js +0/−191
- files/Javascript/epilogue.js +22/−0
- files/Javascript/prelude.js +185/−0
- rest-gen.cabal +6/−5
- src/Rest/Gen/JavaScript.hs +3/−2
CHANGELOG.md view
@@ -1,10 +1,21 @@ # Changelog -### 0.17.1.2+#### 0.17.1.3 +* Javascript: generate new API instance every time. Some properties+ were written to the prototype of the API object, and in Node,+ importing it again could cause mixups of this data. Now every+ instantiation of the API is a new object. This should have no impact+ on user code, unless you're checking the API type with `instanceof`,+ in which case it will now always return false.++#### 0.17.1.2+ * Javascript: fix rare crash in error path.+* Allow `HUnit 1.3.*`+* Allow `process 1.3.*`. -### 0.17.1.1+#### 0.17.1.1 * JavaScript/NodeJS: Use the received content-type instead of the accept header to decide whether to parse json. * Allow `vector 0.11.*`
− files/Javascript/base.js
@@ -1,191 +0,0 @@-// in nodejs, global is an object-// in normal browser environment, global is undefined-// in webpack, global is set to window-var isNodeJs = typeof global !== "undefined" && global.window === undefined;-var isCommonJs = typeof module === "object" && module && typeof module.exports === "object";--// require, that the nodejs will handle, but will remain not processed by webpack and the like-var obfuscatedRequire = function (moduleName)-{- return module["r" + "equire"](moduleName);-}--var $apinamespace$ =- function (url, secureUrl, modifyRequest)- {- var self = this;- var postfix = '/v' + this.version + '/';- var contextUrl = url + postfix;- var secureContextUrl = (secureUrl || url.replace(/^http:/, "https:")) + postfix;-- this.cookieJar = isNodeJs ? obfuscatedRequire('request').jar() : undefined;-- if(!modifyRequest) modifyRequest = function (req) { return req; };-- var finalModifyRequest = function (req)- {- if (isNodeJs) req.jar = self.cookieJar;- return modifyRequest(req);- }-- $apinamespace$.setContext(this, contextUrl, secureContextUrl, finalModifyRequest);- };--var jqFun;-if (isNodeJs)-{- // Export as Node module.- module.exports = $apinamespace$;-- $apinamespace$.ajaxCall = nodeRequest;-}-else-{- if (isCommonJs) {- // Export as CommonJs- module.exports = $apinamespace$;- jqFun = function () { return require("jquery"); };- } else if (typeof define === "function" && define.amd) {- // Export as AMD.- define("$apinamespace$", [], function () { return $apinamespace$; });- jqFun = function () { return window.$dollar$; };- } else {- // Export as global.- window.$apinamespace$ = $apinamespace$;- jqFun = function () { return window.$dollar$; };- }-- $apinamespace$.ajaxCall = jQueryRequest;-}--$apinamespace$.addObject = function (obj1, obj2)-{- for (var fld in obj2)- obj1[fld] = obj2[fld];-};--$apinamespace$.defaultAjaxOptions = {};-$apinamespace$.defaultHeaders = {};--function jQueryRequest (method, url, params, success, error, contentType, acceptHeader, data, callOpts, modifyRequest)-{- var q = window.Q || function (a) { return a };- var jq = jqFun();-- var headers = jq.extend(true, {}, $apinamespace$.defaultHeaders);- $apinamespace$.addObject(headers, { Accept : acceptHeader });-- var callData =- { type : method- , url : url + (params ? '?' + jq.param(params) : '')- , cache : false- , success : success || function () {}- , error : error || function () {}- , contentType : contentType- , headers : headers- , xhrFields : { withCredentials: true }- , data : data || []- };-- callData = modifyRequest(callData);-- $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);- $apinamespace$.addObject(callData, callOpts);-- return q(jq.ajax(callData));-}--function nodeRequest (method, url, params, onSuccess, onError, contentType, acceptHeader, data, callOpts, modifyRequest)-{- var allParams = {};- $apinamespace$.addObject(allParams, params);-- if (method === "GET" || method === "HEAD")- // Avoid cached API responses.- allParams._ = Date.now();-- var headers = { "Content-type" : contentType- , "Accept" : acceptHeader- };-- $apinamespace$.addObject(headers, $apinamespace$.defaultHeaders);-- var callData =- { url : url- , qs : allParams- , method : method- , headers : headers- };-- if (data) callData.body = data;-- callData = modifyRequest(callData);-- $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);- $apinamespace$.addObject(callData, callOpts);-- return require("q").Promise(function (resolve, reject)- {- obfuscatedRequire("request")(callData, callback);-- function callback (error, message, body)- {- if (message && message.statusCode >= 200 && message.statusCode < 300)- {- var parsedResponse = parse(body, message.headers);- onSuccess && onSuccess(parsedResponse, message);- resolve(parsedResponse)- }- else- {- if (!error)- {- error = new Error("HTTP request error");- error.statusCode = message && message.statusCode;- error.responseBody = body;- }-- error.response = parse(body, message ? message.headers : {});-- if (onError)- onError(error);-- reject(error);- }- }- });-- function parse (response, headers)- {- if (headers["content-type"] && headers["content-type"].split(";").indexOf("application/json") >= 0)- {- var r = response;- try- {- r = JSON.parse(response);- }- catch (e)- {- return r;- }- return r;- }- else return response;- }-}--$apinamespace$.setContext =- function (obj, url, secureUrl, modifyRequest)- {- obj.contextUrl = url;- obj.secureContextUrl = secureUrl;- obj.modifyRequest = modifyRequest;- for (var fld in obj)- {- if (obj[fld] != undefined && obj[fld].apiObjectType != undefined && obj[fld].apiObjectType == 'resourceDir')- {- var postfix = fld.replace(/([a-z0-9])([A-Z])/g, '$dollar$1-$dollar$2').toLowerCase() + '/';- $apinamespace$.setContext(obj[fld], url + postfix, secureUrl + postfix, modifyRequest);- }- }- };
+ files/Javascript/epilogue.js view
@@ -0,0 +1,22 @@+ return new $apinamespace$ (url, secureUrl, modifyRequest);+}++var jqFun;+if (isNodeJs)+{+ // Export as Node module.+ module.exports = $apinamespace$;+}+else+{+ if (isCommonJs) {+ // Export as CommonJs+ module.exports = $apinamespace$;+ } else if (typeof define === "function" && define.amd) {+ // Export as AMD.+ define("$apinamespace$", [], function () { return $apinamespace$; });+ } else {+ // Export as global.+ window.$apinamespace$ = $apinamespace$;+ }+}
+ files/Javascript/prelude.js view
@@ -0,0 +1,185 @@+// in nodejs, global is an object+// in normal browser environment, global is undefined+// in webpack, global is set to window+var isNodeJs = typeof global !== "undefined" && global.window === undefined;+var isCommonJs = typeof module === "object" && module && typeof module.exports === "object";++// require, that the nodejs will handle, but will remain not processed by webpack and the like+var obfuscatedRequire = function (moduleName)+{+ return module["r" + "equire"](moduleName);+}++function $apinamespace$ (url, secureUrl, modifyRequest)+{+ var $apinamespace$ =+ function (url, secureUrl, modifyRequest)+ {+ var self = this;+ var postfix = '/v' + this.version + '/';+ var contextUrl = url + postfix;+ var secureContextUrl = (secureUrl || url.replace(/^http:/, "https:")) + postfix;++ this.cookieJar = isNodeJs ? obfuscatedRequire('request').jar() : undefined;++ if(!modifyRequest) modifyRequest = function (req) { return req; };++ var finalModifyRequest = function (req)+ {+ if (isNodeJs) req.jar = self.cookieJar;+ return modifyRequest(req);+ }++ $apinamespace$.setContext(this, contextUrl, secureContextUrl, finalModifyRequest);+ };++ var jqFun;+ if (isNodeJs)+ {+ $apinamespace$.ajaxCall = nodeRequest;+ }+ else+ {+ if (isCommonJs) {+ jqFun = function () { return require("jquery"); };+ } else if (typeof define === "function" && define.amd) {+ jqFun = function () { return window.$dollar$; };+ } else {+ jqFun = function () { return window.$dollar$; };+ }++ $apinamespace$.ajaxCall = jQueryRequest;+ }++ $apinamespace$.addObject = function (obj1, obj2)+ {+ for (var fld in obj2)+ obj1[fld] = obj2[fld];+ };++ $apinamespace$.defaultAjaxOptions = {};+ $apinamespace$.defaultHeaders = {};++ function jQueryRequest (method, url, params, success, error, contentType, acceptHeader, data, callOpts, modifyRequest)+ {+ var q = window.Q || function (a) { return a };+ var jq = jqFun();++ var headers = jq.extend(true, {}, $apinamespace$.defaultHeaders);+ $apinamespace$.addObject(headers, { Accept : acceptHeader });++ var callData =+ { type : method+ , url : url + (params ? '?' + jq.param(params) : '')+ , cache : false+ , success : success || function () {}+ , error : error || function () {}+ , contentType : contentType+ , headers : headers+ , xhrFields : { withCredentials: true }+ , data : data || []+ };++ callData = modifyRequest(callData);++ $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);+ $apinamespace$.addObject(callData, callOpts);++ return q(jq.ajax(callData));+ }++ function nodeRequest (method, url, params, onSuccess, onError, contentType, acceptHeader, data, callOpts, modifyRequest)+ {+ var allParams = {};+ $apinamespace$.addObject(allParams, params);++ if (method === "GET" || method === "HEAD")+ // Avoid cached API responses.+ allParams._ = Date.now();++ var headers = { "Content-type" : contentType+ , "Accept" : acceptHeader+ };++ $apinamespace$.addObject(headers, $apinamespace$.defaultHeaders);++ var callData =+ { url : url+ , qs : allParams+ , method : method+ , headers : headers+ };++ if (data) callData.body = data;++ callData = modifyRequest(callData);++ $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);+ $apinamespace$.addObject(callData, callOpts);++ return require("q").Promise(function (resolve, reject)+ {+ obfuscatedRequire("request")(callData, callback);++ function callback (error, message, body)+ {+ if (message && message.statusCode >= 200 && message.statusCode < 300)+ {+ var parsedResponse = parse(body, message.headers);+ onSuccess && onSuccess(parsedResponse, message);+ resolve(parsedResponse)+ }+ else+ {+ if (!error)+ {+ error = new Error("HTTP request error");+ error.statusCode = message && message.statusCode;+ error.responseBody = body;+ }++ error.response = parse(body, message ? message.headers : {});++ if (onError)+ onError(error);++ reject(error);+ }+ }+ });++ function parse (response, headers)+ {+ if (headers["content-type"] && headers["content-type"].split(";").indexOf("application/json") >= 0)+ {+ var r = response;+ try+ {+ r = JSON.parse(response);+ }+ catch (e)+ {+ return r;+ }+ return r;+ }+ else return response;+ }+ }++ $apinamespace$.setContext =+ function (obj, url, secureUrl, modifyRequest)+ {+ obj.contextUrl = url;+ obj.secureContextUrl = secureUrl;+ obj.modifyRequest = modifyRequest;+ for (var fld in obj)+ {+ if (obj[fld] != undefined && obj[fld].apiObjectType != undefined && obj[fld].apiObjectType == 'resourceDir')+ {+ var postfix = fld.replace(/([a-z0-9])([A-Z])/g, '$dollar$1-$dollar$2').toLowerCase() + '/';+ $apinamespace$.setContext(obj[fld], url + postfix, secureUrl + postfix, modifyRequest);+ }+ }+ };+
rest-gen.cabal view
@@ -1,5 +1,5 @@ name: rest-gen-version: 0.17.1.2+version: 0.17.1.3 description: Documentation and client generation from rest definition. synopsis: Documentation and client generation from rest definition. maintainer: code@silk.co@@ -14,7 +14,8 @@ Docs/*.st Docs/*.js Docs/*.css- Javascript/base.js+ Javascript/prelude.js+ Javascript/epilogue.js Ruby/base.rb extra-source-files: CHANGELOG.md@@ -61,10 +62,10 @@ , hxt >= 9.2 && < 9.4 , json-schema >= 0.6 && < 0.8 , pretty >= 1.0 && < 1.2- , process >= 1.0 && < 1.3+ , process >= 1.0 && < 1.4 , rest-core >= 0.35 && < 0.37 , safe >= 0.2 && < 0.4- , semigroups >= 0.5.0 && < 0.17+ , semigroups >= 0.5 && < 0.18 , scientific >= 0.3.2 && < 0.4 , split >= 0.1 && < 0.3 , text >= 0.11 && < 1.3@@ -81,7 +82,7 @@ ghc-options: -Wall build-depends: base >= 4.5 && < 4.9- , HUnit == 1.2.*+ , HUnit >= 1.2 && < 1.4 , fclabels >= 1.0.4 && < 2.1 , haskell-src-exts >= 1.15.0 && < 1.17 , rest-core >= 0.35 && < 0.37
src/Rest/Gen/JavaScript.hs view
@@ -20,12 +20,13 @@ mkJsApi :: H.ModuleName -> Bool -> Version -> Router m s -> IO String mkJsApi ns priv ver r =- do prelude <- liftM (render . setManyAttrib attrs . newSTMP) (readContent "Javascript/base.js")+ do prelude <- liftM (render . setManyAttrib attrs . newSTMP) (readContent "Javascript/prelude.js")+ epilogue <- liftM (render . setManyAttrib attrs . newSTMP) (readContent "Javascript/epilogue.js") let cod = showCode $ mkStack [ unModuleName ns ++ ".prototype.version" .=. string (show ver) , mkJsCode (unModuleName ns) priv r ]- return $ mkJsModule (prelude ++ cod)+ return $ mkJsModule (prelude ++ cod ++ epilogue) where attrs = [("apinamespace", unModuleName ns), ("dollar", "$")] mkJsModule :: String -> String