@211la/search-client 0.15.3 → 0.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.
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ function __generator(thisArg, body) {
62
62
  }
63
63
  }
64
64
 
65
- var version = "0.15.3";
65
+ var version = "0.17.0";
66
66
 
67
67
  var INDEX_NAME = 'instant_search';
68
68
  var DEFAULT_HITS_PER_PAGE = 20;
@@ -106,7 +106,6 @@ var deepGet = function (obj, path) {
106
106
  var sanitizeKeyword = function (keyword) {
107
107
  var characters = [
108
108
  '+',
109
- ' -',
110
109
  '&&',
111
110
  '||',
112
111
  '!',
@@ -126,13 +125,14 @@ var sanitizeKeyword = function (keyword) {
126
125
  ',',
127
126
  ];
128
127
  characters.forEach(function (char) {
129
- keyword = keyword.replaceAll(char, ' ');
128
+ keyword = keyword.split(char).join(' ');
130
129
  });
131
- return keyword.replaceAll(/\s+/g, ' ');
130
+ return keyword.replace(/\s+/g, ' ');
132
131
  };
133
132
 
134
133
  function sanitizeForES(value) {
135
134
  return value
135
+ .replace(/ - /g, ' ')
136
136
  .split(' ')
137
137
  .filter(Boolean)
138
138
  .map(function (term) { return "".concat(sanitizeKeyword(term), "*"); })
@@ -170,6 +170,7 @@ var sanitizeFilterItem = function (item) {
170
170
  var value = item.substring(colonIndex + 1);
171
171
  var sanitizedValue = sanitizeKeyword(value);
172
172
  sanitizedValue = sanitizedValue
173
+ .replace(/ - /g, ' ')
173
174
  .split(' ')
174
175
  .filter(Boolean)
175
176
  .map(function (term) { return "".concat(term); })
@@ -200,8 +201,12 @@ var normalizeCanadianPostalCode = function (postalCode) {
200
201
  var buildZipCodeTermQuery = function (zipCode) {
201
202
  var normalizedPostalCode = normalizeCanadianPostalCode(zipCode);
202
203
  if (normalizedPostalCode) {
203
- var zipPrefix = normalizedPostalCode.split(' ')[0];
204
- var wildcardZip = "".concat(zipPrefix, " ***");
204
+ var firstChar = normalizedPostalCode[0];
205
+ var secondChar = normalizedPostalCode[1];
206
+ var thirdChar = normalizedPostalCode[2];
207
+ var wildcard1Char = "".concat(firstChar, "** ***");
208
+ var wildcard2Char = "".concat(firstChar).concat(secondChar, "* ***");
209
+ var wildcard3Char = "".concat(firstChar).concat(secondChar).concat(thirdChar, " ***");
205
210
  return {
206
211
  bool: {
207
212
  should: [
@@ -212,7 +217,17 @@ var buildZipCodeTermQuery = function (zipCode) {
212
217
  },
213
218
  {
214
219
  term: {
215
- 'metadata.serviceAreaZipCodes.keyword': wildcardZip,
220
+ 'metadata.serviceAreaZipCodes.keyword': wildcard1Char,
221
+ },
222
+ },
223
+ {
224
+ term: {
225
+ 'metadata.serviceAreaZipCodes.keyword': wildcard2Char,
226
+ },
227
+ },
228
+ {
229
+ term: {
230
+ 'metadata.serviceAreaZipCodes.keyword': wildcard3Char,
216
231
  },
217
232
  },
218
233
  ],
@@ -325,7 +340,7 @@ var buildQueryParams = function (settings, instantSearchParams) {
325
340
  .split(',', 2)
326
341
  .map(function (elem) { return parseFloat(elem.trim()); }), lat = _a[0], lng = _a[1];
327
342
  query.distance = Number(instantSearchParams.aroundRadius);
328
- query.distanceUnit = 'mi';
343
+ query.distanceUnit = settings.distanceUnit || 'mi';
329
344
  query.lat = lat;
330
345
  query.lon = lng;
331
346
  }
@@ -782,14 +797,17 @@ var placeAutocomplete = function (opts) {
782
797
  };
783
798
  };
784
799
 
785
- var renderMileItem = function (n) { return "<li class=\"ais-RefinementList-item\">\n <label class=\"ais-RefinementList-label\">\n <input class=\"ais-RefinementList-checkbox\" type=\"checkbox\" value=".concat(n, " />\n <span class=\"ais-RefinementList-labelText\">").concat(n, " miles</span>\n </label>\n </li>"); };
800
+ var renderDistanceItem = function (n, unitLabel) { return "<li class=\"ais-RefinementList-item\">\n <label class=\"ais-RefinementList-label\">\n <input class=\"ais-RefinementList-checkbox\" type=\"checkbox\" value=".concat(n, " />\n <span class=\"ais-RefinementList-labelText\">").concat(n, " ").concat(unitLabel, "</span>\n </label>\n </li>"); };
786
801
  var renderContainer = function (children) { return "<div class=\"ais-RefinementList\">\n <ul class=\"ais-RefinementList-list\">\n ".concat(children, "\n </ul>\n </div>"); };
787
802
  var locationDistanceFilter = function (props) {
788
803
  var container = props.container;
789
804
  var miles = props.miles || [5, 10, 20, 50];
805
+ var unitLabel = props.distanceUnit === 'km' ? 'km' : 'miles';
790
806
  var init = function (options) {
791
807
  var helper = options.helper;
792
- var milesRender = miles.map(renderMileItem).join('\n');
808
+ var milesRender = miles
809
+ .map(function (n) { return renderDistanceItem(n, unitLabel); })
810
+ .join('\n');
793
811
  container.innerHTML = renderContainer(milesRender);
794
812
  var checkboxes = container.querySelectorAll('input[type=checkbox]');
795
813
  checkboxes.forEach(function (cb) {
@@ -12,4 +12,4 @@ var SearchWidget=function(e){"use strict";
12
12
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
13
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
- ***************************************************************************** */var t=function(){return t=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},t.apply(this,arguments)};function n(e,t,n,r){return new(n||(n=Promise))((function(i,a){function o(e){try{s(r.next(e))}catch(e){a(e)}}function c(e){try{s(r.throw(e))}catch(e){a(e)}}function s(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,c)}s((r=r.apply(e,t||[])).next())}))}function r(e,t){var n,r,i,a,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return a={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(a){return function(c){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(i=2&a[0]?r.return:a[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,a[1])).done)return i;switch(r=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,r=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){o.label=a[1];break}if(6===a[0]&&o.label<i[1]){o.label=i[1],i=a;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(a);break}i[2]&&o.ops.pop(),o.trys.pop();continue}a=t.call(e,o)}catch(e){a=[6,e],r=0}finally{n=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}var i=function(e){var t=e.indexOf(".");return-1===t?[e]:[e.slice(0,t),e.slice(t+1)]},a=function(e,t,n){var r=i(t);if(1!==r.length){var o=r[0],c=r[1];e[o]||(e[o]={}),a(e[o],c,n)}else e[r[0]]=n},o=function(e,t){var n=i(t);if(1===n.length){var r=e[n[0]];return void 0===r?null:r}var a=n[0],c=n[1],s=e[a];return s?o(s,c):null},c=function(e){return["+"," -","&&","||","!","(",")","{","}","[","]","^","~","*","?",":","/","&",","].forEach((function(t){e=e.replaceAll(t," ")})),e.replaceAll(/\s+/g," ")};function s(e){return e.split(" ").filter(Boolean).map((function(e){return"".concat(c(e),"*")})).join(" ")}var u=function(e,n){var r;if(!e.query)return null;var i=e.query.split(":"),a=i.length>1?"".concat(i[0],":").concat(s(i[1])):s(e.query),o=(e.restrictSearchableAttributes?e.restrictSearchableAttributes:null!==(r=n.keywordSearchFields)&&void 0!==r?r:[]).map((function(e){return n.fieldSettings&&n.fieldSettings[e]?"".concat(e,"^").concat(n.fieldSettings[e].boost):e}));return{query_string:t({query:a,default_operator:"AND"},o.length&&{fields:o})}},l=function(e){var t=e.indexOf(":");if(-1===t)return e;var n=e.substring(0,t),r=e.substring(t+1),i=c(r);return i=i.split(" ").filter(Boolean).map((function(e){return"".concat(e)})).join(" "),"".concat(n,":").concat(i)},f=function(e){if(!e||!e.length)return null;var t,n="string"==typeof(t=e)?t:t.map((function(e){if("string"==typeof e)return l(e);var t=e.map((function(e){return l(e)}));return"(".concat(t.join(" OR "),")")})).join(" AND ");if(n.includes("metadata.serviceAreaZipCodes")){var r=n.match(/metadata\.serviceAreaZipCodes:"([^"]+)"/);if(r){var i=function(e){var t,n=(t=e.match(/^([A-Z]\d[A-Z])[\s-]?(\d[A-Z]\d)$/))?"".concat(t[1]," ").concat(t[2]):null;if(n){var r=n.split(" ")[0];return{bool:{should:[{term:{"metadata.serviceAreaZipCodes.keyword":n}},{term:{"metadata.serviceAreaZipCodes.keyword":"".concat(r," ***")}}],minimum_should_match:1}}}return{term:{"metadata.serviceAreaZipCodes":e}}}(r[1].toUpperCase().trim()),a=n.replace(/\(metadata\.serviceAreaZipCodes:"[^"]+"\)\s+AND\s+/g,"").replace(/\s+AND\s+\(metadata\.serviceAreaZipCodes:"[^"]+"\)/g,"").replace(/\(metadata\.serviceAreaZipCodes:"[^"]+"\)/g,"").trim();return a?{bool:{must:[{query_string:{query:a}},i]}}:i}}return{query_string:{query:n}}},d=function(e,t){var n,r=function(e,t){var n=[u(t,e),f(t.facetFilters)].filter((function(e){return null!==e}));return n.length?n:"*"}(e,t),i={query:"string"==typeof r?r:JSON.stringify(r)};e.networkId&&(i.networkId=e.networkId),e.sortByDistance&&(i.sortByDistance=e.sortByDistance),e.zipcode&&(i.zipcode=e.zipcode),t.filters&&(i.filters=JSON.stringify((n=t.filters)?n.map((function(e){var t,n;return"exists"===e.queryType?{exists:{field:e.field}}:"raw"===e.queryType?e.query:((t={})[e.queryType]=((n={})[e.field]=e.query,n),t)})).filter(Boolean):[]));var a=t.hitsPerPage||20;if(i.$limit=a,i.$skip=a&&a*t.page||0,t.aroundLatLng&&t.aroundRadius){var o=t.aroundLatLng.split(",",2).map((function(e){return parseFloat(e.trim())})),c=o[0],s=o[1];i.distance=Number(t.aroundRadius),i.distanceUnit="mi",i.lat=c,i.lon=s}return t.openNow&&(i.openAtDay=t.openAtDay,i.openAtMinute=t.openAtMinute),t.facets&&t.facets.length&&(i.aggregations=JSON.stringify(t.facets.reduce((function(e,n){return e[n]={terms:{field:"".concat(n,".keyword"),min_doc_count:(null==t?void 0:t.facetMinDocCount)||0,size:100}},e}),{}))),i},h=function(){function e(e,t){this.settings=e,this.options=t,this.body=this.getNexus211QueryParams()}return e.prototype.getKeywordSearchFields=function(){return this.options.restrictSearchableAttributes?this.options.restrictSearchableAttributes:this.settings.keywordSearchFields},e.prototype.isSearchableAttributesRestricted=function(){var e;return(null===(e=this.options.restrictSearchableAttributes)||void 0===e?void 0:e.length)>0},e.prototype.getNexus211QueryParams=function(){return d(this.settings,this.options)},e}(),p=function(e,t){var n=t.options.query;if(!e)return{matchLevel:"none",matchedWords:[],value:e};var r="";"string"==typeof e?r=e:Array.isArray(e)&&e.length>0&&(r=e.join(" "));var i,a,o,c,s,u,l,f,d=r.toLowerCase().search(n.toLowerCase());return-1===d?{matchLevel:"none",matchedWords:[],value:e}:{fullyHighlighted:0===d&&r.length===n.length,matchLevel:"full",matchedWords:[n],value:(i={text:r,start:d,length:n.length,preTag:t.options.highlightPreTag,postTag:t.options.highlightPostTag},a=i.text,o=i.start,c=i.length,s=i.preTag,u=i.postTag,l=a.slice(0,o),f=a.slice(o+c),"".concat(l).concat(s).concat(a.slice(o,o+c)).concat(u).concat(f))}},g=function(e,n){return n.map((function(n){return function(e,n){var r={};return e.getKeywordSearchFields().forEach((function(t){var i=o(n,t);i&&(Array.isArray(i)&&i.length>0&&"string"==typeof i[0]?a(r,t,i.map((function(t){return p(t,e)}))):"string"==typeof i?a(r,t,p(i,e)):console.warn('The value of field "'.concat(t,'" is not a string or an array of strings. Skipping highlighting for this field.')))})),e.isSearchableAttributesRestricted()&&e.settings.keywordSearchFields.forEach((function(e){o(r,e)||a(r,e,{matchLevel:"none",matchedWords:[],value:o(n,e)})})),t(t({},n),{_highlightResult:r})}(e,t({objectID:n.id},n))}))},m=function(e){return e.aggregations?Object.entries(e.aggregations).reduce((function(e,t){var n=t[0],r=t[1];return e[n]=r.buckets.reduce((function(e,t){return e[t.key]=t.doc_count,e}),{}),e}),{}):{}},v=function(e,t){return{results:[{index:"instant_search",query:e.options.query,params:e.body.query,nbHits:t.__meta.total,hits:g(e,t.data),hitsPerPage:+t.__meta.perPage,page:e.options.page,nbPages:t.__meta.perPage?Math.ceil(t.__meta.total/t.__meta.perPage):0,processingTimeMS:1,exhaustiveNbHits:!0,exhaustiveFacetsCount:!0,facets:m(t)}]}},y=function(){function e(e){this.settings=t(t({},this.getDefaultSettings()),e)}return e.prototype.getDefaultSettings=function(){return{endpoint:"https://admin.211cs.org",searchUri:"/api/search",keywordSearchFields:["service.name","site.name","site.agency.name","site.agency.description"]}},e.prototype.search=function(e){return n(this,void 0,void 0,(function(){var t,n;return r(this,(function(r){switch(r.label){case 0:return t=new h(this.settings,e[0].params),[4,this.makeSearchRequest(t.body)];case 1:return n=r.sent(),[2,v(t,n)]}}))}))},e.prototype.makeSearchRequest=function(e){return n(this,void 0,void 0,(function(){var t,n;return r(this,(function(r){switch(r.label){case 0:if(!this.settings.token)throw new Error("You must provide a valid SearchApi or PublicSearchApi token. Visit https://admin.211cs.org to create one.");return[4,fetch("".concat(this.settings.endpoint).concat(this.settings.searchUri),{headers:{cache:"no-cache",authorization:"SearchApi ".concat(this.settings.token),"content-type":"application/json","x-search-widget-name":"@211la/search-client","x-search-widget-version":"0.15.3"},method:"POST",body:JSON.stringify({search:e})})];case 1:if(200!==(t=r.sent()).status)throw n=t.text(),new Error("Unexpected status ".concat(t.status,": ").concat(n));return[2,t.json()]}}))}))},e.prototype.searchForFacetValues=function(e){return n(this,void 0,void 0,(function(){var i=this;return r(this,(function(a){return[2,Promise.all(e.map((function(a){return n(i,void 0,void 0,(function(){var n;return r(this,(function(r){switch(r.label){case 0:return n=new h(this.settings,t(t({},e[0].params),{facets:[e[0].params.facetName],hitsPerPage:0})),[4,this.makeSearchRequest(n.body)];case 1:return[2,{facetHits:r.sent().aggregations[a.params.facetName].buckets.map((function(e){return{value:e.key,highlighted:e.key,count:e.doc_count,isRefined:!1}})),exhaustiveFacetsCount:!0,processingTimeMS:1}]}}))}))})))]}))}))},e.prototype.addAlgoliaAgent=function(e,t){console.warn("Unhandled addAlgoliaAgent",e,t)},e.prototype.clearCache=function(){return console.warn("Unhandled clearCache"),Promise.resolve()},e}(),b=function(e){switch(typeof e){case"string":return parseFloat(e);case"number":return e;default:return null}};var S=function(e){if(!e.addresses||0===e.addresses.length)return null;var t=e.addresses[0];return{lat:b(t.latitude),lng:b(t.longitude),hit:e}},w=function(e,t){return function(n){var r,i=n.container,a=n.attribute,o=n.placeholder||"",c=(r=n.debounce||200,function(e){var t=null;return function(n){null!==t&&(clearTimeout(t),t=null);var i=n.target.value;t=setTimeout((function(){e(i),t=null}),r)}}),s=t&&"number"===t?"number":"search",u=e?"":"*";return{init:function(e){var t=e.helper;i.innerHTML='<input class="ais-SearchBox-input" type='.concat(s," placeholder=").concat(o,' autocomplete="off" autocorrect="off" autocapitalize="off" maxlength="512">'),i.querySelector("input").addEventListener("input",c((function(e){t.clearRefinements(a),e&&t.addFacetRefinement(a,[e+u]),t.search()})))},getWidgetSearchParameters:function(e){return e.addFacet(a)}}}},L=function(e){return'<li class="ais-RefinementList-item">\n <label class="ais-RefinementList-label">\n <input class="ais-RefinementList-checkbox" type="checkbox" value='.concat(e,' />\n <span class="ais-RefinementList-labelText">').concat(e," miles</span>\n </label>\n </li>")},k=w(!0,"number"),x=w(!0,"string"),A=w(!1,"string"),R=function(){};function P(e,n){return void 0===n&&(n=R),function(r){var i=r.attribute,a=r.transformItems,o=void 0===a?function(e){return e}:a;return{$$type:"cs.taxonomyRefinementList",init:function(n){e(t(t({},this.getWidgetRenderState(n)),{instantSearchInstance:n.instantSearchInstance}),!0)},render:function(n){e(t(t({},this.getWidgetRenderState(n)),{instantSearchInstance:n.instantSearchInstance}),!1)},getRenderState:function(e,n){var r;return t(t({},e),{taxonomyRefinementList:t(t({},e.taxonomyRefinementList),(r={},r[i]=this.getWidgetRenderState(n),r))})},getWidgetRenderState:function(e){var t=e.results,n=e.helper,a=function(e){e.split("|").forEach((function(e){return n.isDisjunctiveRefined(i,e)?n.removeDisjunctiveFacetRefinement(i,e):n.addDisjunctiveFacetRefinement(i,e)})),n.search()};return t?{items:o(t.getRefinements(i)),refine:a,widgetParams:r}:{items:[],refine:a,widgetParams:r}},getWidgetUiState:function(e,n){var r,a=n.searchParameters;return t(t({},e),{taxonomyRefinementList:t(t({},e.taxonomyRefinementList),(r={},r[i]=a.getRefinements(i),r))})},getWidgetSearchParameters:function(e){return e.addDisjunctiveFacet(i)},dispose:function(){n()}}}}var q=function(e){return{render:function(t,n){var r=t.items,i=t.refine,a="string"==typeof e.container?document.querySelector(e.container):e.container;if(n)a.addEventListener("click",(function(e){if(e.target instanceof HTMLElement){var t=e.target.closest("input");t&&i(t.value)}}));else{var o=e.items.map((function(e){var t=e.label,n=e.value,i=n.split("|").every((function(e){return r.find((function(t){return"disjunctive"===t.type&&t.name===e}))}));return'\n <li>\n <label>\n <input\n type="checkbox"\n value="'.concat(n,'"\n ').concat(i?"checked":"","\n />\n ").concat(t,"\n </label>\n </li>\n ")}));a.innerHTML="<ul>".concat(o.join(""),"</ul>")}},dispose:function(){}}};return e.SearchClient=y,e.connectTaxonomyRefinementList=P,e.createTaxonomyRefinementListRenderer=q,e.exactNumberFieldSearch=k,e.exactStringFieldSearch=x,e.googleMaps=function(e){var t=e.container,n=e.renderInfo,r=e.transformHits||S,i="string"==typeof t?document.querySelector(t):t,a=null,o={},c=new google.maps.InfoWindow;return{init:function(){a=new google.maps.Map(i,{})},render:function(e){if(a){Object.keys(o).forEach((function(e){o[e].marker.setMap(null),delete o[e]}));var t=function(e,t){return e.map(t).filter((function(e){return null!=e&&null!==e.lat&&null!==e.lng}))}(e.results.hits,r);t.forEach((function(e){if(!o[e.hit.id]){var t=new google.maps.Marker({position:{lat:e.lat,lng:e.lng},map:a});n&&t.addListener("click",(function(){c.setContent(n(e)),c.open(a,t)})),t.setMap(a),o[e.hit.id]={marker:t,data:e}}})),function(e,t){e.fitBounds(t.reduce((function(e,t){return e.extend(new google.maps.LatLng(t.lat,t.lng)),e}),new google.maps.LatLngBounds))}(a,t)}},dispose:function(e){},getWidgetState:function(e,t){return e},getWidgetSearchParameters:function(e,t){return e}}},e.locationDistanceFilter=function(e){var t=e.container,n=e.miles||[5,10,20,50];return{init:function(e){var r=e.helper,i=n.map(L).join("\n");t.innerHTML='<div class="ais-RefinementList">\n <ul class="ais-RefinementList-list">\n '.concat(i,"\n </ul>\n </div>");var a=t.querySelectorAll("input[type=checkbox]");a.forEach((function(e){e.addEventListener("change",(function(t){var n=!1;a.forEach((function(t){t.value!==e.value&&(t.checked=!1),t.checked&&(n=!0)})),n?r.setQueryParameter("aroundRadius",t.target.value).search():r.setQueryParameter("aroundRadius").search()}))}))}}},e.makeFieldSearch=w,e.noop=R,e.placeAutocomplete=function(e){var t=e.container,n=e.placeholder;return{init:function(e){var r=e.helper;t.innerHTML='<input class="ais-SearchBox-input" type="search" placeholder='.concat(n,"/>");var i=t.querySelector("input[type=search]"),a=new google.maps.places.Autocomplete(i);a.setFields(["place_id","geometry","name","formatted_address"]);var o=new google.maps.Geocoder;a.addListener("place_changed",(function(){var e=a.getPlace();""!==e.name?e.place_id&&o.geocode({placeId:e.place_id},(function(e,t){if("OK"===t){var n=e[0].geometry.location;r.setQueryParameter("aroundLatLng","".concat(n.lat(),", ").concat(n.lng())).search()}else console.warn("Geocoder failed due to: ".concat(t))})):r.setQueryParameter("aroundLatLng").search()}))}}},e.searchBoxFields=function(e){return{init:function(t){var n;e.container.innerHTML=(n=e.attributes.map((function(e){return function(e){return'<li class="ais-RefinementList-item">\n <label class="ais-RefinementList-label">\n <input class="ais-RefinementList-checkbox" type="checkbox" value="'.concat(e.fieldName,'" checked />\n <span class="ais-RefinementList-labelText">').concat(e.title,"</span>\n </label>\n </li>")}(e)})).join("\n"),'<div class="ais-RefinementList">\n <ul class="ais-RefinementList-list">\n '.concat(n,"\n </ul>\n </div>"));e.container.querySelectorAll("input[type=checkbox]").forEach((function(n){n.addEventListener("change",(function(){!function(){var n=e.container.querySelectorAll("input[type=checkbox]:checked");if(n.length){for(var r=[],i=0;i<n.length;i+=1)r.push(n[i].getAttribute("value"));t.helper.setQueryParameter("restrictSearchableAttributes",r)}else t.helper.setQueryParameter("restrictSearchableAttributes");t.helper.search()}()}))}))}}},e.stringFieldSearch=A,e.taxonomyRefinementList=function(e){var n=q(e),r=P(n.render,n.dispose);return t(t({},r(e)),{$$widgetType:"cs.taxonomyRefinementList"})},Object.defineProperty(e,"__esModule",{value:!0}),e}({});
15
+ ***************************************************************************** */var t=function(){return t=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},t.apply(this,arguments)};function n(e,t,n,r){return new(n||(n=Promise))((function(i,a){function o(e){try{s(r.next(e))}catch(e){a(e)}}function c(e){try{s(r.throw(e))}catch(e){a(e)}}function s(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,c)}s((r=r.apply(e,t||[])).next())}))}function r(e,t){var n,r,i,a,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return a={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(a){return function(c){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(i=2&a[0]?r.return:a[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,a[1])).done)return i;switch(r=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,r=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){o.label=a[1];break}if(6===a[0]&&o.label<i[1]){o.label=i[1],i=a;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(a);break}i[2]&&o.ops.pop(),o.trys.pop();continue}a=t.call(e,o)}catch(e){a=[6,e],r=0}finally{n=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}var i=function(e){var t=e.indexOf(".");return-1===t?[e]:[e.slice(0,t),e.slice(t+1)]},a=function(e,t,n){var r=i(t);if(1!==r.length){var o=r[0],c=r[1];e[o]||(e[o]={}),a(e[o],c,n)}else e[r[0]]=n},o=function(e,t){var n=i(t);if(1===n.length){var r=e[n[0]];return void 0===r?null:r}var a=n[0],c=n[1],s=e[a];return s?o(s,c):null},c=function(e){return["+","&&","||","!","(",")","{","}","[","]","^","~","*","?",":","/","&",","].forEach((function(t){e=e.split(t).join(" ")})),e.replace(/\s+/g," ")};function s(e){return e.replace(/ - /g," ").split(" ").filter(Boolean).map((function(e){return"".concat(c(e),"*")})).join(" ")}var u=function(e,n){var r;if(!e.query)return null;var i=e.query.split(":"),a=i.length>1?"".concat(i[0],":").concat(s(i[1])):s(e.query),o=(e.restrictSearchableAttributes?e.restrictSearchableAttributes:null!==(r=n.keywordSearchFields)&&void 0!==r?r:[]).map((function(e){return n.fieldSettings&&n.fieldSettings[e]?"".concat(e,"^").concat(n.fieldSettings[e].boost):e}));return{query_string:t({query:a,default_operator:"AND"},o.length&&{fields:o})}},l=function(e){var t=e.indexOf(":");if(-1===t)return e;var n=e.substring(0,t),r=e.substring(t+1),i=c(r);return i=i.replace(/ - /g," ").split(" ").filter(Boolean).map((function(e){return"".concat(e)})).join(" "),"".concat(n,":").concat(i)},f=function(e){if(!e||!e.length)return null;var t,n="string"==typeof(t=e)?t:t.map((function(e){if("string"==typeof e)return l(e);var t=e.map((function(e){return l(e)}));return"(".concat(t.join(" OR "),")")})).join(" AND ");if(n.includes("metadata.serviceAreaZipCodes")){var r=n.match(/metadata\.serviceAreaZipCodes:"([^"]+)"/);if(r){var i=function(e){var t,n=(t=e.match(/^([A-Z]\d[A-Z])[\s-]?(\d[A-Z]\d)$/))?"".concat(t[1]," ").concat(t[2]):null;if(n){var r=n[0],i=n[1],a=n[2];return{bool:{should:[{term:{"metadata.serviceAreaZipCodes.keyword":n}},{term:{"metadata.serviceAreaZipCodes.keyword":"".concat(r,"** ***")}},{term:{"metadata.serviceAreaZipCodes.keyword":"".concat(r).concat(i,"* ***")}},{term:{"metadata.serviceAreaZipCodes.keyword":"".concat(r).concat(i).concat(a," ***")}}],minimum_should_match:1}}}return{term:{"metadata.serviceAreaZipCodes":e}}}(r[1].toUpperCase().trim()),a=n.replace(/\(metadata\.serviceAreaZipCodes:"[^"]+"\)\s+AND\s+/g,"").replace(/\s+AND\s+\(metadata\.serviceAreaZipCodes:"[^"]+"\)/g,"").replace(/\(metadata\.serviceAreaZipCodes:"[^"]+"\)/g,"").trim();return a?{bool:{must:[{query_string:{query:a}},i]}}:i}}return{query_string:{query:n}}},d=function(e,t){var n,r=function(e,t){var n=[u(t,e),f(t.facetFilters)].filter((function(e){return null!==e}));return n.length?n:"*"}(e,t),i={query:"string"==typeof r?r:JSON.stringify(r)};e.networkId&&(i.networkId=e.networkId),e.sortByDistance&&(i.sortByDistance=e.sortByDistance),e.zipcode&&(i.zipcode=e.zipcode),t.filters&&(i.filters=JSON.stringify((n=t.filters)?n.map((function(e){var t,n;return"exists"===e.queryType?{exists:{field:e.field}}:"raw"===e.queryType?e.query:((t={})[e.queryType]=((n={})[e.field]=e.query,n),t)})).filter(Boolean):[]));var a=t.hitsPerPage||20;if(i.$limit=a,i.$skip=a&&a*t.page||0,t.aroundLatLng&&t.aroundRadius){var o=t.aroundLatLng.split(",",2).map((function(e){return parseFloat(e.trim())})),c=o[0],s=o[1];i.distance=Number(t.aroundRadius),i.distanceUnit=e.distanceUnit||"mi",i.lat=c,i.lon=s}return t.openNow&&(i.openAtDay=t.openAtDay,i.openAtMinute=t.openAtMinute),t.facets&&t.facets.length&&(i.aggregations=JSON.stringify(t.facets.reduce((function(e,n){return e[n]={terms:{field:"".concat(n,".keyword"),min_doc_count:(null==t?void 0:t.facetMinDocCount)||0,size:100}},e}),{}))),i},h=function(){function e(e,t){this.settings=e,this.options=t,this.body=this.getNexus211QueryParams()}return e.prototype.getKeywordSearchFields=function(){return this.options.restrictSearchableAttributes?this.options.restrictSearchableAttributes:this.settings.keywordSearchFields},e.prototype.isSearchableAttributesRestricted=function(){var e;return(null===(e=this.options.restrictSearchableAttributes)||void 0===e?void 0:e.length)>0},e.prototype.getNexus211QueryParams=function(){return d(this.settings,this.options)},e}(),p=function(e,t){var n=t.options.query;if(!e)return{matchLevel:"none",matchedWords:[],value:e};var r="";"string"==typeof e?r=e:Array.isArray(e)&&e.length>0&&(r=e.join(" "));var i,a,o,c,s,u,l,f,d=r.toLowerCase().search(n.toLowerCase());return-1===d?{matchLevel:"none",matchedWords:[],value:e}:{fullyHighlighted:0===d&&r.length===n.length,matchLevel:"full",matchedWords:[n],value:(i={text:r,start:d,length:n.length,preTag:t.options.highlightPreTag,postTag:t.options.highlightPostTag},a=i.text,o=i.start,c=i.length,s=i.preTag,u=i.postTag,l=a.slice(0,o),f=a.slice(o+c),"".concat(l).concat(s).concat(a.slice(o,o+c)).concat(u).concat(f))}},g=function(e,n){return n.map((function(n){return function(e,n){var r={};return e.getKeywordSearchFields().forEach((function(t){var i=o(n,t);i&&(Array.isArray(i)&&i.length>0&&"string"==typeof i[0]?a(r,t,i.map((function(t){return p(t,e)}))):"string"==typeof i?a(r,t,p(i,e)):console.warn('The value of field "'.concat(t,'" is not a string or an array of strings. Skipping highlighting for this field.')))})),e.isSearchableAttributesRestricted()&&e.settings.keywordSearchFields.forEach((function(e){o(r,e)||a(r,e,{matchLevel:"none",matchedWords:[],value:o(n,e)})})),t(t({},n),{_highlightResult:r})}(e,t({objectID:n.id},n))}))},m=function(e){return e.aggregations?Object.entries(e.aggregations).reduce((function(e,t){var n=t[0],r=t[1];return e[n]=r.buckets.reduce((function(e,t){return e[t.key]=t.doc_count,e}),{}),e}),{}):{}},v=function(e,t){return{results:[{index:"instant_search",query:e.options.query,params:e.body.query,nbHits:t.__meta.total,hits:g(e,t.data),hitsPerPage:+t.__meta.perPage,page:e.options.page,nbPages:t.__meta.perPage?Math.ceil(t.__meta.total/t.__meta.perPage):0,processingTimeMS:1,exhaustiveNbHits:!0,exhaustiveFacetsCount:!0,facets:m(t)}]}},y=function(){function e(e){this.settings=t(t({},this.getDefaultSettings()),e)}return e.prototype.getDefaultSettings=function(){return{endpoint:"https://admin.211cs.org",searchUri:"/api/search",keywordSearchFields:["service.name","site.name","site.agency.name","site.agency.description"]}},e.prototype.search=function(e){return n(this,void 0,void 0,(function(){var t,n;return r(this,(function(r){switch(r.label){case 0:return t=new h(this.settings,e[0].params),[4,this.makeSearchRequest(t.body)];case 1:return n=r.sent(),[2,v(t,n)]}}))}))},e.prototype.makeSearchRequest=function(e){return n(this,void 0,void 0,(function(){var t,n;return r(this,(function(r){switch(r.label){case 0:if(!this.settings.token)throw new Error("You must provide a valid SearchApi or PublicSearchApi token. Visit https://admin.211cs.org to create one.");return[4,fetch("".concat(this.settings.endpoint).concat(this.settings.searchUri),{headers:{cache:"no-cache",authorization:"SearchApi ".concat(this.settings.token),"content-type":"application/json","x-search-widget-name":"@211la/search-client","x-search-widget-version":"0.17.0"},method:"POST",body:JSON.stringify({search:e})})];case 1:if(200!==(t=r.sent()).status)throw n=t.text(),new Error("Unexpected status ".concat(t.status,": ").concat(n));return[2,t.json()]}}))}))},e.prototype.searchForFacetValues=function(e){return n(this,void 0,void 0,(function(){var i=this;return r(this,(function(a){return[2,Promise.all(e.map((function(a){return n(i,void 0,void 0,(function(){var n;return r(this,(function(r){switch(r.label){case 0:return n=new h(this.settings,t(t({},e[0].params),{facets:[e[0].params.facetName],hitsPerPage:0})),[4,this.makeSearchRequest(n.body)];case 1:return[2,{facetHits:r.sent().aggregations[a.params.facetName].buckets.map((function(e){return{value:e.key,highlighted:e.key,count:e.doc_count,isRefined:!1}})),exhaustiveFacetsCount:!0,processingTimeMS:1}]}}))}))})))]}))}))},e.prototype.addAlgoliaAgent=function(e,t){console.warn("Unhandled addAlgoliaAgent",e,t)},e.prototype.clearCache=function(){return console.warn("Unhandled clearCache"),Promise.resolve()},e}(),b=function(e){switch(typeof e){case"string":return parseFloat(e);case"number":return e;default:return null}};var S=function(e){if(!e.addresses||0===e.addresses.length)return null;var t=e.addresses[0];return{lat:b(t.latitude),lng:b(t.longitude),hit:e}},w=function(e,t){return function(n){var r,i=n.container,a=n.attribute,o=n.placeholder||"",c=(r=n.debounce||200,function(e){var t=null;return function(n){null!==t&&(clearTimeout(t),t=null);var i=n.target.value;t=setTimeout((function(){e(i),t=null}),r)}}),s=t&&"number"===t?"number":"search",u=e?"":"*";return{init:function(e){var t=e.helper;i.innerHTML='<input class="ais-SearchBox-input" type='.concat(s," placeholder=").concat(o,' autocomplete="off" autocorrect="off" autocapitalize="off" maxlength="512">'),i.querySelector("input").addEventListener("input",c((function(e){t.clearRefinements(a),e&&t.addFacetRefinement(a,[e+u]),t.search()})))},getWidgetSearchParameters:function(e){return e.addFacet(a)}}}},k=w(!0,"number"),L=w(!0,"string"),x=w(!1,"string"),A=function(){};function R(e,n){return void 0===n&&(n=A),function(r){var i=r.attribute,a=r.transformItems,o=void 0===a?function(e){return e}:a;return{$$type:"cs.taxonomyRefinementList",init:function(n){e(t(t({},this.getWidgetRenderState(n)),{instantSearchInstance:n.instantSearchInstance}),!0)},render:function(n){e(t(t({},this.getWidgetRenderState(n)),{instantSearchInstance:n.instantSearchInstance}),!1)},getRenderState:function(e,n){var r;return t(t({},e),{taxonomyRefinementList:t(t({},e.taxonomyRefinementList),(r={},r[i]=this.getWidgetRenderState(n),r))})},getWidgetRenderState:function(e){var t=e.results,n=e.helper,a=function(e){e.split("|").forEach((function(e){return n.isDisjunctiveRefined(i,e)?n.removeDisjunctiveFacetRefinement(i,e):n.addDisjunctiveFacetRefinement(i,e)})),n.search()};return t?{items:o(t.getRefinements(i)),refine:a,widgetParams:r}:{items:[],refine:a,widgetParams:r}},getWidgetUiState:function(e,n){var r,a=n.searchParameters;return t(t({},e),{taxonomyRefinementList:t(t({},e.taxonomyRefinementList),(r={},r[i]=a.getRefinements(i),r))})},getWidgetSearchParameters:function(e){return e.addDisjunctiveFacet(i)},dispose:function(){n()}}}}var P=function(e){return{render:function(t,n){var r=t.items,i=t.refine,a="string"==typeof e.container?document.querySelector(e.container):e.container;if(n)a.addEventListener("click",(function(e){if(e.target instanceof HTMLElement){var t=e.target.closest("input");t&&i(t.value)}}));else{var o=e.items.map((function(e){var t=e.label,n=e.value,i=n.split("|").every((function(e){return r.find((function(t){return"disjunctive"===t.type&&t.name===e}))}));return'\n <li>\n <label>\n <input\n type="checkbox"\n value="'.concat(n,'"\n ').concat(i?"checked":"","\n />\n ").concat(t,"\n </label>\n </li>\n ")}));a.innerHTML="<ul>".concat(o.join(""),"</ul>")}},dispose:function(){}}};return e.SearchClient=y,e.connectTaxonomyRefinementList=R,e.createTaxonomyRefinementListRenderer=P,e.exactNumberFieldSearch=k,e.exactStringFieldSearch=L,e.googleMaps=function(e){var t=e.container,n=e.renderInfo,r=e.transformHits||S,i="string"==typeof t?document.querySelector(t):t,a=null,o={},c=new google.maps.InfoWindow;return{init:function(){a=new google.maps.Map(i,{})},render:function(e){if(a){Object.keys(o).forEach((function(e){o[e].marker.setMap(null),delete o[e]}));var t=function(e,t){return e.map(t).filter((function(e){return null!=e&&null!==e.lat&&null!==e.lng}))}(e.results.hits,r);t.forEach((function(e){if(!o[e.hit.id]){var t=new google.maps.Marker({position:{lat:e.lat,lng:e.lng},map:a});n&&t.addListener("click",(function(){c.setContent(n(e)),c.open(a,t)})),t.setMap(a),o[e.hit.id]={marker:t,data:e}}})),function(e,t){e.fitBounds(t.reduce((function(e,t){return e.extend(new google.maps.LatLng(t.lat,t.lng)),e}),new google.maps.LatLngBounds))}(a,t)}},dispose:function(e){},getWidgetState:function(e,t){return e},getWidgetSearchParameters:function(e,t){return e}}},e.locationDistanceFilter=function(e){var t=e.container,n=e.miles||[5,10,20,50],r="km"===e.distanceUnit?"km":"miles";return{init:function(e){var i=e.helper,a=n.map((function(e){return function(e,t){return'<li class="ais-RefinementList-item">\n <label class="ais-RefinementList-label">\n <input class="ais-RefinementList-checkbox" type="checkbox" value='.concat(e,' />\n <span class="ais-RefinementList-labelText">').concat(e," ").concat(t,"</span>\n </label>\n </li>")}(e,r)})).join("\n");t.innerHTML='<div class="ais-RefinementList">\n <ul class="ais-RefinementList-list">\n '.concat(a,"\n </ul>\n </div>");var o=t.querySelectorAll("input[type=checkbox]");o.forEach((function(e){e.addEventListener("change",(function(t){var n=!1;o.forEach((function(t){t.value!==e.value&&(t.checked=!1),t.checked&&(n=!0)})),n?i.setQueryParameter("aroundRadius",t.target.value).search():i.setQueryParameter("aroundRadius").search()}))}))}}},e.makeFieldSearch=w,e.noop=A,e.placeAutocomplete=function(e){var t=e.container,n=e.placeholder;return{init:function(e){var r=e.helper;t.innerHTML='<input class="ais-SearchBox-input" type="search" placeholder='.concat(n,"/>");var i=t.querySelector("input[type=search]"),a=new google.maps.places.Autocomplete(i);a.setFields(["place_id","geometry","name","formatted_address"]);var o=new google.maps.Geocoder;a.addListener("place_changed",(function(){var e=a.getPlace();""!==e.name?e.place_id&&o.geocode({placeId:e.place_id},(function(e,t){if("OK"===t){var n=e[0].geometry.location;r.setQueryParameter("aroundLatLng","".concat(n.lat(),", ").concat(n.lng())).search()}else console.warn("Geocoder failed due to: ".concat(t))})):r.setQueryParameter("aroundLatLng").search()}))}}},e.searchBoxFields=function(e){return{init:function(t){var n;e.container.innerHTML=(n=e.attributes.map((function(e){return function(e){return'<li class="ais-RefinementList-item">\n <label class="ais-RefinementList-label">\n <input class="ais-RefinementList-checkbox" type="checkbox" value="'.concat(e.fieldName,'" checked />\n <span class="ais-RefinementList-labelText">').concat(e.title,"</span>\n </label>\n </li>")}(e)})).join("\n"),'<div class="ais-RefinementList">\n <ul class="ais-RefinementList-list">\n '.concat(n,"\n </ul>\n </div>"));e.container.querySelectorAll("input[type=checkbox]").forEach((function(n){n.addEventListener("change",(function(){!function(){var n=e.container.querySelectorAll("input[type=checkbox]:checked");if(n.length){for(var r=[],i=0;i<n.length;i+=1)r.push(n[i].getAttribute("value"));t.helper.setQueryParameter("restrictSearchableAttributes",r)}else t.helper.setQueryParameter("restrictSearchableAttributes");t.helper.search()}()}))}))}}},e.stringFieldSearch=x,e.taxonomyRefinementList=function(e){var n=P(e),r=R(n.render,n.dispose);return t(t({},r(e)),{$$widgetType:"cs.taxonomyRefinementList"})},Object.defineProperty(e,"__esModule",{value:!0}),e}({});
@@ -8,4 +8,5 @@ export interface SearchClientSettings {
8
8
  zipcode?: string;
9
9
  fieldSettings?: FieldSettings;
10
10
  keywordSearchFields: string[];
11
+ distanceUnit?: 'mi' | 'km';
11
12
  }
@@ -1,3 +1,3 @@
1
1
  export declare const deepSet: <T>(obj: Record<string, any>, path: string, value: T) => void;
2
2
  export declare const deepGet: (obj: Record<string, any>, path: string) => any;
3
- export declare const sanitizeKeyword: (keyword: any) => any;
3
+ export declare const sanitizeKeyword: (keyword: string) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@211la/search-client",
3
- "version": "0.15.3",
3
+ "version": "0.17.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/src/index.d.ts",
6
6
  "files": [