algoliasearch-rails 1.16.3 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +8 -0
  3. data/Gemfile +6 -1
  4. data/Gemfile.lock +3 -3
  5. data/README.md +153 -94
  6. data/VERSION +1 -1
  7. data/algoliasearch-rails.gemspec +1 -1
  8. data/lib/algoliasearch-rails.rb +75 -36
  9. data/spec/spec_helper.rb +7 -0
  10. data/vendor/assets/javascripts/algolia/algoliasearch.angular.js +23 -12
  11. data/vendor/assets/javascripts/algolia/algoliasearch.angular.min.js +2 -2
  12. data/vendor/assets/javascripts/algolia/algoliasearch.jquery.js +23 -12
  13. data/vendor/assets/javascripts/algolia/algoliasearch.jquery.min.js +2 -2
  14. data/vendor/assets/javascripts/algolia/algoliasearch.js +22 -12
  15. data/vendor/assets/javascripts/algolia/algoliasearch.min.js +2 -2
  16. data/vendor/assets/javascripts/algolia/v2/algoliasearch.angular.js +23 -12
  17. data/vendor/assets/javascripts/algolia/v2/algoliasearch.angular.min.js +2 -2
  18. data/vendor/assets/javascripts/algolia/v2/algoliasearch.jquery.js +23 -12
  19. data/vendor/assets/javascripts/algolia/v2/algoliasearch.jquery.min.js +2 -2
  20. data/vendor/assets/javascripts/algolia/v2/algoliasearch.js +22 -12
  21. data/vendor/assets/javascripts/algolia/v2/algoliasearch.min.js +2 -2
  22. data/vendor/assets/javascripts/algolia/v3/algoliasearch.angular.js +2020 -1301
  23. data/vendor/assets/javascripts/algolia/v3/algoliasearch.angular.min.js +3 -3
  24. data/vendor/assets/javascripts/algolia/v3/algoliasearch.jquery.js +2019 -1300
  25. data/vendor/assets/javascripts/algolia/v3/algoliasearch.jquery.min.js +3 -3
  26. data/vendor/assets/javascripts/algolia/v3/algoliasearch.js +2003 -1284
  27. data/vendor/assets/javascripts/algolia/v3/algoliasearch.min.js +3 -3
  28. metadata +5 -6
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * algoliasearch 2.9.4
2
+ * algoliasearch 2.9.7
3
3
  * https://github.com/algolia/algoliasearch-client-js
4
4
  * Copyright 2014 Algolia SAS; Licensed MIT
5
5
  */
6
6
 
7
- function AlgoliaExplainResults(a,b,c){function d(a,b){var c=[];if("object"==typeof a&&"matchedWords"in a&&"value"in a){for(var e=!1,f=0;f<a.matchedWords.length;++f){var g=a.matchedWords[f];g in b||(b[g]=1,e=!0)}e&&c.push(a.value)}else if("[object Array]"===Object.prototype.toString.call(a))for(var h=0;h<a.length;++h){var i=d(a[h],b);c=c.concat(i)}else if("object"==typeof a)for(var j in a)a.hasOwnProperty(j)&&(c=c.concat(d(a[j],b)));return c}function e(a,b,c){var f=a._highlightResult||a;if(-1===c.indexOf("."))return c in f?d(f[c],b):[];for(var g=c.split("."),h=f,i=0;i<g.length;++i){if("[object Array]"===Object.prototype.toString.call(h)){for(var j=[],k=0;k<h.length;++k)j=j.concat(e(h[k],b,g.slice(i).join(".")));return j}if(!(g[i]in h))return[];h=h[g[i]]}return d(h,b)}var f={},g={},h=e(a,g,b);if(f.title=h.length>0?h[0]:"",f.subtitles=[],"undefined"!=typeof c)for(var i=0;i<c.length;++i)for(var j=e(a,g,c[i]),k=0;k<j.length;++k)f.subtitles.push({attr:c[i],value:j[k]});return f}var ALGOLIA_VERSION="2.9.4",AlgoliaSearch=function(a,b,c,d,e){var f=this;this.applicationID=a,this.apiKey=b,this.dsn=!0,this.dsnHost=null,this.hosts=[],this.currentHostIndex=0,this.requestTimeoutInMs=2e3,this.extraHeaders=[],this.jsonp=null,this.options={},this.cache={};var g,h="net";if("string"==typeof c)g=c;else{var i=c||{};this.options=i,this._isUndefined(i.method)||(g=i.method),this._isUndefined(i.tld)||(h=i.tld),this._isUndefined(i.dsn)||(this.dsn=i.dsn),this._isUndefined(i.hosts)||(e=i.hosts),this._isUndefined(i.dsnHost)||(this.dsnHost=i.dsnHost),this._isUndefined(i.requestTimeoutInMs)||(this.requestTimeoutInMs=+i.requestTimeoutInMs),this._isUndefined(i.jsonp)||(this.jsonp=i.jsonp)}this._isUndefined(e)&&(e=[this.applicationID+"-1.algolia."+h,this.applicationID+"-2.algolia."+h,this.applicationID+"-3.algolia."+h]),this.host_protocol="http://",this._isUndefined(g)||null===g?this.host_protocol=("https:"==document.location.protocol?"https":"http")+"://":("https"===g||"HTTPS"===g)&&(this.host_protocol="https://");for(var j=0;j<e.length;++j)Math.random()>.5&&this.hosts.reverse(),this.hosts.push(this.host_protocol+e[j]);Math.random()>.5&&this.hosts.reverse(),(this.dsn||null!=this.dsnHost)&&this.hosts.unshift(this.dsnHost?this.host_protocol+this.dsnHost:this.host_protocol+this.applicationID+"-dsn.algolia."+h),this.options.angular&&this.options.angular.$injector.invoke(["$http","$q",function(a,b){f.options.angular.$q=b,f.options.angular.$http=a}])};AlgoliaSearch.JSONPCounter=0,AlgoliaSearch.prototype={deleteIndex:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(a),callback:b})},moveIndex:function(a,b,c){var d={operation:"move",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},copyIndex:function(a,b,c){var d={operation:"copy",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},getLogs:function(a,b,c){return this._isUndefined(b)&&(b=0),this._isUndefined(c)&&(c=10),this._jsonRequest({method:"GET",url:"/1/logs?offset="+b+"&length="+c,callback:a})},listIndexes:function(a,b){var c="undefined"!=typeof b?"?page="+b:"";return this._jsonRequest({method:"GET",url:"/1/indexes"+c,callback:a})},initIndex:function(a){return new this.Index(this,a)},listUserKeys:function(a){return this._jsonRequest({method:"GET",url:"/1/keys",callback:a})},getUserKeyACL:function(a,b){return this._jsonRequest({method:"GET",url:"/1/keys/"+a,callback:b})},deleteUserKey:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/keys/"+a,callback:b})},addUserKey:function(a,b){return this.addUserKeyWithValidity(a,0,0,0,b)},addUserKeyWithValidity:function(a,b,c,d,e){var f={};return f.acl=a,f.validity=b,f.maxQueriesPerIPPerHour=c,f.maxHitsPerQuery=d,this._jsonRequest({method:"POST",url:"/1/keys",body:f,callback:e})},setSecurityTags:function(a){if("[object Array]"===Object.prototype.toString.call(a)){for(var b=[],c=0;c<a.length;++c)if("[object Array]"===Object.prototype.toString.call(a[c])){for(var d=[],e=0;e<a[c].length;++e)d.push(a[c][e]);b.push("("+d.join(",")+")")}else b.push(a[c]);a=b.join(",")}this.tagFilters=a},setUserToken:function(a){this.userToken=a},startQueriesBatch:function(){this.batch=[]},addQueryInBatch:function(a,b,c){var d="query="+encodeURIComponent(b);this._isUndefined(c)||null===c||(d=this._getSearchParams(c,d)),this.batch.push({indexName:a,params:d})},clearCache:function(){this.cache={}},sendQueriesBatch:function(a,b){for(var c=this,d={requests:[]},e=0;e<c.batch.length;++e)d.requests.push(c.batch[e]);if(window.clearTimeout(c.onDelayTrigger),this._isUndefined(b)||null===b||!(b>0))return this._sendQueriesBatch(d,a);var f=window.setTimeout(function(){c._sendQueriesBatch(d,a)},b);c.onDelayTrigger=f},setRequestTimeout:function(a){a&&(this.requestTimeoutInMs=parseInt(a,10))},Index:function(a,b){this.indexName=b,this.as=a,this.typeAheadArgs=null,this.typeAheadValueOption=null,this.cache={}},setExtraHeader:function(a,b){this.extraHeaders.push({key:a,value:b})},_sendQueriesBatch:function(a,b){if(null===this.jsonp){var c=this;return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:function(d,e){d?(c.jsonp=!1,b&&b(d,e)):(c.jsonp=!0,c._sendQueriesBatch(a,b))}})}if(this.jsonp){for(var d="",e=0;e<a.requests.length;++e){var f="/1/indexes/"+encodeURIComponent(a.requests[e].indexName)+"?"+a.requests[e].params;d+=e+"="+encodeURIComponent(f)+"&"}var g={params:d};return this._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/*",body:g,callback:b})}return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:b})},_jsonRequest:function(a){var b=this,c=a.callback,d=null,e=a.url,f=null;if(this.options.jQuery?(f=this.options.jQuery.$.Deferred(),f.promise=f.promise()):this.options.angular&&(f=this.options.angular.$q.defer()),this._isUndefined(a.body)||(e=a.url+"_body_"+JSON.stringify(a.body)),!this._isUndefined(a.cache)&&(d=a.cache,!this._isUndefined(d[e])))return!this._isUndefined(c)&&c&&setTimeout(function(){c(!0,d[e])},1),f&&f.resolve(d[e]),f&&f.promise;a.successiveRetryCount=0;var g=function(){if(a.successiveRetryCount>=b.hosts.length){var h={message:"Cannot connect the Algolia's Search API. Please send an email to support@algolia.com to report the issue."};return!b._isUndefined(c)&&c&&(a.successiveRetryCount=0,c(!1,h)),void(f&&f.reject(h))}a.callback=function(h,i,j){i&&!b._isUndefined(a.cache)&&(d[e]=j),!i&&h?(b.currentHostIndex=++b.currentHostIndex%b.hosts.length,a.successiveRetryCount+=1,g()):(a.successiveRetryCount=0,f&&(i?f.resolve(j):f.reject(j)),!b._isUndefined(c)&&c&&c(i,j))},a.hostname=b.hosts[b.currentHostIndex],b._jsonRequestByHost(a)};return g(),f&&f.promise},_jsonRequestByHost:function(a){var b=a.hostname+a.url;this.jsonp?this._makeJsonpRequestByHost(b,a):this.options.jQuery?this._makejQueryRequestByHost(b,a):this.options.angular?this._makeAngularRequestByHost(b,a):this._makeXmlHttpRequestByHost(b,a)},_makeAngularRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.angular.$http({url:a,method:b.method,data:c,cache:!1,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1)}).then(function(a){b.callback(!1,!0,a.data)},function(a){0===a.status?b.callback(!0,!1,a.data):400==a.status||403===a.status||404===a.status?b.callback(!1,!1,a.data):b.callback(!0,!1,a.data)})},_makejQueryRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.jQuery.$.ajax(a,{type:b.method,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1),dataType:"json",data:c,error:function(c,d,e){"timeout"===d?b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a}):400===c.status||403===c.status||404===c.status?b.callback(!1,!1,c.responseJSON):b.callback(!0,!1,{message:e})},success:function(a){b.callback(!1,!0,a)}})},_makeJsonpRequestByHost:function(a,b){if("GET"!==b.method)return void b.callback(!0,!1,{message:"Method "+b.method+" "+a+" is not supported by JSONP."});var c=!1,d=!1;AlgoliaSearch.JSONPCounter+=1;var e,f,g,h=document.getElementsByTagName("head")[0],i=document.createElement("script"),j="algoliaJSONP_"+AlgoliaSearch.JSONPCounter,k=!1;window[j]=function(a){try{delete window[j]}catch(e){window[j]=void 0}if(!d){var f=a&&a.message&&a.status||a&&200,g=200===f,h=!g&&400!==f&&403!==f&&404!==f;c=!0,b.callback(h,g,a)}},i.type="text/javascript",a+="?callback="+j+"&X-Algolia-Application-Id="+this.applicationID+"&X-Algolia-API-Key="+this.apiKey,this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken));for(var l=0;l<this.extraHeaders.length;++l)a+="&"+this.extraHeaders[l].key+"="+this.extraHeaders[l].value;b.body&&b.body.params&&(a+="&"+b.body.params),e=setTimeout(function(){d=!0,g(),b.callback(!0,!1,{message:"Timeout - Failed to load JSONP script."})},this.requestTimeoutInMs),f=function(){k||d||(k=!0,g(),c||b.callback(!0,!1,{message:"Failed to load JSONP script."}))},g=function(){clearTimeout(e),i.onload=null,i.onreadystatechange=null,i.onerror=null,h.removeChild(i);try{delete window[j],delete window[j+"_loaded"]}catch(a){window[j]=null,window[j+"_loaded"]=null}},i.onreadystatechange=function(){("loaded"===this.readyState||"complete"===this.readyState)&&f()},i.onload=function(){f()},i.onerror=function(){k||d||(g(),b.callback(!0,!1,{message:"Failed to load JSONP script."}))},i.async=!0,i.defer=!0,i.src=a,h.appendChild(i)},_makeXmlHttpRequestByHost:function(a,b){if(!this._support.cors&&!this._support.hasXDomainRequest)return void b.callback(!1,!1,{message:"CORS not supported"});var c,d,e,f=null,g=this._support.cors?new XMLHttpRequest:new XDomainRequest,h=this;this._isUndefined(b.body)||(f=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var i=0;i<this.extraHeaders.length;++i)a+="&"+this.extraHeaders[i].key+"="+this.extraHeaders[i].value;e=function(){h._support.timeout||(d=!0,g.abort()),b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a})},g instanceof XMLHttpRequest?g.open(b.method,a,!0):g.open(b.method,a),this._support.cors&&null!==f&&"GET"!==b.method&&g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.onload=function(){if(!d){h._support.timeout||clearTimeout(c);var a=null;try{a=JSON.parse(g.responseText)}catch(e){}var f=g.status||a&&a.message&&a.status||a&&200,i=200===f||201===f,j=!i&&400!==f&&403!==f&&404!==f;b.callback(j,i,a)}},this._support.timeout?(g.timeout=this.requestTimeoutInMs*(b.successiveRetryCount+1),g.ontimeout=e):c=setTimeout(e,this.requestTimeoutInMs*(b.successiveRetryCount+1)),g.onerror=function(a){d||(h._support.timeout||clearTimeout(c),b.callback(!0,!1,{message:"Could not connect to host",error:a}))},g.send(f)},_getSearchParams:function(a,b){if(this._isUndefined(a)||null===a)return b;for(var c in a)null!==c&&a.hasOwnProperty(c)&&(b+=0===b.length?"?":"&",b+=c+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(a[c])?JSON.stringify(a[c]):a[c]));return b},_isUndefined:function(a){return void 0===a},_support:{hasXMLHttpRequest:"XMLHttpRequest"in window,hasXDomainRequest:"XDomainRequest"in window,cors:"withCredentials"in new XMLHttpRequest,timeout:"timeout"in new XMLHttpRequest}},AlgoliaSearch.prototype.Index.prototype={clearCache:function(){this.cache={}},addObject:function(a,b,c){var d=this;return this.as._jsonRequest(this.as._isUndefined(c)?{method:"POST",url:"/1/indexes/"+encodeURIComponent(d.indexName),body:a,callback:b}:{method:"PUT",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(c),body:a,callback:b})},addObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"addObject",body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},getObject:function(a,b,c){"[object Array]"!==Object.prototype.toString.call(b)||c||(c=b,b=null);var d=this,e="";if(!this.as._isUndefined(c)){e="?attributes=";for(var f=0;f<c.length;++f)0!==f&&(e+=","),e+=c[f]}return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a)+e,callback:b})},partialUpdateObject:function(a,b){var c=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID)+"/partial",body:a,callback:b})},partialUpdateObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"partialUpdateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},saveObject:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID),body:a,callback:b})},saveObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"updateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},deleteObject:function(a,b){if(null===a||0===a.length)return void b(!1,{message:"empty objectID"});var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a),callback:b})},search:function(a,b,c,d){(void 0===a||null===a)&&(a=""),"function"==typeof a&&(b=a,a=""),"object"!=typeof b||!this.as._isUndefined(c)&&c||(c=b,b=null);var e=this,f="query="+encodeURIComponent(a);if(this.as._isUndefined(c)||null===c||(f=this.as._getSearchParams(c,f)),window.clearTimeout(e.onDelayTrigger),this.as._isUndefined(d)||null===d||!(d>0))return this._search(f,b);var g=window.setTimeout(function(){e._search(f,b)},d);e.onDelayTrigger=g},browse:function(a,b,c){+b>0&&(this.as._isUndefined(c)||!c)&&(c=b,b=null);var d=this,e="?page="+a;return this.as._isUndefined(c)||(e+="&hitsPerPage="+c),this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/browse"+e,callback:b})},ttAdapter:function(a){var b=this;return function(c,d){b.search(c,function(a,b){d(a?b.hits:b&&b.message)},a)}},waitTask:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/task/"+a,callback:function(d,e){d?"published"===e.status?b(!0,e):setTimeout(function(){c.waitTask(a,b)},100):b(!1,e)}})},clearIndex:function(a){var b=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/clear",callback:a})},getSettings:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/settings",callback:a})},setSettings:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/settings",body:a,callback:b})},listUserKeys:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/keys",callback:a})},getUserKeyACL:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},deleteUserKey:function(a,b){var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},addUserKey:function(a,b){var c=this,d={};return d.acl=a,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys",body:d,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};return g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(f.indexName)+"/keys",body:g,callback:e})},_search:function(a,b){var c={params:a};if(null===this.as.jsonp){var d=this;return this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:function(c,e){var f=e&&e.status;c||f&&4===Math.floor(f/100)||1===Math.floor(f/100)?(d.as.jsonp=!1,b&&b(c,e)):(d.as.jsonp=!0,d._search(a,b))}})}return this.as._jsonRequest(this.as.jsonp?{cache:this.cache,method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName),body:c,callback:b}:{cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:b})},as:null,indexName:null,typeAheadArgs:null,typeAheadValueOption:null},function(){var a=function(a){a=a||{};for(var b=1;b<arguments.length;b++)if(arguments[b])for(var c in arguments[b])arguments[b].hasOwnProperty(c)&&(a[c]=arguments[b][c]);return a};window.AlgoliaSearchHelper=function(b,c,d){var e={facets:[],disjunctiveFacets:[],hitsPerPage:20,defaultFacetFilters:[]};this.init(b,c,a({},e,d))},AlgoliaSearchHelper.prototype={init:function(a,b,c){this.client=a,this.index=b,this.options=c,this.page=0,this.refinements={},this.excludes={},this.disjunctiveRefinements={},this.extraQueries=[]},search:function(a,b,c){this.q=a,this.searchCallback=b,this.searchParams=c||{},this.page=this.page||0,this.refinements=this.refinements||{},this.disjunctiveRefinements=this.disjunctiveRefinements||{},this._search()},clearRefinements:function(){this.disjunctiveRefinements={},this.refinements={}},addDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{},this.disjunctiveRefinements[a][b]=!0},removeDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};try{delete this.disjunctiveRefinements[a][b]}catch(c){this.disjunctiveRefinements[a][b]=void 0}},addRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!0},removeRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!1},addExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!0},removeExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!1},toggleExclude:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":-"+b;return this.excludes[d]=!this.excludes[d],this.page=0,this._search(),!0}return!1},toggleRefine:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":"+b;return this.refinements[d]=!this.refinements[d],this.page=0,this._search(),!0}this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};for(var e=0;e<this.options.disjunctiveFacets.length;++e)if(this.options.disjunctiveFacets[e]==a)return this.disjunctiveRefinements[a][b]=!this.disjunctiveRefinements[a][b],this.page=0,this._search(),!0;return!1},isRefined:function(a,b){var c=a+":"+b;return this.refinements[c]?!0:this.disjunctiveRefinements[a]&&this.disjunctiveRefinements[a][b]?!0:!1},isExcluded:function(a,b){var c=a+":-"+b;return this.excludes[c]?!0:!1},nextPage:function(){this._gotoPage(this.page+1)},previousPage:function(){this.page>0&&this._gotoPage(this.page-1)},gotoPage:function(a){this._gotoPage(a)},setPage:function(a){this.page=a},setIndex:function(a){this.index=a},getIndex:function(){return this.index},clearExtraQueries:function(){this.extraQueries=[]},addExtraQuery:function(a,b,c){this.extraQueries.push({index:a,query:b,params:c||{}})},_gotoPage:function(a){this.page=a,this._search()},_search:function(){this.client.startQueriesBatch(),this.client.addQueryInBatch(this.index,this.q,this._getHitsSearchParams());var a=[],b={},c=0;for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)?a.push(d):b[d]=!0}for(c=0;c<a.length;++c)this.client.addQueryInBatch(this.index,this.q,this._getDisjunctiveFacetSearchParams(a[c]));for(c=0;c<this.extraQueries.length;++c)this.client.addQueryInBatch(this.extraQueries[c].index,this.extraQueries[c].query,this.extraQueries[c].params);var e=this;this.client.sendQueriesBatch(function(d,f){if(!d)return void e.searchCallback(!1,f);var g=f.results[0];g.disjunctiveFacets=g.disjunctiveFacets||{},g.facets_stats=g.facets_stats||{};for(var h in b)if(g.facets[h]&&!g.disjunctiveFacets[h]){g.disjunctiveFacets[h]=g.facets[h];try{delete g.facets[h]}catch(i){g.facets[h]=void 0}}for(c=0;c<a.length;++c){for(var j in f.results[c+1].facets)if(g.disjunctiveFacets[j]=f.results[c+1].facets[j],e.disjunctiveRefinements[j])for(var k in e.disjunctiveRefinements[j])!g.disjunctiveFacets[j][k]&&e.disjunctiveRefinements[j][k]&&(g.disjunctiveFacets[j][k]=0);for(var l in f.results[c+1].facets_stats)g.facets_stats[l]=f.results[c+1].facets_stats[l]}g.facetStats=g.facets_stats;for(var m in e.excludes)if(e.excludes[m]){var i=m.indexOf(":-"),h=m.slice(0,i),k=m.slice(i+2);g.facets[h]=g.facets[h]||{},g.facets[h][k]||(g.facets[h][k]=0)}if(0===e.extraQueries.length)e.searchCallback(!0,g);else{var n={results:[g]};for(c=0;c<e.extraQueries.length;++c)n.results.push(f.results[1+a.length+c]);e.searchCallback(!0,n)}})},_getHitsSearchParams:function(){var b=[],c=0;for(c=0;c<this.options.facets.length;++c)b.push(this.options.facets[c]);for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)||b.push(d)}return a({},{hitsPerPage:this.options.hitsPerPage,page:this.page,facets:b,facetFilters:this._getFacetFilters()},this.searchParams)},_getDisjunctiveFacetSearchParams:function(b){return a({},this.searchParams,{hitsPerPage:1,page:0,attributesToRetrieve:[],attributesToHighlight:[],attributesToSnippet:[],facets:b,facetFilters:this._getFacetFilters(b),analytics:!1})},_hasDisjunctiveRefinements:function(a){for(var b in this.disjunctiveRefinements[a])if(this.disjunctiveRefinements[a][b])return!0;return!1},_getFacetFilters:function(a){var b=[];if(this.options.defaultFacetFilters)for(var c=0;c<this.options.defaultFacetFilters.length;++c)b.push(this.options.defaultFacetFilters[c]);for(var d in this.refinements)this.refinements[d]&&b.push(d);for(var d in this.excludes)this.excludes[d]&&b.push(d);for(var e in this.disjunctiveRefinements)if(e!=a){var f=[];for(var g in this.disjunctiveRefinements[e])this.disjunctiveRefinements[e][g]&&f.push(e+":"+g);f.length>0&&b.push(f)}return b}}}(),function(){window.AlgoliaPlaces=function(a,b){this.init(a,b)},AlgoliaPlaces.prototype={init:function(a,b){this.client=new AlgoliaSearch(a,b,"http",!0,["places-1.algolia.io","places-2.algolia.io","places-3.algolia.io"]),this.cache={}},search:function(a,b,c){var d="query="+encodeURIComponent(a);this.client._isUndefined(c)||null==c||(d=this.client._getSearchParams(c,d));var e={params:d,apiKey:this.client.apiKey,appID:this.client.applicationID};this.client._jsonRequest({cache:this.cache,method:"POST",url:"/1/places/query",body:e,callback:b,removeCustomHTTPHeaders:!0})}}}(),"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return 10>a?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,g=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||"null";return e=0===g.length?"[]":gap?"[\n"+gap+g.join(",\n"+gap)+"\n"+h+"]":"["+g.join(",")+"]",gap=h,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)"string"==typeof rep[c]&&(d=rep[c],e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));return e=0===g.length?"{}":gap?"{\n"+gap+g.join(",\n"+gap)+"\n"+h+"}":"{"+g.join(",")+"}",gap=h,e}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx,escapable,gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;c>d;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}(),function(a){a.algolia={},a.algolia.Client=function(b,c,d){return d=d||{},d.jQuery={$:a},new AlgoliaSearch(b,c,d)}}(jQuery);
7
+ function AlgoliaExplainResults(a,b,c){function d(a,b){var c=[];if("object"==typeof a&&"matchedWords"in a&&"value"in a){for(var e=!1,f=0;f<a.matchedWords.length;++f){var g=a.matchedWords[f];g in b||(b[g]=1,e=!0)}e&&c.push(a.value)}else if("[object Array]"===Object.prototype.toString.call(a))for(var h=0;h<a.length;++h){var i=d(a[h],b);c=c.concat(i)}else if("object"==typeof a)for(var j in a)a.hasOwnProperty(j)&&(c=c.concat(d(a[j],b)));return c}function e(a,b,c){var f=a._highlightResult||a;if(-1===c.indexOf("."))return c in f?d(f[c],b):[];for(var g=c.split("."),h=f,i=0;i<g.length;++i){if("[object Array]"===Object.prototype.toString.call(h)){for(var j=[],k=0;k<h.length;++k)j=j.concat(e(h[k],b,g.slice(i).join(".")));return j}if(!(g[i]in h))return[];h=h[g[i]]}return d(h,b)}var f={},g={},h=e(a,g,b);if(f.title=h.length>0?h[0]:"",f.subtitles=[],"undefined"!=typeof c)for(var i=0;i<c.length;++i)for(var j=e(a,g,c[i]),k=0;k<j.length;++k)f.subtitles.push({attr:c[i],value:j[k]});return f}var ALGOLIA_VERSION="2.9.7",AlgoliaSearch=function(a,b,c,d,e){var f=this;this.applicationID=a,this.apiKey=b,this.dsn=!0,this.dsnHost=null,this.hosts=[],this.currentHostIndex=0,this.requestTimeoutInMs=2e3,this.extraHeaders=[],this.jsonp=null,this.options={},this.cache={};var g,h="net";if("string"==typeof c)g=c;else{var i=c||{};this.options=i,this._isUndefined(i.method)||(g=i.method),this._isUndefined(i.tld)||(h=i.tld),this._isUndefined(i.dsn)||(this.dsn=i.dsn),this._isUndefined(i.hosts)||(e=i.hosts),this._isUndefined(i.dsnHost)||(this.dsnHost=i.dsnHost),this._isUndefined(i.requestTimeoutInMs)||(this.requestTimeoutInMs=+i.requestTimeoutInMs),this._isUndefined(i.jsonp)||(this.jsonp=i.jsonp)}this._isUndefined(e)&&(e=[this.applicationID+"-1.algolianet.com",this.applicationID+"-2.algolianet.com",this.applicationID+"-3.algolianet.com"]),this.host_protocol="http://",this._isUndefined(g)||null===g?this.host_protocol=("https:"==document.location.protocol?"https":"http")+"://":("https"===g||"HTTPS"===g)&&(this.host_protocol="https://");for(var j=0;j<e.length;++j)this.hosts.push(this.host_protocol+e[j]);(this.dsn||null!=this.dsnHost)&&(this.dsnHost?this.hosts.unshift(this.host_protocol+this.dsnHost):this.hosts.unshift(this.host_protocol+this.applicationID+"-dsn.algolia."+h)),this.options.angular&&this.options.angular.$injector.invoke(["$http","$q",function(a,b){f.options.angular.$q=b,f.options.angular.$http=a}]),this._ua=this.options._ua||"Algolia for vanilla JavaScript "+window.ALGOLIA_VERSION};AlgoliaSearch.JSONPCounter=0,AlgoliaSearch.prototype={deleteIndex:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(a),callback:b})},moveIndex:function(a,b,c){var d={operation:"move",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},copyIndex:function(a,b,c){var d={operation:"copy",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},getLogs:function(a,b,c){return this._isUndefined(b)&&(b=0),this._isUndefined(c)&&(c=10),this._jsonRequest({method:"GET",url:"/1/logs?offset="+b+"&length="+c,callback:a})},listIndexes:function(a,b){var c="undefined"!=typeof b?"?page="+b:"";return this._jsonRequest({method:"GET",url:"/1/indexes"+c,callback:a})},initIndex:function(a){return new this.Index(this,a)},listUserKeys:function(a){return this._jsonRequest({method:"GET",url:"/1/keys",callback:a})},getUserKeyACL:function(a,b){return this._jsonRequest({method:"GET",url:"/1/keys/"+a,callback:b})},deleteUserKey:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/keys/"+a,callback:b})},addUserKey:function(a,b){return this.addUserKeyWithValidity(a,0,0,0,b)},addUserKeyWithValidity:function(a,b,c,d,e){var f={};return f.acl=a,f.validity=b,f.maxQueriesPerIPPerHour=c,f.maxHitsPerQuery=d,this._jsonRequest({method:"POST",url:"/1/keys",body:f,callback:e})},setSecurityTags:function(a){if("[object Array]"===Object.prototype.toString.call(a)){for(var b=[],c=0;c<a.length;++c)if("[object Array]"===Object.prototype.toString.call(a[c])){for(var d=[],e=0;e<a[c].length;++e)d.push(a[c][e]);b.push("("+d.join(",")+")")}else b.push(a[c]);a=b.join(",")}this.tagFilters=a},setUserToken:function(a){this.userToken=a},startQueriesBatch:function(){this.batch=[]},addQueryInBatch:function(a,b,c){var d="query="+encodeURIComponent(b);this._isUndefined(c)||null===c||(d=this._getSearchParams(c,d)),this.batch.push({indexName:a,params:d})},clearCache:function(){this.cache={}},sendQueriesBatch:function(a,b){for(var c=this,d={requests:[]},e=0;e<c.batch.length;++e)d.requests.push(c.batch[e]);if(window.clearTimeout(c.onDelayTrigger),this._isUndefined(b)||null===b||!(b>0))return this._sendQueriesBatch(d,a);var f=window.setTimeout(function(){c._sendQueriesBatch(d,a)},b);c.onDelayTrigger=f},setRequestTimeout:function(a){a&&(this.requestTimeoutInMs=parseInt(a,10))},Index:function(a,b){this.indexName=b,this.as=a,this.typeAheadArgs=null,this.typeAheadValueOption=null,this.cache={}},setExtraHeader:function(a,b){this.extraHeaders.push({key:a,value:b})},_sendQueriesBatch:function(a,b){if(null===this.jsonp){var c=this;return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:function(d,e){d?(c.jsonp=!1,b&&b(d,e)):(c.jsonp=!0,c._sendQueriesBatch(a,b))}})}if(this.jsonp){for(var d="",e=0;e<a.requests.length;++e){var f="/1/indexes/"+encodeURIComponent(a.requests[e].indexName)+"?"+a.requests[e].params;d+=e+"="+encodeURIComponent(f)+"&"}var g={params:d};return this._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/*",body:g,callback:b})}return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:b})},_jsonRequest:function(a){var b=this,c=a.callback,d=null,e=a.url,f=null;if(this.options.jQuery?(f=this.options.jQuery.$.Deferred(),f.promise=f.promise()):this.options.angular&&(f=this.options.angular.$q.defer()),this._isUndefined(a.body)||(e=a.url+"_body_"+JSON.stringify(a.body)),!this._isUndefined(a.cache)&&(d=a.cache,!this._isUndefined(d[e])))return!this._isUndefined(c)&&c&&setTimeout(function(){c(!0,d[e])},1),f&&f.resolve(d[e]),f&&f.promise;a.successiveRetryCount=0;var g=function(){if(a.successiveRetryCount>=b.hosts.length){var h={message:"Cannot connect the Algolia's Search API. Please send an email to support@algolia.com to report the issue."};return!b._isUndefined(c)&&c&&(a.successiveRetryCount=0,c(!1,h)),void(f&&f.reject(h))}a.callback=function(h,i,j){i&&!b._isUndefined(a.cache)&&(d[e]=j),!i&&h?(b.currentHostIndex=++b.currentHostIndex%b.hosts.length,a.successiveRetryCount+=1,g()):(a.successiveRetryCount=0,f&&(i?f.resolve(j):f.reject(j)),!b._isUndefined(c)&&c&&c(i,j))},a.hostname=b.hosts[b.currentHostIndex],b._jsonRequestByHost(a)};return g(),f&&f.promise},_jsonRequestByHost:function(a){var b=a.hostname+a.url;this.jsonp?this._makeJsonpRequestByHost(b,a):this.options.jQuery?this._makejQueryRequestByHost(b,a):this.options.angular?this._makeAngularRequestByHost(b,a):this._makeXmlHttpRequestByHost(b,a)},_makeAngularRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.angular.$http({url:a,method:b.method,data:c,cache:!1,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1)}).then(function(a){b.callback(!1,!0,a.data)},function(a){0===a.status?b.callback(!0,!1,a.data):400==a.status||403===a.status||404===a.status?b.callback(!1,!1,a.data):b.callback(!0,!1,a.data)})},_makejQueryRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.jQuery.$.ajax(a,{type:b.method,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1),dataType:"json",data:c,error:function(c,d,e){"timeout"===d?b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a}):400===c.status||403===c.status||404===c.status?b.callback(!1,!1,c.responseJSON):b.callback(!0,!1,{message:e})},success:function(a,c,d){b.callback(!1,!0,a)}})},_makeJsonpRequestByHost:function(a,b){if("GET"!==b.method)return void b.callback(!0,!1,{message:"Method "+b.method+" "+a+" is not supported by JSONP."});var c=!1,d=!1;AlgoliaSearch.JSONPCounter+=1;var e,f,g,h=document.getElementsByTagName("head")[0],i=document.createElement("script"),j="algoliaJSONP_"+AlgoliaSearch.JSONPCounter,k=!1;window[j]=function(a){try{delete window[j]}catch(e){window[j]=void 0}if(!d){var f=a&&a.message&&a.status||a&&200,g=200===f,h=!g&&400!==f&&403!==f&&404!==f;c=!0,b.callback(h,g,a)}},i.type="text/javascript",a+="?callback="+j+"&X-Algolia-Application-Id="+this.applicationID+"&X-Algolia-API-Key="+this.apiKey,this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var l=0;l<this.extraHeaders.length;++l)a+="&"+this.extraHeaders[l].key+"="+this.extraHeaders[l].value;b.body&&b.body.params&&(a+="&"+b.body.params),e=setTimeout(function(){d=!0,g(),b.callback(!0,!1,{message:"Timeout - Failed to load JSONP script."})},this.requestTimeoutInMs*(b.successiveRetryCount+1)),f=function(){k||d||(k=!0,g(),c||b.callback(!0,!1,{message:"Failed to load JSONP script."}))},g=function(){clearTimeout(e),i.onload=null,i.onreadystatechange=null,i.onerror=null,h.removeChild(i);try{delete window[j],delete window[j+"_loaded"]}catch(a){window[j]=null,window[j+"_loaded"]=null}},i.onreadystatechange=function(){("loaded"===this.readyState||"complete"===this.readyState)&&f()},i.onload=function(){f()},i.onerror=function(){k||d||(g(),b.callback(!0,!1,{message:"Failed to load JSONP script."}))},i.async=!0,i.defer=!0,i.src=a,h.appendChild(i)},_makeXmlHttpRequestByHost:function(a,b){if(!this._support.cors&&!this._support.hasXDomainRequest)return void b.callback(!1,!1,{message:"CORS not supported"});var c,d,e,f=null,g=this._support.cors?new XMLHttpRequest:new XDomainRequest,h=this;this._isUndefined(b.body)||(f=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var i=0;i<this.extraHeaders.length;++i)a+="&"+this.extraHeaders[i].key+"="+this.extraHeaders[i].value;e=function(){h._support.timeout||(d=!0,g.abort()),b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a})},g instanceof XMLHttpRequest?g.open(b.method,a,!0):g.open(b.method,a),this._support.cors&&null!==f&&"GET"!==b.method&&g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.onload=function(){if(!d){h._support.timeout||clearTimeout(c);var a=null;try{a=JSON.parse(g.responseText)}catch(e){}var f=g.status||a&&a.message&&a.status||a&&200,i=200===f||201===f,j=!i&&400!==f&&403!==f&&404!==f;b.callback(j,i,a)}},g.onprogress=function(){},this._support.timeout?(g.timeout=this.requestTimeoutInMs*(b.successiveRetryCount+1),g.ontimeout=e):c=setTimeout(e,this.requestTimeoutInMs*(b.successiveRetryCount+1)),g.onerror=function(a){d||(h._support.timeout||clearTimeout(c),b.callback(!0,!1,{message:"Could not connect to host",error:a}))},g.send(f)},_getSearchParams:function(a,b){if(this._isUndefined(a)||null===a)return b;for(var c in a)null!==c&&a.hasOwnProperty(c)&&(b+=0===b.length?"?":"&",b+=c+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(a[c])?JSON.stringify(a[c]):a[c]));return b},_isUndefined:function(a){return void 0===a},_support:{hasXMLHttpRequest:"XMLHttpRequest"in window,hasXDomainRequest:"XDomainRequest"in window,cors:"withCredentials"in new XMLHttpRequest,timeout:"timeout"in new XMLHttpRequest}},AlgoliaSearch.prototype.Index.prototype={clearCache:function(){this.cache={}},addObject:function(a,b,c){var d=this;return this.as._isUndefined(c)?this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(d.indexName),body:a,callback:b}):this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(c),body:a,callback:b})},addObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"addObject",body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},getObject:function(a,b,c){"[object Array]"!==Object.prototype.toString.call(b)||c||(c=b,b=null);var d=this,e="";if(!this.as._isUndefined(c)){e="?attributes=";for(var f=0;f<c.length;++f)0!==f&&(e+=","),e+=c[f]}return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a)+e,callback:b})},partialUpdateObject:function(a,b){var c=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID)+"/partial",body:a,callback:b})},partialUpdateObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"partialUpdateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},saveObject:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID),body:a,callback:b})},saveObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"updateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},deleteObject:function(a,b){if(null===a||0===a.length)return void b(!1,{message:"empty objectID"});var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a),callback:b})},search:function(a,b,c,d){(void 0===a||null===a)&&(a=""),"function"==typeof a&&(b=a,a=""),"object"!=typeof b||!this.as._isUndefined(c)&&c||(c=b,b=null);var e=this,f="query="+encodeURIComponent(a);if(this.as._isUndefined(c)||null===c||(f=this.as._getSearchParams(c,f)),window.clearTimeout(e.onDelayTrigger),this.as._isUndefined(d)||null===d||!(d>0))return this._search(f,b);var g=window.setTimeout(function(){e._search(f,b)},d);e.onDelayTrigger=g},browse:function(a,b,c){+b>0&&(this.as._isUndefined(c)||!c)&&(c=b,b=null);var d=this,e="?page="+a;return this.as._isUndefined(c)||(e+="&hitsPerPage="+c),this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/browse"+e,callback:b})},ttAdapter:function(a){var b=this;return function(c,d){b.search(c,function(a,b){d(a?b.hits:b&&b.message)},a)}},waitTask:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/task/"+a,callback:function(d,e){d?"published"===e.status?b(!0,e):setTimeout(function(){c.waitTask(a,b)},100):b(!1,e)}})},clearIndex:function(a){var b=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/clear",callback:a})},getSettings:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/settings",callback:a})},setSettings:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/settings",body:a,callback:b})},listUserKeys:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/keys",callback:a})},getUserKeyACL:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},deleteUserKey:function(a,b){var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},addUserKey:function(a,b){var c=this,d={};return d.acl=a,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys",body:d,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};return g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(f.indexName)+"/keys",body:g,callback:e})},_search:function(a,b){var c={params:a};if(null===this.as.jsonp){var d=this;return this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:function(c,e){var f=e&&e.status;c||f&&4===Math.floor(f/100)||1===Math.floor(f/100)?(d.as.jsonp=!1,b&&b(c,e)):(d.as.jsonp=!0,d._search(a,b))}})}return this.as.jsonp?this.as._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName),body:c,callback:b}):this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:b})},as:null,indexName:null,typeAheadArgs:null,typeAheadValueOption:null},function(a){var b=function(a){a=a||{};for(var b=1;b<arguments.length;b++)if(arguments[b])for(var c in arguments[b])arguments[b].hasOwnProperty(c)&&(a[c]=arguments[b][c]);return a};window.AlgoliaSearchHelper=function(a,c,d){var e={facets:[],disjunctiveFacets:[],hitsPerPage:20,defaultFacetFilters:[]};this.init(a,c,b({},e,d))},AlgoliaSearchHelper.prototype={init:function(a,b,c){this.client=a,this.index=b,this.options=c,this.page=0,this.refinements={},this.excludes={},this.disjunctiveRefinements={},this.extraQueries=[]},search:function(a,b,c){this.q=a,this.searchCallback=b,this.searchParams=c||{},this.page=this.page||0,this.refinements=this.refinements||{},this.disjunctiveRefinements=this.disjunctiveRefinements||{},this._search()},clearRefinements:function(){this.disjunctiveRefinements={},this.refinements={}},addDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{},this.disjunctiveRefinements[a][b]=!0},removeDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};try{delete this.disjunctiveRefinements[a][b]}catch(c){this.disjunctiveRefinements[a][b]=void 0}},addRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!0},removeRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!1},addExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!0},removeExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!1},toggleExclude:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":-"+b;return this.excludes[d]=!this.excludes[d],this.page=0,this._search(),!0}return!1},toggleRefine:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":"+b;return this.refinements[d]=!this.refinements[d],this.page=0,this._search(),!0}this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};for(var e=0;e<this.options.disjunctiveFacets.length;++e)if(this.options.disjunctiveFacets[e]==a)return this.disjunctiveRefinements[a][b]=!this.disjunctiveRefinements[a][b],this.page=0,this._search(),!0;return!1},isRefined:function(a,b){var c=a+":"+b;return this.refinements[c]?!0:this.disjunctiveRefinements[a]&&this.disjunctiveRefinements[a][b]?!0:!1},isExcluded:function(a,b){var c=a+":-"+b;return this.excludes[c]?!0:!1},nextPage:function(){this._gotoPage(this.page+1)},previousPage:function(){this.page>0&&this._gotoPage(this.page-1)},gotoPage:function(a){this._gotoPage(a)},setPage:function(a){this.page=a},setIndex:function(a){this.index=a},getIndex:function(){return this.index},clearExtraQueries:function(){this.extraQueries=[]},addExtraQuery:function(a,b,c){this.extraQueries.push({index:a,query:b,params:c||{}})},_gotoPage:function(a){this.page=a,this._search()},_search:function(){this.client.startQueriesBatch(),this.client.addQueryInBatch(this.index,this.q,this._getHitsSearchParams());var a=[],b={},c=0;for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)?a.push(d):b[d]=!0}for(c=0;c<a.length;++c)this.client.addQueryInBatch(this.index,this.q,this._getDisjunctiveFacetSearchParams(a[c]));for(c=0;c<this.extraQueries.length;++c)this.client.addQueryInBatch(this.extraQueries[c].index,this.extraQueries[c].query,this.extraQueries[c].params);var e=this;this.client.sendQueriesBatch(function(d,f){if(!d)return void e.searchCallback(!1,f);var g=f.results[0];g.disjunctiveFacets=g.disjunctiveFacets||{},g.facets_stats=g.facets_stats||{};for(var h in b)if(g.facets[h]&&!g.disjunctiveFacets[h]){g.disjunctiveFacets[h]=g.facets[h];try{delete g.facets[h]}catch(i){g.facets[h]=void 0}}for(c=0;c<a.length;++c){for(var j in f.results[c+1].facets)if(g.disjunctiveFacets[j]=f.results[c+1].facets[j],e.disjunctiveRefinements[j])for(var k in e.disjunctiveRefinements[j])!g.disjunctiveFacets[j][k]&&e.disjunctiveRefinements[j][k]&&(g.disjunctiveFacets[j][k]=0);for(var l in f.results[c+1].facets_stats)g.facets_stats[l]=f.results[c+1].facets_stats[l]}g.facetStats=g.facets_stats;for(var m in e.excludes)if(e.excludes[m]){var i=m.indexOf(":-"),h=m.slice(0,i),k=m.slice(i+2);g.facets[h]=g.facets[h]||{},g.facets[h][k]||(g.facets[h][k]=0)}if(0===e.extraQueries.length)e.searchCallback(!0,g);else{var n={results:[g]};for(c=0;c<e.extraQueries.length;++c)n.results.push(f.results[1+a.length+c]);e.searchCallback(!0,n)}})},_getHitsSearchParams:function(){var a=[],c=0;for(c=0;c<this.options.facets.length;++c)a.push(this.options.facets[c]);for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)||a.push(d)}return b({},{hitsPerPage:this.options.hitsPerPage,page:this.page,facets:a,facetFilters:this._getFacetFilters()},this.searchParams)},_getDisjunctiveFacetSearchParams:function(a){return b({},this.searchParams,{hitsPerPage:1,page:0,attributesToRetrieve:[],attributesToHighlight:[],attributesToSnippet:[],facets:a,facetFilters:this._getFacetFilters(a),analytics:!1})},_hasDisjunctiveRefinements:function(a){for(var b in this.disjunctiveRefinements[a])if(this.disjunctiveRefinements[a][b])return!0;return!1},_getFacetFilters:function(a){var b=[];if(this.options.defaultFacetFilters)for(var c=0;c<this.options.defaultFacetFilters.length;++c)b.push(this.options.defaultFacetFilters[c]);for(var d in this.refinements)this.refinements[d]&&b.push(d);for(var d in this.excludes)this.excludes[d]&&b.push(d);for(var e in this.disjunctiveRefinements)if(e!=a){var f=[];for(var g in this.disjunctiveRefinements[e])this.disjunctiveRefinements[e][g]&&f.push(e+":"+g);f.length>0&&b.push(f)}return b}}}(),function(a){window.AlgoliaPlaces=function(a,b){this.init(a,b)},AlgoliaPlaces.prototype={init:function(a,b){this.client=new AlgoliaSearch(a,b,"http",!0,["places-1.algolia.io","places-2.algolia.io","places-3.algolia.io"]),this.cache={}},search:function(a,b,c){var d="query="+encodeURIComponent(a);this.client._isUndefined(c)||null==c||(d=this.client._getSearchParams(c,d));var e={params:d,apiKey:this.client.apiKey,appID:this.client.applicationID};this.client._jsonRequest({cache:this.cache,method:"POST",url:"/1/places/query",body:e,callback:b,removeCustomHTTPHeaders:!0})}}}(),"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return 10>a?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,g=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||"null";return e=0===g.length?"[]":gap?"[\n"+gap+g.join(",\n"+gap)+"\n"+h+"]":"["+g.join(",")+"]",gap=h,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)"string"==typeof rep[c]&&(d=rep[c],e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));return e=0===g.length?"{}":gap?"{\n"+gap+g.join(",\n"+gap)+"\n"+h+"}":"{"+g.join(",")+"}",gap=h,e}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx,escapable,gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;c>d;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}(),function(a){a.algolia={},a.algolia.Client=function(b,c,d){return d=d||{},d.jQuery={$:a},d._ua="Algolia for jQuery "+window.ALGOLIA_VERSION,new AlgoliaSearch(b,c,d)}}(jQuery);
@@ -21,7 +21,7 @@
21
21
  * THE SOFTWARE.
