Comparing version 0.11.0 to 0.12.0
{ | ||
"name": "posterior", | ||
"version": "0.11.0", | ||
"version": "0.12.0", | ||
"main": "dist/posterior.js", | ||
@@ -5,0 +5,0 @@ "description": "Hierarchical configuration of JSON XHR communication for your APIs", |
@@ -5,3 +5,3 @@ { | ||
"description": "Hierarchical configuration of JSON XHR communication for your APIs", | ||
"version": "0.11.0", | ||
"version": "0.12.0", | ||
"keywords": [ | ||
@@ -8,0 +8,0 @@ "JSON", |
@@ -1,2 +0,2 @@ | ||
/*! posterior - v0.11.0 - 2015-08-05 | ||
/*! posterior - v0.12.0 - 2015-08-08 | ||
* http://esha.github.io/posterior/ | ||
@@ -344,17 +344,14 @@ * Copyright (c) 2015 ESHA Research; Licensed MIT, GPL */ | ||
API.main = function(fn, data) { | ||
if (fn.cfg.sharedResult) { | ||
return Promise.resolve(fn.cfg.sharedResult); | ||
if (fn.cfg.savedResult) { | ||
return Promise.resolve(fn.cfg.savedResult); | ||
} | ||
var cfg = API.getAll(fn.cfg); | ||
cfg.data = data; | ||
API.process(cfg, data); | ||
var deps = cfg.requires, | ||
promise = deps ? | ||
Promise.all(deps.map(API.require.bind(cfg))).then(function() { | ||
return XHR(cfg); | ||
}) : | ||
XHR(cfg); | ||
if (cfg.shareResult) { | ||
var promise = API.promise(cfg, fn); | ||
if (cfg.saveResult) { | ||
promise.then(function(result) { | ||
fn.cfg.sharedResult = result; | ||
fn.cfg.savedResult = result; | ||
}); | ||
@@ -365,2 +362,35 @@ } | ||
API.promise = function(cfg, fn) { | ||
var deps = cfg.requires; | ||
return deps ? | ||
Promise.all(deps.map(API.require.bind(cfg))).then(function() { | ||
return API.follow(cfg, fn); | ||
}) : | ||
API.follow(cfg, fn); | ||
}; | ||
API.follow = function(cfg, fn) { | ||
if (cfg.follows) { | ||
var follows = cfg.follows, | ||
leader; | ||
if (typeof follows === "object") { | ||
leader = follows.source; | ||
follows = follows.path; | ||
} | ||
if (!leader) { | ||
leader = fn.cfg._parent._fn; | ||
} | ||
if (leader) { | ||
return leader().then(function following(resource) { | ||
cfg.url = follows && eval('resource.'+follows) || resource; | ||
return XHR(cfg); | ||
}); | ||
} else { | ||
return Promise.reject("Cannot follow link relation without a parent function."); | ||
} | ||
} else { | ||
return XHR(cfg); | ||
} | ||
}; | ||
API.require = function(req) { | ||
@@ -367,0 +397,0 @@ try { |
@@ -1,4 +0,4 @@ | ||
/*! posterior - v0.11.0 - 2015-08-05 | ||
/*! posterior - v0.12.0 - 2015-08-08 | ||
* http://esha.github.io/posterior/ | ||
* Copyright (c) 2015 ESHA Research; Licensed MIT, GPL */ | ||
!function(D,store){"use strict";var Posterior=window.Posterior=function(a,b){return Posterior.api(a,b)},XHR=Posterior.xhr=function(a){return XHR.main(a)},htmlClass=D.documentElement.classList;XHR.ctor=XMLHttpRequest,XHR.main=function(a){var b,c;return a.cache&&(b=store(XHR.key(a)),b&&(c=Promise.resolve(b))),c||(b=new XHR.ctor,XHR.config(b,a),c=XHR.promise(b,a),a.cache&&c.then(function(){XHR.cache(b)})),a.then&&(c=c.then(a.then)),a["catch"]&&(c=c["catch"](a["catch"])),c.xhr=b,c},XHR.config=function(a,b){a.open(XHR.method(b),XHR.url(b),"async"in b?b.async:!0,b.username,b.password),a.cfg=b,b.xhr=a;for(var c in b){var d=b[c];c in a&&(a[c]=d),"function"==typeof d&&a.addEventListener(c,d.bind(a))}if(b.mimeType&&a.overrideMimeType(b.mimeType),b.requestedWith!==!1&&a.setRequestHeader("X-Requested-With",b.requestedWith||"XMLHttpRequest"),b.json!==!1){try{a.responseType="json"}catch(e){}a.setRequestHeader("Accept","application/json"),a.setRequestHeader("Content-Type","application/json")}if(b.headers)for(var f in b.headers)a.setRequestHeader(f,b.headers[f])},XHR.method=function(a){return XHR.methodMap[a.method]||a.method||"GET"},XHR.methodMap={PATCH:"POST"},XHR.url=function(a){for(var b,c=a.url;b!==c;)b=c,c=c.replace(/([\/\?\&]|^)[^\/\.\?\&]+[\/\?\&]?\.\.([\/\?\&]?)/,"$1");return c},XHR.promise=function(a,b){return new Promise(function(c,d){var e=function(c){b.retry?XHR.retry(b,b.retry,f,e):d(a.error=c)},f={error:e,timeout:e,loadstart:XHR.start,loadend:XHR.end,load:XHR.load(b,c,e)};XHR.run(a,b,f,e)})},XHR.retry=function(a,b,c,d){"object"!=typeof b&&(b=a.retry={}),b.wait="wait"in b?b.wait:1e3,b.limit="limit"in b?b.limit:3,b.count="count"in b?b.count:0,b.limit>b.count++&&setTimeout(function(){var b=new XHR.ctor;XHR.config(b,a),XHR.run(b,a,c,d)},b.wait*=2)},XHR.run=function(a,b,c,d){for(var e in c)a.addEventListener(e,c[e]);try{a.send(XHR.data(b))}catch(f){d(f)}},XHR.load=function(a,b,c){return function(){try{var d=a.xhr,e=a[d.status]||d.status;if("function"==typeof e&&(e=e(d)||d.status),e>=200&&300>e){a.json!==!1&&"object"!=typeof d.response&&XHR.forceJSONResponse(d);var f=d.responseType?d.response:a.json!==!1?d.responseObject:d.responseText;if(a.responseData&&XHR.isData(f)){var g=a.responseData.call(d,f);f=void 0===g?f:g}b(XHR.isData(f)?f:d)}else c(e)}catch(h){c(h)}}},XHR.forceJSONResponse=function(a){try{delete a.response,Object.defineProperty(a,"response",{value:a.responseObject,enumerable:!0,configurable:!0})}catch(b){}},XHR.isData=function(a){return!(void 0===a||""===a)},XHR.data=function(a){var b=a.data;if(a.requestData&&XHR.isData(b)){var c=a.requestData(b);b=void 0===c?b:c}return void 0!==b&&"string"!=typeof b&&(b=JSON.stringify(b)),b||""},XHR.properties={responseObject:{get:function(){var a=null;try{this.responseText&&(a=JSON.parse(this.responseText))}catch(b){}return null===a&&"object"==typeof this.response&&(a=this.response),Object.defineProperty(this,"responseObject",{value:a}),a},enumerable:!0,configurable:!0},responseHeaders:{get:function(){for(var a,b={},c=this.getAllResponseHeaders().trim().split("\n"),d=0,e=c.length;e>d;d++)if(a=c[d]){var f=a.match(/^([\w\-]+):(.*)/);3===f.length&&(b[f[1]]=f[2].trim())}return Object.defineProperty(this,"responseHeaders",{value:b}),b},enumerable:!0,configurable:!0}},Object.defineProperties(XMLHttpRequest.prototype,XHR.properties),XHR.active=0,XHR.activeClass="xhr-active",XHR.start=function(){XHR.active++,htmlClass.add(XHR.activeClass)},XHR.end=function(){--XHR.active||htmlClass.remove(XHR.activeClass)},XHR.key=function(a){return XHR.url(a)+"|"+XHR.method(a)+"|"+XHR.data(a)},XHR.cache=function(a){var b=a.cfg;return store(XHR.key(b),XHR.safeCopy(a),b.cache),a},XHR.safeCopy=function(a,b){var c={};if(b=b||[],b.indexOf(a)<0){b.push(a);for(var d in a)try{var e=a[d],f=typeof e;"function"===f?e=void 0:"object"===f&&(e=XHR.safeCopy(e,b)),void 0!==e&&(c[d]=e)}catch(g){}return c}};var API=Posterior.api=function(a,b){var c=a.parent||null;return c&&c.cfg&&(c=c.cfg),API.build(a,c,b)};API.build=function(a,b,c){var d=function(a){return API.main(d,a)},e={_fn:d,_parent:b,_private:{},name:c||"Posterior"};(a.debug||API.get(e,"debug"))&&(d=e._fn=API.debug(e.name,d));for(var f in a)API.set(e,f,a[f],e.name),API.getter(d,f);return d.cfg=e,d.config=API.config,d.extend=API.extend,API.get(e,"auto")&&setTimeout(d,0),d},API.extend=function(a,b){return API.build(a,this.cfg,b)},API.main=function(a,b){if(a.cfg.sharedResult)return Promise.resolve(a.cfg.sharedResult);var c=API.getAll(a.cfg);c.data=b,API.process(c,b);var d=c.requires,e=d?Promise.all(d.map(API.require.bind(c))).then(function(){return XHR(c)}):XHR(c);return c.shareResult&&e.then(function(b){a.cfg.sharedResult=b}),e},API.require=function(req){try{return"string"==typeof req&&(req=eval("window."+req)),"function"==typeof req&&(req=req()||req),req?Promise.resolve(req):Promise.reject(req)}catch(e){return Promise.reject(e)}},API.config=function(a,b){return a?void 0===b?API.get(this.cfg,a):API.set(this.cfg,a,b):API.getAll(this.cfg)},API.process=function(a){a.configure&&a.configure(a);for(var b in a){var c=a[b];"string"==typeof c&&(c=a[b]=API.fill(c,a,a.data))}},API.fill=function(a,b,c){c=c||{};for(var d,e=a,f=/\$?\{([^}]+)\}/g;d=f.exec(a);){d=d[1];var g=c[d];(null===g||void 0===g)&&(g=d in b?b[d]:""),e=e.replace(new RegExp("\\$?\\{"+d+"}"),g),b.consumeData!==!1&&delete c[d]}return e},API.getAll=function(a,b){var c=a._parent?API.getAll(a._parent,!0):{};return API.copy(c,a),b||API.copy(c,a._private),c},API.copy=function(a,b){for(var c in b)"_"!==c.charAt(0)&&("!"===c.charAt(0)?a[c.substring(1)]=b[c]:a[c]=API.combine(a[c],b[c],a))},API.get=function(a,b,c){var d=a._private,e="!"+b;if(!c&&e in d)return d[e];if(e in a)return a[e];var f=c?a[b]:API.combine(a[b],d[b],a);return a._parent?API.combine(API.get(a._parent,b,!0),f,a):f},API.getter=function(a,b){try{Object.defineProperty(a,b,{get:function(){return API.get(a.cfg,b)},configurable:!0})}catch(c){}},API.set=function(a,b,c,d){var e=a._fn,f=d+("."===b.charAt(0)?"":".")+b;"function"==typeof c&&API.get(a,"debug")&&(c=API.debug(f,c)),"."===b.charAt(0)?e[b.substring(1)]=c:"@"===b.charAt(0)?e[b.substring(1)]=API.build(c,a,f):"_"===b.charAt(0)?a._private[b.substring(1)]=c:a[b]=c},API.debug=function(a,b){var c=window.console,d=Array.prototype.concat;return function(e){try{var f=[a+"("];f.push.apply(f,arguments),f.push(")");var g=b.apply(this,arguments);return void 0!==g&&g!==e&&c.debug.apply(c,[a,"->",g]),g}catch(h){var f=d.apply([a,h],arguments);throw c.error.apply(c,f),h}}},API.combine=function(a,b,c){var d=API.type(a),e=API.type(b);return e?d?e!==d?"function"===d?a.call(c,b):"function"===e?b.call(c,a):"array"===d?a.concat(b):"array"===e?[].concat.apply([a],b):a+b:"function"===e?API.combineFn(a,b):"object"===e?API.combineObject(a,b):"array"===e?a.concat.apply(a,b):"boolean"===e?a&&b:a+b:b:a},API.combineFn=function(a,b){return function(c){var d=a.call(this,c);return d=b.call(this,void 0===d?c:d),void 0===d?c:d}},API.combineObject=function(a,b){var c={};for(var d in a)c[d]=a[d];for(d in b)c[d]=b[d];return c},API.type=function(a){var b=typeof a;return"object"===b?Array.isArray(a)?"array":a?b:null:"undefined"===b?null:b},Posterior.version=""}(document,window.store||function(){}); | ||
!function(D,store){"use strict";var Posterior=window.Posterior=function(a,b){return Posterior.api(a,b)},XHR=Posterior.xhr=function(a){return XHR.main(a)},htmlClass=D.documentElement.classList;XHR.ctor=XMLHttpRequest,XHR.main=function(a){var b,c;return a.cache&&(b=store(XHR.key(a)),b&&(c=Promise.resolve(b))),c||(b=new XHR.ctor,XHR.config(b,a),c=XHR.promise(b,a),a.cache&&c.then(function(){XHR.cache(b)})),a.then&&(c=c.then(a.then)),a["catch"]&&(c=c["catch"](a["catch"])),c.xhr=b,c},XHR.config=function(a,b){a.open(XHR.method(b),XHR.url(b),"async"in b?b.async:!0,b.username,b.password),a.cfg=b,b.xhr=a;for(var c in b){var d=b[c];c in a&&(a[c]=d),"function"==typeof d&&a.addEventListener(c,d.bind(a))}if(b.mimeType&&a.overrideMimeType(b.mimeType),b.requestedWith!==!1&&a.setRequestHeader("X-Requested-With",b.requestedWith||"XMLHttpRequest"),b.json!==!1){try{a.responseType="json"}catch(e){}a.setRequestHeader("Accept","application/json"),a.setRequestHeader("Content-Type","application/json")}if(b.headers)for(var f in b.headers)a.setRequestHeader(f,b.headers[f])},XHR.method=function(a){return XHR.methodMap[a.method]||a.method||"GET"},XHR.methodMap={PATCH:"POST"},XHR.url=function(a){for(var b,c=a.url;b!==c;)b=c,c=c.replace(/([\/\?\&]|^)[^\/\.\?\&]+[\/\?\&]?\.\.([\/\?\&]?)/,"$1");return c},XHR.promise=function(a,b){return new Promise(function(c,d){var e=function(c){b.retry?XHR.retry(b,b.retry,f,e):d(a.error=c)},f={error:e,timeout:e,loadstart:XHR.start,loadend:XHR.end,load:XHR.load(b,c,e)};XHR.run(a,b,f,e)})},XHR.retry=function(a,b,c,d){"object"!=typeof b&&(b=a.retry={}),b.wait="wait"in b?b.wait:1e3,b.limit="limit"in b?b.limit:3,b.count="count"in b?b.count:0,b.limit>b.count++&&setTimeout(function(){var b=new XHR.ctor;XHR.config(b,a),XHR.run(b,a,c,d)},b.wait*=2)},XHR.run=function(a,b,c,d){for(var e in c)a.addEventListener(e,c[e]);try{a.send(XHR.data(b))}catch(f){d(f)}},XHR.load=function(a,b,c){return function(){try{var d=a.xhr,e=a[d.status]||d.status;if("function"==typeof e&&(e=e(d)||d.status),e>=200&&300>e){a.json!==!1&&"object"!=typeof d.response&&XHR.forceJSONResponse(d);var f=d.responseType?d.response:a.json!==!1?d.responseObject:d.responseText;if(a.responseData&&XHR.isData(f)){var g=a.responseData.call(d,f);f=void 0===g?f:g}b(XHR.isData(f)?f:d)}else c(e)}catch(h){c(h)}}},XHR.forceJSONResponse=function(a){try{delete a.response,Object.defineProperty(a,"response",{value:a.responseObject,enumerable:!0,configurable:!0})}catch(b){}},XHR.isData=function(a){return!(void 0===a||""===a)},XHR.data=function(a){var b=a.data;if(a.requestData&&XHR.isData(b)){var c=a.requestData(b);b=void 0===c?b:c}return void 0!==b&&"string"!=typeof b&&(b=JSON.stringify(b)),b||""},XHR.properties={responseObject:{get:function(){var a=null;try{this.responseText&&(a=JSON.parse(this.responseText))}catch(b){}return null===a&&"object"==typeof this.response&&(a=this.response),Object.defineProperty(this,"responseObject",{value:a}),a},enumerable:!0,configurable:!0},responseHeaders:{get:function(){for(var a,b={},c=this.getAllResponseHeaders().trim().split("\n"),d=0,e=c.length;e>d;d++)if(a=c[d]){var f=a.match(/^([\w\-]+):(.*)/);3===f.length&&(b[f[1]]=f[2].trim())}return Object.defineProperty(this,"responseHeaders",{value:b}),b},enumerable:!0,configurable:!0}},Object.defineProperties(XMLHttpRequest.prototype,XHR.properties),XHR.active=0,XHR.activeClass="xhr-active",XHR.start=function(){XHR.active++,htmlClass.add(XHR.activeClass)},XHR.end=function(){--XHR.active||htmlClass.remove(XHR.activeClass)},XHR.key=function(a){return XHR.url(a)+"|"+XHR.method(a)+"|"+XHR.data(a)},XHR.cache=function(a){var b=a.cfg;return store(XHR.key(b),XHR.safeCopy(a),b.cache),a},XHR.safeCopy=function(a,b){var c={};if(b=b||[],b.indexOf(a)<0){b.push(a);for(var d in a)try{var e=a[d],f=typeof e;"function"===f?e=void 0:"object"===f&&(e=XHR.safeCopy(e,b)),void 0!==e&&(c[d]=e)}catch(g){}return c}};var API=Posterior.api=function(a,b){var c=a.parent||null;return c&&c.cfg&&(c=c.cfg),API.build(a,c,b)};API.build=function(a,b,c){var d=function(a){return API.main(d,a)},e={_fn:d,_parent:b,_private:{},name:c||"Posterior"};(a.debug||API.get(e,"debug"))&&(d=e._fn=API.debug(e.name,d));for(var f in a)API.set(e,f,a[f],e.name),API.getter(d,f);return d.cfg=e,d.config=API.config,d.extend=API.extend,API.get(e,"auto")&&setTimeout(d,0),d},API.extend=function(a,b){return API.build(a,this.cfg,b)},API.main=function(a,b){if(a.cfg.savedResult)return Promise.resolve(a.cfg.savedResult);var c=API.getAll(a.cfg);c.data=b,API.process(c,b);var d=API.promise(c,a);return c.saveResult&&d.then(function(b){a.cfg.savedResult=b}),d},API.promise=function(a,b){var c=a.requires;return c?Promise.all(c.map(API.require.bind(a))).then(function(){return API.follow(a,b)}):API.follow(a,b)},API.follow=function(cfg,fn){if(cfg.follows){var follows=cfg.follows,leader;return"object"==typeof follows&&(leader=follows.source,follows=follows.path),leader||(leader=fn.cfg._parent._fn),leader?leader().then(function following(resource){return cfg.url=follows&&eval("resource."+follows)||resource,XHR(cfg)}):Promise.reject("Cannot follow link relation without a parent function.")}return XHR(cfg)},API.require=function(req){try{return"string"==typeof req&&(req=eval("window."+req)),"function"==typeof req&&(req=req()||req),req?Promise.resolve(req):Promise.reject(req)}catch(e){return Promise.reject(e)}},API.config=function(a,b){return a?void 0===b?API.get(this.cfg,a):API.set(this.cfg,a,b):API.getAll(this.cfg)},API.process=function(a){a.configure&&a.configure(a);for(var b in a){var c=a[b];"string"==typeof c&&(c=a[b]=API.fill(c,a,a.data))}},API.fill=function(a,b,c){c=c||{};for(var d,e=a,f=/\$?\{([^}]+)\}/g;d=f.exec(a);){d=d[1];var g=c[d];(null===g||void 0===g)&&(g=d in b?b[d]:""),e=e.replace(new RegExp("\\$?\\{"+d+"}"),g),b.consumeData!==!1&&delete c[d]}return e},API.getAll=function(a,b){var c=a._parent?API.getAll(a._parent,!0):{};return API.copy(c,a),b||API.copy(c,a._private),c},API.copy=function(a,b){for(var c in b)"_"!==c.charAt(0)&&("!"===c.charAt(0)?a[c.substring(1)]=b[c]:a[c]=API.combine(a[c],b[c],a))},API.get=function(a,b,c){var d=a._private,e="!"+b;if(!c&&e in d)return d[e];if(e in a)return a[e];var f=c?a[b]:API.combine(a[b],d[b],a);return a._parent?API.combine(API.get(a._parent,b,!0),f,a):f},API.getter=function(a,b){try{Object.defineProperty(a,b,{get:function(){return API.get(a.cfg,b)},configurable:!0})}catch(c){}},API.set=function(a,b,c,d){var e=a._fn,f=d+("."===b.charAt(0)?"":".")+b;"function"==typeof c&&API.get(a,"debug")&&(c=API.debug(f,c)),"."===b.charAt(0)?e[b.substring(1)]=c:"@"===b.charAt(0)?e[b.substring(1)]=API.build(c,a,f):"_"===b.charAt(0)?a._private[b.substring(1)]=c:a[b]=c},API.debug=function(a,b){var c=window.console,d=Array.prototype.concat;return function(e){try{var f=[a+"("];f.push.apply(f,arguments),f.push(")");var g=b.apply(this,arguments);return void 0!==g&&g!==e&&c.debug.apply(c,[a,"->",g]),g}catch(h){var f=d.apply([a,h],arguments);throw c.error.apply(c,f),h}}},API.combine=function(a,b,c){var d=API.type(a),e=API.type(b);return e?d?e!==d?"function"===d?a.call(c,b):"function"===e?b.call(c,a):"array"===d?a.concat(b):"array"===e?[].concat.apply([a],b):a+b:"function"===e?API.combineFn(a,b):"object"===e?API.combineObject(a,b):"array"===e?a.concat.apply(a,b):"boolean"===e?a&&b:a+b:b:a},API.combineFn=function(a,b){return function(c){var d=a.call(this,c);return d=b.call(this,void 0===d?c:d),void 0===d?c:d}},API.combineObject=function(a,b){var c={};for(var d in a)c[d]=a[d];for(d in b)c[d]=b[d];return c},API.type=function(a){var b=typeof a;return"object"===b?Array.isArray(a)?"array":a?b:null:"undefined"===b?null:b},Posterior.version=""}(document,window.store||function(){}); |
@@ -5,3 +5,3 @@ { | ||
"description": "Hierarchical configuration of JSON XHR communication for your APIs", | ||
"version": "0.11.0", | ||
"version": "0.12.0", | ||
"homepage": "http://esha.github.io/posterior/", | ||
@@ -8,0 +8,0 @@ "author": { |
@@ -27,2 +27,3 @@ [Posterior][home] Gives your backend services intuitive front-end interfaces (uses XHR, JSON, Promise) via straightforward, hierarchical, extensible configurations. | ||
* 2015-08-05 [v0.11.0][] (support both ${key} and {key} in URL templates) | ||
* 2015-08-08 [v0.12.0][] (s/share(d)Result/save(d)Result, and support dynamic link relations via new 'follows' property) | ||
@@ -39,1 +40,2 @@ [v0.1.4]: https://github.com/esha/posterior/tree/0.1.4 | ||
[v0.11.0]: https://github.com/esha/posterior/tree/0.11.0 | ||
[v0.12.0]: https://github.com/esha/posterior/tree/0.12.0 |
@@ -63,17 +63,14 @@ /* | ||
API.main = function(fn, data) { | ||
if (fn.cfg.sharedResult) { | ||
return Promise.resolve(fn.cfg.sharedResult); | ||
if (fn.cfg.savedResult) { | ||
return Promise.resolve(fn.cfg.savedResult); | ||
} | ||
var cfg = API.getAll(fn.cfg); | ||
cfg.data = data; | ||
API.process(cfg, data); | ||
var deps = cfg.requires, | ||
promise = deps ? | ||
Promise.all(deps.map(API.require.bind(cfg))).then(function() { | ||
return XHR(cfg); | ||
}) : | ||
XHR(cfg); | ||
if (cfg.shareResult) { | ||
var promise = API.promise(cfg, fn); | ||
if (cfg.saveResult) { | ||
promise.then(function(result) { | ||
fn.cfg.sharedResult = result; | ||
fn.cfg.savedResult = result; | ||
}); | ||
@@ -84,2 +81,35 @@ } | ||
API.promise = function(cfg, fn) { | ||
var deps = cfg.requires; | ||
return deps ? | ||
Promise.all(deps.map(API.require.bind(cfg))).then(function() { | ||
return API.follow(cfg, fn); | ||
}) : | ||
API.follow(cfg, fn); | ||
}; | ||
API.follow = function(cfg, fn) { | ||
if (cfg.follows) { | ||
var follows = cfg.follows, | ||
leader; | ||
if (typeof follows === "object") { | ||
leader = follows.source; | ||
follows = follows.path; | ||
} | ||
if (!leader) { | ||
leader = fn.cfg._parent._fn; | ||
} | ||
if (leader) { | ||
return leader().then(function following(resource) { | ||
cfg.url = follows && eval('resource.'+follows) || resource; | ||
return XHR(cfg); | ||
}); | ||
} else { | ||
return Promise.reject("Cannot follow link relation without a parent function."); | ||
} | ||
} else { | ||
return XHR(cfg); | ||
} | ||
}; | ||
API.require = function(req) { | ||
@@ -86,0 +116,0 @@ try { |
@@ -306,3 +306,3 @@ (function() { | ||
var backend = new Posterior({ shareResult: true, url: './index.html' }); | ||
var backend = new Posterior({ saveResult: true, url: './index.html' }); | ||
backend().then(function(result, fake) { | ||
@@ -322,2 +322,53 @@ ok(fake, "is fake promise"); | ||
test('API.follows', function() { | ||
expect(5);// 2 calls to fake XHR.main, 2 calls to source fn | ||
// fake XHR.main and promises to allow synchronous resolution | ||
var XHR = Posterior.xhr, | ||
XHRmain = XHR.main; | ||
function FakeResolvedPromise(value) { | ||
this.value = value; | ||
} | ||
FakeResolvedPromise.prototype.then = function(fn) { | ||
var val = fn(this.value, true); | ||
return new FakeResolvedPromise(val); | ||
}; | ||
XHR.main = function(cfg) { | ||
equal(cfg.url, "/related/type", 'got link relation as URL'); | ||
}; | ||
var service = function() { | ||
ok(true, 'called service fn'); | ||
return new FakeResolvedPromise({ _links: { type: { href: '/related/type' }}}); | ||
}; | ||
// test non-heirarchical source | ||
API.follow({ | ||
follows: { | ||
source: service, | ||
path: '_links.type.href' | ||
} | ||
}); | ||
// test heirarchical source | ||
API.follow({ | ||
follows: '_links.type.href' | ||
}, { | ||
cfg:{ _parent:{ _fn: service }} | ||
}); | ||
// test direct URL result | ||
API.follow({ | ||
follows: { | ||
source: function() { | ||
return new FakeResolvedPromise("/related/type"); | ||
} | ||
} | ||
}); | ||
// restore proper main function | ||
XHR.main = XHRmain; | ||
}); | ||
}()); |
Sorry, the diff of this file is not supported yet
97963
1980
40