22
22
  */
23
23
 
24
- var ALGOLIA_VERSION = '2.9.4';
24
+ var ALGOLIA_VERSION = '2.9.7';
25
25
 
26
26
  /*
27
27
  * Copyright (c) 2013 Algolia
@@ -106,9 +106,9 @@ var AlgoliaSearch = function(applicationID, apiKey, methodOrOptions, resolveDNS,
106
106
  // If hosts is undefined, initialize it with applicationID
107
107
  if (this._isUndefined(hosts)) {
108
108
  hosts = [
109
- this.applicationID + '-1.algolia.' + tld,
110
- this.applicationID + '-2.algolia.' + tld,
111
- this.applicationID + '-3.algolia.' + tld
109
+ this.applicationID + '-1.algolianet.com',
110
+ this.applicationID + '-2.algolianet.com',
111
+ this.applicationID + '-3.algolianet.com'
112
112
  ];
113
113
  }
114
114
  // detect is we use http or https
@@ -118,16 +118,10 @@ var AlgoliaSearch = function(applicationID, apiKey, methodOrOptions, resolveDNS,
118
118
  } else if (method === 'https' || method === 'HTTPS') {
119
119
  this.host_protocol = 'https://';
120
120
  }
121
- // Add hosts in random order
121
+ // Add protocol to hosts
122
122
  for (var i = 0; i < hosts.length; ++i) {
123
- if (Math.random() > 0.5) {
124
- this.hosts.reverse();
125
- }
126
123
  this.hosts.push(this.host_protocol + hosts[i]);
127
124
  }
128
- if (Math.random() > 0.5) {
129
- this.hosts.reverse();
130
- }
131
125
  // then add Distributed Search Network host if there is one
132
126
  if (this.dsn || this.dsnHost != null) {
133
127
  if (this.dsnHost) {
@@ -143,6 +137,8 @@ var AlgoliaSearch = function(applicationID, apiKey, methodOrOptions, resolveDNS,
143
137
  self.options.angular.$http = $http;
144
138
  }]);
145
139
  }
140
+
141
+ this._ua = this.options._ua || 'Algolia for vanilla JavaScript ' + window.ALGOLIA_VERSION;
146
142
  };
147
143
 
148
144
  // This holds the number of JSONP requests done accross clients
@@ -595,6 +591,7 @@ AlgoliaSearch.prototype = {
595
591
 
596
592
  opts.successiveRetryCount = 0;
597
593
  var impl = function() {
594
+
598
595
  if (opts.successiveRetryCount >= self.hosts.length) {
599
596
  var error = { message: 'Cannot connect the Algolia\'s Search API. Please send an email to support@algolia.com to report the issue.' };
600
597
  if (!self._isUndefined(callback) && callback) {
@@ -665,6 +662,7 @@ AlgoliaSearch.prototype = {
665
662
  if (this.tagFilters) {
666
663
  url += '&X-Algolia-TagFilters=' + encodeURIComponent(this.tagFilters);
667
664
  }
665
+ url += '&X-Algolia-Agent=' + encodeURIComponent(this._ua);
668
666
  for (var i = 0; i < this.extraHeaders.length; ++i) {
669
667
  url += '&' + this.extraHeaders[i].key + '=' + this.extraHeaders[i].value;
670
668
  }
@@ -711,6 +709,7 @@ AlgoliaSearch.prototype = {
711
709
  if (this.tagFilters) {
712
710
  url += '&X-Algolia-TagFilters=' + encodeURIComponent(this.tagFilters);
713
711
  }
712
+ url += '&X-Algolia-Agent=' + encodeURIComponent(this._ua);
714
713
  for (var i = 0; i < this.extraHeaders.length; ++i) {
715
714
  url += '&' + this.extraHeaders[i].key + '=' + this.extraHeaders[i].value;
716
715
  }
@@ -786,6 +785,8 @@ AlgoliaSearch.prototype = {
786
785
  url += '&X-Algolia-UserToken=' + encodeURIComponent(this.userToken);
787
786
  }
788
787
 
788
+ url += '&X-Algolia-Agent=' + encodeURIComponent(this._ua);
789
+
789
790
  for (var i = 0; i < this.extraHeaders.length; ++i) {
790
791
  url += '&' + this.extraHeaders[i].key + '=' + this.extraHeaders[i].value;
791
792
  }
@@ -799,7 +800,7 @@ AlgoliaSearch.prototype = {
799
800
  clean();
800
801
 
801
802
  opts.callback(true, false, { 'message': 'Timeout - Failed to load JSONP script.' });
802
- }, this.requestTimeoutInMs);
803
+ }, this.requestTimeoutInMs * (opts.successiveRetryCount + 1));
803
804
 
804
805
  success = function() {
805
806
  if (done || timedOut) {
@@ -896,6 +897,8 @@ AlgoliaSearch.prototype = {
896
897
  url += '&X-Algolia-TagFilters=' + encodeURIComponent(this.tagFilters);
897
898
  }
898
899
 
900
+ url += '&X-Algolia-Agent=' + encodeURIComponent(this._ua);
901
+
899
902
  for (var i = 0; i < this.extraHeaders.length; ++i) {
900
903
  url += '&' + this.extraHeaders[i].key + '=' + this.extraHeaders[i].value;
901
904
  }
@@ -958,6 +961,13 @@ AlgoliaSearch.prototype = {
958
961
  opts.callback(retry, success, response);
959
962
  };
960
963
 
964
+ // we set an empty onprogress listener
965
+ // so that XDomainRequest on IE9 is not aborted
966
+ // refs:
967
+ // - https://github.com/algolia/algoliasearch-client-js/issues/76
968
+ // - https://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified?forum=iewebdevelopment
969
+ request.onprogress = function noop() {};
970
+
961
971
  if (this._support.timeout) {
962
972
  // .timeout supported by both XHR and XDR,
963
973
  // we do receive timeout event, tested
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * algoliasearch 2.9.4
2
+ * algoliasearch 2.9.7
3
3
  * https://github.com/algolia/algoliasearch-client-js
4
4
  * Copyright 2014 Algolia SAS; Licensed MIT
5
5
  */
6
6
 
7
- function AlgoliaExplainResults(a,b,c){function d(a,b){var c=[];if("object"==typeof a&&"matchedWords"in a&&"value"in a){for(var e=!1,f=0;f<a.matchedWords.length;++f){var g=a.matchedWords[f];g in b||(b[g]=1,e=!0)}e&&c.push(a.value)}else if("[object Array]"===Object.prototype.toString.call(a))for(var h=0;h<a.length;++h){var i=d(a[h],b);c=c.concat(i)}else if("object"==typeof a)for(var j in a)a.hasOwnProperty(j)&&(c=c.concat(d(a[j],b)));return c}function e(a,b,c){var f=a._highlightResult||a;if(-1===c.indexOf("."))return c in f?d(f[c],b):[];for(var g=c.split("."),h=f,i=0;i<g.length;++i){if("[object Array]"===Object.prototype.toString.call(h)){for(var j=[],k=0;k<h.length;++k)j=j.concat(e(h[k],b,g.slice(i).join(".")));return j}if(!(g[i]in h))return[];h=h[g[i]]}return d(h,b)}var f={},g={},h=e(a,g,b);if(f.title=h.length>0?h[0]:"",f.subtitles=[],"undefined"!=typeof c)for(var i=0;i<c.length;++i)for(var j=e(a,g,c[i]),k=0;k<j.length;++k)f.subtitles.push({attr:c[i],value:j[k]});return f}var ALGOLIA_VERSION="2.9.4",AlgoliaSearch=function(a,b,c,d,e){var f=this;this.applicationID=a,this.apiKey=b,this.dsn=!0,this.dsnHost=null,this.hosts=[],this.currentHostIndex=0,this.requestTimeoutInMs=2e3,this.extraHeaders=[],this.jsonp=null,this.options={},this.cache={};var g,h="net";if("string"==typeof c)g=c;else{var i=c||{};this.options=i,this._isUndefined(i.method)||(g=i.method),this._isUndefined(i.tld)||(h=i.tld),this._isUndefined(i.dsn)||(this.dsn=i.dsn),this._isUndefined(i.hosts)||(e=i.hosts),this._isUndefined(i.dsnHost)||(this.dsnHost=i.dsnHost),this._isUndefined(i.requestTimeoutInMs)||(this.requestTimeoutInMs=+i.requestTimeoutInMs),this._isUndefined(i.jsonp)||(this.jsonp=i.jsonp)}this._isUndefined(e)&&(e=[this.applicationID+"-1.algolia."+h,this.applicationID+"-2.algolia."+h,this.applicationID+"-3.algolia."+h]),this.host_protocol="http://",this._isUndefined(g)||null===g?this.host_protocol=("https:"==document.location.protocol?"https":"http")+"://":("https"===g||"HTTPS"===g)&&(this.host_protocol="https://");for(var j=0;j<e.length;++j)Math.random()>.5&&this.hosts.reverse(),this.hosts.push(this.host_protocol+e[j]);Math.random()>.5&&this.hosts.reverse(),(this.dsn||null!=this.dsnHost)&&this.hosts.unshift(this.dsnHost?this.host_protocol+this.dsnHost:this.host_protocol+this.applicationID+"-dsn.algolia."+h),this.options.angular&&this.options.angular.$injector.invoke(["$http","$q",function(a,b){f.options.angular.$q=b,f.options.angular.$http=a}])};AlgoliaSearch.JSONPCounter=0,AlgoliaSearch.prototype={deleteIndex:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(a),callback:b})},moveIndex:function(a,b,c){var d={operation:"move",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},copyIndex:function(a,b,c){var d={operation:"copy",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},getLogs:function(a,b,c){return this._isUndefined(b)&&(b=0),this._isUndefined(c)&&(c=10),this._jsonRequest({method:"GET",url:"/1/logs?offset="+b+"&length="+c,callback:a})},listIndexes:function(a,b){var c="undefined"!=typeof b?"?page="+b:"";return this._jsonRequest({method:"GET",url:"/1/indexes"+c,callback:a})},initIndex:function(a){return new this.Index(this,a)},listUserKeys:function(a){return this._jsonRequest({method:"GET",url:"/1/keys",callback:a})},getUserKeyACL:function(a,b){return this._jsonRequest({method:"GET",url:"/1/keys/"+a,callback:b})},deleteUserKey:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/keys/"+a,callback:b})},addUserKey:function(a,b){return this.addUserKeyWithValidity(a,0,0,0,b)},addUserKeyWithValidity:function(a,b,c,d,e){var f={};return f.acl=a,f.validity=b,f.maxQueriesPerIPPerHour=c,f.maxHitsPerQuery=d,this._jsonRequest({method:"POST",url:"/1/keys",body:f,callback:e})},setSecurityTags:function(a){if("[object Array]"===Object.prototype.toString.call(a)){for(var b=[],c=0;c<a.length;++c)if("[object Array]"===Object.prototype.toString.call(a[c])){for(var d=[],e=0;e<a[c].length;++e)d.push(a[c][e]);b.push("("+d.join(",")+")")}else b.push(a[c]);a=b.join(",")}this.tagFilters=a},setUserToken:function(a){this.userToken=a},startQueriesBatch:function(){this.batch=[]},addQueryInBatch:function(a,b,c){var d="query="+encodeURIComponent(b);this._isUndefined(c)||null===c||(d=this._getSearchParams(c,d)),this.batch.push({indexName:a,params:d})},clearCache:function(){this.cache={}},sendQueriesBatch:function(a,b){for(var c=this,d={requests:[]},e=0;e<c.batch.length;++e)d.requests.push(c.batch[e]);if(window.clearTimeout(c.onDelayTrigger),this._isUndefined(b)||null===b||!(b>0))return this._sendQueriesBatch(d,a);var f=window.setTimeout(function(){c._sendQueriesBatch(d,a)},b);c.onDelayTrigger=f},setRequestTimeout:function(a){a&&(this.requestTimeoutInMs=parseInt(a,10))},Index:function(a,b){this.indexName=b,this.as=a,this.typeAheadArgs=null,this.typeAheadValueOption=null,this.cache={}},setExtraHeader:function(a,b){this.extraHeaders.push({key:a,value:b})},_sendQueriesBatch:function(a,b){if(null===this.jsonp){var c=this;return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:function(d,e){d?(c.jsonp=!1,b&&b(d,e)):(c.jsonp=!0,c._sendQueriesBatch(a,b))}})}if(this.jsonp){for(var d="",e=0;e<a.requests.length;++e){var f="/1/indexes/"+encodeURIComponent(a.requests[e].indexName)+"?"+a.requests[e].params;d+=e+"="+encodeURIComponent(f)+"&"}var g={params:d};return this._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/*",body:g,callback:b})}return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:b})},_jsonRequest:function(a){var b=this,c=a.callback,d=null,e=a.url,f=null;if(this.options.jQuery?(f=this.options.jQuery.$.Deferred(),f.promise=f.promise()):this.options.angular&&(f=this.options.angular.$q.defer()),this._isUndefined(a.body)||(e=a.url+"_body_"+JSON.stringify(a.body)),!this._isUndefined(a.cache)&&(d=a.cache,!this._isUndefined(d[e])))return!this._isUndefined(c)&&c&&setTimeout(function(){c(!0,d[e])},1),f&&f.resolve(d[e]),f&&f.promise;a.successiveRetryCount=0;var g=function(){if(a.successiveRetryCount>=b.hosts.length){var h={message:"Cannot connect the Algolia's Search API. Please send an email to support@algolia.com to report the issue."};return!b._isUndefined(c)&&c&&(a.successiveRetryCount=0,c(!1,h)),void(f&&f.reject(h))}a.callback=function(h,i,j){i&&!b._isUndefined(a.cache)&&(d[e]=j),!i&&h?(b.currentHostIndex=++b.currentHostIndex%b.hosts.length,a.successiveRetryCount+=1,g()):(a.successiveRetryCount=0,f&&(i?f.resolve(j):f.reject(j)),!b._isUndefined(c)&&c&&c(i,j))},a.hostname=b.hosts[b.currentHostIndex],b._jsonRequestByHost(a)};return g(),f&&f.promise},_jsonRequestByHost:function(a){var b=a.hostname+a.url;this.jsonp?this._makeJsonpRequestByHost(b,a):this.options.jQuery?this._makejQueryRequestByHost(b,a):this.options.angular?this._makeAngularRequestByHost(b,a):this._makeXmlHttpRequestByHost(b,a)},_makeAngularRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.angular.$http({url:a,method:b.method,data:c,cache:!1,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1)}).then(function(a){b.callback(!1,!0,a.data)},function(a){0===a.status?b.callback(!0,!1,a.data):400==a.status||403===a.status||404===a.status?b.callback(!1,!1,a.data):b.callback(!0,!1,a.data)})},_makejQueryRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.jQuery.$.ajax(a,{type:b.method,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1),dataType:"json",data:c,error:function(c,d,e){"timeout"===d?b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a}):400===c.status||403===c.status||404===c.status?b.callback(!1,!1,c.responseJSON):b.callback(!0,!1,{message:e})},success:function(a){b.callback(!1,!0,a)}})},_makeJsonpRequestByHost:function(a,b){if("GET"!==b.method)return void b.callback(!0,!1,{message:"Method "+b.method+" "+a+" is not supported by JSONP."});var c=!1,d=!1;AlgoliaSearch.JSONPCounter+=1;var e,f,g,h=document.getElementsByTagName("head")[0],i=document.createElement("script"),j="algoliaJSONP_"+AlgoliaSearch.JSONPCounter,k=!1;window[j]=function(a){try{delete window[j]}catch(e){window[j]=void 0}if(!d){var f=a&&a.message&&a.status||a&&200,g=200===f,h=!g&&400!==f&&403!==f&&404!==f;c=!0,b.callback(h,g,a)}},i.type="text/javascript",a+="?callback="+j+"&X-Algolia-Application-Id="+this.applicationID+"&X-Algolia-API-Key="+this.apiKey,this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken));for(var l=0;l<this.extraHeaders.length;++l)a+="&"+this.extraHeaders[l].key+"="+this.extraHeaders[l].value;b.body&&b.body.params&&(a+="&"+b.body.params),e=setTimeout(function(){d=!0,g(),b.callback(!0,!1,{message:"Timeout - Failed to load JSONP script."})},this.requestTimeoutInMs),f=function(){k||d||(k=!0,g(),c||b.callback(!0,!1,{message:"Failed to load JSONP script."}))},g=function(){clearTimeout(e),i.onload=null,i.onreadystatechange=null,i.onerror=null,h.removeChild(i);try{delete window[j],delete window[j+"_loaded"]}catch(a){window[j]=null,window[j+"_loaded"]=null}},i.onreadystatechange=function(){("loaded"===this.readyState||"complete"===this.readyState)&&f()},i.onload=function(){f()},i.onerror=function(){k||d||(g(),b.callback(!0,!1,{message:"Failed to load JSONP script."}))},i.async=!0,i.defer=!0,i.src=a,h.appendChild(i)},_makeXmlHttpRequestByHost:function(a,b){if(!this._support.cors&&!this._support.hasXDomainRequest)return void b.callback(!1,!1,{message:"CORS not supported"});var c,d,e,f=null,g=this._support.cors?new XMLHttpRequest:new XDomainRequest,h=this;this._isUndefined(b.body)||(f=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters));for(var i=0;i<this.extraHeaders.length;++i)a+="&"+this.extraHeaders[i].key+"="+this.extraHeaders[i].value;e=function(){h._support.timeout||(d=!0,g.abort()),b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a})},g instanceof XMLHttpRequest?g.open(b.method,a,!0):g.open(b.method,a),this._support.cors&&null!==f&&"GET"!==b.method&&g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.onload=function(){if(!d){h._support.timeout||clearTimeout(c);var a=null;try{a=JSON.parse(g.responseText)}catch(e){}var f=g.status||a&&a.message&&a.status||a&&200,i=200===f||201===f,j=!i&&400!==f&&403!==f&&404!==f;b.callback(j,i,a)}},this._support.timeout?(g.timeout=this.requestTimeoutInMs*(b.successiveRetryCount+1),g.ontimeout=e):c=setTimeout(e,this.requestTimeoutInMs*(b.successiveRetryCount+1)),g.onerror=function(a){d||(h._support.timeout||clearTimeout(c),b.callback(!0,!1,{message:"Could not connect to host",error:a}))},g.send(f)},_getSearchParams:function(a,b){if(this._isUndefined(a)||null===a)return b;for(var c in a)null!==c&&a.hasOwnProperty(c)&&(b+=0===b.length?"?":"&",b+=c+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(a[c])?JSON.stringify(a[c]):a[c]));return b},_isUndefined:function(a){return void 0===a},_support:{hasXMLHttpRequest:"XMLHttpRequest"in window,hasXDomainRequest:"XDomainRequest"in window,cors:"withCredentials"in new XMLHttpRequest,timeout:"timeout"in new XMLHttpRequest}},AlgoliaSearch.prototype.Index.prototype={clearCache:function(){this.cache={}},addObject:function(a,b,c){var d=this;return this.as._jsonRequest(this.as._isUndefined(c)?{method:"POST",url:"/1/indexes/"+encodeURIComponent(d.indexName),body:a,callback:b}:{method:"PUT",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(c),body:a,callback:b})},addObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"addObject",body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},getObject:function(a,b,c){"[object Array]"!==Object.prototype.toString.call(b)||c||(c=b,b=null);var d=this,e="";if(!this.as._isUndefined(c)){e="?attributes=";for(var f=0;f<c.length;++f)0!==f&&(e+=","),e+=c[f]}return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a)+e,callback:b})},partialUpdateObject:function(a,b){var c=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID)+"/partial",body:a,callback:b})},partialUpdateObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"partialUpdateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},saveObject:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID),body:a,callback:b})},saveObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"updateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},deleteObject:function(a,b){if(null===a||0===a.length)return void b(!1,{message:"empty objectID"});var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a),callback:b})},search:function(a,b,c,d){(void 0===a||null===a)&&(a=""),"function"==typeof a&&(b=a,a=""),"object"!=typeof b||!this.as._isUndefined(c)&&c||(c=b,b=null);var e=this,f="query="+encodeURIComponent(a);if(this.as._isUndefined(c)||null===c||(f=this.as._getSearchParams(c,f)),window.clearTimeout(e.onDelayTrigger),this.as._isUndefined(d)||null===d||!(d>0))return this._search(f,b);var g=window.setTimeout(function(){e._search(f,b)},d);e.onDelayTrigger=g},browse:function(a,b,c){+b>0&&(this.as._isUndefined(c)||!c)&&(c=b,b=null);var d=this,e="?page="+a;return this.as._isUndefined(c)||(e+="&hitsPerPage="+c),this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/browse"+e,callback:b})},ttAdapter:function(a){var b=this;return function(c,d){b.search(c,function(a,b){d(a?b.hits:b&&b.message)},a)}},waitTask:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/task/"+a,callback:function(d,e){d?"published"===e.status?b(!0,e):setTimeout(function(){c.waitTask(a,b)},100):b(!1,e)}})},clearIndex:function(a){var b=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/clear",callback:a})},getSettings:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/settings",callback:a})},setSettings:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/settings",body:a,callback:b})},listUserKeys:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/keys",callback:a})},getUserKeyACL:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},deleteUserKey:function(a,b){var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},addUserKey:function(a,b){var c=this,d={};return d.acl=a,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys",body:d,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};return g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(f.indexName)+"/keys",body:g,callback:e})},_search:function(a,b){var c={params:a};if(null===this.as.jsonp){var d=this;return this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:function(c,e){var f=e&&e.status;c||f&&4===Math.floor(f/100)||1===Math.floor(f/100)?(d.as.jsonp=!1,b&&b(c,e)):(d.as.jsonp=!0,d._search(a,b))}})}return this.as._jsonRequest(this.as.jsonp?{cache:this.cache,method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName),body:c,callback:b}:{cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:b})},as:null,indexName:null,typeAheadArgs:null,typeAheadValueOption:null},function(){var a=function(a){a=a||{};for(var b=1;b<arguments.length;b++)if(arguments[b])for(var c in arguments[b])arguments[b].hasOwnProperty(c)&&(a[c]=arguments[b][c]);return a};window.AlgoliaSearchHelper=function(b,c,d){var e={facets:[],disjunctiveFacets:[],hitsPerPage:20,defaultFacetFilters:[]};this.init(b,c,a({},e,d))},AlgoliaSearchHelper.prototype={init:function(a,b,c){this.client=a,this.index=b,this.options=c,this.page=0,this.refinements={},this.excludes={},this.disjunctiveRefinements={},this.extraQueries=[]},search:function(a,b,c){this.q=a,this.searchCallback=b,this.searchParams=c||{},this.page=this.page||0,this.refinements=this.refinements||{},this.disjunctiveRefinements=this.disjunctiveRefinements||{},this._search()},clearRefinements:function(){this.disjunctiveRefinements={},this.refinements={}},addDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{},this.disjunctiveRefinements[a][b]=!0},removeDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};try{delete this.disjunctiveRefinements[a][b]}catch(c){this.disjunctiveRefinements[a][b]=void 0}},addRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!0},removeRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!1},addExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!0},removeExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!1},toggleExclude:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":-"+b;return this.excludes[d]=!this.excludes[d],this.page=0,this._search(),!0}return!1},toggleRefine:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":"+b;return this.refinements[d]=!this.refinements[d],this.page=0,this._search(),!0}this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};for(var e=0;e<this.options.disjunctiveFacets.length;++e)if(this.options.disjunctiveFacets[e]==a)return this.disjunctiveRefinements[a][b]=!this.disjunctiveRefinements[a][b],this.page=0,this._search(),!0;return!1},isRefined:function(a,b){var c=a+":"+b;return this.refinements[c]?!0:this.disjunctiveRefinements[a]&&this.disjunctiveRefinements[a][b]?!0:!1},isExcluded:function(a,b){var c=a+":-"+b;return this.excludes[c]?!0:!1},nextPage:function(){this._gotoPage(this.page+1)},previousPage:function(){this.page>0&&this._gotoPage(this.page-1)},gotoPage:function(a){this._gotoPage(a)},setPage:function(a){this.page=a},setIndex:function(a){this.index=a},getIndex:function(){return this.index},clearExtraQueries:function(){this.extraQueries=[]},addExtraQuery:function(a,b,c){this.extraQueries.push({index:a,query:b,params:c||{}})},_gotoPage:function(a){this.page=a,this._search()},_search:function(){this.client.startQueriesBatch(),this.client.addQueryInBatch(this.index,this.q,this._getHitsSearchParams());var a=[],b={},c=0;for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)?a.push(d):b[d]=!0}for(c=0;c<a.length;++c)this.client.addQueryInBatch(this.index,this.q,this._getDisjunctiveFacetSearchParams(a[c]));for(c=0;c<this.extraQueries.length;++c)this.client.addQueryInBatch(this.extraQueries[c].index,this.extraQueries[c].query,this.extraQueries[c].params);var e=this;this.client.sendQueriesBatch(function(d,f){if(!d)return void e.searchCallback(!1,f);var g=f.results[0];g.disjunctiveFacets=g.disjunctiveFacets||{},g.facets_stats=g.facets_stats||{};for(var h in b)if(g.facets[h]&&!g.disjunctiveFacets[h]){g.disjunctiveFacets[h]=g.facets[h];try{delete g.facets[h]}catch(i){g.facets[h]=void 0}}for(c=0;c<a.length;++c){for(var j in f.results[c+1].facets)if(g.disjunctiveFacets[j]=f.results[c+1].facets[j],e.disjunctiveRefinements[j])for(var k in e.disjunctiveRefinements[j])!g.disjunctiveFacets[j][k]&&e.disjunctiveRefinements[j][k]&&(g.disjunctiveFacets[j][k]=0);for(var l in f.results[c+1].facets_stats)g.facets_stats[l]=f.results[c+1].facets_stats[l]}g.facetStats=g.facets_stats;for(var m in e.excludes)if(e.excludes[m]){var i=m.indexOf(":-"),h=m.slice(0,i),k=m.slice(i+2);g.facets[h]=g.facets[h]||{},g.facets[h][k]||(g.facets[h][k]=0)}if(0===e.extraQueries.length)e.searchCallback(!0,g);else{var n={results:[g]};for(c=0;c<e.extraQueries.length;++c)n.results.push(f.results[1+a.length+c]);e.searchCallback(!0,n)}})},_getHitsSearchParams:function(){var b=[],c=0;for(c=0;c<this.options.facets.length;++c)b.push(this.options.facets[c]);for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)||b.push(d)}return a({},{hitsPerPage:this.options.hitsPerPage,page:this.page,facets:b,facetFilters:this._getFacetFilters()},this.searchParams)},_getDisjunctiveFacetSearchParams:function(b){return a({},this.searchParams,{hitsPerPage:1,page:0,attributesToRetrieve:[],attributesToHighlight:[],attributesToSnippet:[],facets:b,facetFilters:this._getFacetFilters(b),analytics:!1})},_hasDisjunctiveRefinements:function(a){for(var b in this.disjunctiveRefinements[a])if(this.disjunctiveRefinements[a][b])return!0;return!1},_getFacetFilters:function(a){var b=[];if(this.options.defaultFacetFilters)for(var c=0;c<this.options.defaultFacetFilters.length;++c)b.push(this.options.defaultFacetFilters[c]);for(var d in this.refinements)this.refinements[d]&&b.push(d);for(var d in this.excludes)this.excludes[d]&&b.push(d);for(var e in this.disjunctiveRefinements)if(e!=a){var f=[];for(var g in this.disjunctiveRefinements[e])this.disjunctiveRefinements[e][g]&&f.push(e+":"+g);f.length>0&&b.push(f)}return b}}}(),function(){window.AlgoliaPlaces=function(a,b){this.init(a,b)},AlgoliaPlaces.prototype={init:function(a,b){this.client=new AlgoliaSearch(a,b,"http",!0,["places-1.algolia.io","places-2.algolia.io","places-3.algolia.io"]),this.cache={}},search:function(a,b,c){var d="query="+encodeURIComponent(a);this.client._isUndefined(c)||null==c||(d=this.client._getSearchParams(c,d));var e={params:d,apiKey:this.client.apiKey,appID:this.client.applicationID};this.client._jsonRequest({cache:this.cache,method:"POST",url:"/1/places/query",body:e,callback:b,removeCustomHTTPHeaders:!0})}}}(),"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return 10>a?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,g=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||"null";return e=0===g.length?"[]":gap?"[\n"+gap+g.join(",\n"+gap)+"\n"+h+"]":"["+g.join(",")+"]",gap=h,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)"string"==typeof rep[c]&&(d=rep[c],e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));return e=0===g.length?"{}":gap?"{\n"+gap+g.join(",\n"+gap)+"\n"+h+"}":"{"+g.join(",")+"}",gap=h,e}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx,escapable,gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;c>d;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
7
+ function AlgoliaExplainResults(a,b,c){function d(a,b){var c=[];if("object"==typeof a&&"matchedWords"in a&&"value"in a){for(var e=!1,f=0;f<a.matchedWords.length;++f){var g=a.matchedWords[f];g in b||(b[g]=1,e=!0)}e&&c.push(a.value)}else if("[object Array]"===Object.prototype.toString.call(a))for(var h=0;h<a.length;++h){var i=d(a[h],b);c=c.concat(i)}else if("object"==typeof a)for(var j in a)a.hasOwnProperty(j)&&(c=c.concat(d(a[j],b)));return c}function e(a,b,c){var f=a._highlightResult||a;if(-1===c.indexOf("."))return c in f?d(f[c],b):[];for(var g=c.split("."),h=f,i=0;i<g.length;++i){if("[object Array]"===Object.prototype.toString.call(h)){for(var j=[],k=0;k<h.length;++k)j=j.concat(e(h[k],b,g.slice(i).join(".")));return j}if(!(g[i]in h))return[];h=h[g[i]]}return d(h,b)}var f={},g={},h=e(a,g,b);if(f.title=h.length>0?h[0]:"",f.subtitles=[],"undefined"!=typeof c)for(var i=0;i<c.length;++i)for(var j=e(a,g,c[i]),k=0;k<j.length;++k)f.subtitles.push({attr:c[i],value:j[k]});return f}var ALGOLIA_VERSION="2.9.7",AlgoliaSearch=function(a,b,c,d,e){var f=this;this.applicationID=a,this.apiKey=b,this.dsn=!0,this.dsnHost=null,this.hosts=[],this.currentHostIndex=0,this.requestTimeoutInMs=2e3,this.extraHeaders=[],this.jsonp=null,this.options={},this.cache={};var g,h="net";if("string"==typeof c)g=c;else{var i=c||{};this.options=i,this._isUndefined(i.method)||(g=i.method),this._isUndefined(i.tld)||(h=i.tld),this._isUndefined(i.dsn)||(this.dsn=i.dsn),this._isUndefined(i.hosts)||(e=i.hosts),this._isUndefined(i.dsnHost)||(this.dsnHost=i.dsnHost),this._isUndefined(i.requestTimeoutInMs)||(this.requestTimeoutInMs=+i.requestTimeoutInMs),this._isUndefined(i.jsonp)||(this.jsonp=i.jsonp)}this._isUndefined(e)&&(e=[this.applicationID+"-1.algolianet.com",this.applicationID+"-2.algolianet.com",this.applicationID+"-3.algolianet.com"]),this.host_protocol="http://",this._isUndefined(g)||null===g?this.host_protocol=("https:"==document.location.protocol?"https":"http")+"://":("https"===g||"HTTPS"===g)&&(this.host_protocol="https://");for(var j=0;j<e.length;++j)this.hosts.push(this.host_protocol+e[j]);(this.dsn||null!=this.dsnHost)&&(this.dsnHost?this.hosts.unshift(this.host_protocol+this.dsnHost):this.hosts.unshift(this.host_protocol+this.applicationID+"-dsn.algolia."+h)),this.options.angular&&this.options.angular.$injector.invoke(["$http","$q",function(a,b){f.options.angular.$q=b,f.options.angular.$http=a}]),this._ua=this.options._ua||"Algolia for vanilla JavaScript "+window.ALGOLIA_VERSION};AlgoliaSearch.JSONPCounter=0,AlgoliaSearch.prototype={deleteIndex:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(a),callback:b})},moveIndex:function(a,b,c){var d={operation:"move",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},copyIndex:function(a,b,c){var d={operation:"copy",destination:b};return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(a)+"/operation",body:d,callback:c})},getLogs:function(a,b,c){return this._isUndefined(b)&&(b=0),this._isUndefined(c)&&(c=10),this._jsonRequest({method:"GET",url:"/1/logs?offset="+b+"&length="+c,callback:a})},listIndexes:function(a,b){var c="undefined"!=typeof b?"?page="+b:"";return this._jsonRequest({method:"GET",url:"/1/indexes"+c,callback:a})},initIndex:function(a){return new this.Index(this,a)},listUserKeys:function(a){return this._jsonRequest({method:"GET",url:"/1/keys",callback:a})},getUserKeyACL:function(a,b){return this._jsonRequest({method:"GET",url:"/1/keys/"+a,callback:b})},deleteUserKey:function(a,b){return this._jsonRequest({method:"DELETE",url:"/1/keys/"+a,callback:b})},addUserKey:function(a,b){return this.addUserKeyWithValidity(a,0,0,0,b)},addUserKeyWithValidity:function(a,b,c,d,e){var f={};return f.acl=a,f.validity=b,f.maxQueriesPerIPPerHour=c,f.maxHitsPerQuery=d,this._jsonRequest({method:"POST",url:"/1/keys",body:f,callback:e})},setSecurityTags:function(a){if("[object Array]"===Object.prototype.toString.call(a)){for(var b=[],c=0;c<a.length;++c)if("[object Array]"===Object.prototype.toString.call(a[c])){for(var d=[],e=0;e<a[c].length;++e)d.push(a[c][e]);b.push("("+d.join(",")+")")}else b.push(a[c]);a=b.join(",")}this.tagFilters=a},setUserToken:function(a){this.userToken=a},startQueriesBatch:function(){this.batch=[]},addQueryInBatch:function(a,b,c){var d="query="+encodeURIComponent(b);this._isUndefined(c)||null===c||(d=this._getSearchParams(c,d)),this.batch.push({indexName:a,params:d})},clearCache:function(){this.cache={}},sendQueriesBatch:function(a,b){for(var c=this,d={requests:[]},e=0;e<c.batch.length;++e)d.requests.push(c.batch[e]);if(window.clearTimeout(c.onDelayTrigger),this._isUndefined(b)||null===b||!(b>0))return this._sendQueriesBatch(d,a);var f=window.setTimeout(function(){c._sendQueriesBatch(d,a)},b);c.onDelayTrigger=f},setRequestTimeout:function(a){a&&(this.requestTimeoutInMs=parseInt(a,10))},Index:function(a,b){this.indexName=b,this.as=a,this.typeAheadArgs=null,this.typeAheadValueOption=null,this.cache={}},setExtraHeader:function(a,b){this.extraHeaders.push({key:a,value:b})},_sendQueriesBatch:function(a,b){if(null===this.jsonp){var c=this;return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:function(d,e){d?(c.jsonp=!1,b&&b(d,e)):(c.jsonp=!0,c._sendQueriesBatch(a,b))}})}if(this.jsonp){for(var d="",e=0;e<a.requests.length;++e){var f="/1/indexes/"+encodeURIComponent(a.requests[e].indexName)+"?"+a.requests[e].params;d+=e+"="+encodeURIComponent(f)+"&"}var g={params:d};return this._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/*",body:g,callback:b})}return this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,callback:b})},_jsonRequest:function(a){var b=this,c=a.callback,d=null,e=a.url,f=null;if(this.options.jQuery?(f=this.options.jQuery.$.Deferred(),f.promise=f.promise()):this.options.angular&&(f=this.options.angular.$q.defer()),this._isUndefined(a.body)||(e=a.url+"_body_"+JSON.stringify(a.body)),!this._isUndefined(a.cache)&&(d=a.cache,!this._isUndefined(d[e])))return!this._isUndefined(c)&&c&&setTimeout(function(){c(!0,d[e])},1),f&&f.resolve(d[e]),f&&f.promise;a.successiveRetryCount=0;var g=function(){if(a.successiveRetryCount>=b.hosts.length){var h={message:"Cannot connect the Algolia's Search API. Please send an email to support@algolia.com to report the issue."};return!b._isUndefined(c)&&c&&(a.successiveRetryCount=0,c(!1,h)),void(f&&f.reject(h))}a.callback=function(h,i,j){i&&!b._isUndefined(a.cache)&&(d[e]=j),!i&&h?(b.currentHostIndex=++b.currentHostIndex%b.hosts.length,a.successiveRetryCount+=1,g()):(a.successiveRetryCount=0,f&&(i?f.resolve(j):f.reject(j)),!b._isUndefined(c)&&c&&c(i,j))},a.hostname=b.hosts[b.currentHostIndex],b._jsonRequestByHost(a)};return g(),f&&f.promise},_jsonRequestByHost:function(a){var b=a.hostname+a.url;this.jsonp?this._makeJsonpRequestByHost(b,a):this.options.jQuery?this._makejQueryRequestByHost(b,a):this.options.angular?this._makeAngularRequestByHost(b,a):this._makeXmlHttpRequestByHost(b,a)},_makeAngularRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.angular.$http({url:a,method:b.method,data:c,cache:!1,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1)}).then(function(a){b.callback(!1,!0,a.data)},function(a){0===a.status?b.callback(!0,!1,a.data):400==a.status||403===a.status||404===a.status?b.callback(!1,!1,a.data):b.callback(!0,!1,a.data)})},_makejQueryRequestByHost:function(a,b){var c=null;this._isUndefined(b.body)||(c=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var d=0;d<this.extraHeaders.length;++d)a+="&"+this.extraHeaders[d].key+"="+this.extraHeaders[d].value;this.options.jQuery.$.ajax(a,{type:b.method,timeout:this.requestTimeoutInMs*(b.successiveRetryCount+1),dataType:"json",data:c,error:function(c,d,e){"timeout"===d?b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a}):400===c.status||403===c.status||404===c.status?b.callback(!1,!1,c.responseJSON):b.callback(!0,!1,{message:e})},success:function(a,c,d){b.callback(!1,!0,a)}})},_makeJsonpRequestByHost:function(a,b){if("GET"!==b.method)return void b.callback(!0,!1,{message:"Method "+b.method+" "+a+" is not supported by JSONP."});var c=!1,d=!1;AlgoliaSearch.JSONPCounter+=1;var e,f,g,h=document.getElementsByTagName("head")[0],i=document.createElement("script"),j="algoliaJSONP_"+AlgoliaSearch.JSONPCounter,k=!1;window[j]=function(a){try{delete window[j]}catch(e){window[j]=void 0}if(!d){var f=a&&a.message&&a.status||a&&200,g=200===f,h=!g&&400!==f&&403!==f&&404!==f;c=!0,b.callback(h,g,a)}},i.type="text/javascript",a+="?callback="+j+"&X-Algolia-Application-Id="+this.applicationID+"&X-Algolia-API-Key="+this.apiKey,this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var l=0;l<this.extraHeaders.length;++l)a+="&"+this.extraHeaders[l].key+"="+this.extraHeaders[l].value;b.body&&b.body.params&&(a+="&"+b.body.params),e=setTimeout(function(){d=!0,g(),b.callback(!0,!1,{message:"Timeout - Failed to load JSONP script."})},this.requestTimeoutInMs*(b.successiveRetryCount+1)),f=function(){k||d||(k=!0,g(),c||b.callback(!0,!1,{message:"Failed to load JSONP script."}))},g=function(){clearTimeout(e),i.onload=null,i.onreadystatechange=null,i.onerror=null,h.removeChild(i);try{delete window[j],delete window[j+"_loaded"]}catch(a){window[j]=null,window[j+"_loaded"]=null}},i.onreadystatechange=function(){("loaded"===this.readyState||"complete"===this.readyState)&&f()},i.onload=function(){f()},i.onerror=function(){k||d||(g(),b.callback(!0,!1,{message:"Failed to load JSONP script."}))},i.async=!0,i.defer=!0,i.src=a,h.appendChild(i)},_makeXmlHttpRequestByHost:function(a,b){if(!this._support.cors&&!this._support.hasXDomainRequest)return void b.callback(!1,!1,{message:"CORS not supported"});var c,d,e,f=null,g=this._support.cors?new XMLHttpRequest:new XDomainRequest,h=this;this._isUndefined(b.body)||(f=JSON.stringify(b.body)),a+=(-1===a.indexOf("?")?"?":"&")+"X-Algolia-API-Key="+this.apiKey,a+="&X-Algolia-Application-Id="+this.applicationID,this.userToken&&(a+="&X-Algolia-UserToken="+encodeURIComponent(this.userToken)),this.tagFilters&&(a+="&X-Algolia-TagFilters="+encodeURIComponent(this.tagFilters)),a+="&X-Algolia-Agent="+encodeURIComponent(this._ua);for(var i=0;i<this.extraHeaders.length;++i)a+="&"+this.extraHeaders[i].key+"="+this.extraHeaders[i].value;e=function(){h._support.timeout||(d=!0,g.abort()),b.callback(!0,!1,{message:"Timeout - Could not connect to endpoint "+a})},g instanceof XMLHttpRequest?g.open(b.method,a,!0):g.open(b.method,a),this._support.cors&&null!==f&&"GET"!==b.method&&g.setRequestHeader("Content-type","application/x-www-form-urlencoded"),g.onload=function(){if(!d){h._support.timeout||clearTimeout(c);var a=null;try{a=JSON.parse(g.responseText)}catch(e){}var f=g.status||a&&a.message&&a.status||a&&200,i=200===f||201===f,j=!i&&400!==f&&403!==f&&404!==f;b.callback(j,i,a)}},g.onprogress=function(){},this._support.timeout?(g.timeout=this.requestTimeoutInMs*(b.successiveRetryCount+1),g.ontimeout=e):c=setTimeout(e,this.requestTimeoutInMs*(b.successiveRetryCount+1)),g.onerror=function(a){d||(h._support.timeout||clearTimeout(c),b.callback(!0,!1,{message:"Could not connect to host",error:a}))},g.send(f)},_getSearchParams:function(a,b){if(this._isUndefined(a)||null===a)return b;for(var c in a)null!==c&&a.hasOwnProperty(c)&&(b+=0===b.length?"?":"&",b+=c+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(a[c])?JSON.stringify(a[c]):a[c]));return b},_isUndefined:function(a){return void 0===a},_support:{hasXMLHttpRequest:"XMLHttpRequest"in window,hasXDomainRequest:"XDomainRequest"in window,cors:"withCredentials"in new XMLHttpRequest,timeout:"timeout"in new XMLHttpRequest}},AlgoliaSearch.prototype.Index.prototype={clearCache:function(){this.cache={}},addObject:function(a,b,c){var d=this;return this.as._isUndefined(c)?this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(d.indexName),body:a,callback:b}):this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(c),body:a,callback:b})},addObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"addObject",body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},getObject:function(a,b,c){"[object Array]"!==Object.prototype.toString.call(b)||c||(c=b,b=null);var d=this,e="";if(!this.as._isUndefined(c)){e="?attributes=";for(var f=0;f<c.length;++f)0!==f&&(e+=","),e+=c[f]}return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/"+encodeURIComponent(a)+e,callback:b})},partialUpdateObject:function(a,b){var c=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID)+"/partial",body:a,callback:b})},partialUpdateObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"partialUpdateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},saveObject:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a.objectID),body:a,callback:b})},saveObjects:function(a,b){for(var c=this,d={requests:[]},e=0;e<a.length;++e){var f={action:"updateObject",objectID:a[e].objectID,body:a[e]};d.requests.push(f)}return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/batch",body:d,callback:b})},deleteObject:function(a,b){if(null===a||0===a.length)return void b(!1,{message:"empty objectID"});var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/"+encodeURIComponent(a),callback:b})},search:function(a,b,c,d){(void 0===a||null===a)&&(a=""),"function"==typeof a&&(b=a,a=""),"object"!=typeof b||!this.as._isUndefined(c)&&c||(c=b,b=null);var e=this,f="query="+encodeURIComponent(a);if(this.as._isUndefined(c)||null===c||(f=this.as._getSearchParams(c,f)),window.clearTimeout(e.onDelayTrigger),this.as._isUndefined(d)||null===d||!(d>0))return this._search(f,b);var g=window.setTimeout(function(){e._search(f,b)},d);e.onDelayTrigger=g},browse:function(a,b,c){+b>0&&(this.as._isUndefined(c)||!c)&&(c=b,b=null);var d=this,e="?page="+a;return this.as._isUndefined(c)||(e+="&hitsPerPage="+c),this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(d.indexName)+"/browse"+e,callback:b})},ttAdapter:function(a){var b=this;return function(c,d){b.search(c,function(a,b){d(a?b.hits:b&&b.message)},a)}},waitTask:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/task/"+a,callback:function(d,e){d?"published"===e.status?b(!0,e):setTimeout(function(){c.waitTask(a,b)},100):b(!1,e)}})},clearIndex:function(a){var b=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/clear",callback:a})},getSettings:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/settings",callback:a})},setSettings:function(a,b){var c=this;return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/settings",body:a,callback:b})},listUserKeys:function(a){var b=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(b.indexName)+"/keys",callback:a})},getUserKeyACL:function(a,b){var c=this;return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},deleteUserKey:function(a,b){var c=this;return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys/"+a,callback:b})},addUserKey:function(a,b){var c=this,d={};return d.acl=a,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(c.indexName)+"/keys",body:d,callback:b})},addUserKeyWithValidity:function(a,b,c,d,e){var f=this,g={};return g.acl=a,g.validity=b,g.maxQueriesPerIPPerHour=c,g.maxHitsPerQuery=d,this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(f.indexName)+"/keys",body:g,callback:e})},_search:function(a,b){var c={params:a};if(null===this.as.jsonp){var d=this;return this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:function(c,e){var f=e&&e.status;c||f&&4===Math.floor(f/100)||1===Math.floor(f/100)?(d.as.jsonp=!1,b&&b(c,e)):(d.as.jsonp=!0,d._search(a,b))}})}return this.as.jsonp?this.as._jsonRequest({cache:this.cache,method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName),body:c,callback:b}):this.as._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/query",body:c,callback:b})},as:null,indexName:null,typeAheadArgs:null,typeAheadValueOption:null},function(a){var b=function(a){a=a||{};for(var b=1;b<arguments.length;b++)if(arguments[b])for(var c in arguments[b])arguments[b].hasOwnProperty(c)&&(a[c]=arguments[b][c]);return a};window.AlgoliaSearchHelper=function(a,c,d){var e={facets:[],disjunctiveFacets:[],hitsPerPage:20,defaultFacetFilters:[]};this.init(a,c,b({},e,d))},AlgoliaSearchHelper.prototype={init:function(a,b,c){this.client=a,this.index=b,this.options=c,this.page=0,this.refinements={},this.excludes={},this.disjunctiveRefinements={},this.extraQueries=[]},search:function(a,b,c){this.q=a,this.searchCallback=b,this.searchParams=c||{},this.page=this.page||0,this.refinements=this.refinements||{},this.disjunctiveRefinements=this.disjunctiveRefinements||{},this._search()},clearRefinements:function(){this.disjunctiveRefinements={},this.refinements={}},addDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{},this.disjunctiveRefinements[a][b]=!0},removeDisjunctiveRefine:function(a,b){this.disjunctiveRefinements=this.disjunctiveRefinements||{},this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};try{delete this.disjunctiveRefinements[a][b]}catch(c){this.disjunctiveRefinements[a][b]=void 0}},addRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!0},removeRefine:function(a,b){var c=a+":"+b;this.refinements=this.refinements||{},this.refinements[c]=!1},addExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!0},removeExclude:function(a,b){var c=a+":-"+b;this.excludes=this.excludes||{},this.excludes[c]=!1},toggleExclude:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":-"+b;return this.excludes[d]=!this.excludes[d],this.page=0,this._search(),!0}return!1},toggleRefine:function(a,b){for(var c=0;c<this.options.facets.length;++c)if(this.options.facets[c]==a){var d=a+":"+b;return this.refinements[d]=!this.refinements[d],this.page=0,this._search(),!0}this.disjunctiveRefinements[a]=this.disjunctiveRefinements[a]||{};for(var e=0;e<this.options.disjunctiveFacets.length;++e)if(this.options.disjunctiveFacets[e]==a)return this.disjunctiveRefinements[a][b]=!this.disjunctiveRefinements[a][b],this.page=0,this._search(),!0;return!1},isRefined:function(a,b){var c=a+":"+b;return this.refinements[c]?!0:this.disjunctiveRefinements[a]&&this.disjunctiveRefinements[a][b]?!0:!1},isExcluded:function(a,b){var c=a+":-"+b;return this.excludes[c]?!0:!1},nextPage:function(){this._gotoPage(this.page+1)},previousPage:function(){this.page>0&&this._gotoPage(this.page-1)},gotoPage:function(a){this._gotoPage(a)},setPage:function(a){this.page=a},setIndex:function(a){this.index=a},getIndex:function(){return this.index},clearExtraQueries:function(){this.extraQueries=[]},addExtraQuery:function(a,b,c){this.extraQueries.push({index:a,query:b,params:c||{}})},_gotoPage:function(a){this.page=a,this._search()},_search:function(){this.client.startQueriesBatch(),this.client.addQueryInBatch(this.index,this.q,this._getHitsSearchParams());var a=[],b={},c=0;for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)?a.push(d):b[d]=!0}for(c=0;c<a.length;++c)this.client.addQueryInBatch(this.index,this.q,this._getDisjunctiveFacetSearchParams(a[c]));for(c=0;c<this.extraQueries.length;++c)this.client.addQueryInBatch(this.extraQueries[c].index,this.extraQueries[c].query,this.extraQueries[c].params);var e=this;this.client.sendQueriesBatch(function(d,f){if(!d)return void e.searchCallback(!1,f);var g=f.results[0];g.disjunctiveFacets=g.disjunctiveFacets||{},g.facets_stats=g.facets_stats||{};for(var h in b)if(g.facets[h]&&!g.disjunctiveFacets[h]){g.disjunctiveFacets[h]=g.facets[h];try{delete g.facets[h]}catch(i){g.facets[h]=void 0}}for(c=0;c<a.length;++c){for(var j in f.results[c+1].facets)if(g.disjunctiveFacets[j]=f.results[c+1].facets[j],e.disjunctiveRefinements[j])for(var k in e.disjunctiveRefinements[j])!g.disjunctiveFacets[j][k]&&e.disjunctiveRefinements[j][k]&&(g.disjunctiveFacets[j][k]=0);for(var l in f.results[c+1].facets_stats)g.facets_stats[l]=f.results[c+1].facets_stats[l]}g.facetStats=g.facets_stats;for(var m in e.excludes)if(e.excludes[m]){var i=m.indexOf(":-"),h=m.slice(0,i),k=m.slice(i+2);g.facets[h]=g.facets[h]||{},g.facets[h][k]||(g.facets[h][k]=0)}if(0===e.extraQueries.length)e.searchCallback(!0,g);else{var n={results:[g]};for(c=0;c<e.extraQueries.length;++c)n.results.push(f.results[1+a.length+c]);e.searchCallback(!0,n)}})},_getHitsSearchParams:function(){var a=[],c=0;for(c=0;c<this.options.facets.length;++c)a.push(this.options.facets[c]);for(c=0;c<this.options.disjunctiveFacets.length;++c){var d=this.options.disjunctiveFacets[c];this._hasDisjunctiveRefinements(d)||a.push(d)}return b({},{hitsPerPage:this.options.hitsPerPage,page:this.page,facets:a,facetFilters:this._getFacetFilters()},this.searchParams)},_getDisjunctiveFacetSearchParams:function(a){return b({},this.searchParams,{hitsPerPage:1,page:0,attributesToRetrieve:[],attributesToHighlight:[],attributesToSnippet:[],facets:a,facetFilters:this._getFacetFilters(a),analytics:!1})},_hasDisjunctiveRefinements:function(a){for(var b in this.disjunctiveRefinements[a])if(this.disjunctiveRefinements[a][b])return!0;return!1},_getFacetFilters:function(a){var b=[];if(this.options.defaultFacetFilters)for(var c=0;c<this.options.defaultFacetFilters.length;++c)b.push(this.options.defaultFacetFilters[c]);for(var d in this.refinements)this.refinements[d]&&b.push(d);for(var d in this.excludes)this.excludes[d]&&b.push(d);for(var e in this.disjunctiveRefinements)if(e!=a){var f=[];for(var g in this.disjunctiveRefinements[e])this.disjunctiveRefinements[e][g]&&f.push(e+":"+g);f.length>0&&b.push(f)}return b}}}(),function(a){window.AlgoliaPlaces=function(a,b){this.init(a,b)},AlgoliaPlaces.prototype={init:function(a,b){this.client=new AlgoliaSearch(a,b,"http",!0,["places-1.algolia.io","places-2.algolia.io","places-3.algolia.io"]),this.cache={}},search:function(a,b,c){var d="query="+encodeURIComponent(a);this.client._isUndefined(c)||null==c||(d=this.client._getSearchParams(c,d));var e={params:d,apiKey:this.client.apiKey,appID:this.client.applicationID};this.client._jsonRequest({cache:this.cache,method:"POST",url:"/1/places/query",body:e,callback:b,removeCustomHTTPHeaders:!0})}}}(),"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(a){return 10>a?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(a)),"function"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,g=[],"[object Array]"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||"null";return e=0===g.length?"[]":gap?"[\n"+gap+g.join(",\n"+gap)+"\n"+h+"]":"["+g.join(",")+"]",gap=h,e}if(rep&&"object"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)"string"==typeof rep[c]&&(d=rep[c],e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));else for(d in i)Object.prototype.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?": ":":")+e));return e=0===g.length?"{}":gap?"{\n"+gap+g.join(",\n"+gap)+"\n"+h+"}":"{"+g.join(",")+"}",gap=h,e}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx,escapable,gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,b,c){var d;if(gap="",indent="","number"==typeof c)for(d=0;c>d;d+=1)indent+=" ";else"string"==typeof c&&(indent=c);if(rep=b,b&&"function"!=typeof b&&("object"!=typeof b||"number"!=typeof b.length))throw new Error("JSON.stringify");return str("",{"":a})}),"function"!=typeof JSON.parse&&(cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
@@ -1,4 +1,4 @@
1
- /*! algoliasearch 3.18.0 | © 2014, 2015 Algolia SAS | github.com/algolia/algoliasearch-client-js */
1
+ /*! algoliasearch 3.20.3 | © 2014, 2015 Algolia SAS | github.com/algolia/algoliasearch-client-js */
2
2
  (function(f){var g;if(typeof window!=='undefined'){g=window}else if(typeof self!=='undefined'){g=self}g.ALGOLIA_MIGRATION_LAYER=f()})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
3
3
 
4
4
  module.exports = function load (src, opts, cb) {
@@ -200,258 +200,7 @@ function migrationLayer(buildName) {
200
200
 
201
201
  },{"2":2,"3":3,"4":4}]},{},[5])(5)
202
202
  });(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
203
- /**
204
- * Helpers.
205
- */
206
-
207
- var s = 1000;
208
- var m = s * 60;
209
- var h = m * 60;
210
- var d = h * 24;
211
- var y = d * 365.25;
212
-
213
- /**
214
- * Parse or format the given `val`.
215
- *
216
- * Options:
217
- *
218
- * - `long` verbose formatting [false]
219
- *
220
- * @param {String|Number} val
221
- * @param {Object} options
222
- * @return {String|Number}
223
- * @api public
224
- */
225
-
226
- module.exports = function(val, options){
227
- options = options || {};
228
- if ('string' == typeof val) return parse(val);
229
- // long, short were "future reserved words in js", YUI compressor fail on them
230
- // https://github.com/algolia/algoliasearch-client-js/issues/113#issuecomment-111978606
231
- // https://github.com/yui/yuicompressor/issues/47
232
- // https://github.com/rauchg/ms.js/pull/40
233
- return options['long']
234
- ? _long(val)
235
- : _short(val);
236
- };
237
-
238
- /**
239
- * Parse the given `str` and return milliseconds.
240
- *
241
- * @param {String} str
242
- * @return {Number}
243
- * @api private
244
- */
245
-
246
- function parse(str) {
247
- str = '' + str;
248
- if (str.length > 10000) return;
249
- var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);
250
- if (!match) return;
251
- var n = parseFloat(match[1]);
252
- var type = (match[2] || 'ms').toLowerCase();
253
- switch (type) {
254
- case 'years':
255
- case 'year':
256
- case 'yrs':
257
- case 'yr':
258
- case 'y':
259
- return n * y;
260
- case 'days':
261
- case 'day':
262
- case 'd':
263
- return n * d;
264
- case 'hours':
265
- case 'hour':
266
- case 'hrs':
267
- case 'hr':
268
- case 'h':
269
- return n * h;
270
- case 'minutes':
271
- case 'minute':
272
- case 'mins':
273
- case 'min':
274
- case 'm':
275
- return n * m;
276
- case 'seconds':
277
- case 'second':
278
- case 'secs':
279
- case 'sec':
280
- case 's':
281
- return n * s;
282
- case 'milliseconds':
283
- case 'millisecond':
284
- case 'msecs':
285
- case 'msec':
286
- case 'ms':
287
- return n;
288
- }
289
- }
290
-
291
- /**
292
- * Short format for `ms`.
293
- *
294
- * @param {Number} ms
295
- * @return {String}
296
- * @api private
297
- */
298
-
299
- function _short(ms) {
300
- if (ms >= d) return Math.round(ms / d) + 'd';
301
- if (ms >= h) return Math.round(ms / h) + 'h';
302
- if (ms >= m) return Math.round(ms / m) + 'm';
303
- if (ms >= s) return Math.round(ms / s) + 's';
304
- return ms + 'ms';
305
- }
306
-
307
- /**
308
- * Long format for `ms`.
309
- *
310
- * @param {Number} ms
311
- * @return {String}
312
- * @api private
313
- */
314
-
315
- function _long(ms) {
316
- return plural(ms, d, 'day')
317
- || plural(ms, h, 'hour')
318
- || plural(ms, m, 'minute')
319
- || plural(ms, s, 'second')
320
- || ms + ' ms';
321
- }
322
-
323
- /**
324
- * Pluralization helper.
325
- */
326
-
327
- function plural(ms, n, name) {
328
- if (ms < n) return;
329
- if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
330
- return Math.ceil(ms / n) + ' ' + name + 's';
331
- }
332
-
333
- },{}],2:[function(require,module,exports){
334
- // shim for using process in browser
335
-
336
- var process = module.exports = {};
337
-
338
- // cached from whatever global is present so that test runners that stub it
339
- // don't break things. But we need to wrap it in a try catch in case it is
340
- // wrapped in strict mode code which doesn't define any globals. It's inside a
341
- // function because try/catches deoptimize in certain engines.
342
-
343
- var cachedSetTimeout;
344
- var cachedClearTimeout;
345
-
346
- (function () {
347
- try {
348
- cachedSetTimeout = setTimeout;
349
- } catch (e) {
350
- cachedSetTimeout = function () {
351
- throw new Error('setTimeout is not defined');
352
- }
353
- }
354
- try {
355
- cachedClearTimeout = clearTimeout;
356
- } catch (e) {
357
- cachedClearTimeout = function () {
358
- throw new Error('clearTimeout is not defined');
359
- }
360
- }
361
- } ())
362
- var queue = [];
363
- var draining = false;
364
- var currentQueue;
365
- var queueIndex = -1;
366
-
367
- function cleanUpNextTick() {
368
- if (!draining || !currentQueue) {
369
- return;
370
- }
371
- draining = false;
372
- if (currentQueue.length) {
373
- queue = currentQueue.concat(queue);
374
- } else {
375
- queueIndex = -1;
376
- }
377
- if (queue.length) {
378
- drainQueue();
379
- }
380
- }
381
-
382
- function drainQueue() {
383
- if (draining) {
384
- return;
385
- }
386
- var timeout = cachedSetTimeout(cleanUpNextTick);
387
- draining = true;
388
-
389
- var len = queue.length;
390
- while(len) {
391
- currentQueue = queue;
392
- queue = [];
393
- while (++queueIndex < len) {
394
- if (currentQueue) {
395
- currentQueue[queueIndex].run();
396
- }
397
- }
398
- queueIndex = -1;
399
- len = queue.length;
400
- }
401
- currentQueue = null;
402
- draining = false;
403
- cachedClearTimeout(timeout);
404
- }
405
-
406
- process.nextTick = function (fun) {
407
- var args = new Array(arguments.length - 1);
408
- if (arguments.length > 1) {
409
- for (var i = 1; i < arguments.length; i++) {
410
- args[i - 1] = arguments[i];
411
- }
412
- }
413
- queue.push(new Item(fun, args));
414
- if (queue.length === 1 && !draining) {
415
- cachedSetTimeout(drainQueue, 0);
416
- }
417
- };
418
-
419
- // v8 likes predictible objects
420
- function Item(fun, array) {
421
- this.fun = fun;
422
- this.array = array;
423
- }
424
- Item.prototype.run = function () {
425
- this.fun.apply(null, this.array);
426
- };
427
- process.title = 'browser';
428
- process.browser = true;
429
- process.env = {};
430
- process.argv = [];
431
- process.version = ''; // empty string to avoid regexp issues
432
- process.versions = {};
433
-
434
- function noop() {}
435
-
436
- process.on = noop;
437
- process.addListener = noop;
438
- process.once = noop;
439
- process.off = noop;
440
- process.removeListener = noop;
441
- process.removeAllListeners = noop;
442
- process.emit = noop;
443
-
444
- process.binding = function (name) {
445
- throw new Error('process.binding is not supported');
446
- };
447
-
448
- process.cwd = function () { return '/' };
449
- process.chdir = function (dir) {
450
- throw new Error('process.chdir is not supported');
451
- };
452
- process.umask = function() { return 0; };
453
-
454
- },{}],3:[function(require,module,exports){
203
+ (function (process){
455
204
 
456
205
  /**
457
206
  * This is the web browser implementation of `debug()`.
@@ -459,7 +208,7 @@ process.umask = function() { return 0; };
459
208
  * Expose `debug()` as the module.
460
209
  */
461
210
 
462
- exports = module.exports = require(4);
211
+ exports = module.exports = require(2);
463
212
  exports.log = log;
464
213
  exports.formatArgs = formatArgs;
465
214
  exports.save = save;
@@ -493,7 +242,8 @@ exports.colors = [
493
242
 
494
243
  function useColors() {
495
244
  // is webkit? http://stackoverflow.com/a/16459606/376773
496
- return ('WebkitAppearance' in document.documentElement.style) ||
245
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
246
+ return (typeof document !== 'undefined' && 'WebkitAppearance' in document.documentElement.style) ||
497
247
  // is firebug? http://stackoverflow.com/a/398120/376773
498
248
  (window.console && (console.firebug || (console.exception && console.table))) ||
499
249
  // is firefox >= v31?
@@ -506,7 +256,11 @@ function useColors() {
506
256
  */
507
257
 
508
258
  exports.formatters.j = function(v) {
509
- return JSON.stringify(v);
259
+ try {
260
+ return JSON.stringify(v);
261
+ } catch (err) {
262
+ return '[UnexpectedJSONParseError]: ' + err.message;
263
+ }
510
264
  };
511
265
 
512
266
 
@@ -593,9 +347,13 @@ function save(namespaces) {
593
347
  function load() {
594
348
  var r;
595
349
  try {
596
- r = exports.storage.debug;
350
+ return exports.storage.debug;
597
351
  } catch(e) {}
598
- return r;
352
+
353
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
354
+ if (typeof process !== 'undefined' && 'env' in process) {
355
+ return process.env.DEBUG;
356
+ }
599
357
  }
600
358
 
601
359
  /**
@@ -621,7 +379,8 @@ function localstorage(){
621
379
  } catch (e) {}
622
380
  }
623
381
 
624
- },{"4":4}],4:[function(require,module,exports){
382
+ }).call(this,require(12))
383
+ },{"12":12,"2":2}],2:[function(require,module,exports){
625
384
 
626
385
  /**
627
386
  * This is the common logic for both the Node.js and web browser
@@ -630,12 +389,12 @@ function localstorage(){
630
389
  * Expose `debug()` as the module.
631
390
  */
632
391
 
633
- exports = module.exports = debug;
392
+ exports = module.exports = debug.debug = debug;
634
393
  exports.coerce = coerce;
635
394
  exports.disable = disable;
636
395
  exports.enable = enable;
637
396
  exports.enabled = enabled;
638
- exports.humanize = require(1);
397
+ exports.humanize = require(9);
639
398
 
640
399
  /**
641
400
  * The currently active debug mode names, and names to skip.
@@ -707,7 +466,10 @@ function debug(namespace) {
707
466
  if (null == self.useColors) self.useColors = exports.useColors();
708
467
  if (null == self.color && self.useColors) self.color = selectColor();
709
468
 
710
- var args = Array.prototype.slice.call(arguments);
469
+ var args = new Array(arguments.length);
470
+ for (var i = 0; i < args.length; i++) {
471
+ args[i] = arguments[i];
472
+ }
711
473
 
712
474
  args[0] = exports.coerce(args[0]);
713
475
 
@@ -734,9 +496,9 @@ function debug(namespace) {
734
496
  return match;
735
497
  });
736
498
 
737
- if ('function' === typeof exports.formatArgs) {
738
- args = exports.formatArgs.apply(self, args);
739
- }
499
+ // apply env-specific formatting
500
+ args = exports.formatArgs.apply(self, args);
501
+
740
502
  var logFn = enabled.log || exports.log || console.log.bind(console);
741
503
  logFn.apply(self, args);
742
504
  }
@@ -765,7 +527,7 @@ function enable(namespaces) {
765
527
 
766
528
  for (var i = 0; i < len; i++) {
767
529
  if (!split[i]) continue; // ignore empty strings
768
- namespaces = split[i].replace(/\*/g, '.*?');
530
+ namespaces = split[i].replace(/[\\^$+?.()|[\]{}]/g, '\\$&').replace(/\*/g, '.*?');
769
531
  if (namespaces[0] === '-') {
770
532
  exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
771
533
  } else {
@@ -820,970 +582,1167 @@ function coerce(val) {
820
582
  return val;
821
583
  }
822
584
 
823
- },{"1":1}],5:[function(require,module,exports){
585
+ },{"9":9}],3:[function(require,module,exports){
824
586
  (function (process,global){
825
587
  /*!
826
588
  * @overview es6-promise - a tiny implementation of Promises/A+.
827
589
  * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
828
590
  * @license Licensed under MIT license
829
- * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
830
- * @version 3.2.1
591
+ * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
592
+ * @version 4.0.5
831
593
  */
832
594
 
833
- (function() {
834
- "use strict";
835
- function lib$es6$promise$utils$$objectOrFunction(x) {
836
- return typeof x === 'function' || (typeof x === 'object' && x !== null);
837
- }
595
+ (function (global, factory) {
596
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
597
+ typeof define === 'function' && define.amd ? define(factory) :
598
+ (global.ES6Promise = factory());
599
+ }(this, (function () { 'use strict';
838
600
 
839
- function lib$es6$promise$utils$$isFunction(x) {
840
- return typeof x === 'function';
841
- }
601
+ function objectOrFunction(x) {
602
+ return typeof x === 'function' || typeof x === 'object' && x !== null;
603
+ }
842
604
 
843
- function lib$es6$promise$utils$$isMaybeThenable(x) {
844
- return typeof x === 'object' && x !== null;
845
- }
605
+ function isFunction(x) {
606
+ return typeof x === 'function';
607
+ }
846
608
 
847
- var lib$es6$promise$utils$$_isArray;
848
- if (!Array.isArray) {
849
- lib$es6$promise$utils$$_isArray = function (x) {
850
- return Object.prototype.toString.call(x) === '[object Array]';
851
- };
609
+ var _isArray = undefined;
610
+ if (!Array.isArray) {
611
+ _isArray = function (x) {
612
+ return Object.prototype.toString.call(x) === '[object Array]';
613
+ };
614
+ } else {
615
+ _isArray = Array.isArray;
616
+ }
617
+
618
+ var isArray = _isArray;
619
+
620
+ var len = 0;
621
+ var vertxNext = undefined;
622
+ var customSchedulerFn = undefined;
623
+
624
+ var asap = function asap(callback, arg) {
625
+ queue[len] = callback;
626
+ queue[len + 1] = arg;
627
+ len += 2;
628
+ if (len === 2) {
629
+ // If len is 2, that means that we need to schedule an async flush.
630
+ // If additional callbacks are queued before the queue is flushed, they
631
+ // will be processed by this flush that we are scheduling.
632
+ if (customSchedulerFn) {
633
+ customSchedulerFn(flush);
852
634
  } else {
853
- lib$es6$promise$utils$$_isArray = Array.isArray;
635
+ scheduleFlush();
854
636
  }
637
+ }
638
+ };
855
639
 
856
- var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;
857
- var lib$es6$promise$asap$$len = 0;
858
- var lib$es6$promise$asap$$vertxNext;
859
- var lib$es6$promise$asap$$customSchedulerFn;
860
-
861
- var lib$es6$promise$asap$$asap = function asap(callback, arg) {
862
- lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;
863
- lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;
864
- lib$es6$promise$asap$$len += 2;
865
- if (lib$es6$promise$asap$$len === 2) {
866
- // If len is 2, that means that we need to schedule an async flush.
867
- // If additional callbacks are queued before the queue is flushed, they
868
- // will be processed by this flush that we are scheduling.
869
- if (lib$es6$promise$asap$$customSchedulerFn) {
870
- lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);
871
- } else {
872
- lib$es6$promise$asap$$scheduleFlush();
873
- }
874
- }
875
- }
640
+ function setScheduler(scheduleFn) {
641
+ customSchedulerFn = scheduleFn;
642
+ }
876
643
 
877
- function lib$es6$promise$asap$$setScheduler(scheduleFn) {
878
- lib$es6$promise$asap$$customSchedulerFn = scheduleFn;
879
- }
644
+ function setAsap(asapFn) {
645
+ asap = asapFn;
646
+ }
880
647
 
881
- function lib$es6$promise$asap$$setAsap(asapFn) {
882
- lib$es6$promise$asap$$asap = asapFn;
883
- }
648
+ var browserWindow = typeof window !== 'undefined' ? window : undefined;
649
+ var browserGlobal = browserWindow || {};
650
+ var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
651
+ var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';
884
652
 
885
- var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;
886
- var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};
887
- var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;
888
- var lib$es6$promise$asap$$isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
889
-
890
- // test for web worker but not in IE10
891
- var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&
892
- typeof importScripts !== 'undefined' &&
893
- typeof MessageChannel !== 'undefined';
894
-
895
- // node
896
- function lib$es6$promise$asap$$useNextTick() {
897
- // node version 0.10.x displays a deprecation warning when nextTick is used recursively
898
- // see https://github.com/cujojs/when/issues/410 for details
899
- return function() {
900
- process.nextTick(lib$es6$promise$asap$$flush);
901
- };
902
- }
653
+ // test for web worker but not in IE10
654
+ var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
903
655
 
904
- // vertx
905
- function lib$es6$promise$asap$$useVertxTimer() {
906
- return function() {
907
- lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);
908
- };
909
- }
656
+ // node
657
+ function useNextTick() {
658
+ // node version 0.10.x displays a deprecation warning when nextTick is used recursively
659
+ // see https://github.com/cujojs/when/issues/410 for details
660
+ return function () {
661
+ return process.nextTick(flush);
662
+ };
663
+ }
910
664
 
911
- function lib$es6$promise$asap$$useMutationObserver() {
912
- var iterations = 0;
913
- var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);
914
- var node = document.createTextNode('');
915
- observer.observe(node, { characterData: true });
665
+ // vertx
666
+ function useVertxTimer() {
667
+ if (typeof vertxNext !== 'undefined') {
668
+ return function () {
669
+ vertxNext(flush);
670
+ };
671
+ }
916
672
 
917
- return function() {
918
- node.data = (iterations = ++iterations % 2);
919
- };
920
- }
673
+ return useSetTimeout();
674
+ }
921
675
 
922
- // web worker
923
- function lib$es6$promise$asap$$useMessageChannel() {
924
- var channel = new MessageChannel();
925
- channel.port1.onmessage = lib$es6$promise$asap$$flush;
926
- return function () {
927
- channel.port2.postMessage(0);
928
- };
929
- }
676
+ function useMutationObserver() {
677
+ var iterations = 0;
678
+ var observer = new BrowserMutationObserver(flush);
679
+ var node = document.createTextNode('');
680
+ observer.observe(node, { characterData: true });
930
681
 
931
- function lib$es6$promise$asap$$useSetTimeout() {
932
- return function() {
933
- setTimeout(lib$es6$promise$asap$$flush, 1);
934
- };
935
- }
682
+ return function () {
683
+ node.data = iterations = ++iterations % 2;
684
+ };
685
+ }
936
686
 
937
- var lib$es6$promise$asap$$queue = new Array(1000);
938
- function lib$es6$promise$asap$$flush() {
939
- for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {
940
- var callback = lib$es6$promise$asap$$queue[i];
941
- var arg = lib$es6$promise$asap$$queue[i+1];
687
+ // web worker
688
+ function useMessageChannel() {
689
+ var channel = new MessageChannel();
690
+ channel.port1.onmessage = flush;
691
+ return function () {
692
+ return channel.port2.postMessage(0);
693
+ };
694
+ }
942
695
 
943
- callback(arg);
696
+ function useSetTimeout() {
697
+ // Store setTimeout reference so es6-promise will be unaffected by
698
+ // other code modifying setTimeout (like sinon.useFakeTimers())
699
+ var globalSetTimeout = setTimeout;
700
+ return function () {
701
+ return globalSetTimeout(flush, 1);
702
+ };
703
+ }
944
704
 
945
- lib$es6$promise$asap$$queue[i] = undefined;
946
- lib$es6$promise$asap$$queue[i+1] = undefined;
947
- }
705
+ var queue = new Array(1000);
706
+ function flush() {
707
+ for (var i = 0; i < len; i += 2) {
708
+ var callback = queue[i];
709
+ var arg = queue[i + 1];
948
710
 
949
- lib$es6$promise$asap$$len = 0;
950
- }
711
+ callback(arg);
951
712
 
952
- function lib$es6$promise$asap$$attemptVertx() {
953
- try {
954
- var r = require;
955
- var vertx = r('vertx');
956
- lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;
957
- return lib$es6$promise$asap$$useVertxTimer();
958
- } catch(e) {
959
- return lib$es6$promise$asap$$useSetTimeout();
960
- }
961
- }
713
+ queue[i] = undefined;
714
+ queue[i + 1] = undefined;
715
+ }
962
716
 
963
- var lib$es6$promise$asap$$scheduleFlush;
964
- // Decide what async method to use to triggering processing of queued callbacks:
965
- if (lib$es6$promise$asap$$isNode) {
966
- lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();
967
- } else if (lib$es6$promise$asap$$BrowserMutationObserver) {
968
- lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();
969
- } else if (lib$es6$promise$asap$$isWorker) {
970
- lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();
971
- } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {
972
- lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx();
973
- } else {
974
- lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();
975
- }
976
- function lib$es6$promise$then$$then(onFulfillment, onRejection) {
977
- var parent = this;
717
+ len = 0;
718
+ }
978
719
 
979
- var child = new this.constructor(lib$es6$promise$$internal$$noop);
720
+ function attemptVertx() {
721
+ try {
722
+ var r = require;
723
+ var vertx = r('vertx');
724
+ vertxNext = vertx.runOnLoop || vertx.runOnContext;
725
+ return useVertxTimer();
726
+ } catch (e) {
727
+ return useSetTimeout();
728
+ }
729
+ }
980
730
 
981
- if (child[lib$es6$promise$$internal$$PROMISE_ID] === undefined) {
982
- lib$es6$promise$$internal$$makePromise(child);
983
- }
731
+ var scheduleFlush = undefined;
732
+ // Decide what async method to use to triggering processing of queued callbacks:
733
+ if (isNode) {
734
+ scheduleFlush = useNextTick();
735
+ } else if (BrowserMutationObserver) {
736
+ scheduleFlush = useMutationObserver();
737
+ } else if (isWorker) {
738
+ scheduleFlush = useMessageChannel();
739
+ } else if (browserWindow === undefined && typeof require === 'function') {
740
+ scheduleFlush = attemptVertx();
741
+ } else {
742
+ scheduleFlush = useSetTimeout();
743
+ }
984
744
 
985
- var state = parent._state;
745
+ function then(onFulfillment, onRejection) {
746
+ var _arguments = arguments;
986
747
 
987
- if (state) {
988
- var callback = arguments[state - 1];
989
- lib$es6$promise$asap$$asap(function(){
990
- lib$es6$promise$$internal$$invokeCallback(state, child, callback, parent._result);
991
- });
992
- } else {
993
- lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);
994
- }
748
+ var parent = this;
995
749
 
996
- return child;
997
- }
998
- var lib$es6$promise$then$$default = lib$es6$promise$then$$then;
999
- function lib$es6$promise$promise$resolve$$resolve(object) {
1000
- /*jshint validthis:true */
1001
- var Constructor = this;
750
+ var child = new this.constructor(noop);
1002
751
 
1003
- if (object && typeof object === 'object' && object.constructor === Constructor) {
1004
- return object;
1005
- }
752
+ if (child[PROMISE_ID] === undefined) {
753
+ makePromise(child);
754
+ }
1006
755
 
1007
- var promise = new Constructor(lib$es6$promise$$internal$$noop);
1008
- lib$es6$promise$$internal$$resolve(promise, object);
1009
- return promise;
1010
- }
1011
- var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;
1012
- var lib$es6$promise$$internal$$PROMISE_ID = Math.random().toString(36).substring(16);
756
+ var _state = parent._state;
1013
757
 
1014
- function lib$es6$promise$$internal$$noop() {}
758
+ if (_state) {
759
+ (function () {
760
+ var callback = _arguments[_state - 1];
761
+ asap(function () {
762
+ return invokeCallback(_state, child, callback, parent._result);
763
+ });
764
+ })();
765
+ } else {
766
+ subscribe(parent, child, onFulfillment, onRejection);
767
+ }
1015
768
 
1016
- var lib$es6$promise$$internal$$PENDING = void 0;
1017
- var lib$es6$promise$$internal$$FULFILLED = 1;
1018
- var lib$es6$promise$$internal$$REJECTED = 2;
769
+ return child;
770
+ }
1019
771
 
1020
- var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();
772
+ /**
773
+ `Promise.resolve` returns a promise that will become resolved with the
774
+ passed `value`. It is shorthand for the following:
1021
775
 
1022
- function lib$es6$promise$$internal$$selfFulfillment() {
1023
- return new TypeError("You cannot resolve a promise with itself");
1024
- }
776
+ ```javascript
777
+ let promise = new Promise(function(resolve, reject){
778
+ resolve(1);
779
+ });
1025
780
 
1026
- function lib$es6$promise$$internal$$cannotReturnOwn() {
1027
- return new TypeError('A promises callback cannot return that same promise.');
1028
- }
781
+ promise.then(function(value){
782
+ // value === 1
783
+ });
784
+ ```
1029
785
 
1030
- function lib$es6$promise$$internal$$getThen(promise) {
1031
- try {
1032
- return promise.then;
1033
- } catch(error) {
1034
- lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;
1035
- return lib$es6$promise$$internal$$GET_THEN_ERROR;
1036
- }
1037
- }
786
+ Instead of writing the above, your code now simply becomes the following:
1038
787
 
1039
- function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {
1040
- try {
1041
- then.call(value, fulfillmentHandler, rejectionHandler);
1042
- } catch(e) {
1043
- return e;
1044
- }
1045
- }
788
+ ```javascript
789
+ let promise = Promise.resolve(1);
1046
790
 
1047
- function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {
1048
- lib$es6$promise$asap$$asap(function(promise) {
1049
- var sealed = false;
1050
- var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {
1051
- if (sealed) { return; }
1052
- sealed = true;
1053
- if (thenable !== value) {
1054
- lib$es6$promise$$internal$$resolve(promise, value);
1055
- } else {
1056
- lib$es6$promise$$internal$$fulfill(promise, value);
1057
- }
1058
- }, function(reason) {
1059
- if (sealed) { return; }
1060
- sealed = true;
791
+ promise.then(function(value){
792
+ // value === 1
793
+ });
794
+ ```
795
+
796
+ @method resolve
797
+ @static
798
+ @param {Any} value value that the returned promise will be resolved with
799
+ Useful for tooling.
800
+ @return {Promise} a promise that will become fulfilled with the given
801
+ `value`
802
+ */
803
+ function resolve(object) {
804
+ /*jshint validthis:true */
805
+ var Constructor = this;
1061
806
 
1062
- lib$es6$promise$$internal$$reject(promise, reason);
1063
- }, 'Settle: ' + (promise._label || ' unknown promise'));
807
+ if (object && typeof object === 'object' && object.constructor === Constructor) {
808
+ return object;
809
+ }
1064
810
 
1065
- if (!sealed && error) {
1066
- sealed = true;
1067
- lib$es6$promise$$internal$$reject(promise, error);
1068
- }
1069
- }, promise);
1070
- }
811
+ var promise = new Constructor(noop);
812
+ _resolve(promise, object);
813
+ return promise;
814
+ }
1071
815
 
1072
- function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {
1073
- if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {
1074
- lib$es6$promise$$internal$$fulfill(promise, thenable._result);
1075
- } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {
1076
- lib$es6$promise$$internal$$reject(promise, thenable._result);
1077
- } else {
1078
- lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {
1079
- lib$es6$promise$$internal$$resolve(promise, value);
1080
- }, function(reason) {
1081
- lib$es6$promise$$internal$$reject(promise, reason);
1082
- });
1083
- }
1084
- }
816
+ var PROMISE_ID = Math.random().toString(36).substring(16);
1085
817
 
1086
- function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable, then) {
1087
- if (maybeThenable.constructor === promise.constructor &&
1088
- then === lib$es6$promise$then$$default &&
1089
- constructor.resolve === lib$es6$promise$promise$resolve$$default) {
1090
- lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);
1091
- } else {
1092
- if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {
1093
- lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);
1094
- } else if (then === undefined) {
1095
- lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
1096
- } else if (lib$es6$promise$utils$$isFunction(then)) {
1097
- lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);
1098
- } else {
1099
- lib$es6$promise$$internal$$fulfill(promise, maybeThenable);
1100
- }
1101
- }
1102
- }
818
+ function noop() {}
1103
819
 
1104
- function lib$es6$promise$$internal$$resolve(promise, value) {
1105
- if (promise === value) {
1106
- lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment());
1107
- } else if (lib$es6$promise$utils$$objectOrFunction(value)) {
1108
- lib$es6$promise$$internal$$handleMaybeThenable(promise, value, lib$es6$promise$$internal$$getThen(value));
1109
- } else {
1110
- lib$es6$promise$$internal$$fulfill(promise, value);
1111
- }
1112
- }
820
+ var PENDING = void 0;
821
+ var FULFILLED = 1;
822
+ var REJECTED = 2;
1113
823
 
1114
- function lib$es6$promise$$internal$$publishRejection(promise) {
1115
- if (promise._onerror) {
1116
- promise._onerror(promise._result);
1117
- }
824
+ var GET_THEN_ERROR = new ErrorObject();
1118
825
 
1119
- lib$es6$promise$$internal$$publish(promise);
1120
- }
826
+ function selfFulfillment() {
827
+ return new TypeError("You cannot resolve a promise with itself");
828
+ }
829
+
830
+ function cannotReturnOwn() {
831
+ return new TypeError('A promises callback cannot return that same promise.');
832
+ }
1121
833
 
1122
- function lib$es6$promise$$internal$$fulfill(promise, value) {
1123
- if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }
834
+ function getThen(promise) {
835
+ try {
836
+ return promise.then;
837
+ } catch (error) {
838
+ GET_THEN_ERROR.error = error;
839
+ return GET_THEN_ERROR;
840
+ }
841
+ }
1124
842
 
1125
- promise._result = value;
1126
- promise._state = lib$es6$promise$$internal$$FULFILLED;
843
+ function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
844
+ try {
845
+ then.call(value, fulfillmentHandler, rejectionHandler);
846
+ } catch (e) {
847
+ return e;
848
+ }
849
+ }
1127
850
 
1128
- if (promise._subscribers.length !== 0) {
1129
- lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise);
851
+ function handleForeignThenable(promise, thenable, then) {
852
+ asap(function (promise) {
853
+ var sealed = false;
854
+ var error = tryThen(then, thenable, function (value) {
855
+ if (sealed) {
856
+ return;
1130
857
  }
1131
- }
858
+ sealed = true;
859
+ if (thenable !== value) {
860
+ _resolve(promise, value);
861
+ } else {
862
+ fulfill(promise, value);
863
+ }
864
+ }, function (reason) {
865
+ if (sealed) {
866
+ return;
867
+ }
868
+ sealed = true;
1132
869
 
1133
- function lib$es6$promise$$internal$$reject(promise, reason) {
1134
- if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }
1135
- promise._state = lib$es6$promise$$internal$$REJECTED;
1136
- promise._result = reason;
870
+ _reject(promise, reason);
871
+ }, 'Settle: ' + (promise._label || ' unknown promise'));
1137
872
 
1138
- lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise);
873
+ if (!sealed && error) {
874
+ sealed = true;
875
+ _reject(promise, error);
1139
876
  }
877
+ }, promise);
878
+ }
1140
879
 
1141
- function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) {
1142
- var subscribers = parent._subscribers;
1143
- var length = subscribers.length;
880
+ function handleOwnThenable(promise, thenable) {
881
+ if (thenable._state === FULFILLED) {
882
+ fulfill(promise, thenable._result);
883
+ } else if (thenable._state === REJECTED) {
884
+ _reject(promise, thenable._result);
885
+ } else {
886
+ subscribe(thenable, undefined, function (value) {
887
+ return _resolve(promise, value);
888
+ }, function (reason) {
889
+ return _reject(promise, reason);
890
+ });
891
+ }
892
+ }
1144
893
 
1145
- parent._onerror = null;
894
+ function handleMaybeThenable(promise, maybeThenable, then$$) {
895
+ if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) {
896
+ handleOwnThenable(promise, maybeThenable);
897
+ } else {
898
+ if (then$$ === GET_THEN_ERROR) {
899
+ _reject(promise, GET_THEN_ERROR.error);
900
+ } else if (then$$ === undefined) {
901
+ fulfill(promise, maybeThenable);
902
+ } else if (isFunction(then$$)) {
903
+ handleForeignThenable(promise, maybeThenable, then$$);
904
+ } else {
905
+ fulfill(promise, maybeThenable);
906
+ }
907
+ }
908
+ }
1146
909
 
1147
- subscribers[length] = child;
1148
- subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment;
1149
- subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;
910
+ function _resolve(promise, value) {
911
+ if (promise === value) {
912
+ _reject(promise, selfFulfillment());
913
+ } else if (objectOrFunction(value)) {
914
+ handleMaybeThenable(promise, value, getThen(value));
915
+ } else {
916
+ fulfill(promise, value);
917
+ }
918
+ }
1150
919
 
1151
- if (length === 0 && parent._state) {
1152
- lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent);
1153
- }
1154
- }
920
+ function publishRejection(promise) {
921
+ if (promise._onerror) {
922
+ promise._onerror(promise._result);
923
+ }
1155
924
 
1156
- function lib$es6$promise$$internal$$publish(promise) {
1157
- var subscribers = promise._subscribers;
1158
- var settled = promise._state;
925
+ publish(promise);
926
+ }
1159
927
 
1160
- if (subscribers.length === 0) { return; }
928
+ function fulfill(promise, value) {
929
+ if (promise._state !== PENDING) {
930
+ return;
931
+ }
1161
932
 
1162
- var child, callback, detail = promise._result;
933
+ promise._result = value;
934
+ promise._state = FULFILLED;
1163
935
 
1164
- for (var i = 0; i < subscribers.length; i += 3) {
1165
- child = subscribers[i];
1166
- callback = subscribers[i + settled];
936
+ if (promise._subscribers.length !== 0) {
937
+ asap(publish, promise);
938
+ }
939
+ }
1167
940
 
1168
- if (child) {
1169
- lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);
1170
- } else {
1171
- callback(detail);
1172
- }
1173
- }
941
+ function _reject(promise, reason) {
942
+ if (promise._state !== PENDING) {
943
+ return;
944
+ }
945
+ promise._state = REJECTED;
946
+ promise._result = reason;
1174
947
 
1175
- promise._subscribers.length = 0;
1176
- }
948
+ asap(publishRejection, promise);
949
+ }
1177
950
 
1178
- function lib$es6$promise$$internal$$ErrorObject() {
1179
- this.error = null;
1180
- }
951
+ function subscribe(parent, child, onFulfillment, onRejection) {
952
+ var _subscribers = parent._subscribers;
953
+ var length = _subscribers.length;
1181
954
 
1182
- var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();
955
+ parent._onerror = null;
1183
956
 
1184
- function lib$es6$promise$$internal$$tryCatch(callback, detail) {
1185
- try {
1186
- return callback(detail);
1187
- } catch(e) {
1188
- lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;
1189
- return lib$es6$promise$$internal$$TRY_CATCH_ERROR;
1190
- }
1191
- }
957
+ _subscribers[length] = child;
958
+ _subscribers[length + FULFILLED] = onFulfillment;
959
+ _subscribers[length + REJECTED] = onRejection;
1192
960
 
1193
- function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {
1194
- var hasCallback = lib$es6$promise$utils$$isFunction(callback),
1195
- value, error, succeeded, failed;
961
+ if (length === 0 && parent._state) {
962
+ asap(publish, parent);
963
+ }
964
+ }
1196
965
 
1197
- if (hasCallback) {
1198
- value = lib$es6$promise$$internal$$tryCatch(callback, detail);
966
+ function publish(promise) {
967
+ var subscribers = promise._subscribers;
968
+ var settled = promise._state;
1199
969
 
1200
- if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) {
1201
- failed = true;
1202
- error = value.error;
1203
- value = null;
1204
- } else {
1205
- succeeded = true;
1206
- }
970
+ if (subscribers.length === 0) {
971
+ return;
972
+ }
1207
973
 
1208
- if (promise === value) {
1209
- lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());
1210
- return;
1211
- }
974
+ var child = undefined,
975
+ callback = undefined,
976
+ detail = promise._result;
1212
977
 
1213
- } else {
1214
- value = detail;
1215
- succeeded = true;
1216
- }
978
+ for (var i = 0; i < subscribers.length; i += 3) {
979
+ child = subscribers[i];
980
+ callback = subscribers[i + settled];
1217
981
 
1218
- if (promise._state !== lib$es6$promise$$internal$$PENDING) {
1219
- // noop
1220
- } else if (hasCallback && succeeded) {
1221
- lib$es6$promise$$internal$$resolve(promise, value);
1222
- } else if (failed) {
1223
- lib$es6$promise$$internal$$reject(promise, error);
1224
- } else if (settled === lib$es6$promise$$internal$$FULFILLED) {
1225
- lib$es6$promise$$internal$$fulfill(promise, value);
1226
- } else if (settled === lib$es6$promise$$internal$$REJECTED) {
1227
- lib$es6$promise$$internal$$reject(promise, value);
1228
- }
982
+ if (child) {
983
+ invokeCallback(settled, child, callback, detail);
984
+ } else {
985
+ callback(detail);
1229
986
  }
987
+ }
1230
988
 
1231
- function lib$es6$promise$$internal$$initializePromise(promise, resolver) {
1232
- try {
1233
- resolver(function resolvePromise(value){
1234
- lib$es6$promise$$internal$$resolve(promise, value);
1235
- }, function rejectPromise(reason) {
1236
- lib$es6$promise$$internal$$reject(promise, reason);
1237
- });
1238
- } catch(e) {
1239
- lib$es6$promise$$internal$$reject(promise, e);
1240
- }
1241
- }
989
+ promise._subscribers.length = 0;
990
+ }
1242
991
 
1243
- var lib$es6$promise$$internal$$id = 0;
1244
- function lib$es6$promise$$internal$$nextId() {
1245
- return lib$es6$promise$$internal$$id++;
1246
- }
992
+ function ErrorObject() {
993
+ this.error = null;
994
+ }
1247
995
 
1248
- function lib$es6$promise$$internal$$makePromise(promise) {
1249
- promise[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$id++;
1250
- promise._state = undefined;
1251
- promise._result = undefined;
1252
- promise._subscribers = [];
1253
- }
996
+ var TRY_CATCH_ERROR = new ErrorObject();
1254
997
 
1255
- function lib$es6$promise$promise$all$$all(entries) {
1256
- return new lib$es6$promise$enumerator$$default(this, entries).promise;
1257
- }
1258
- var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;
1259
- function lib$es6$promise$promise$race$$race(entries) {
1260
- /*jshint validthis:true */
1261
- var Constructor = this;
1262
-
1263
- if (!lib$es6$promise$utils$$isArray(entries)) {
1264
- return new Constructor(function(resolve, reject) {
1265
- reject(new TypeError('You must pass an array to race.'));
1266
- });
1267
- } else {
1268
- return new Constructor(function(resolve, reject) {
1269
- var length = entries.length;
1270
- for (var i = 0; i < length; i++) {
1271
- Constructor.resolve(entries[i]).then(resolve, reject);
1272
- }
1273
- });
1274
- }
1275
- }
1276
- var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;
1277
- function lib$es6$promise$promise$reject$$reject(reason) {
1278
- /*jshint validthis:true */
1279
- var Constructor = this;
1280
- var promise = new Constructor(lib$es6$promise$$internal$$noop);
1281
- lib$es6$promise$$internal$$reject(promise, reason);
1282
- return promise;
1283
- }
1284
- var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;
998
+ function tryCatch(callback, detail) {
999
+ try {
1000
+ return callback(detail);
1001
+ } catch (e) {
1002
+ TRY_CATCH_ERROR.error = e;
1003
+ return TRY_CATCH_ERROR;
1004
+ }
1005
+ }
1285
1006
 
1007
+ function invokeCallback(settled, promise, callback, detail) {
1008
+ var hasCallback = isFunction(callback),
1009
+ value = undefined,
1010
+ error = undefined,
1011
+ succeeded = undefined,
1012
+ failed = undefined;
1286
1013
 
1287
- function lib$es6$promise$promise$$needsResolver() {
1288
- throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
1014
+ if (hasCallback) {
1015
+ value = tryCatch(callback, detail);
1016
+
1017
+ if (value === TRY_CATCH_ERROR) {
1018
+ failed = true;
1019
+ error = value.error;
1020
+ value = null;
1021
+ } else {
1022
+ succeeded = true;
1289
1023
  }
1290
1024
 
1291
- function lib$es6$promise$promise$$needsNew() {
1292
- throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
1025
+ if (promise === value) {
1026
+ _reject(promise, cannotReturnOwn());
1027
+ return;
1293
1028
  }
1029
+ } else {
1030
+ value = detail;
1031
+ succeeded = true;
1032
+ }
1294
1033
 
1295
- var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;
1296
- /**
1297
- Promise objects represent the eventual result of an asynchronous operation. The
1298
- primary way of interacting with a promise is through its `then` method, which
1299
- registers callbacks to receive either a promise's eventual value or the reason
1300
- why the promise cannot be fulfilled.
1034
+ if (promise._state !== PENDING) {
1035
+ // noop
1036
+ } else if (hasCallback && succeeded) {
1037
+ _resolve(promise, value);
1038
+ } else if (failed) {
1039
+ _reject(promise, error);
1040
+ } else if (settled === FULFILLED) {
1041
+ fulfill(promise, value);
1042
+ } else if (settled === REJECTED) {
1043
+ _reject(promise, value);
1044
+ }
1045
+ }
1301
1046
 
1302
- Terminology
1303
- -----------
1047
+ function initializePromise(promise, resolver) {
1048
+ try {
1049
+ resolver(function resolvePromise(value) {
1050
+ _resolve(promise, value);
1051
+ }, function rejectPromise(reason) {
1052
+ _reject(promise, reason);
1053
+ });
1054
+ } catch (e) {
1055
+ _reject(promise, e);
1056
+ }
1057
+ }
1304
1058
 
1305
- - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
1306
- - `thenable` is an object or function that defines a `then` method.
1307
- - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
1308
- - `exception` is a value that is thrown using the throw statement.
1309
- - `reason` is a value that indicates why a promise was rejected.
1310
- - `settled` the final resting state of a promise, fulfilled or rejected.
1059
+ var id = 0;
1060
+ function nextId() {
1061
+ return id++;
1062
+ }
1311
1063
 
1312
- A promise can be in one of three states: pending, fulfilled, or rejected.
1064
+ function makePromise(promise) {
1065
+ promise[PROMISE_ID] = id++;
1066
+ promise._state = undefined;
1067
+ promise._result = undefined;
1068
+ promise._subscribers = [];
1069
+ }
1313
1070
 
1314
- Promises that are fulfilled have a fulfillment value and are in the fulfilled
1315
- state. Promises that are rejected have a rejection reason and are in the
1316
- rejected state. A fulfillment value is never a thenable.
1071
+ function Enumerator(Constructor, input) {
1072
+ this._instanceConstructor = Constructor;
1073
+ this.promise = new Constructor(noop);
1317
1074
 
1318
- Promises can also be said to *resolve* a value. If this value is also a
1319
- promise, then the original promise's settled state will match the value's
1320
- settled state. So a promise that *resolves* a promise that rejects will
1321
- itself reject, and a promise that *resolves* a promise that fulfills will
1322
- itself fulfill.
1075
+ if (!this.promise[PROMISE_ID]) {
1076
+ makePromise(this.promise);
1077
+ }
1323
1078
 
1079
+ if (isArray(input)) {
1080
+ this._input = input;
1081
+ this.length = input.length;
1082
+ this._remaining = input.length;
1324
1083
 
1325
- Basic Usage:
1326
- ------------
1084
+ this._result = new Array(this.length);
1327
1085
 
1328
- ```js
1329
- var promise = new Promise(function(resolve, reject) {
1330
- // on success
1331
- resolve(value);
1086
+ if (this.length === 0) {
1087
+ fulfill(this.promise, this._result);
1088
+ } else {
1089
+ this.length = this.length || 0;
1090
+ this._enumerate();
1091
+ if (this._remaining === 0) {
1092
+ fulfill(this.promise, this._result);
1093
+ }
1094
+ }
1095
+ } else {
1096
+ _reject(this.promise, validationError());
1097
+ }
1098
+ }
1332
1099
 
1333
- // on failure
1334
- reject(reason);
1335
- });
1100
+ function validationError() {
1101
+ return new Error('Array Methods must be provided an Array');
1102
+ };
1336
1103
 
1337
- promise.then(function(value) {
1338
- // on fulfillment
1339
- }, function(reason) {
1340
- // on rejection
1341
- });
1342
- ```
1343
-
1344
- Advanced Usage:
1345
- ---------------
1346
-
1347
- Promises shine when abstracting away asynchronous interactions such as
1348
- `XMLHttpRequest`s.
1349
-
1350
- ```js
1351
- function getJSON(url) {
1352
- return new Promise(function(resolve, reject){
1353
- var xhr = new XMLHttpRequest();
1354
-
1355
- xhr.open('GET', url);
1356
- xhr.onreadystatechange = handler;
1357
- xhr.responseType = 'json';
1358
- xhr.setRequestHeader('Accept', 'application/json');
1359
- xhr.send();
1360
-
1361
- function handler() {
1362
- if (this.readyState === this.DONE) {
1363
- if (this.status === 200) {
1364
- resolve(this.response);
1365
- } else {
1366
- reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
1367
- }
1368
- }
1369
- };
1370
- });
1371
- }
1104
+ Enumerator.prototype._enumerate = function () {
1105
+ var length = this.length;
1106
+ var _input = this._input;
1372
1107
 
1373
- getJSON('/posts.json').then(function(json) {
1374
- // on fulfillment
1375
- }, function(reason) {
1376
- // on rejection
1377
- });
1378
- ```
1108
+ for (var i = 0; this._state === PENDING && i < length; i++) {
1109
+ this._eachEntry(_input[i], i);
1110
+ }
1111
+ };
1379
1112
 
1380
- Unlike callbacks, promises are great composable primitives.
1113
+ Enumerator.prototype._eachEntry = function (entry, i) {
1114
+ var c = this._instanceConstructor;
1115
+ var resolve$$ = c.resolve;
1116
+
1117
+ if (resolve$$ === resolve) {
1118
+ var _then = getThen(entry);
1119
+
1120
+ if (_then === then && entry._state !== PENDING) {
1121
+ this._settledAt(entry._state, i, entry._result);
1122
+ } else if (typeof _then !== 'function') {
1123
+ this._remaining--;
1124
+ this._result[i] = entry;
1125
+ } else if (c === Promise) {
1126
+ var promise = new c(noop);
1127
+ handleMaybeThenable(promise, entry, _then);
1128
+ this._willSettleAt(promise, i);
1129
+ } else {
1130
+ this._willSettleAt(new c(function (resolve$$) {
1131
+ return resolve$$(entry);
1132
+ }), i);
1133
+ }
1134
+ } else {
1135
+ this._willSettleAt(resolve$$(entry), i);
1136
+ }
1137
+ };
1381
1138
 
1382
- ```js
1383
- Promise.all([
1384
- getJSON('/posts'),
1385
- getJSON('/comments')
1386
- ]).then(function(values){
1387
- values[0] // => postsJSON
1388
- values[1] // => commentsJSON
1139
+ Enumerator.prototype._settledAt = function (state, i, value) {
1140
+ var promise = this.promise;
1389
1141
 
1390
- return values;
1391
- });
1392
- ```
1393
-
1394
- @class Promise
1395
- @param {function} resolver
1396
- Useful for tooling.
1397
- @constructor
1398
- */
1399
- function lib$es6$promise$promise$$Promise(resolver) {
1400
- this[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$nextId();
1401
- this._result = this._state = undefined;
1402
- this._subscribers = [];
1403
-
1404
- if (lib$es6$promise$$internal$$noop !== resolver) {
1405
- typeof resolver !== 'function' && lib$es6$promise$promise$$needsResolver();
1406
- this instanceof lib$es6$promise$promise$$Promise ? lib$es6$promise$$internal$$initializePromise(this, resolver) : lib$es6$promise$promise$$needsNew();
1407
- }
1142
+ if (promise._state === PENDING) {
1143
+ this._remaining--;
1144
+
1145
+ if (state === REJECTED) {
1146
+ _reject(promise, value);
1147
+ } else {
1148
+ this._result[i] = value;
1408
1149
  }
1150
+ }
1409
1151
 
1410
- lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;
1411
- lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;
1412
- lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;
1413
- lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;
1414
- lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;
1415
- lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;
1416
- lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;
1417
-
1418
- lib$es6$promise$promise$$Promise.prototype = {
1419
- constructor: lib$es6$promise$promise$$Promise,
1420
-
1421
- /**
1422
- The primary way of interacting with a promise is through its `then` method,
1423
- which registers callbacks to receive either a promise's eventual value or the
1424
- reason why the promise cannot be fulfilled.
1425
-
1426
- ```js
1427
- findUser().then(function(user){
1428
- // user is available
1429
- }, function(reason){
1430
- // user is unavailable, and you are given the reason why
1431
- });
1432
- ```
1433
-
1434
- Chaining
1435
- --------
1436
-
1437
- The return value of `then` is itself a promise. This second, 'downstream'
1438
- promise is resolved with the return value of the first promise's fulfillment
1439
- or rejection handler, or rejected if the handler throws an exception.
1440
-
1441
- ```js
1442
- findUser().then(function (user) {
1443
- return user.name;
1444
- }, function (reason) {
1445
- return 'default name';
1446
- }).then(function (userName) {
1447
- // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
1448
- // will be `'default name'`
1449
- });
1152
+ if (this._remaining === 0) {
1153
+ fulfill(promise, this._result);
1154
+ }
1155
+ };
1450
1156
 
1451
- findUser().then(function (user) {
1452
- throw new Error('Found user, but still unhappy');
1453
- }, function (reason) {
1454
- throw new Error('`findUser` rejected and we're unhappy');
1455
- }).then(function (value) {
1456
- // never reached
1457
- }, function (reason) {
1458
- // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
1459
- // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
1460
- });
1461
- ```
1462
- If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
1463
-
1464
- ```js
1465
- findUser().then(function (user) {
1466
- throw new PedagogicalException('Upstream error');
1467
- }).then(function (value) {
1468
- // never reached
1469
- }).then(function (value) {
1470
- // never reached
1471
- }, function (reason) {
1472
- // The `PedgagocialException` is propagated all the way down to here
1473
- });
1474
- ```
1157
+ Enumerator.prototype._willSettleAt = function (promise, i) {
1158
+ var enumerator = this;
1475
1159
 
1476
- Assimilation
1477
- ------------
1160
+ subscribe(promise, undefined, function (value) {
1161
+ return enumerator._settledAt(FULFILLED, i, value);
1162
+ }, function (reason) {
1163
+ return enumerator._settledAt(REJECTED, i, reason);
1164
+ });
1165
+ };
1478
1166
 
1479
- Sometimes the value you want to propagate to a downstream promise can only be
1480
- retrieved asynchronously. This can be achieved by returning a promise in the
1481
- fulfillment or rejection handler. The downstream promise will then be pending
1482
- until the returned promise is settled. This is called *assimilation*.
1167
+ /**
1168
+ `Promise.all` accepts an array of promises, and returns a new promise which
1169
+ is fulfilled with an array of fulfillment values for the passed promises, or
1170
+ rejected with the reason of the first passed promise to be rejected. It casts all
1171
+ elements of the passed iterable to promises as it runs this algorithm.
1483
1172
 
1484
- ```js
1485
- findUser().then(function (user) {
1486
- return findCommentsByAuthor(user);
1487
- }).then(function (comments) {
1488
- // The user's comments are now available
1489
- });
1490
- ```
1173
+ Example:
1491
1174
 
1492
- If the assimliated promise rejects, then the downstream promise will also reject.
1175
+ ```javascript
1176
+ let promise1 = resolve(1);
1177
+ let promise2 = resolve(2);
1178
+ let promise3 = resolve(3);
1179
+ let promises = [ promise1, promise2, promise3 ];
1493
1180
 
1494
- ```js
1495
- findUser().then(function (user) {
1496
- return findCommentsByAuthor(user);
1497
- }).then(function (comments) {
1498
- // If `findCommentsByAuthor` fulfills, we'll have the value here
1499
- }, function (reason) {
1500
- // If `findCommentsByAuthor` rejects, we'll have the reason here
1501
- });
1502
- ```
1181
+ Promise.all(promises).then(function(array){
1182
+ // The array here would be [ 1, 2, 3 ];
1183
+ });
1184
+ ```
1503
1185
 
1504
- Simple Example
1505
- --------------
1186
+ If any of the `promises` given to `all` are rejected, the first promise
1187
+ that is rejected will be given as an argument to the returned promises's
1188
+ rejection handler. For example:
1506
1189
 
1507
- Synchronous Example
1190
+ Example:
1508
1191
 
1509
- ```javascript
1510
- var result;
1192
+ ```javascript
1193
+ let promise1 = resolve(1);
1194
+ let promise2 = reject(new Error("2"));
1195
+ let promise3 = reject(new Error("3"));
1196
+ let promises = [ promise1, promise2, promise3 ];
1511
1197
 
1512
- try {
1513
- result = findResult();
1514
- // success
1515
- } catch(reason) {
1516
- // failure
1517
- }
1518
- ```
1198
+ Promise.all(promises).then(function(array){
1199
+ // Code here never runs because there are rejected promises!
1200
+ }, function(error) {
1201
+ // error.message === "2"
1202
+ });
1203
+ ```
1204
+
1205
+ @method all
1206
+ @static
1207
+ @param {Array} entries array of promises
1208
+ @param {String} label optional string for labeling the promise.
1209
+ Useful for tooling.
1210
+ @return {Promise} promise that is fulfilled when all `promises` have been
1211
+ fulfilled, or rejected if any of them become rejected.
1212
+ @static
1213
+ */
1214
+ function all(entries) {
1215
+ return new Enumerator(this, entries).promise;
1216
+ }
1519
1217
 
1520
- Errback Example
1218
+ /**
1219
+ `Promise.race` returns a new promise which is settled in the same way as the
1220
+ first passed promise to settle.
1521
1221
 
1522
- ```js
1523
- findResult(function(result, err){
1524
- if (err) {
1525
- // failure
1526
- } else {
1527
- // success
1528
- }
1529
- });
1530
- ```
1222
+ Example:
1531
1223
 
1532
- Promise Example;
1224
+ ```javascript
1225
+ let promise1 = new Promise(function(resolve, reject){
1226
+ setTimeout(function(){
1227
+ resolve('promise 1');
1228
+ }, 200);
1229
+ });
1533
1230
 
1534
- ```javascript
1535
- findResult().then(function(result){
1536
- // success
1537
- }, function(reason){
1538
- // failure
1539
- });
1540
- ```
1231
+ let promise2 = new Promise(function(resolve, reject){
1232
+ setTimeout(function(){
1233
+ resolve('promise 2');
1234
+ }, 100);
1235
+ });
1541
1236
 
1542
- Advanced Example
1543
- --------------
1237
+ Promise.race([promise1, promise2]).then(function(result){
1238
+ // result === 'promise 2' because it was resolved before promise1
1239
+ // was resolved.
1240
+ });
1241
+ ```
1242
+
1243
+ `Promise.race` is deterministic in that only the state of the first
1244
+ settled promise matters. For example, even if other promises given to the
1245
+ `promises` array argument are resolved, but the first settled promise has
1246
+ become rejected before the other promises became fulfilled, the returned
1247
+ promise will become rejected:
1248
+
1249
+ ```javascript
1250
+ let promise1 = new Promise(function(resolve, reject){
1251
+ setTimeout(function(){
1252
+ resolve('promise 1');
1253
+ }, 200);
1254
+ });
1544
1255
 
1545
- Synchronous Example
1256
+ let promise2 = new Promise(function(resolve, reject){
1257
+ setTimeout(function(){
1258
+ reject(new Error('promise 2'));
1259
+ }, 100);
1260
+ });
1546
1261
 
1547
- ```javascript
1548
- var author, books;
1262
+ Promise.race([promise1, promise2]).then(function(result){
1263
+ // Code here never runs
1264
+ }, function(reason){
1265
+ // reason.message === 'promise 2' because promise 2 became rejected before
1266
+ // promise 1 became fulfilled
1267
+ });
1268
+ ```
1549
1269
 
1550
- try {
1551
- author = findAuthor();
1552
- books = findBooksByAuthor(author);
1553
- // success
1554
- } catch(reason) {
1555
- // failure
1270
+ An example real-world use case is implementing timeouts:
1271
+
1272
+ ```javascript
1273
+ Promise.race([ajax('foo.json'), timeout(5000)])
1274
+ ```
1275
+
1276
+ @method race
1277
+ @static
1278
+ @param {Array} promises array of promises to observe
1279
+ Useful for tooling.
1280
+ @return {Promise} a promise which settles in the same way as the first passed
1281
+ promise to settle.
1282
+ */
1283
+ function race(entries) {
1284
+ /*jshint validthis:true */
1285
+ var Constructor = this;
1286
+
1287
+ if (!isArray(entries)) {
1288
+ return new Constructor(function (_, reject) {
1289
+ return reject(new TypeError('You must pass an array to race.'));
1290
+ });
1291
+ } else {
1292
+ return new Constructor(function (resolve, reject) {
1293
+ var length = entries.length;
1294
+ for (var i = 0; i < length; i++) {
1295
+ Constructor.resolve(entries[i]).then(resolve, reject);
1556
1296
  }
1557
- ```
1297
+ });
1298
+ }
1299
+ }
1558
1300
 
1559
- Errback Example
1301
+ /**
1302
+ `Promise.reject` returns a promise rejected with the passed `reason`.
1303
+ It is shorthand for the following:
1560
1304
 
1561
- ```js
1305
+ ```javascript
1306
+ let promise = new Promise(function(resolve, reject){
1307
+ reject(new Error('WHOOPS'));
1308
+ });
1562
1309
 
1563
- function foundBooks(books) {
1310
+ promise.then(function(value){
1311
+ // Code here doesn't run because the promise is rejected!
1312
+ }, function(reason){
1313
+ // reason.message === 'WHOOPS'
1314
+ });
1315
+ ```
1564
1316
 
1565
- }
1317
+ Instead of writing the above, your code now simply becomes the following:
1566
1318
 
1567
- function failure(reason) {
1319
+ ```javascript
1320
+ let promise = Promise.reject(new Error('WHOOPS'));
1568
1321
 
1569
- }
1322
+ promise.then(function(value){
1323
+ // Code here doesn't run because the promise is rejected!
1324
+ }, function(reason){
1325
+ // reason.message === 'WHOOPS'
1326
+ });
1327
+ ```
1570
1328
 
1571
- findAuthor(function(author, err){
1572
- if (err) {
1573
- failure(err);
1574
- // failure
1575
- } else {
1576
- try {
1577
- findBoooksByAuthor(author, function(books, err) {
1578
- if (err) {
1579
- failure(err);
1580
- } else {
1581
- try {
1582
- foundBooks(books);
1583
- } catch(reason) {
1584
- failure(reason);
1585
- }
1586
- }
1587
- });
1588
- } catch(error) {
1589
- failure(err);
1590
- }
1591
- // success
1592
- }
1593
- });
1594
- ```
1329
+ @method reject
1330
+ @static
1331
+ @param {Any} reason value that the returned promise will be rejected with.
1332
+ Useful for tooling.
1333
+ @return {Promise} a promise rejected with the given `reason`.
1334
+ */
1335
+ function reject(reason) {
1336
+ /*jshint validthis:true */
1337
+ var Constructor = this;
1338
+ var promise = new Constructor(noop);
1339
+ _reject(promise, reason);
1340
+ return promise;
1341
+ }
1595
1342
 
1596
- Promise Example;
1343
+ function needsResolver() {
1344
+ throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
1345
+ }
1597
1346
 
1598
- ```javascript
1599
- findAuthor().
1600
- then(findBooksByAuthor).
1601
- then(function(books){
1602
- // found books
1603
- }).catch(function(reason){
1604
- // something went wrong
1605
- });
1606
- ```
1607
-
1608
- @method then
1609
- @param {Function} onFulfilled
1610
- @param {Function} onRejected
1611
- Useful for tooling.
1612
- @return {Promise}
1613
- */
1614
- then: lib$es6$promise$then$$default,
1615
-
1616
- /**
1617
- `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
1618
- as the catch block of a try/catch statement.
1619
-
1620
- ```js
1621
- function findAuthor(){
1622
- throw new Error('couldn't find that author');
1623
- }
1347
+ function needsNew() {
1348
+ throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
1349
+ }
1624
1350
 
1625
- // synchronous
1626
- try {
1627
- findAuthor();
1628
- } catch(reason) {
1629
- // something went wrong
1630
- }
1351
+ /**
1352
+ Promise objects represent the eventual result of an asynchronous operation. The
1353
+ primary way of interacting with a promise is through its `then` method, which
1354
+ registers callbacks to receive either a promise's eventual value or the reason
1355
+ why the promise cannot be fulfilled.
1631
1356
 
1632
- // async with promises
1633
- findAuthor().catch(function(reason){
1634
- // something went wrong
1635
- });
1636
- ```
1637
-
1638
- @method catch
1639
- @param {Function} onRejection
1640
- Useful for tooling.
1641
- @return {Promise}
1642
- */
1643
- 'catch': function(onRejection) {
1644
- return this.then(null, onRejection);
1645
- }
1646
- };
1647
- var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;
1648
- function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {
1649
- this._instanceConstructor = Constructor;
1650
- this.promise = new Constructor(lib$es6$promise$$internal$$noop);
1357
+ Terminology
1358
+ -----------
1651
1359
 
1652
- if (!this.promise[lib$es6$promise$$internal$$PROMISE_ID]) {
1653
- lib$es6$promise$$internal$$makePromise(this.promise);
1654
- }
1360
+ - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
1361
+ - `thenable` is an object or function that defines a `then` method.
1362
+ - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
1363
+ - `exception` is a value that is thrown using the throw statement.
1364
+ - `reason` is a value that indicates why a promise was rejected.
1365
+ - `settled` the final resting state of a promise, fulfilled or rejected.
1655
1366
 
1656
- if (lib$es6$promise$utils$$isArray(input)) {
1657
- this._input = input;
1658
- this.length = input.length;
1659
- this._remaining = input.length;
1367
+ A promise can be in one of three states: pending, fulfilled, or rejected.
1660
1368
 
1661
- this._result = new Array(this.length);
1369
+ Promises that are fulfilled have a fulfillment value and are in the fulfilled
1370
+ state. Promises that are rejected have a rejection reason and are in the
1371
+ rejected state. A fulfillment value is never a thenable.
1662
1372
 
1663
- if (this.length === 0) {
1664
- lib$es6$promise$$internal$$fulfill(this.promise, this._result);
1665
- } else {
1666
- this.length = this.length || 0;
1667
- this._enumerate();
1668
- if (this._remaining === 0) {
1669
- lib$es6$promise$$internal$$fulfill(this.promise, this._result);
1670
- }
1671
- }
1672
- } else {
1673
- lib$es6$promise$$internal$$reject(this.promise, lib$es6$promise$enumerator$$validationError());
1674
- }
1675
- }
1373
+ Promises can also be said to *resolve* a value. If this value is also a
1374
+ promise, then the original promise's settled state will match the value's
1375
+ settled state. So a promise that *resolves* a promise that rejects will
1376
+ itself reject, and a promise that *resolves* a promise that fulfills will
1377
+ itself fulfill.
1676
1378
 
1677
- function lib$es6$promise$enumerator$$validationError() {
1678
- return new Error('Array Methods must be provided an Array');
1679
- }
1680
1379
 
1681
- lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {
1682
- var length = this.length;
1683
- var input = this._input;
1380
+ Basic Usage:
1381
+ ------------
1684
1382
 
1685
- for (var i = 0; this._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {
1686
- this._eachEntry(input[i], i);
1687
- }
1688
- };
1383
+ ```js
1384
+ let promise = new Promise(function(resolve, reject) {
1385
+ // on success
1386
+ resolve(value);
1689
1387
 
1690
- lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {
1691
- var c = this._instanceConstructor;
1692
- var resolve = c.resolve;
1693
-
1694
- if (resolve === lib$es6$promise$promise$resolve$$default) {
1695
- var then = lib$es6$promise$$internal$$getThen(entry);
1696
-
1697
- if (then === lib$es6$promise$then$$default &&
1698
- entry._state !== lib$es6$promise$$internal$$PENDING) {
1699
- this._settledAt(entry._state, i, entry._result);
1700
- } else if (typeof then !== 'function') {
1701
- this._remaining--;
1702
- this._result[i] = entry;
1703
- } else if (c === lib$es6$promise$promise$$default) {
1704
- var promise = new c(lib$es6$promise$$internal$$noop);
1705
- lib$es6$promise$$internal$$handleMaybeThenable(promise, entry, then);
1706
- this._willSettleAt(promise, i);
1707
- } else {
1708
- this._willSettleAt(new c(function(resolve) { resolve(entry); }), i);
1709
- }
1710
- } else {
1711
- this._willSettleAt(resolve(entry), i);
1712
- }
1713
- };
1388
+ // on failure
1389
+ reject(reason);
1390
+ });
1714
1391
 
1715
- lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {
1716
- var promise = this.promise;
1392
+ promise.then(function(value) {
1393
+ // on fulfillment
1394
+ }, function(reason) {
1395
+ // on rejection
1396
+ });
1397
+ ```
1717
1398
 
1718
- if (promise._state === lib$es6$promise$$internal$$PENDING) {
1719
- this._remaining--;
1399
+ Advanced Usage:
1400
+ ---------------
1720
1401
 
1721
- if (state === lib$es6$promise$$internal$$REJECTED) {
1722
- lib$es6$promise$$internal$$reject(promise, value);
1723
- } else {
1724
- this._result[i] = value;
1402
+ Promises shine when abstracting away asynchronous interactions such as
1403
+ `XMLHttpRequest`s.
1404
+
1405
+ ```js
1406
+ function getJSON(url) {
1407
+ return new Promise(function(resolve, reject){
1408
+ let xhr = new XMLHttpRequest();
1409
+
1410
+ xhr.open('GET', url);
1411
+ xhr.onreadystatechange = handler;
1412
+ xhr.responseType = 'json';
1413
+ xhr.setRequestHeader('Accept', 'application/json');
1414
+ xhr.send();
1415
+
1416
+ function handler() {
1417
+ if (this.readyState === this.DONE) {
1418
+ if (this.status === 200) {
1419
+ resolve(this.response);
1420
+ } else {
1421
+ reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
1422
+ }
1725
1423
  }
1726
- }
1424
+ };
1425
+ });
1426
+ }
1727
1427
 
1728
- if (this._remaining === 0) {
1729
- lib$es6$promise$$internal$$fulfill(promise, this._result);
1730
- }
1731
- };
1428
+ getJSON('/posts.json').then(function(json) {
1429
+ // on fulfillment
1430
+ }, function(reason) {
1431
+ // on rejection
1432
+ });
1433
+ ```
1732
1434
 
1733
- lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {
1734
- var enumerator = this;
1435
+ Unlike callbacks, promises are great composable primitives.
1735
1436
 
1736
- lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {
1737
- enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);
1738
- }, function(reason) {
1739
- enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);
1740
- });
1741
- };
1742
- function lib$es6$promise$polyfill$$polyfill() {
1743
- var local;
1437
+ ```js
1438
+ Promise.all([
1439
+ getJSON('/posts'),
1440
+ getJSON('/comments')
1441
+ ]).then(function(values){
1442
+ values[0] // => postsJSON
1443
+ values[1] // => commentsJSON
1444
+
1445
+ return values;
1446
+ });
1447
+ ```
1448
+
1449
+ @class Promise
1450
+ @param {function} resolver
1451
+ Useful for tooling.
1452
+ @constructor
1453
+ */
1454
+ function Promise(resolver) {
1455
+ this[PROMISE_ID] = nextId();
1456
+ this._result = this._state = undefined;
1457
+ this._subscribers = [];
1458
+
1459
+ if (noop !== resolver) {
1460
+ typeof resolver !== 'function' && needsResolver();
1461
+ this instanceof Promise ? initializePromise(this, resolver) : needsNew();
1462
+ }
1463
+ }
1744
1464
 
1745
- if (typeof global !== 'undefined') {
1746
- local = global;
1747
- } else if (typeof self !== 'undefined') {
1748
- local = self;
1465
+ Promise.all = all;
1466
+ Promise.race = race;
1467
+ Promise.resolve = resolve;
1468
+ Promise.reject = reject;
1469
+ Promise._setScheduler = setScheduler;
1470
+ Promise._setAsap = setAsap;
1471
+ Promise._asap = asap;
1472
+
1473
+ Promise.prototype = {
1474
+ constructor: Promise,
1475
+
1476
+ /**
1477
+ The primary way of interacting with a promise is through its `then` method,
1478
+ which registers callbacks to receive either a promise's eventual value or the
1479
+ reason why the promise cannot be fulfilled.
1480
+
1481
+ ```js
1482
+ findUser().then(function(user){
1483
+ // user is available
1484
+ }, function(reason){
1485
+ // user is unavailable, and you are given the reason why
1486
+ });
1487
+ ```
1488
+
1489
+ Chaining
1490
+ --------
1491
+
1492
+ The return value of `then` is itself a promise. This second, 'downstream'
1493
+ promise is resolved with the return value of the first promise's fulfillment
1494
+ or rejection handler, or rejected if the handler throws an exception.
1495
+
1496
+ ```js
1497
+ findUser().then(function (user) {
1498
+ return user.name;
1499
+ }, function (reason) {
1500
+ return 'default name';
1501
+ }).then(function (userName) {
1502
+ // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
1503
+ // will be `'default name'`
1504
+ });
1505
+
1506
+ findUser().then(function (user) {
1507
+ throw new Error('Found user, but still unhappy');
1508
+ }, function (reason) {
1509
+ throw new Error('`findUser` rejected and we're unhappy');
1510
+ }).then(function (value) {
1511
+ // never reached
1512
+ }, function (reason) {
1513
+ // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
1514
+ // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
1515
+ });
1516
+ ```
1517
+ If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
1518
+
1519
+ ```js
1520
+ findUser().then(function (user) {
1521
+ throw new PedagogicalException('Upstream error');
1522
+ }).then(function (value) {
1523
+ // never reached
1524
+ }).then(function (value) {
1525
+ // never reached
1526
+ }, function (reason) {
1527
+ // The `PedgagocialException` is propagated all the way down to here
1528
+ });
1529
+ ```
1530
+
1531
+ Assimilation
1532
+ ------------
1533
+
1534
+ Sometimes the value you want to propagate to a downstream promise can only be
1535
+ retrieved asynchronously. This can be achieved by returning a promise in the
1536
+ fulfillment or rejection handler. The downstream promise will then be pending
1537
+ until the returned promise is settled. This is called *assimilation*.
1538
+
1539
+ ```js
1540
+ findUser().then(function (user) {
1541
+ return findCommentsByAuthor(user);
1542
+ }).then(function (comments) {
1543
+ // The user's comments are now available
1544
+ });
1545
+ ```
1546
+
1547
+ If the assimliated promise rejects, then the downstream promise will also reject.
1548
+
1549
+ ```js
1550
+ findUser().then(function (user) {
1551
+ return findCommentsByAuthor(user);
1552
+ }).then(function (comments) {
1553
+ // If `findCommentsByAuthor` fulfills, we'll have the value here
1554
+ }, function (reason) {
1555
+ // If `findCommentsByAuthor` rejects, we'll have the reason here
1556
+ });
1557
+ ```
1558
+
1559
+ Simple Example
1560
+ --------------
1561
+
1562
+ Synchronous Example
1563
+
1564
+ ```javascript
1565
+ let result;
1566
+
1567
+ try {
1568
+ result = findResult();
1569
+ // success
1570
+ } catch(reason) {
1571
+ // failure
1572
+ }
1573
+ ```
1574
+
1575
+ Errback Example
1576
+
1577
+ ```js
1578
+ findResult(function(result, err){
1579
+ if (err) {
1580
+ // failure
1749
1581
  } else {
1750
- try {
1751
- local = Function('return this')();
1752
- } catch (e) {
1753
- throw new Error('polyfill failed because global object is unavailable in this environment');
1754
- }
1582
+ // success
1583
+ }
1584
+ });
1585
+ ```
1586
+
1587
+ Promise Example;
1588
+
1589
+ ```javascript
1590
+ findResult().then(function(result){
1591
+ // success
1592
+ }, function(reason){
1593
+ // failure
1594
+ });
1595
+ ```
1596
+
1597
+ Advanced Example
1598
+ --------------
1599
+
1600
+ Synchronous Example
1601
+
1602
+ ```javascript
1603
+ let author, books;
1604
+
1605
+ try {
1606
+ author = findAuthor();
1607
+ books = findBooksByAuthor(author);
1608
+ // success
1609
+ } catch(reason) {
1610
+ // failure
1611
+ }
1612
+ ```
1613
+
1614
+ Errback Example
1615
+
1616
+ ```js
1617
+
1618
+ function foundBooks(books) {
1619
+
1620
+ }
1621
+
1622
+ function failure(reason) {
1623
+
1624
+ }
1625
+
1626
+ findAuthor(function(author, err){
1627
+ if (err) {
1628
+ failure(err);
1629
+ // failure
1630
+ } else {
1631
+ try {
1632
+ findBoooksByAuthor(author, function(books, err) {
1633
+ if (err) {
1634
+ failure(err);
1635
+ } else {
1636
+ try {
1637
+ foundBooks(books);
1638
+ } catch(reason) {
1639
+ failure(reason);
1640
+ }
1641
+ }
1642
+ });
1643
+ } catch(error) {
1644
+ failure(err);
1645
+ }
1646
+ // success
1755
1647
  }
1648
+ });
1649
+ ```
1650
+
1651
+ Promise Example;
1652
+
1653
+ ```javascript
1654
+ findAuthor().
1655
+ then(findBooksByAuthor).
1656
+ then(function(books){
1657
+ // found books
1658
+ }).catch(function(reason){
1659
+ // something went wrong
1660
+ });
1661
+ ```
1662
+
1663
+ @method then
1664
+ @param {Function} onFulfilled
1665
+ @param {Function} onRejected
1666
+ Useful for tooling.
1667
+ @return {Promise}
1668
+ */
1669
+ then: then,
1670
+
1671
+ /**
1672
+ `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
1673
+ as the catch block of a try/catch statement.
1674
+
1675
+ ```js
1676
+ function findAuthor(){
1677
+ throw new Error('couldn't find that author');
1678
+ }
1679
+
1680
+ // synchronous
1681
+ try {
1682
+ findAuthor();
1683
+ } catch(reason) {
1684
+ // something went wrong
1685
+ }
1686
+
1687
+ // async with promises
1688
+ findAuthor().catch(function(reason){
1689
+ // something went wrong
1690
+ });
1691
+ ```
1692
+
1693
+ @method catch
1694
+ @param {Function} onRejection
1695
+ Useful for tooling.
1696
+ @return {Promise}
1697
+ */
1698
+ 'catch': function _catch(onRejection) {
1699
+ return this.then(null, onRejection);
1700
+ }
1701
+ };
1756
1702
 
1757
- var P = local.Promise;
1703
+ function polyfill() {
1704
+ var local = undefined;
1758
1705
 
1759
- if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {
1760
- return;
1761
- }
1706
+ if (typeof global !== 'undefined') {
1707
+ local = global;
1708
+ } else if (typeof self !== 'undefined') {
1709
+ local = self;
1710
+ } else {
1711
+ try {
1712
+ local = Function('return this')();
1713
+ } catch (e) {
1714
+ throw new Error('polyfill failed because global object is unavailable in this environment');
1715
+ }
1716
+ }
1717
+
1718
+ var P = local.Promise;
1762
1719
 
1763
- local.Promise = lib$es6$promise$promise$$default;
1720
+ if (P) {
1721
+ var promiseToString = null;
1722
+ try {
1723
+ promiseToString = Object.prototype.toString.call(P.resolve());
1724
+ } catch (e) {
1725
+ // silently ignored
1726
+ }
1727
+
1728
+ if (promiseToString === '[object Promise]' && !P.cast) {
1729
+ return;
1730
+ }
1764
1731
  }
1765
- var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;
1766
1732
 
1767
- var lib$es6$promise$umd$$ES6Promise = {
1768
- 'Promise': lib$es6$promise$promise$$default,
1769
- 'polyfill': lib$es6$promise$polyfill$$default
1770
- };
1733
+ local.Promise = Promise;
1734
+ }
1771
1735
 
1772
- /* global define:true module:true window: true */
1773
- if (typeof define === 'function' && define['amd']) {
1774
- define(function() { return lib$es6$promise$umd$$ES6Promise; });
1775
- } else if (typeof module !== 'undefined' && module['exports']) {
1776
- module['exports'] = lib$es6$promise$umd$$ES6Promise;
1777
- } else if (typeof this !== 'undefined') {
1778
- this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;
1779
- }
1736
+ // Strange compat..
1737
+ Promise.polyfill = polyfill;
1738
+ Promise.Promise = Promise;
1780
1739
 
1781
- lib$es6$promise$polyfill$$default();
1782
- }).call(this);
1740
+ return Promise;
1783
1741
 
1742
+ })));
1784
1743
 
1785
- }).call(this,require(2),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1786
- },{"2":2}],6:[function(require,module,exports){
1744
+ }).call(this,require(12),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1745
+ },{"12":12}],4:[function(require,module,exports){
1787
1746
  // Copyright Joyent, Inc. and other Node contributors.
1788
1747
  //
1789
1748
  // Permission is hereby granted, free of charge, to any person obtaining a
@@ -2087,76 +2046,570 @@ function isUndefined(arg) {
2087
2046
  return arg === void 0;
2088
2047
  }
2089
2048
 
2090
- },{}],7:[function(require,module,exports){
2091
-
2092
- var hasOwn = Object.prototype.hasOwnProperty;
2093
- var toString = Object.prototype.toString;
2094
-
2095
- module.exports = function forEach (obj, fn, ctx) {
2096
- if (toString.call(fn) !== '[object Function]') {
2097
- throw new TypeError('iterator must be a function');
2049
+ },{}],5:[function(require,module,exports){
2050
+
2051
+ var hasOwn = Object.prototype.hasOwnProperty;
2052
+ var toString = Object.prototype.toString;
2053
+
2054
+ module.exports = function forEach (obj, fn, ctx) {
2055
+ if (toString.call(fn) !== '[object Function]') {
2056
+ throw new TypeError('iterator must be a function');
2057
+ }
2058
+ var l = obj.length;
2059
+ if (l === +l) {
2060
+ for (var i = 0; i < l; i++) {
2061
+ fn.call(ctx, obj[i], i, obj);
2062
+ }
2063
+ } else {
2064
+ for (var k in obj) {
2065
+ if (hasOwn.call(obj, k)) {
2066
+ fn.call(ctx, obj[k], k, obj);
2067
+ }
2068
+ }
2069
+ }
2070
+ };
2071
+
2072
+
2073
+ },{}],6:[function(require,module,exports){
2074
+ (function (global){
2075
+ if (typeof window !== "undefined") {
2076
+ module.exports = window;
2077
+ } else if (typeof global !== "undefined") {
2078
+ module.exports = global;
2079
+ } else if (typeof self !== "undefined"){
2080
+ module.exports = self;
2081
+ } else {
2082
+ module.exports = {};
2083
+ }
2084
+
2085
+ }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2086
+ },{}],7:[function(require,module,exports){
2087
+ if (typeof Object.create === 'function') {
2088
+ // implementation from standard node.js 'util' module
2089
+ module.exports = function inherits(ctor, superCtor) {
2090
+ ctor.super_ = superCtor
2091
+ ctor.prototype = Object.create(superCtor.prototype, {
2092
+ constructor: {
2093
+ value: ctor,
2094
+ enumerable: false,
2095
+ writable: true,
2096
+ configurable: true
2097
+ }
2098
+ });
2099
+ };
2100
+ } else {
2101
+ // old school shim for old browsers
2102
+ module.exports = function inherits(ctor, superCtor) {
2103
+ ctor.super_ = superCtor
2104
+ var TempCtor = function () {}
2105
+ TempCtor.prototype = superCtor.prototype
2106
+ ctor.prototype = new TempCtor()
2107
+ ctor.prototype.constructor = ctor
2108
+ }
2109
+ }
2110
+
2111
+ },{}],8:[function(require,module,exports){
2112
+ var toString = {}.toString;
2113
+
2114
+ module.exports = Array.isArray || function (arr) {
2115
+ return toString.call(arr) == '[object Array]';
2116
+ };
2117
+
2118
+ },{}],9:[function(require,module,exports){
2119
+ /**
2120
+ * Helpers.
2121
+ */
2122
+
2123
+ var s = 1000
2124
+ var m = s * 60
2125
+ var h = m * 60
2126
+ var d = h * 24
2127
+ var y = d * 365.25
2128
+
2129
+ /**
2130
+ * Parse or format the given `val`.
2131
+ *
2132
+ * Options:
2133
+ *
2134
+ * - `long` verbose formatting [false]
2135
+ *
2136
+ * @param {String|Number} val
2137
+ * @param {Object} options
2138
+ * @throws {Error} throw an error if val is not a non-empty string or a number
2139
+ * @return {String|Number}
2140
+ * @api public
2141
+ */
2142
+
2143
+ module.exports = function (val, options) {
2144
+ options = options || {}
2145
+ var type = typeof val
2146
+ if (type === 'string' && val.length > 0) {
2147
+ return parse(val)
2148
+ } else if (type === 'number' && isNaN(val) === false) {
2149
+ return options.long ?
2150
+ fmtLong(val) :
2151
+ fmtShort(val)
2152
+ }
2153
+ throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val))
2154
+ }
2155
+
2156
+ /**
2157
+ * Parse the given `str` and return milliseconds.
2158
+ *
2159
+ * @param {String} str
2160
+ * @return {Number}
2161
+ * @api private
2162
+ */
2163
+
2164
+ function parse(str) {
2165
+ str = String(str)
2166
+ if (str.length > 10000) {
2167
+ return
2168
+ }
2169
+ var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str)
2170
+ if (!match) {
2171
+ return
2172
+ }
2173
+ var n = parseFloat(match[1])
2174
+ var type = (match[2] || 'ms').toLowerCase()
2175
+ switch (type) {
2176
+ case 'years':
2177
+ case 'year':
2178
+ case 'yrs':
2179
+ case 'yr':
2180
+ case 'y':
2181
+ return n * y
2182
+ case 'days':
2183
+ case 'day':
2184
+ case 'd':
2185
+ return n * d
2186
+ case 'hours':
2187
+ case 'hour':
2188
+ case 'hrs':
2189
+ case 'hr':
2190
+ case 'h':
2191
+ return n * h
2192
+ case 'minutes':
2193
+ case 'minute':
2194
+ case 'mins':
2195
+ case 'min':
2196
+ case 'm':
2197
+ return n * m
2198
+ case 'seconds':
2199
+ case 'second':
2200
+ case 'secs':
2201
+ case 'sec':
2202
+ case 's':
2203
+ return n * s
2204
+ case 'milliseconds':
2205
+ case 'millisecond':
2206
+ case 'msecs':
2207
+ case 'msec':
2208
+ case 'ms':
2209
+ return n
2210
+ default:
2211
+ return undefined
2212
+ }
2213
+ }
2214
+
2215
+ /**
2216
+ * Short format for `ms`.
2217
+ *
2218
+ * @param {Number} ms
2219
+ * @return {String}
2220
+ * @api private
2221
+ */
2222
+
2223
+ function fmtShort(ms) {
2224
+ if (ms >= d) {
2225
+ return Math.round(ms / d) + 'd'
2226
+ }
2227
+ if (ms >= h) {
2228
+ return Math.round(ms / h) + 'h'
2229
+ }
2230
+ if (ms >= m) {
2231
+ return Math.round(ms / m) + 'm'
2232
+ }
2233
+ if (ms >= s) {
2234
+ return Math.round(ms / s) + 's'
2235
+ }
2236
+ return ms + 'ms'
2237
+ }
2238
+
2239
+ /**
2240
+ * Long format for `ms`.
2241
+ *
2242
+ * @param {Number} ms
2243
+ * @return {String}
2244
+ * @api private
2245
+ */
2246
+
2247
+ function fmtLong(ms) {
2248
+ return plural(ms, d, 'day') ||
2249
+ plural(ms, h, 'hour') ||
2250
+ plural(ms, m, 'minute') ||
2251
+ plural(ms, s, 'second') ||
2252
+ ms + ' ms'
2253
+ }
2254
+
2255
+ /**
2256
+ * Pluralization helper.
2257
+ */
2258
+
2259
+ function plural(ms, n, name) {
2260
+ if (ms < n) {
2261
+ return
2262
+ }
2263
+ if (ms < n * 1.5) {
2264
+ return Math.floor(ms / n) + ' ' + name
2265
+ }
2266
+ return Math.ceil(ms / n) + ' ' + name + 's'
2267
+ }
2268
+
2269
+ },{}],10:[function(require,module,exports){
2270
+ 'use strict';
2271
+
2272
+ // modified from https://github.com/es-shims/es5-shim
2273
+ var has = Object.prototype.hasOwnProperty;
2274
+ var toStr = Object.prototype.toString;
2275
+ var slice = Array.prototype.slice;
2276
+ var isArgs = require(11);
2277
+ var isEnumerable = Object.prototype.propertyIsEnumerable;
2278
+ var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
2279
+ var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
2280
+ var dontEnums = [
2281
+ 'toString',
2282
+ 'toLocaleString',
2283
+ 'valueOf',
2284
+ 'hasOwnProperty',
2285
+ 'isPrototypeOf',
2286
+ 'propertyIsEnumerable',
2287
+ 'constructor'
2288
+ ];
2289
+ var equalsConstructorPrototype = function (o) {
2290
+ var ctor = o.constructor;
2291
+ return ctor && ctor.prototype === o;
2292
+ };
2293
+ var excludedKeys = {
2294
+ $console: true,
2295
+ $external: true,
2296
+ $frame: true,
2297
+ $frameElement: true,
2298
+ $frames: true,
2299
+ $innerHeight: true,
2300
+ $innerWidth: true,
2301
+ $outerHeight: true,
2302
+ $outerWidth: true,
2303
+ $pageXOffset: true,
2304
+ $pageYOffset: true,
2305
+ $parent: true,
2306
+ $scrollLeft: true,
2307
+ $scrollTop: true,
2308
+ $scrollX: true,
2309
+ $scrollY: true,
2310
+ $self: true,
2311
+ $webkitIndexedDB: true,
2312
+ $webkitStorageInfo: true,
2313
+ $window: true
2314
+ };
2315
+ var hasAutomationEqualityBug = (function () {
2316
+ /* global window */
2317
+ if (typeof window === 'undefined') { return false; }
2318
+ for (var k in window) {
2319
+ try {
2320
+ if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
2321
+ try {
2322
+ equalsConstructorPrototype(window[k]);
2323
+ } catch (e) {
2324
+ return true;
2325
+ }
2326
+ }
2327
+ } catch (e) {
2328
+ return true;
2329
+ }
2330
+ }
2331
+ return false;
2332
+ }());
2333
+ var equalsConstructorPrototypeIfNotBuggy = function (o) {
2334
+ /* global window */
2335
+ if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
2336
+ return equalsConstructorPrototype(o);
2337
+ }
2338
+ try {
2339
+ return equalsConstructorPrototype(o);
2340
+ } catch (e) {
2341
+ return false;
2342
+ }
2343
+ };
2344
+
2345
+ var keysShim = function keys(object) {
2346
+ var isObject = object !== null && typeof object === 'object';
2347
+ var isFunction = toStr.call(object) === '[object Function]';
2348
+ var isArguments = isArgs(object);
2349
+ var isString = isObject && toStr.call(object) === '[object String]';
2350
+ var theKeys = [];
2351
+
2352
+ if (!isObject && !isFunction && !isArguments) {
2353
+ throw new TypeError('Object.keys called on a non-object');
2354
+ }
2355
+
2356
+ var skipProto = hasProtoEnumBug && isFunction;
2357
+ if (isString && object.length > 0 && !has.call(object, 0)) {
2358
+ for (var i = 0; i < object.length; ++i) {
2359
+ theKeys.push(String(i));
2360
+ }
2361
+ }
2362
+
2363
+ if (isArguments && object.length > 0) {
2364
+ for (var j = 0; j < object.length; ++j) {
2365
+ theKeys.push(String(j));
2366
+ }
2367
+ } else {
2368
+ for (var name in object) {
2369
+ if (!(skipProto && name === 'prototype') && has.call(object, name)) {
2370
+ theKeys.push(String(name));
2371
+ }
2372
+ }
2373
+ }
2374
+
2375
+ if (hasDontEnumBug) {
2376
+ var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
2377
+
2378
+ for (var k = 0; k < dontEnums.length; ++k) {
2379
+ if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
2380
+ theKeys.push(dontEnums[k]);
2381
+ }
2382
+ }
2383
+ }
2384
+ return theKeys;
2385
+ };
2386
+
2387
+ keysShim.shim = function shimObjectKeys() {
2388
+ if (Object.keys) {
2389
+ var keysWorksWithArguments = (function () {
2390
+ // Safari 5.0 bug
2391
+ return (Object.keys(arguments) || '').length === 2;
2392
+ }(1, 2));
2393
+ if (!keysWorksWithArguments) {
2394
+ var originalKeys = Object.keys;
2395
+ Object.keys = function keys(object) {
2396
+ if (isArgs(object)) {
2397
+ return originalKeys(slice.call(object));
2398
+ } else {
2399
+ return originalKeys(object);
2400
+ }
2401
+ };
2402
+ }
2403
+ } else {
2404
+ Object.keys = keysShim;
2405
+ }
2406
+ return Object.keys || keysShim;
2407
+ };
2408
+
2409
+ module.exports = keysShim;
2410
+
2411
+ },{"11":11}],11:[function(require,module,exports){
2412
+ 'use strict';
2413
+
2414
+ var toStr = Object.prototype.toString;
2415
+
2416
+ module.exports = function isArguments(value) {
2417
+ var str = toStr.call(value);
2418
+ var isArgs = str === '[object Arguments]';
2419
+ if (!isArgs) {
2420
+ isArgs = str !== '[object Array]' &&
2421
+ value !== null &&
2422
+ typeof value === 'object' &&
2423
+ typeof value.length === 'number' &&
2424
+ value.length >= 0 &&
2425
+ toStr.call(value.callee) === '[object Function]';
2426
+ }
2427
+ return isArgs;
2428
+ };
2429
+
2430
+ },{}],12:[function(require,module,exports){
2431
+ // shim for using process in browser
2432
+ var process = module.exports = {};
2433
+
2434
+ // cached from whatever global is present so that test runners that stub it
2435
+ // don't break things. But we need to wrap it in a try catch in case it is
2436
+ // wrapped in strict mode code which doesn't define any globals. It's inside a
2437
+ // function because try/catches deoptimize in certain engines.
2438
+
2439
+ var cachedSetTimeout;
2440
+ var cachedClearTimeout;
2441
+
2442
+ function defaultSetTimout() {
2443
+ throw new Error('setTimeout has not been defined');
2444
+ }
2445
+ function defaultClearTimeout () {
2446
+ throw new Error('clearTimeout has not been defined');
2447
+ }
2448
+ (function () {
2449
+ try {
2450
+ if (typeof setTimeout === 'function') {
2451
+ cachedSetTimeout = setTimeout;
2452
+ } else {
2453
+ cachedSetTimeout = defaultSetTimout;
2454
+ }
2455
+ } catch (e) {
2456
+ cachedSetTimeout = defaultSetTimout;
2457
+ }
2458
+ try {
2459
+ if (typeof clearTimeout === 'function') {
2460
+ cachedClearTimeout = clearTimeout;
2461
+ } else {
2462
+ cachedClearTimeout = defaultClearTimeout;
2463
+ }
2464
+ } catch (e) {
2465
+ cachedClearTimeout = defaultClearTimeout;
2466
+ }
2467
+ } ())
2468
+ function runTimeout(fun) {
2469
+ if (cachedSetTimeout === setTimeout) {
2470
+ //normal enviroments in sane situations
2471
+ return setTimeout(fun, 0);
2472
+ }
2473
+ // if setTimeout wasn't available but was latter defined
2474
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
2475
+ cachedSetTimeout = setTimeout;
2476
+ return setTimeout(fun, 0);
2477
+ }
2478
+ try {
2479
+ // when when somebody has screwed with setTimeout but no I.E. maddness
2480
+ return cachedSetTimeout(fun, 0);
2481
+ } catch(e){
2482
+ try {
2483
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
2484
+ return cachedSetTimeout.call(null, fun, 0);
2485
+ } catch(e){
2486
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
2487
+ return cachedSetTimeout.call(this, fun, 0);
2488
+ }
2489
+ }
2490
+
2491
+
2492
+ }
2493
+ function runClearTimeout(marker) {
2494
+ if (cachedClearTimeout === clearTimeout) {
2495
+ //normal enviroments in sane situations
2496
+ return clearTimeout(marker);
2497
+ }
2498
+ // if clearTimeout wasn't available but was latter defined
2499
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
2500
+ cachedClearTimeout = clearTimeout;
2501
+ return clearTimeout(marker);
2502
+ }
2503
+ try {
2504
+ // when when somebody has screwed with setTimeout but no I.E. maddness
2505
+ return cachedClearTimeout(marker);
2506
+ } catch (e){
2507
+ try {
2508
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
2509
+ return cachedClearTimeout.call(null, marker);
2510
+ } catch (e){
2511
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
2512
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
2513
+ return cachedClearTimeout.call(this, marker);
2514
+ }
2515
+ }
2516
+
2517
+
2518
+
2519
+ }
2520
+ var queue = [];
2521
+ var draining = false;
2522
+ var currentQueue;
2523
+ var queueIndex = -1;
2524
+
2525
+ function cleanUpNextTick() {
2526
+ if (!draining || !currentQueue) {
2527
+ return;
2528
+ }
2529
+ draining = false;
2530
+ if (currentQueue.length) {
2531
+ queue = currentQueue.concat(queue);
2532
+ } else {
2533
+ queueIndex = -1;
2534
+ }
2535
+ if (queue.length) {
2536
+ drainQueue();
2537
+ }
2538
+ }
2539
+
2540
+ function drainQueue() {
2541
+ if (draining) {
2542
+ return;
2098
2543
  }
2099
- var l = obj.length;
2100
- if (l === +l) {
2101
- for (var i = 0; i < l; i++) {
2102
- fn.call(ctx, obj[i], i, obj);
2103
- }
2104
- } else {
2105
- for (var k in obj) {
2106
- if (hasOwn.call(obj, k)) {
2107
- fn.call(ctx, obj[k], k, obj);
2544
+ var timeout = runTimeout(cleanUpNextTick);
2545
+ draining = true;
2546
+
2547
+ var len = queue.length;
2548
+ while(len) {
2549
+ currentQueue = queue;
2550
+ queue = [];
2551
+ while (++queueIndex < len) {
2552
+ if (currentQueue) {
2553
+ currentQueue[queueIndex].run();
2108
2554
  }
2109
2555
  }
2556
+ queueIndex = -1;
2557
+ len = queue.length;
2558
+ }
2559
+ currentQueue = null;
2560
+ draining = false;
2561
+ runClearTimeout(timeout);
2562
+ }
2563
+
2564
+ process.nextTick = function (fun) {
2565
+ var args = new Array(arguments.length - 1);
2566
+ if (arguments.length > 1) {
2567
+ for (var i = 1; i < arguments.length; i++) {
2568
+ args[i - 1] = arguments[i];
2569
+ }
2570
+ }
2571
+ queue.push(new Item(fun, args));
2572
+ if (queue.length === 1 && !draining) {
2573
+ runTimeout(drainQueue);
2110
2574
  }
2111
2575
  };
2112
2576
 
2113
-
2114
- },{}],8:[function(require,module,exports){
2115
- (function (global){
2116
- if (typeof window !== "undefined") {
2117
- module.exports = window;
2118
- } else if (typeof global !== "undefined") {
2119
- module.exports = global;
2120
- } else if (typeof self !== "undefined"){
2121
- module.exports = self;
2122
- } else {
2123
- module.exports = {};
2577
+ // v8 likes predictible objects
2578
+ function Item(fun, array) {
2579
+ this.fun = fun;
2580
+ this.array = array;
2124
2581
  }
2582
+ Item.prototype.run = function () {
2583
+ this.fun.apply(null, this.array);
2584
+ };
2585
+ process.title = 'browser';
2586
+ process.browser = true;
2587
+ process.env = {};
2588
+ process.argv = [];
2589
+ process.version = ''; // empty string to avoid regexp issues
2590
+ process.versions = {};
2125
2591
 
2126
- }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2127
- },{}],9:[function(require,module,exports){
2128
- if (typeof Object.create === 'function') {
2129
- // implementation from standard node.js 'util' module
2130
- module.exports = function inherits(ctor, superCtor) {
2131
- ctor.super_ = superCtor
2132
- ctor.prototype = Object.create(superCtor.prototype, {
2133
- constructor: {
2134
- value: ctor,
2135
- enumerable: false,
2136
- writable: true,
2137
- configurable: true
2138
- }
2139
- });
2140
- };
2141
- } else {
2142
- // old school shim for old browsers
2143
- module.exports = function inherits(ctor, superCtor) {
2144
- ctor.super_ = superCtor
2145
- var TempCtor = function () {}
2146
- TempCtor.prototype = superCtor.prototype
2147
- ctor.prototype = new TempCtor()
2148
- ctor.prototype.constructor = ctor
2149
- }
2150
- }
2592
+ function noop() {}
2151
2593
 
2152
- },{}],10:[function(require,module,exports){
2153
- var toString = {}.toString;
2594
+ process.on = noop;
2595
+ process.addListener = noop;
2596
+ process.once = noop;
2597
+ process.off = noop;
2598
+ process.removeListener = noop;
2599
+ process.removeAllListeners = noop;
2600
+ process.emit = noop;
2154
2601
 
2155
- module.exports = Array.isArray || function (arr) {
2156
- return toString.call(arr) == '[object Array]';
2602
+ process.binding = function (name) {
2603
+ throw new Error('process.binding is not supported');
2604
+ };
2605
+
2606
+ process.cwd = function () { return '/' };
2607
+ process.chdir = function (dir) {
2608
+ throw new Error('process.chdir is not supported');
2157
2609
  };
2610
+ process.umask = function() { return 0; };
2158
2611
 
2159
- },{}],11:[function(require,module,exports){
2612
+ },{}],13:[function(require,module,exports){
2160
2613
  // Copyright Joyent, Inc. and other Node contributors.
2161
2614
  //
2162
2615
  // Permission is hereby granted, free of charge, to any person obtaining a
@@ -2243,15 +2696,15 @@ var objectKeys = Object.keys || function (obj) {
2243
2696
  return res;
2244
2697
  };
2245
2698
 
2246
- },{}],12:[function(require,module,exports){
2699
+ },{}],14:[function(require,module,exports){
2247
2700
  module.exports = AlgoliaSearch;
2248
2701
 
2249
- var Index = require(14);
2250
- var deprecate = require(25);
2251
- var deprecatedMessage = require(26);
2252
- var AlgoliaSearchCore = require(13);
2253
- var inherits = require(9);
2254
- var errors = require(27);
2702
+ var Index = require(16);
2703
+ var deprecate = require(27);
2704
+ var deprecatedMessage = require(28);
2705
+ var AlgoliaSearchCore = require(15);
2706
+ var inherits = require(7);
2707
+ var errors = require(29);
2255
2708
 
2256
2709
  function AlgoliaSearch() {
2257
2710
  AlgoliaSearchCore.apply(this, arguments);
@@ -2332,7 +2785,7 @@ AlgoliaSearch.prototype.copyIndex = function(srcIndexName, dstIndexName, callbac
2332
2785
  * content: the server answer that contains the task ID
2333
2786
  */
2334
2787
  AlgoliaSearch.prototype.getLogs = function(offset, length, callback) {
2335
- var clone = require(24);
2788
+ var clone = require(26);
2336
2789
  var params = {};
2337
2790
  if (typeof offset === 'object') {
2338
2791
  // getLogs(params)
@@ -2484,7 +2937,7 @@ AlgoliaSearch.prototype.deleteUserKey = function(key, callback) {
2484
2937
  * @see {@link https://www.algolia.com/doc/rest_api#AddKey|Algolia REST API Documentation}
2485
2938
  */
2486
2939
  AlgoliaSearch.prototype.addUserKey = function(acls, params, callback) {
2487
- var isArray = require(10);
2940
+ var isArray = require(8);
2488
2941
  var usage = 'Usage: client.addUserKey(arrayOfAcls[, params, callback])';
2489
2942
 
2490
2943
  if (!isArray(acls)) {
@@ -2569,7 +3022,7 @@ AlgoliaSearch.prototype.addUserKeyWithValidity = deprecate(function(acls, params
2569
3022
  * @see {@link https://www.algolia.com/doc/rest_api#UpdateIndexKey|Algolia REST API Documentation}
2570
3023
  */
2571
3024
  AlgoliaSearch.prototype.updateUserKey = function(key, acls, params, callback) {
2572
- var isArray = require(10);
3025
+ var isArray = require(8);
2573
3026
  var usage = 'Usage: client.updateUserKey(key, arrayOfAcls[, params, callback])';
2574
3027
 
2575
3028
  if (!isArray(acls)) {
@@ -2670,7 +3123,7 @@ AlgoliaSearch.prototype.sendQueriesBatch = deprecate(function sendQueriesBatchDe
2670
3123
  * }], cb)
2671
3124
  */
2672
3125
  AlgoliaSearch.prototype.batch = function(operations, callback) {
2673
- var isArray = require(10);
3126
+ var isArray = require(8);
2674
3127
  var usage = 'Usage: client.batch(operations[, callback])';
2675
3128
 
2676
3129
  if (!isArray(operations)) {
@@ -2703,15 +3156,22 @@ function notImplemented() {
2703
3156
  throw new errors.AlgoliaSearchError(message);
2704
3157
  }
2705
3158
 
2706
- },{"10":10,"13":13,"14":14,"24":24,"25":25,"26":26,"27":27,"9":9}],13:[function(require,module,exports){
3159
+ },{"15":15,"16":16,"26":26,"27":27,"28":28,"29":29,"7":7,"8":8}],15:[function(require,module,exports){
3160
+ (function (process){
2707
3161
  module.exports = AlgoliaSearchCore;
2708
3162
 
2709
- var errors = require(27);
2710
- var exitPromise = require(28);
2711
- var IndexCore = require(16);
3163
+ var errors = require(29);
3164
+ var exitPromise = require(30);
3165
+ var IndexCore = require(18);
3166
+ var store = require(35);
2712
3167
 
2713
- // We will always put the API KEY in the JSON body in case of too long API KEY
3168
+ // We will always put the API KEY in the JSON body in case of too long API KEY,
3169
+ // to avoid query string being too long and failing in various conditions (our server limit, browser limit,
3170
+ // proxies limit)
2714
3171
  var MAX_API_KEY_LENGTH = 500;
3172
+ var RESET_APP_DATA_TIMER =
3173
+ process.env.RESET_APP_DATA_TIMER && parseInt(process.env.RESET_APP_DATA_TIMER, 10) ||
3174
+ 60 * 2 * 1000; // after 2 minutes reset to first host
2715
3175
 
2716
3176
  /*
2717
3177
  * Algolia Search library initialization
@@ -2739,11 +3199,11 @@ var MAX_API_KEY_LENGTH = 500;
2739
3199
  * If you provide them, you will less benefit from our HA implementation
2740
3200
  */
2741
3201
  function AlgoliaSearchCore(applicationID, apiKey, opts) {
2742
- var debug = require(3)('algoliasearch');
3202
+ var debug = require(1)('algoliasearch');
2743
3203
 
2744
- var clone = require(24);
2745
- var isArray = require(10);
2746
- var map = require(29);
3204
+ var clone = require(26);
3205
+ var isArray = require(8);
3206
+ var map = require(31);
2747
3207
 
2748
3208
  var usage = 'Usage: algoliasearch(applicationID, apiKey, opts)';
2749
3209
 
@@ -2758,25 +3218,24 @@ function AlgoliaSearchCore(applicationID, apiKey, opts) {
2758
3218
  this.applicationID = applicationID;
2759
3219
  this.apiKey = apiKey;
2760
3220
 
2761
- var defaultHosts = shuffle([
2762
- this.applicationID + '-1.algolianet.com',
2763
- this.applicationID + '-2.algolianet.com',
2764
- this.applicationID + '-3.algolianet.com'
2765
- ]);
2766
3221
  this.hosts = {
2767
3222
  read: [],
2768
3223
  write: []
2769
3224
  };
2770
3225
 
2771
- this.hostIndex = {
2772
- read: 0,
2773
- write: 0
2774
- };
2775
-
2776
3226
  opts = opts || {};
2777
3227
 
2778
3228
  var protocol = opts.protocol || 'https:';
2779
- var timeout = opts.timeout === undefined ? 2000 : opts.timeout;
3229
+ this._timeouts = opts.timeouts || {
3230
+ connect: 1 * 1000, // 500ms connect is GPRS latency
3231
+ read: 2 * 1000,
3232
+ write: 30 * 1000
3233
+ };
3234
+
3235
+ // backward compat, if opts.timeout is passed, we use it to configure all timeouts like before
3236
+ if (opts.timeout) {
3237
+ this._timeouts.connect = this._timeouts.read = this._timeouts.write = opts.timeout;
3238
+ }
2780
3239
 
2781
3240
  // while we advocate for colon-at-the-end values: 'http:' for `opts.protocol`
2782
3241
  // we also accept `http` and `https`. It's a common error.
@@ -2788,11 +3247,19 @@ function AlgoliaSearchCore(applicationID, apiKey, opts) {
2788
3247
  throw new errors.AlgoliaSearchError('protocol must be `http:` or `https:` (was `' + opts.protocol + '`)');
2789
3248
  }
2790
3249
 
2791
- // no hosts given, add defaults
3250
+ this._checkAppIdData();
3251
+
2792
3252
  if (!opts.hosts) {
3253
+ var defaultHosts = map(this._shuffleResult, function(hostNumber) {
3254
+ return applicationID + '-' + hostNumber + '.algolianet.com';
3255
+ });
3256
+
3257
+ // no hosts given, compute defaults
2793
3258
  this.hosts.read = [this.applicationID + '-dsn.algolia.net'].concat(defaultHosts);
2794
3259
  this.hosts.write = [this.applicationID + '.algolia.net'].concat(defaultHosts);
2795
3260
  } else if (isArray(opts.hosts)) {
3261
+ // when passing custom hosts, we need to have a different host index if the number
3262
+ // of write/read hosts are different.
2796
3263
  this.hosts.read = clone(opts.hosts);
2797
3264
  this.hosts.write = clone(opts.hosts);
2798
3265
  } else {
@@ -2803,7 +3270,6 @@ function AlgoliaSearchCore(applicationID, apiKey, opts) {
2803
3270
  // add protocol and lowercase hosts
2804
3271
  this.hosts.read = map(this.hosts.read, prepareHost(protocol));
2805
3272
  this.hosts.write = map(this.hosts.write, prepareHost(protocol));
2806
- this.requestTimeout = timeout;
2807
3273
 
2808
3274
  this.extraHeaders = [];
2809
3275
 
@@ -2848,14 +3314,18 @@ AlgoliaSearchCore.prototype.setExtraHeader = function(name, value) {
2848
3314
  * @param algoliaAgent the agent to add
2849
3315
  */
2850
3316
  AlgoliaSearchCore.prototype.addAlgoliaAgent = function(algoliaAgent) {
2851
- this._ua += ';' + algoliaAgent;
3317
+ if (this._ua.indexOf(';' + algoliaAgent) === -1) {
3318
+ this._ua += ';' + algoliaAgent;
3319
+ }
2852
3320
  };
2853
3321
 
2854
3322
  /*
2855
3323
  * Wrapper that try all hosts to maximize the quality of service
2856
3324
  */
2857
3325
  AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
2858
- var requestDebug = require(3)('algoliasearch:' + initialOpts.url);
3326
+ this._checkAppIdData();
3327
+
3328
+ var requestDebug = require(1)('algoliasearch:' + initialOpts.url);
2859
3329
 
2860
3330
  var body;
2861
3331
  var cache = initialOpts.cache;
@@ -2865,7 +3335,12 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
2865
3335
  var hasFallback = client._useFallback && client._request.fallback && initialOpts.fallback;
2866
3336
  var headers;
2867
3337
 
2868
- if (this.apiKey.length > MAX_API_KEY_LENGTH && initialOpts.body !== undefined && initialOpts.body.params !== undefined) {
3338
+ if (
3339
+ this.apiKey.length > MAX_API_KEY_LENGTH &&
3340
+ initialOpts.body !== undefined &&
3341
+ (initialOpts.body.params !== undefined || // index.search()
3342
+ initialOpts.body.requests !== undefined) // client.search()
3343
+ ) {
2869
3344
  initialOpts.body.apiKey = this.apiKey;
2870
3345
  headers = this._computeRequestHeaders(false);
2871
3346
  } else {
@@ -2880,6 +3355,8 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
2880
3355
  var debugData = [];
2881
3356
 
2882
3357
  function doRequest(requester, reqOpts) {
3358
+ client._checkAppIdData();
3359
+
2883
3360
  var startTime = new Date();
2884
3361
  var cacheID;
2885
3362
 
@@ -2926,13 +3403,13 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
2926
3403
  // re-compute headers, they could be omitting the API KEY
2927
3404
  headers = client._computeRequestHeaders();
2928
3405
 
2929
- reqOpts.timeout = client.requestTimeout * (tries + 1);
2930
- client.hostIndex[initialOpts.hostType] = 0;
3406
+ reqOpts.timeouts = client._getTimeoutsForRequest(initialOpts.hostType);
3407
+ client._setHostIndexByType(0, initialOpts.hostType);
2931
3408
  usingFallback = true; // the current request is now using fallback
2932
3409
  return doRequest(client._request.fallback, reqOpts);
2933
3410
  }
2934
3411
 
2935
- var currentHost = client.hosts[initialOpts.hostType][client.hostIndex[initialOpts.hostType]];
3412
+ var currentHost = client._getHostByType(initialOpts.hostType);
2936
3413
 
2937
3414
  var url = currentHost + reqOpts.url;
2938
3415
  var options = {
@@ -2940,12 +3417,12 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
2940
3417
  jsonBody: reqOpts.jsonBody,
2941
3418
  method: reqOpts.method,
2942
3419
  headers: headers,
2943
- timeout: reqOpts.timeout,
3420
+ timeouts: reqOpts.timeouts,
2944
3421
  debug: requestDebug
2945
3422
  };
2946
3423
 
2947
- requestDebug('method: %s, url: %s, headers: %j, timeout: %d',
2948
- options.method, url, options.headers, options.timeout);
3424
+ requestDebug('method: %s, url: %s, headers: %j, timeouts: %d',
3425
+ options.method, url, options.headers, options.timeouts);
2949
3426
 
2950
3427
  if (requester === client._request.fallback) {
2951
3428
  requestDebug('using fallback');
@@ -2988,7 +3465,7 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
2988
3465
  content: body || null,
2989
3466
  contentLength: body !== undefined ? body.length : null,
2990
3467
  method: reqOpts.method,
2991
- timeout: reqOpts.timeout,
3468
+ timeouts: reqOpts.timeouts,
2992
3469
  url: reqOpts.url,
2993
3470
  startTime: startTime,
2994
3471
  endTime: endTime,
@@ -3041,7 +3518,7 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
3041
3518
  content: body || null,
3042
3519
  contentLength: body !== undefined ? body.length : null,
3043
3520
  method: reqOpts.method,
3044
- timeout: reqOpts.timeout,
3521
+ timeouts: reqOpts.timeouts,
3045
3522
  url: reqOpts.url,
3046
3523
  startTime: startTime,
3047
3524
  endTime: endTime,
@@ -3081,14 +3558,15 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
3081
3558
 
3082
3559
  function retryRequest() {
3083
3560
  requestDebug('retrying request');
3084
- client.hostIndex[initialOpts.hostType] = (client.hostIndex[initialOpts.hostType] + 1) % client.hosts[initialOpts.hostType].length;
3561
+ client._incrementHostIndex(initialOpts.hostType);
3085
3562
  return doRequest(requester, reqOpts);
3086
3563
  }
3087
3564
 
3088
3565
  function retryRequestWithHigherTimeout() {
3089
3566
  requestDebug('retrying request with higher timeout');
3090
- client.hostIndex[initialOpts.hostType] = (client.hostIndex[initialOpts.hostType] + 1) % client.hosts[initialOpts.hostType].length;
3091
- reqOpts.timeout = client.requestTimeout * (tries + 1);
3567
+ client._incrementHostIndex(initialOpts.hostType);
3568
+ client._incrementTimeoutMultipler();
3569
+ reqOpts.timeouts = client._getTimeoutsForRequest(initialOpts.hostType);
3092
3570
  return doRequest(requester, reqOpts);
3093
3571
  }
3094
3572
  }
@@ -3099,7 +3577,7 @@ AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {
3099
3577
  method: initialOpts.method,
3100
3578
  body: body,
3101
3579
  jsonBody: initialOpts.body,
3102
- timeout: client.requestTimeout * (tries + 1)
3580
+ timeouts: client._getTimeoutsForRequest(initialOpts.hostType)
3103
3581
  }
3104
3582
  );
3105
3583
 
@@ -3137,7 +3615,7 @@ AlgoliaSearchCore.prototype._getSearchParams = function(args, params) {
3137
3615
  };
3138
3616
 
3139
3617
  AlgoliaSearchCore.prototype._computeRequestHeaders = function(withAPIKey) {
3140
- var forEach = require(7);
3618
+ var forEach = require(5);
3141
3619
 
3142
3620
  var requestHeaders = {
3143
3621
  'x-algolia-agent': this._ua,
@@ -3179,8 +3657,8 @@ AlgoliaSearchCore.prototype._computeRequestHeaders = function(withAPIKey) {
3179
3657
  * @return {Promise|undefined} Returns a promise if no callback given
3180
3658
  */
3181
3659
  AlgoliaSearchCore.prototype.search = function(queries, opts, callback) {
3182
- var isArray = require(10);
3183
- var map = require(29);
3660
+ var isArray = require(8);
3661
+ var map = require(31);
3184
3662
 
3185
3663
  var usage = 'Usage: client.search(arrayOfQueries[, callback])';
3186
3664
 
@@ -3288,13 +3766,113 @@ AlgoliaSearchCore.prototype.clearCache = function() {
3288
3766
 
3289
3767
  /**
3290
3768
  * Set the number of milliseconds a request can take before automatically being terminated.
3291
- *
3769
+ * @deprecated
3292
3770
  * @param {Number} milliseconds
3293
3771
  */
3294
3772
  AlgoliaSearchCore.prototype.setRequestTimeout = function(milliseconds) {
3295
3773
  if (milliseconds) {
3296
- this.requestTimeout = parseInt(milliseconds, 10);
3774
+ this._timeouts.connect = this._timeouts.read = this._timeouts.write = milliseconds;
3775
+ }
3776
+ };
3777
+
3778
+ /**
3779
+ * Set the three different (connect, read, write) timeouts to be used when requesting
3780
+ * @param {Object} timeouts
3781
+ */
3782
+ AlgoliaSearchCore.prototype.setTimeouts = function(timeouts) {
3783
+ this._timeouts = timeouts;
3784
+ };
3785
+
3786
+ /**
3787
+ * Get the three different (connect, read, write) timeouts to be used when requesting
3788
+ * @param {Object} timeouts
3789
+ */
3790
+ AlgoliaSearchCore.prototype.getTimeouts = function() {
3791
+ return this._timeouts;
3792
+ };
3793
+
3794
+ AlgoliaSearchCore.prototype._getAppIdData = function() {
3795
+ var data = store.get(this.applicationID);
3796
+ if (data !== null) this._cacheAppIdData(data);
3797
+ return data;
3798
+ };
3799
+
3800
+ AlgoliaSearchCore.prototype._setAppIdData = function(data) {
3801
+ data.lastChange = (new Date()).getTime();
3802
+ this._cacheAppIdData(data);
3803
+ return store.set(this.applicationID, data);
3804
+ };
3805
+
3806
+ AlgoliaSearchCore.prototype._checkAppIdData = function() {
3807
+ var data = this._getAppIdData();
3808
+ var now = (new Date()).getTime();
3809
+ if (data === null || now - data.lastChange > RESET_APP_DATA_TIMER) {
3810
+ return this._resetInitialAppIdData(data);
3297
3811
  }
3812
+
3813
+ return data;
3814
+ };
3815
+
3816
+ AlgoliaSearchCore.prototype._resetInitialAppIdData = function(data) {
3817
+ var newData = data || {};
3818
+ newData.hostIndexes = {read: 0, write: 0};
3819
+ newData.timeoutMultiplier = 1;
3820
+ newData.shuffleResult = newData.shuffleResult || shuffle([1, 2, 3]);
3821
+ return this._setAppIdData(newData);
3822
+ };
3823
+
3824
+ AlgoliaSearchCore.prototype._cacheAppIdData = function(data) {
3825
+ this._hostIndexes = data.hostIndexes;
3826
+ this._timeoutMultiplier = data.timeoutMultiplier;
3827
+ this._shuffleResult = data.shuffleResult;
3828
+ };
3829
+
3830
+ AlgoliaSearchCore.prototype._partialAppIdDataUpdate = function(newData) {
3831
+ var foreach = require(5);
3832
+ var currentData = this._getAppIdData();
3833
+ foreach(newData, function(value, key) {
3834
+ currentData[key] = value;
3835
+ });
3836
+
3837
+ return this._setAppIdData(currentData);
3838
+ };
3839
+
3840
+ AlgoliaSearchCore.prototype._getHostByType = function(hostType) {
3841
+ return this.hosts[hostType][this._getHostIndexByType(hostType)];
3842
+ };
3843
+
3844
+ AlgoliaSearchCore.prototype._getTimeoutMultiplier = function() {
3845
+ return this._timeoutMultiplier;
3846
+ };
3847
+
3848
+ AlgoliaSearchCore.prototype._getHostIndexByType = function(hostType) {
3849
+ return this._hostIndexes[hostType];
3850
+ };
3851
+
3852
+ AlgoliaSearchCore.prototype._setHostIndexByType = function(hostIndex, hostType) {
3853
+ var clone = require(26);
3854
+ var newHostIndexes = clone(this._hostIndexes);
3855
+ newHostIndexes[hostType] = hostIndex;
3856
+ this._partialAppIdDataUpdate({hostIndexes: newHostIndexes});
3857
+ return hostIndex;
3858
+ };
3859
+
3860
+ AlgoliaSearchCore.prototype._incrementHostIndex = function(hostType) {
3861
+ return this._setHostIndexByType(
3862
+ (this._getHostIndexByType(hostType) + 1) % this.hosts[hostType].length, hostType
3863
+ );
3864
+ };
3865
+
3866
+ AlgoliaSearchCore.prototype._incrementTimeoutMultipler = function() {
3867
+ var timeoutMultiplier = Math.max(this._timeoutMultiplier + 1, 4);
3868
+ return this._partialAppIdDataUpdate({timeoutMultiplier: timeoutMultiplier});
3869
+ };
3870
+
3871
+ AlgoliaSearchCore.prototype._getTimeoutsForRequest = function(hostType) {
3872
+ return {
3873
+ connect: this._timeouts.connect * this._timeoutMultiplier,
3874
+ complete: this._timeouts[hostType] * this._timeoutMultiplier
3875
+ };
3298
3876
  };
3299
3877
 
3300
3878
  function prepareHost(protocol) {
@@ -3365,13 +3943,14 @@ function removeCredentials(headers) {
3365
3943
  return newHeaders;
3366
3944
  }
3367
3945
 
3368
- },{"10":10,"16":16,"24":24,"27":27,"28":28,"29":29,"3":3,"7":7}],14:[function(require,module,exports){
3369
- var inherits = require(9);
3370
- var IndexCore = require(16);
3371
- var deprecate = require(25);
3372
- var deprecatedMessage = require(26);
3373
- var exitPromise = require(28);
3374
- var errors = require(27);
3946
+ }).call(this,require(12))
3947
+ },{"1":1,"12":12,"18":18,"26":26,"29":29,"30":30,"31":31,"35":35,"5":5,"8":8}],16:[function(require,module,exports){
3948
+ var inherits = require(7);
3949
+ var IndexCore = require(18);
3950
+ var deprecate = require(27);
3951
+ var deprecatedMessage = require(28);
3952
+ var exitPromise = require(30);
3953
+ var errors = require(29);
3375
3954
 
3376
3955
  module.exports = Index;
3377
3956
 
@@ -3420,7 +3999,7 @@ Index.prototype.addObject = function(content, objectID, callback) {
3420
3999
  * content: the server answer that updateAt and taskID
3421
4000
  */
3422
4001
  Index.prototype.addObjects = function(objects, callback) {
3423
- var isArray = require(10);
4002
+ var isArray = require(8);
3424
4003
  var usage = 'Usage: index.addObjects(arrayOfObjects[, callback])';
3425
4004
 
3426
4005
  if (!isArray(objects)) {
@@ -3487,7 +4066,7 @@ Index.prototype.partialUpdateObject = function(partialObject, createIfNotExists,
3487
4066
  * content: the server answer that updateAt and taskID
3488
4067
  */
3489
4068
  Index.prototype.partialUpdateObjects = function(objects, callback) {
3490
- var isArray = require(10);
4069
+ var isArray = require(8);
3491
4070
  var usage = 'Usage: index.partialUpdateObjects(arrayOfObjects[, callback])';
3492
4071
 
3493
4072
  if (!isArray(objects)) {
@@ -3543,7 +4122,7 @@ Index.prototype.saveObject = function(object, callback) {
3543
4122
  * content: the server answer that updateAt and taskID
3544
4123
  */
3545
4124
  Index.prototype.saveObjects = function(objects, callback) {
3546
- var isArray = require(10);
4125
+ var isArray = require(8);
3547
4126
  var usage = 'Usage: index.saveObjects(arrayOfObjects[, callback])';
3548
4127
 
3549
4128
  if (!isArray(objects)) {
@@ -3608,8 +4187,8 @@ Index.prototype.deleteObject = function(objectID, callback) {
3608
4187
  * content: the server answer that contains 3 elements: createAt, taskId and objectID
3609
4188
  */
3610
4189
  Index.prototype.deleteObjects = function(objectIDs, callback) {
3611
- var isArray = require(10);
3612
- var map = require(29);
4190
+ var isArray = require(8);
4191
+ var map = require(31);
3613
4192
 
3614
4193
  var usage = 'Usage: index.deleteObjects(arrayOfObjectIDs[, callback])';
3615
4194
 
@@ -3648,8 +4227,8 @@ Index.prototype.deleteObjects = function(objectIDs, callback) {
3648
4227
  * error: null or Error('message')
3649
4228
  */
3650
4229
  Index.prototype.deleteByQuery = function(query, params, callback) {
3651
- var clone = require(24);
3652
- var map = require(29);
4230
+ var clone = require(26);
4231
+ var map = require(31);
3653
4232
 
3654
4233
  var indexObj = this;
3655
4234
  var client = indexObj.as;
@@ -3759,9 +4338,9 @@ Index.prototype.browseAll = function(query, queryParameters) {
3759
4338
  query = undefined;
3760
4339
  }
3761
4340
 
3762
- var merge = require(30);
4341
+ var merge = require(32);
3763
4342
 
3764
- var IndexBrowser = require(15);
4343
+ var IndexBrowser = require(17);
3765
4344
 
3766
4345
  var browser = new IndexBrowser();
3767
4346
  var client = this.as;
@@ -4221,7 +4800,7 @@ Index.prototype.deleteUserKey = function(key, callback) {
4221
4800
  * @see {@link https://www.algolia.com/doc/rest_api#AddIndexKey|Algolia REST API Documentation}
4222
4801
  */
4223
4802
  Index.prototype.addUserKey = function(acls, params, callback) {
4224
- var isArray = require(10);
4803
+ var isArray = require(8);
4225
4804
  var usage = 'Usage: index.addUserKey(arrayOfAcls[, params, callback])';
4226
4805
 
4227
4806
  if (!isArray(acls)) {
@@ -4304,7 +4883,7 @@ Index.prototype.addUserKeyWithValidity = deprecate(function deprecatedAddUserKey
4304
4883
  * @see {@link https://www.algolia.com/doc/rest_api#UpdateIndexKey|Algolia REST API Documentation}
4305
4884
  */
4306
4885
  Index.prototype.updateUserKey = function(key, acls, params, callback) {
4307
- var isArray = require(10);
4886
+ var isArray = require(8);
4308
4887
  var usage = 'Usage: index.updateUserKey(key, arrayOfAcls[, params, callback])';
4309
4888
 
4310
4889
  if (!isArray(acls)) {
@@ -4342,15 +4921,15 @@ Index.prototype.updateUserKey = function(key, acls, params, callback) {
4342
4921
  });
4343
4922
  };
4344
4923
 
4345
- },{"10":10,"15":15,"16":16,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"9":9}],15:[function(require,module,exports){
4924
+ },{"17":17,"18":18,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"7":7,"8":8}],17:[function(require,module,exports){
4346
4925
  'use strict';
4347
4926
 
4348
4927
  // This is the object returned by the `index.browseAll()` method
4349
4928
 
4350
4929
  module.exports = IndexBrowser;
4351
4930
 
4352
- var inherits = require(9);
4353
- var EventEmitter = require(6).EventEmitter;
4931
+ var inherits = require(7);
4932
+ var EventEmitter = require(4).EventEmitter;
4354
4933
 
4355
4934
  function IndexBrowser() {
4356
4935
  }
@@ -4383,8 +4962,10 @@ IndexBrowser.prototype._clean = function() {
4383
4962
  this.removeAllListeners('result');
4384
4963
  };
4385
4964
 
4386
- },{"6":6,"9":9}],16:[function(require,module,exports){
4387
- var buildSearchMethod = require(23);
4965
+ },{"4":4,"7":7}],18:[function(require,module,exports){
4966
+ var buildSearchMethod = require(25);
4967
+ var deprecate = require(27);
4968
+ var deprecatedMessage = require(28);
4388
4969
 
4389
4970
  module.exports = IndexCore;
4390
4971
 
@@ -4536,7 +5117,7 @@ IndexCore.prototype.similarSearch = buildSearchMethod('similarQuery');
4536
5117
  * @see {@link https://www.algolia.com/doc/rest_api#Browse|Algolia REST API Documentation}
4537
5118
  */
4538
5119
  IndexCore.prototype.browse = function(query, queryParameters, callback) {
4539
- var merge = require(30);
5120
+ var merge = require(32);
4540
5121
 
4541
5122
  var indexObj = this;
4542
5123
 
@@ -4616,6 +5197,50 @@ IndexCore.prototype.browseFrom = function(cursor, callback) {
4616
5197
  });
4617
5198
  };
4618
5199
 
5200
+ /*
5201
+ * Search for facet values
5202
+ * https://www.algolia.com/doc/rest-api/search#search-for-facet-values
5203
+ *
5204
+ * @param {string} params.facetName Facet name, name of the attribute to search for values in.
5205
+ * Must be declared as a facet
5206
+ * @param {string} params.facetQuery Query for the facet search
5207
+ * @param {string} [params.*] Any search parameter of Algolia,
5208
+ * see https://www.algolia.com/doc/api-client/javascript/search#search-parameters
5209
+ * Pagination is not supported. The page and hitsPerPage parameters will be ignored.
5210
+ * @param callback (optional)
5211
+ */
5212
+ IndexCore.prototype.searchForFacetValues = function(params, callback) {
5213
+ var clone = require(26);
5214
+ var omit = require(33);
5215
+ var usage = 'Usage: index.searchForFacetValues({facetName, facetQuery, ...params}[, callback])';
5216
+
5217
+ if (params.facetName === undefined || params.facetQuery === undefined) {
5218
+ throw new Error(usage);
5219
+ }
5220
+
5221
+ var facetName = params.facetName;
5222
+ var filteredParams = omit(clone(params), function(keyName) {
5223
+ return keyName === 'facetName';
5224
+ });
5225
+ var searchParameters = this.as._getSearchParams(filteredParams, '');
5226
+
5227
+ return this.as._jsonRequest({
5228
+ method: 'POST',
5229
+ url: '/1/indexes/' +
5230
+ encodeURIComponent(this.indexName) + '/facets/' + encodeURIComponent(facetName) + '/query',
5231
+ hostType: 'read',
5232
+ body: {params: searchParameters},
5233
+ callback: callback
5234
+ });
5235
+ };
5236
+
5237
+ IndexCore.prototype.searchFacet = deprecate(function(params, callback) {
5238
+ return this.searchForFacetValues(params, callback);
5239
+ }, deprecatedMessage(
5240
+ 'index.searchFacet(params[, callback])',
5241
+ 'index.searchForFacetValues(params[, callback])'
5242
+ ));
5243
+
4619
5244
  IndexCore.prototype._search = function(params, url, callback) {
4620
5245
  return this.as._jsonRequest({
4621
5246
  cache: this.cache,
@@ -4674,8 +5299,8 @@ IndexCore.prototype.getObject = function(objectID, attrs, callback) {
4674
5299
  * @param objectIDs the array of unique identifier of objects to retrieve
4675
5300
  */
4676
5301
  IndexCore.prototype.getObjects = function(objectIDs, attributesToRetrieve, callback) {
4677
- var isArray = require(10);
4678
- var map = require(29);
5302
+ var isArray = require(8);
5303
+ var map = require(31);
4679
5304
 
4680
5305
  var usage = 'Usage: index.getObjects(arrayOfObjectIDs[, callback])';
4681
5306
 
@@ -4719,7 +5344,7 @@ IndexCore.prototype.indexName = null;
4719
5344
  IndexCore.prototype.typeAheadArgs = null;
4720
5345
  IndexCore.prototype.typeAheadValueOption = null;
4721
5346
 
4722
- },{"10":10,"23":23,"29":29,"30":30}],17:[function(require,module,exports){
5347
+ },{"25":25,"26":26,"27":27,"28":28,"31":31,"32":32,"33":33,"8":8}],19:[function(require,module,exports){
4723
5348
  (function (process){
4724
5349
  'use strict';
4725
5350
 
@@ -4727,29 +5352,29 @@ IndexCore.prototype.typeAheadValueOption = null;
4727
5352
  // It's using $http to do requests with a JSONP fallback
4728
5353
  // $q promises are returned
4729
5354
 
4730
- var inherits = require(9);
5355
+ var inherits = require(7);
4731
5356
 
4732
- var forEach = require(7);
5357
+ var forEach = require(5);
4733
5358
 
4734
- var AlgoliaSearch = require(12);
4735
- var errors = require(27);
4736
- var inlineHeaders = require(21);
4737
- var jsonpRequest = require(22);
4738
- var places = require(31);
5359
+ var AlgoliaSearch = require(14);
5360
+ var errors = require(29);
5361
+ var inlineHeaders = require(23);
5362
+ var jsonpRequest = require(24);
5363
+ var places = require(34);
4739
5364
 
4740
5365
  // expose original algoliasearch fn in window
4741
- window.algoliasearch = require(18);
5366
+ window.algoliasearch = require(20);
4742
5367
 
4743
5368
  if (process.env.NODE_ENV === 'debug') {
4744
- require(3).enable('algoliasearch*');
5369
+ require(1).enable('algoliasearch*');
4745
5370
  }
4746
5371
 
4747
5372
  window.angular.module('algoliasearch', [])
4748
5373
  .service('algolia', ['$http', '$q', '$timeout', function algoliaSearchService($http, $q, $timeout) {
4749
5374
  function algoliasearch(applicationID, apiKey, opts) {
4750
- var cloneDeep = require(24);
5375
+ var cloneDeep = require(26);
4751
5376
 
4752
- var getDocumentProtocol = require(20);
5377
+ var getDocumentProtocol = require(22);
4753
5378
 
4754
5379
  opts = cloneDeep(opts || {});
4755
5380
 
@@ -4762,14 +5387,14 @@ window.angular.module('algoliasearch', [])
4762
5387
  return new AlgoliaSearchAngular(applicationID, apiKey, opts);
4763
5388
  }
4764
5389
 
4765
- algoliasearch.version = require(32);
5390
+ algoliasearch.version = require(36);
4766
5391
  algoliasearch.ua = 'Algolia for AngularJS ' + algoliasearch.version;
4767
5392
  algoliasearch.initPlaces = places(algoliasearch);
4768
5393
 
4769
5394
  // we expose into window no matter how we are used, this will allow
4770
5395
  // us to easily debug any website running algolia
4771
5396
  window.__algolia = {
4772
- debug: require(3),
5397
+ debug: require(1),
4773
5398
  algoliasearch: algoliasearch
4774
5399
  };
4775
5400
 
@@ -4800,7 +5425,7 @@ window.angular.module('algoliasearch', [])
4800
5425
  // will cancel the xhr
4801
5426
  timeoutDeferred.resolve('test');
4802
5427
  reject(new errors.RequestTimeout());
4803
- }, opts.timeout);
5428
+ }, opts.timeouts.complete);
4804
5429
 
4805
5430
  var requestHeaders = {};
4806
5431
 
@@ -4926,41 +5551,41 @@ window.angular.module('algoliasearch', [])
4926
5551
  };
4927
5552
  }]);
4928
5553
 
4929
- }).call(this,require(2))
4930
- },{"12":12,"18":18,"2":2,"20":20,"21":21,"22":22,"24":24,"27":27,"3":3,"31":31,"32":32,"7":7,"9":9}],18:[function(require,module,exports){
5554
+ }).call(this,require(12))
5555
+ },{"1":1,"12":12,"14":14,"20":20,"22":22,"23":23,"24":24,"26":26,"29":29,"34":34,"36":36,"5":5,"7":7}],20:[function(require,module,exports){
4931
5556
  'use strict';
4932
5557
 
4933
- var AlgoliaSearch = require(12);
4934
- var createAlgoliasearch = require(19);
5558
+ var AlgoliaSearch = require(14);
5559
+ var createAlgoliasearch = require(21);
4935
5560
 
4936
5561
  module.exports = createAlgoliasearch(AlgoliaSearch);
4937
5562
 
4938
- },{"12":12,"19":19}],19:[function(require,module,exports){
5563
+ },{"14":14,"21":21}],21:[function(require,module,exports){
4939
5564
  (function (process){
4940
5565
  'use strict';
4941
5566
 
4942
- var global = require(8);
4943
- var Promise = global.Promise || require(5).Promise;
5567
+ var global = require(6);
5568
+ var Promise = global.Promise || require(3).Promise;
4944
5569
 
4945
5570
  // This is the standalone browser build entry point
4946
5571
  // Browser implementation of the Algolia Search JavaScript client,
4947
5572
  // using XMLHttpRequest, XDomainRequest and JSONP as fallback
4948
5573
  module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
4949
- var inherits = require(9);
4950
- var errors = require(27);
4951
- var inlineHeaders = require(21);
4952
- var jsonpRequest = require(22);
4953
- var places = require(31);
5574
+ var inherits = require(7);
5575
+ var errors = require(29);
5576
+ var inlineHeaders = require(23);
5577
+ var jsonpRequest = require(24);
5578
+ var places = require(34);
4954
5579
  uaSuffix = uaSuffix || '';
4955
5580
 
4956
5581
  if (process.env.NODE_ENV === 'debug') {
4957
- require(3).enable('algoliasearch*');
5582
+ require(1).enable('algoliasearch*');
4958
5583
  }
4959
5584
 
4960
5585
  function algoliasearch(applicationID, apiKey, opts) {
4961
- var cloneDeep = require(24);
5586
+ var cloneDeep = require(26);
4962
5587
 
4963
- var getDocumentProtocol = require(20);
5588
+ var getDocumentProtocol = require(22);
4964
5589
 
4965
5590
  opts = cloneDeep(opts || {});
4966
5591
 
@@ -4973,14 +5598,14 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
4973
5598
  return new AlgoliaSearchBrowser(applicationID, apiKey, opts);
4974
5599
  }
4975
5600
 
4976
- algoliasearch.version = require(32);
5601
+ algoliasearch.version = require(36);
4977
5602
  algoliasearch.ua = 'Algolia for vanilla JavaScript ' + uaSuffix + algoliasearch.version;
4978
5603
  algoliasearch.initPlaces = places(algoliasearch);
4979
5604
 
4980
5605
  // we expose into window no matter how we are used, this will allow
4981
5606
  // us to easily debug any website running algolia
4982
5607
  global.__algolia = {
4983
- debug: require(3),
5608
+ debug: require(1),
4984
5609
  algoliasearch: algoliasearch
4985
5610
  };
4986
5611
 
@@ -4991,7 +5616,6 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
4991
5616
 
4992
5617
  if (support.hasXMLHttpRequest) {
4993
5618
  support.cors = 'withCredentials' in new XMLHttpRequest();
4994
- support.timeout = 'timeout' in new XMLHttpRequest();
4995
5619
  }
4996
5620
 
4997
5621
  function AlgoliaSearchBrowser() {
@@ -5014,8 +5638,20 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
5014
5638
 
5015
5639
  var body = opts.body;
5016
5640
  var req = support.cors ? new XMLHttpRequest() : new XDomainRequest();
5017
- var ontimeout;
5641
+ var reqTimeout;
5018
5642
  var timedOut;
5643
+ var connected = false;
5644
+
5645
+ reqTimeout = setTimeout(onTimeout, opts.timeouts.connect);
5646
+ // we set an empty onprogress listener
5647
+ // so that XDomainRequest on IE9 is not aborted
5648
+ // refs:
5649
+ // - https://github.com/algolia/algoliasearch-client-js/issues/76
5650
+ // - https://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified?forum=iewebdevelopment
5651
+ req.onprogress = onProgress;
5652
+ if ('onreadystatechange' in req) req.onreadystatechange = onReadyStateChange;
5653
+ req.onload = onLoad;
5654
+ req.onerror = onError;
5019
5655
 
5020
5656
  // do not rely on default XHR async flag, as some analytics code like hotjar
5021
5657
  // breaks it and set it to false by default
@@ -5025,6 +5661,7 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
5025
5661
  req.open(opts.method, url);
5026
5662
  }
5027
5663
 
5664
+ // headers are meant to be sent after open
5028
5665
  if (support.cors) {
5029
5666
  if (body) {
5030
5667
  if (opts.method === 'POST') {
@@ -5037,40 +5674,18 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
5037
5674
  req.setRequestHeader('accept', 'application/json');
5038
5675
  }
5039
5676
 
5040
- // we set an empty onprogress listener
5041
- // so that XDomainRequest on IE9 is not aborted
5042
- // refs:
5043
- // - https://github.com/algolia/algoliasearch-client-js/issues/76
5044
- // - https://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified?forum=iewebdevelopment
5045
- req.onprogress = function noop() {};
5046
-
5047
- req.onload = load;
5048
- req.onerror = error;
5049
-
5050
- if (support.timeout) {
5051
- // .timeout supported by both XHR and XDR,
5052
- // we do receive timeout event, tested
5053
- req.timeout = opts.timeout;
5054
-
5055
- req.ontimeout = timeout;
5056
- } else {
5057
- ontimeout = setTimeout(timeout, opts.timeout);
5058
- }
5059
-
5060
5677
  req.send(body);
5061
5678
 
5062
5679
  // event object not received in IE8, at least
5063
5680
  // but we do not use it, still important to note
5064
- function load(/* event */) {
5681
+ function onLoad(/* event */) {
5065
5682
  // When browser does not supports req.timeout, we can
5066
5683
  // have both a load and timeout event, since handled by a dumb setTimeout
5067
5684
  if (timedOut) {
5068
5685
  return;
5069
5686
  }
5070
5687
 
5071
- if (!support.timeout) {
5072
- clearTimeout(ontimeout);
5073
- }
5688
+ clearTimeout(reqTimeout);
5074
5689
 
5075
5690
  var out;
5076
5691
 
@@ -5095,14 +5710,12 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
5095
5710
  }
5096
5711
  }
5097
5712
 
5098
- function error(event) {
5713
+ function onError(event) {
5099
5714
  if (timedOut) {
5100
5715
  return;
5101
5716
  }
5102
5717
 
5103
- if (!support.timeout) {
5104
- clearTimeout(ontimeout);
5105
- }
5718
+ clearTimeout(reqTimeout);
5106
5719
 
5107
5720
  // error event is trigerred both with XDR/XHR on:
5108
5721
  // - DNS error
@@ -5114,14 +5727,26 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
5114
5727
  );
5115
5728
  }
5116
5729
 
5117
- function timeout() {
5118
- if (!support.timeout) {
5119
- timedOut = true;
5120
- req.abort();
5121
- }
5730
+ function onTimeout() {
5731
+ timedOut = true;
5732
+ req.abort();
5122
5733
 
5123
5734
  reject(new errors.RequestTimeout());
5124
5735
  }
5736
+
5737
+ function onConnect() {
5738
+ connected = true;
5739
+ clearTimeout(reqTimeout);
5740
+ reqTimeout = setTimeout(onTimeout, opts.timeouts.complete);
5741
+ }
5742
+
5743
+ function onProgress() {
5744
+ if (!connected) onConnect();
5745
+ }
5746
+
5747
+ function onReadyStateChange() {
5748
+ if (!connected && req.readyState > 1) onConnect();
5749
+ }
5125
5750
  });
5126
5751
  };
5127
5752
 
@@ -5157,8 +5782,8 @@ module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {
5157
5782
  return algoliasearch;
5158
5783
  };
5159
5784
 
5160
- }).call(this,require(2))
5161
- },{"2":2,"20":20,"21":21,"22":22,"24":24,"27":27,"3":3,"31":31,"32":32,"5":5,"8":8,"9":9}],20:[function(require,module,exports){
5785
+ }).call(this,require(12))
5786
+ },{"1":1,"12":12,"22":22,"23":23,"24":24,"26":26,"29":29,"3":3,"34":34,"36":36,"6":6,"7":7}],22:[function(require,module,exports){
5162
5787
  'use strict';
5163
5788
 
5164
5789
  module.exports = getDocumentProtocol;
@@ -5174,12 +5799,12 @@ function getDocumentProtocol() {
5174
5799
  return protocol;
5175
5800
  }
5176
5801
 
5177
- },{}],21:[function(require,module,exports){
5802
+ },{}],23:[function(require,module,exports){
5178
5803
  'use strict';
5179
5804
 
5180
5805
  module.exports = inlineHeaders;
5181
5806
 
5182
- var encode = require(11);
5807
+ var encode = require(13);
5183
5808
 
5184
5809
  function inlineHeaders(url, headers) {
5185
5810
  if (/\?/.test(url)) {
@@ -5191,12 +5816,12 @@ function inlineHeaders(url, headers) {
5191
5816
  return url + encode(headers);
5192
5817
  }
5193
5818
 
5194
- },{"11":11}],22:[function(require,module,exports){
5819
+ },{"13":13}],24:[function(require,module,exports){
5195
5820
  'use strict';
5196
5821
 
5197
5822
  module.exports = jsonpRequest;
5198
5823
 
5199
- var errors = require(27);
5824
+ var errors = require(29);
5200
5825
 
5201
5826
  var JSONPCounter = 0;
5202
5827
 
@@ -5245,7 +5870,7 @@ function jsonpRequest(url, opts, cb) {
5245
5870
  url += '&' + opts.jsonBody.params;
5246
5871
  }
5247
5872
 
5248
- var ontimeout = setTimeout(timeout, opts.timeout);
5873
+ var ontimeout = setTimeout(timeout, opts.timeouts.complete);
5249
5874
 
5250
5875
  // script onreadystatechange needed only for
5251
5876
  // <= IE8
@@ -5318,10 +5943,10 @@ function jsonpRequest(url, opts, cb) {
5318
5943
  }
5319
5944
  }
5320
5945
 
5321
- },{"27":27}],23:[function(require,module,exports){
5946
+ },{"29":29}],25:[function(require,module,exports){
5322
5947
  module.exports = buildSearchMethod;
5323
5948
 
5324
- var errors = require(27);
5949
+ var errors = require(29);
5325
5950
 
5326
5951
  function buildSearchMethod(queryParam, url) {
5327
5952
  return function search(query, args, callback) {
@@ -5366,12 +5991,12 @@ function buildSearchMethod(queryParam, url) {
5366
5991
  };
5367
5992
  }
5368
5993
 
5369
- },{"27":27}],24:[function(require,module,exports){
5994
+ },{"29":29}],26:[function(require,module,exports){
5370
5995
  module.exports = function clone(obj) {
5371
5996
  return JSON.parse(JSON.stringify(obj));
5372
5997
  };
5373
5998
 
5374
- },{}],25:[function(require,module,exports){
5999
+ },{}],27:[function(require,module,exports){
5375
6000
  module.exports = function deprecate(fn, message) {
5376
6001
  var warned = false;
5377
6002
 
@@ -5388,7 +6013,7 @@ module.exports = function deprecate(fn, message) {
5388
6013
  return deprecated;
5389
6014
  };
5390
6015
 
5391
- },{}],26:[function(require,module,exports){
6016
+ },{}],28:[function(require,module,exports){
5392
6017
  module.exports = function deprecatedMessage(previousUsage, newUsage) {
5393
6018
  var githubAnchorLink = previousUsage.toLowerCase()
5394
6019
  .replace('.', '')
@@ -5398,17 +6023,17 @@ module.exports = function deprecatedMessage(previousUsage, newUsage) {
5398
6023
  '`. Please see https://github.com/algolia/algoliasearch-client-js/wiki/Deprecated#' + githubAnchorLink;
5399
6024
  };
5400
6025
 
5401
- },{}],27:[function(require,module,exports){
6026
+ },{}],29:[function(require,module,exports){
5402
6027
  'use strict';
5403
6028
 
5404
6029
  // This file hosts our error definitions
5405
6030
  // We use custom error "types" so that we can act on them when we need it
5406
6031
  // e.g.: if error instanceof errors.UnparsableJSON then..
5407
6032
 
5408
- var inherits = require(9);
6033
+ var inherits = require(7);
5409
6034
 
5410
6035
  function AlgoliaSearchError(message, extraProperties) {
5411
- var forEach = require(7);
6036
+ var forEach = require(5);
5412
6037
 
5413
6038
  var error = this;
5414
6039
 
@@ -5478,7 +6103,7 @@ module.exports = {
5478
6103
  )
5479
6104
  };
5480
6105
 
5481
- },{"7":7,"9":9}],28:[function(require,module,exports){
6106
+ },{"5":5,"7":7}],30:[function(require,module,exports){
5482
6107
  // Parse cloud does not supports setTimeout
5483
6108
  // We do not store a setTimeout reference in the client everytime
5484
6109
  // We only fallback to a fake setTimeout when not available
@@ -5487,8 +6112,8 @@ module.exports = function exitPromise(fn, _setTimeout) {
5487
6112
  _setTimeout(fn, 0);
5488
6113
  };
5489
6114
 
5490
- },{}],29:[function(require,module,exports){
5491
- var foreach = require(7);
6115
+ },{}],31:[function(require,module,exports){
6116
+ var foreach = require(5);
5492
6117
 
5493
6118
  module.exports = function map(arr, fn) {
5494
6119
  var newArr = [];
@@ -5498,8 +6123,8 @@ module.exports = function map(arr, fn) {
5498
6123
  return newArr;
5499
6124
  };
5500
6125
 
5501
- },{"7":7}],30:[function(require,module,exports){
5502
- var foreach = require(7);
6126
+ },{"5":5}],32:[function(require,module,exports){
6127
+ var foreach = require(5);
5503
6128
 
5504
6129
  module.exports = function merge(destination/* , sources */) {
5505
6130
  var sources = Array.prototype.slice.call(arguments);
@@ -5519,14 +6144,30 @@ module.exports = function merge(destination/* , sources */) {
5519
6144
  return destination;
5520
6145
  };
5521
6146
 
5522
- },{"7":7}],31:[function(require,module,exports){
6147
+ },{"5":5}],33:[function(require,module,exports){
6148
+ module.exports = function omit(obj, test) {
6149
+ var keys = require(10);
6150
+ var foreach = require(5);
6151
+
6152
+ var filtered = {};
6153
+
6154
+ foreach(keys(obj), function doFilter(keyName) {
6155
+ if (test(keyName) !== true) {
6156
+ filtered[keyName] = obj[keyName];
6157
+ }
6158
+ });
6159
+
6160
+ return filtered;
6161
+ };
6162
+
6163
+ },{"10":10,"5":5}],34:[function(require,module,exports){
5523
6164
  module.exports = createPlacesClient;
5524
6165
 
5525
- var buildSearchMethod = require(23);
6166
+ var buildSearchMethod = require(25);
5526
6167
 
5527
6168
  function createPlacesClient(algoliasearch) {
5528
6169
  return function places(appID, apiKey, opts) {
5529
- var cloneDeep = require(24);
6170
+ var cloneDeep = require(26);
5530
6171
 
5531
6172
  opts = opts && cloneDeep(opts) || {};
5532
6173
  opts.hosts = opts.hosts || [
@@ -5550,9 +6191,87 @@ function createPlacesClient(algoliasearch) {
5550
6191
  };
5551
6192
  }
5552
6193
 
5553
- },{"23":23,"24":24}],32:[function(require,module,exports){
6194
+ },{"25":25,"26":26}],35:[function(require,module,exports){
6195
+ (function (global){
6196
+ var debug = require(1)('algoliasearch:src/hostIndexState.js');
6197
+ var localStorageNamespace = 'algoliasearch-client-js';
6198
+
6199
+ var store;
6200
+ var moduleStore = {
6201
+ state: {},
6202
+ set: function(key, data) {
6203
+ this.state[key] = data;
6204
+ return this.state[key];
6205
+ },
6206
+ get: function(key) {
6207
+ return this.state[key] || null;
6208
+ }
6209
+ };
6210
+
6211
+ var localStorageStore = {
6212
+ set: function(key, data) {
6213
+ try {
6214
+ var namespace = JSON.parse(global.localStorage[localStorageNamespace]);
6215
+ namespace[key] = data;
6216
+ global.localStorage[localStorageNamespace] = JSON.stringify(namespace);
6217
+ return namespace[key];
6218
+ } catch (e) {
6219
+ debug('localStorage set failed with', e);
6220
+ cleanup();
6221
+ store = moduleStore;
6222
+ return store.set(key, data);
6223
+ }
6224
+ },
6225
+ get: function(key) {
6226
+ return JSON.parse(global.localStorage[localStorageNamespace])[key] || null;
6227
+ }
6228
+ };
6229
+
6230
+ store = supportsLocalStorage() ? localStorageStore : moduleStore;
6231
+
6232
+ module.exports = {
6233
+ get: getOrSet,
6234
+ set: getOrSet
6235
+ };
6236
+
6237
+ function getOrSet(key, data) {
6238
+ if (arguments.length === 1) {
6239
+ return store.get(key);
6240
+ }
6241
+
6242
+ return store.set(key, data);
6243
+ }
6244
+
6245
+ function supportsLocalStorage() {
6246
+ try {
6247
+ if ('localStorage' in global &&
6248
+ global.localStorage !== null &&
6249
+ !global.localStorage[localStorageNamespace]) {
6250
+ // actual creation of the namespace
6251
+ global.localStorage.setItem(localStorageNamespace, JSON.stringify({}));
6252
+ return true;
6253
+ }
6254
+
6255
+ return false;
6256
+ } catch (_) {
6257
+ return false;
6258
+ }
6259
+ }
6260
+
6261
+ // In case of any error on localStorage, we clean our own namespace, this should handle
6262
+ // quota errors when a lot of keys + data are used
6263
+ function cleanup() {
6264
+ try {
6265
+ global.localStorage.removeItem(localStorageNamespace);
6266
+ } catch (_) {
6267
+ // nothing to do
6268
+ }
6269
+ }
6270
+
6271
+ }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
6272
+ },{"1":1}],36:[function(require,module,exports){
5554
6273
  'use strict';
5555
6274
 
5556
- module.exports = '3.18.0';
6275
+ module.exports = '3.20.3';
5557
6276
 
5558
- },{}]},{},[17]);
6277
+ },{}]},{},[19]);