@searchcraft/javascript-sdk 0.10.3 → 0.10.4

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 (41) hide show
  1. package/dist/components/index.d.ts +1 -1
  2. package/dist/components/index.js +4 -4
  3. package/dist/components/{p-53c795bd.js → p-163402fb.js} +14 -2
  4. package/dist/components/p-163402fb.js.map +1 -0
  5. package/dist/components/{p-508ee769.js → p-2d975f19.js} +2 -2
  6. package/dist/components/{p-508ee769.js.map → p-2d975f19.js.map} +1 -1
  7. package/dist/components/{p-ad569b01.js → p-35ee16e2.js} +2 -2
  8. package/dist/components/{p-ad569b01.js.map → p-35ee16e2.js.map} +1 -1
  9. package/dist/components/{p-da1fb5c0.js → p-4c610bc4.js} +2 -2
  10. package/dist/components/{p-da1fb5c0.js.map → p-4c610bc4.js.map} +1 -1
  11. package/dist/components/{p-5a4be632.js → p-6065aee1.js} +2 -2
  12. package/dist/components/{p-5a4be632.js.map → p-6065aee1.js.map} +1 -1
  13. package/dist/components/{p-d4558d44.js → p-60fd824d.js} +69 -68
  14. package/dist/components/p-60fd824d.js.map +1 -0
  15. package/dist/components/{p-fd564261.js → p-6ed5cca1.js} +4 -4
  16. package/dist/components/{p-fd564261.js.map → p-6ed5cca1.js.map} +1 -1
  17. package/dist/components/{p-6717ab82.js → p-9d2e55a7.js} +2 -2
  18. package/dist/components/{p-6717ab82.js.map → p-9d2e55a7.js.map} +1 -1
  19. package/dist/components/{p-06bac1fc.js → p-eb633481.js} +2 -2
  20. package/dist/components/{p-06bac1fc.js.map → p-eb633481.js.map} +1 -1
  21. package/dist/components/searchcraft-ad.js +1 -1
  22. package/dist/components/searchcraft-facet-list.js +1 -1
  23. package/dist/components/searchcraft-filter-panel.js +3 -3
  24. package/dist/components/searchcraft-input-form.js +1 -1
  25. package/dist/components/searchcraft-pagination.js +1 -1
  26. package/dist/components/searchcraft-popover-button.js +1 -1
  27. package/dist/components/searchcraft-popover-footer.js +1 -1
  28. package/dist/components/searchcraft-popover-form.js +6 -6
  29. package/dist/components/searchcraft-popover-list-item.js +1 -1
  30. package/dist/components/searchcraft-popover-list-view.js +1 -1
  31. package/dist/components/searchcraft-results-info.js +1 -1
  32. package/dist/components/searchcraft-search-result.js +1 -1
  33. package/dist/components/searchcraft-search-results-per-page.js +1 -1
  34. package/dist/components/searchcraft-search-results.js +3 -3
  35. package/dist/components/searchcraft-toggle-button.js +1 -1
  36. package/dist/hydrate/index.js +63 -51
  37. package/dist/hydrate/index.mjs +63 -51
  38. package/dist/types/store/SearchcraftStore.types.d.ts +1 -1
  39. package/package.json +3 -3
  40. package/dist/components/p-53c795bd.js.map +0 -1
  41. package/dist/components/p-d4558d44.js.map +0 -1
@@ -335,7 +335,7 @@ var uniqueTime = (key, measureText) => {
335
335
  };
336
336
  }
337
337
  };
338
- var h = (nodeName, vnodeData, ...children) => {
338
+ var h$1 = (nodeName, vnodeData, ...children) => {
339
339
  let child = null;
340
340
  let key = null;
341
341
  let slotName = null;
@@ -437,7 +437,7 @@ var convertToPrivate = (node) => {
437
437
  if (node.vname) {
438
438
  vnodeData.name = node.vname;
439
439
  }
440
- return h(node.vtag, vnodeData, ...node.vchildren || []);
440
+ return h$1(node.vtag, vnodeData, ...node.vchildren || []);
441
441
  }
442
442
  const vnode = newVNode(node.vtag, node.vtext);
443
443
  vnode.$attrs$ = node.vattrs;
@@ -1275,7 +1275,7 @@ var renderVdom = (hostRef, renderFnResults, isInitialLoad = false) => {
1275
1275
  var _c, _d;
1276
1276
  const hostElm = hostRef.$hostElement$;
1277
1277
  const oldVNode = hostRef.$vnode$ || newVNode(null, null);
1278
- const rootVnode = isHost(renderFnResults) ? renderFnResults : h(null, null, renderFnResults);
1278
+ const rootVnode = isHost(renderFnResults) ? renderFnResults : h$1(null, null, renderFnResults);
1279
1279
  hostTagName = hostElm.tagName;
1280
1280
  if (isInitialLoad && rootVnode.$attrs$) {
1281
1281
  for (const key of Object.keys(rootVnode.$attrs$)) {
@@ -1947,14 +1947,14 @@ var hAsync = (nodeName, vnodeData, ...children) => {
1947
1947
  const flatChildren = children.flat(Infinity);
1948
1948
  if (flatChildren.some((child) => child instanceof Promise)) {
1949
1949
  return Promise.all(flatChildren).then((resolvedChildren) => {
1950
- return h(nodeName, vnodeData, ...resolvedChildren);
1950
+ return h$1(nodeName, vnodeData, ...resolvedChildren);
1951
1951
  }).catch((err2) => {
1952
- return h(nodeName, vnodeData);
1952
+ return h$1(nodeName, vnodeData);
1953
1953
  });
1954
1954
  }
1955
- return h(nodeName, vnodeData, ...flatChildren);
1955
+ return h$1(nodeName, vnodeData, ...flatChildren);
1956
1956
  }
1957
- return h(nodeName, vnodeData);
1957
+ return h$1(nodeName, vnodeData);
1958
1958
  };
1959
1959
  function proxyHostElement(elm, cstr) {
1960
1960
  const cmpMeta = cstr.cmpMeta;
@@ -3222,25 +3222,25 @@ function w(a, e, n, r) {
3222
3222
  return new (n || (n = Promise))(function(i, o) {
3223
3223
  function t(c) {
3224
3224
  try {
3225
- h(r.next(c));
3225
+ d(r.next(c));
3226
3226
  } catch (s) {
3227
3227
  o(s);
3228
3228
  }
3229
3229
  }
3230
3230
  function u(c) {
3231
3231
  try {
3232
- h(r.throw(c));
3232
+ d(r.throw(c));
3233
3233
  } catch (s) {
3234
3234
  o(s);
3235
3235
  }
3236
3236
  }
3237
- function h(c) {
3237
+ function d(c) {
3238
3238
  var s;
3239
3239
  c.done ? i(c.value) : (s = c.value, s instanceof n ? s : new n(function(p) {
3240
3240
  p(s);
3241
3241
  })).then(t, u);
3242
3242
  }
3243
- h((r = r.apply(a, [])).next());
3243
+ d((r = r.apply(a, [])).next());
3244
3244
  });
3245
3245
  }
3246
3246
  function y(a, e) {
@@ -3251,7 +3251,7 @@ function y(a, e) {
3251
3251
  return o = { next: u(0), throw: u(1), return: u(2) }, typeof Symbol == "function" && (o[Symbol.iterator] = function() {
3252
3252
  return this;
3253
3253
  }), o;
3254
- function u(h) {
3254
+ function u(d) {
3255
3255
  return function(c) {
3256
3256
  return function(s) {
3257
3257
  if (n) throw new TypeError("Generator is already executing.");
@@ -3298,7 +3298,7 @@ function y(a, e) {
3298
3298
  }
3299
3299
  if (5 & s[0]) throw s[1];
3300
3300
  return { value: s[0] ? s[1] : void 0, done: !0 };
3301
- }([h, c]);
3301
+ }([d, c]);
3302
3302
  };
3303
3303
  }
3304
3304
  }
@@ -3317,13 +3317,13 @@ function I(a, e) {
3317
3317
  if (e === void 0 && (e = 0), e = e ? 0 | e : 0, typeof a == "string" && (n = a, a = new TextEncoder().encode(n).buffer), !(a instanceof ArrayBuffer)) throw new TypeError("Expected key to be ArrayBuffer or string");
3318
3318
  var r = new Uint32Array([e, e, e, e]);
3319
3319
  (((function(o, t) {
3320
- for (var u = o.byteLength / 16 | 0, h = new Uint32Array(o, 0, 4 * u), c = 0; c < u; c++) {
3321
- var s = h.subarray(4 * c, 4 * (c + 1));
3320
+ for (var u = o.byteLength / 16 | 0, d = new Uint32Array(o, 0, 4 * u), c = 0; c < u; c++) {
3321
+ var s = d.subarray(4 * c, 4 * (c + 1));
3322
3322
  s[0] = Math.imul(s[0], m[0]), s[0] = g(s[0], 15), s[0] = Math.imul(s[0], m[1]), t[0] = t[0] ^ s[0], t[0] = g(t[0], 19), t[0] = t[0] + t[1], t[0] = Math.imul(t[0], 5) + 1444728091, s[1] = Math.imul(s[1], m[1]), s[1] = g(s[1], 16), s[1] = Math.imul(s[1], m[2]), t[1] = t[1] ^ s[1], t[1] = g(t[1], 17), t[1] = t[1] + t[2], t[1] = Math.imul(t[1], 5) + 197830471, s[2] = Math.imul(s[2], m[2]), s[2] = g(s[2], 17), s[2] = Math.imul(s[2], m[3]), t[2] = t[2] ^ s[2], t[2] = g(t[2], 15), t[2] = t[2] + t[3], t[2] = Math.imul(t[2], 5) + 2530024501, s[3] = Math.imul(s[3], m[3]), s[3] = g(s[3], 18), s[3] = Math.imul(s[3], m[0]), t[3] = t[3] ^ s[3], t[3] = g(t[3], 13), t[3] = t[3] + t[0], t[3] = Math.imul(t[3], 5) + 850148119;
3323
3323
  }
3324
3324
  })))(a, r), function(o, t) {
3325
- var u = o.byteLength / 16 | 0, h = o.byteLength % 16, c = new Uint32Array(4), s = new Uint8Array(o, 16 * u, h);
3326
- switch (h) {
3325
+ var u = o.byteLength / 16 | 0, d = o.byteLength % 16, c = new Uint32Array(4), s = new Uint8Array(o, 16 * u, d);
3326
+ switch (d) {
3327
3327
  case 15:
3328
3328
  c[3] = c[3] ^ s[14] << 16;
3329
3329
  case 14:
@@ -3399,11 +3399,11 @@ v("audio", function() {
3399
3399
  var r = new (window.OfflineAudioContext || window.webkitOfflineAudioContext)(1, 5e3, 44100), i = r.createBufferSource(), o = r.createOscillator();
3400
3400
  o.frequency.value = 1e3;
3401
3401
  var t, u = r.createDynamicsCompressor();
3402
- u.threshold.value = -50, u.knee.value = 40, u.ratio.value = 12, u.attack.value = 0, u.release.value = 0.2, o.connect(u), u.connect(r.destination), o.start(), r.oncomplete = function(h) {
3403
- t = h.renderedBuffer.getChannelData(0), e({ sampleHash: H(t), oscillator: o.type, maxChannels: r.destination.maxChannelCount, channelCountMode: i.channelCountMode });
3402
+ u.threshold.value = -50, u.knee.value = 40, u.ratio.value = 12, u.attack.value = 0, u.release.value = 0.2, o.connect(u), u.connect(r.destination), o.start(), r.oncomplete = function(d) {
3403
+ t = d.renderedBuffer.getChannelData(0), e({ sampleHash: H(t), oscillator: o.type, maxChannels: r.destination.maxChannelCount, channelCountMode: i.channelCountMode });
3404
3404
  }, r.startRendering();
3405
- } catch (h) {
3406
- console.error("Error creating audio fingerprint:", h), n(h);
3405
+ } catch (d) {
3406
+ console.error("Error creating audio fingerprint:", d), n(d);
3407
3407
  }
3408
3408
  })];
3409
3409
  });
@@ -3440,8 +3440,8 @@ function Y() {
3440
3440
  if (!i.length || !r.length) {
3441
3441
  var t = n.getExtension("WEBGL_debug_renderer_info");
3442
3442
  if (t) {
3443
- var u = (n.getParameter(t.UNMASKED_VENDOR_WEBGL) || "").toString(), h = (n.getParameter(t.UNMASKED_RENDERER_WEBGL) || "").toString();
3444
- u && (o.vendorUnmasked = u), h && (o.rendererUnmasked = h);
3443
+ var u = (n.getParameter(t.UNMASKED_VENDOR_WEBGL) || "").toString(), d = (n.getParameter(t.UNMASKED_RENDERER_WEBGL) || "").toString();
3444
+ u && (o.vendorUnmasked = u), d && (o.rendererUnmasked = d);
3445
3445
  }
3446
3446
  }
3447
3447
  return o;
@@ -3463,9 +3463,9 @@ function ee(a, e) {
3463
3463
  var s = String(c);
3464
3464
  t[s] = (t[s] || 0) + 1;
3465
3465
  });
3466
- var u = o[0], h = 1;
3466
+ var u = o[0], d = 1;
3467
3467
  return Object.keys(t).forEach(function(c) {
3468
- t[c] > h && (u = c, h = t[c]);
3468
+ t[c] > d && (u = c, d = t[c]);
3469
3469
  }), u;
3470
3470
  }(a.map(function(o) {
3471
3471
  return r in o ? o[r] : void 0;
@@ -3499,14 +3499,14 @@ C().name != "Firefox" && v("fonts", function() {
3499
3499
  var i;
3500
3500
  w(this, void 0, void 0, function() {
3501
3501
  var o, t, u;
3502
- return y(this, function(h) {
3503
- switch (h.label) {
3502
+ return y(this, function(d) {
3503
+ switch (d.label) {
3504
3504
  case 0:
3505
3505
  return document.body ? [3, 2] : [4, (c = 50, new Promise(function(p) {
3506
3506
  return setTimeout(p, c, s);
3507
3507
  }))];
3508
3508
  case 1:
3509
- return h.sent(), [3, 0];
3509
+ return d.sent(), [3, 0];
3510
3510
  case 2:
3511
3511
  if ((o = document.createElement("iframe")).setAttribute("frameBorder", "0"), (t = o.style).setProperty("position", "fixed"), t.setProperty("display", "block", "important"), t.setProperty("visibility", "visible"), t.setProperty("border", "0"), t.setProperty("opacity", "0"), o.src = "about:blank", document.body.appendChild(o), !(u = o.contentDocument || ((i = o.contentWindow) === null || i === void 0 ? void 0 : i.document))) throw new Error("Iframe document is not accessible");
3512
3512
  return r({ iframe: u }), setTimeout(function() {
@@ -3519,14 +3519,14 @@ C().name != "Firefox" && v("fonts", function() {
3519
3519
  })(function(r) {
3520
3520
  var i = r.iframe;
3521
3521
  return w(a, void 0, void 0, function() {
3522
- var o, t, u, h;
3522
+ var o, t, u, d;
3523
3523
  return y(this, function(c) {
3524
3524
  return o = i.createElement("canvas"), t = o.getContext("2d"), u = J.map(function(s) {
3525
3525
  return F(t, s);
3526
- }), h = {}, X.forEach(function(s) {
3526
+ }), d = {}, X.forEach(function(s) {
3527
3527
  var p = F(t, s);
3528
- u.includes(p) || (h[s] = p);
3529
- }), e(h), [2];
3528
+ u.includes(p) || (d[s] = p);
3529
+ }), e(d), [2];
3530
3530
  });
3531
3531
  });
3532
3532
  });
@@ -3596,18 +3596,18 @@ C().name != "Firefox" && v("fonts", function() {
3596
3596
  a({ platform: window.navigator.platform, cookieEnabled: window.navigator.cookieEnabled, productSub: navigator.productSub, product: navigator.product, useragent: navigator.userAgent, hardwareConcurrency: navigator.hardwareConcurrency, browser: { name: e.name, version: e.version }, applePayVersion: ne() });
3597
3597
  });
3598
3598
  });
3599
- var f, re = C().name !== "SamsungBrowser" ? 1 : 3, d = null;
3599
+ var f, re = C().name !== "SamsungBrowser" ? 1 : 3, h = null;
3600
3600
  v("webgl", function() {
3601
3601
  return w(this, void 0, void 0, function() {
3602
3602
  var a;
3603
3603
  return y(this, function(e) {
3604
- typeof document < "u" && ((f = document.createElement("canvas")).width = 200, f.height = 100, d = f.getContext("webgl"));
3604
+ typeof document < "u" && ((f = document.createElement("canvas")).width = 200, f.height = 100, h = f.getContext("webgl"));
3605
3605
  try {
3606
- if (!d) throw new Error("WebGL not supported");
3606
+ if (!h) throw new Error("WebGL not supported");
3607
3607
  return a = Array.from({ length: re }, function() {
3608
3608
  return function() {
3609
3609
  try {
3610
- if (!d) throw new Error("WebGL not supported");
3610
+ if (!h) throw new Error("WebGL not supported");
3611
3611
  var n = `
3612
3612
  attribute vec2 position;
3613
3613
  void main() {
@@ -3618,28 +3618,28 @@ v("webgl", function() {
3618
3618
  void main() {
3619
3619
  gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color
3620
3620
  }
3621
- `, i = d.createShader(d.VERTEX_SHADER), o = d.createShader(d.FRAGMENT_SHADER);
3621
+ `, i = h.createShader(h.VERTEX_SHADER), o = h.createShader(h.FRAGMENT_SHADER);
3622
3622
  if (!i || !o) throw new Error("Failed to create shaders");
3623
- if (d.shaderSource(i, n), d.shaderSource(o, r), d.compileShader(i), !d.getShaderParameter(i, d.COMPILE_STATUS)) throw new Error("Vertex shader compilation failed: " + d.getShaderInfoLog(i));
3624
- if (d.compileShader(o), !d.getShaderParameter(o, d.COMPILE_STATUS)) throw new Error("Fragment shader compilation failed: " + d.getShaderInfoLog(o));
3625
- var t = d.createProgram();
3623
+ if (h.shaderSource(i, n), h.shaderSource(o, r), h.compileShader(i), !h.getShaderParameter(i, h.COMPILE_STATUS)) throw new Error("Vertex shader compilation failed: " + h.getShaderInfoLog(i));
3624
+ if (h.compileShader(o), !h.getShaderParameter(o, h.COMPILE_STATUS)) throw new Error("Fragment shader compilation failed: " + h.getShaderInfoLog(o));
3625
+ var t = h.createProgram();
3626
3626
  if (!t) throw new Error("Failed to create shader program");
3627
- if (d.attachShader(t, i), d.attachShader(t, o), d.linkProgram(t), !d.getProgramParameter(t, d.LINK_STATUS)) throw new Error("Shader program linking failed: " + d.getProgramInfoLog(t));
3628
- d.useProgram(t);
3629
- for (var u = 137, h = new Float32Array(4 * u), c = 2 * Math.PI / u, s = 0; s < u; s++) {
3627
+ if (h.attachShader(t, i), h.attachShader(t, o), h.linkProgram(t), !h.getProgramParameter(t, h.LINK_STATUS)) throw new Error("Shader program linking failed: " + h.getProgramInfoLog(t));
3628
+ h.useProgram(t);
3629
+ for (var u = 137, d = new Float32Array(4 * u), c = 2 * Math.PI / u, s = 0; s < u; s++) {
3630
3630
  var p = s * c;
3631
- h[4 * s] = 0, h[4 * s + 1] = 0, h[4 * s + 2] = Math.cos(p) * (f.width / 2), h[4 * s + 3] = Math.sin(p) * (f.height / 2);
3631
+ d[4 * s] = 0, d[4 * s + 1] = 0, d[4 * s + 2] = Math.cos(p) * (f.width / 2), d[4 * s + 3] = Math.sin(p) * (f.height / 2);
3632
3632
  }
3633
- var q = d.createBuffer();
3634
- d.bindBuffer(d.ARRAY_BUFFER, q), d.bufferData(d.ARRAY_BUFFER, h, d.STATIC_DRAW);
3635
- var R = d.getAttribLocation(t, "position");
3636
- d.enableVertexAttribArray(R), d.vertexAttribPointer(R, 2, d.FLOAT, !1, 0, 0), d.viewport(0, 0, f.width, f.height), d.clearColor(0, 0, 0, 1), d.clear(d.COLOR_BUFFER_BIT), d.drawArrays(d.LINES, 0, 2 * u);
3633
+ var q = h.createBuffer();
3634
+ h.bindBuffer(h.ARRAY_BUFFER, q), h.bufferData(h.ARRAY_BUFFER, d, h.STATIC_DRAW);
3635
+ var R = h.getAttribLocation(t, "position");
3636
+ h.enableVertexAttribArray(R), h.vertexAttribPointer(R, 2, h.FLOAT, !1, 0, 0), h.viewport(0, 0, f.width, f.height), h.clearColor(0, 0, 0, 1), h.clear(h.COLOR_BUFFER_BIT), h.drawArrays(h.LINES, 0, 2 * u);
3637
3637
  var x = new Uint8ClampedArray(f.width * f.height * 4);
3638
- return d.readPixels(0, 0, f.width, f.height, d.RGBA, d.UNSIGNED_BYTE, x), new ImageData(x, f.width, f.height);
3638
+ return h.readPixels(0, 0, f.width, f.height, h.RGBA, h.UNSIGNED_BYTE, x), new ImageData(x, f.width, f.height);
3639
3639
  } catch {
3640
3640
  return new ImageData(1, 1);
3641
3641
  } finally {
3642
- d && (d.bindBuffer(d.ARRAY_BUFFER, null), d.useProgram(null), d.viewport(0, 0, d.drawingBufferWidth, d.drawingBufferHeight), d.clearColor(0, 0, 0, 0));
3642
+ h && (h.bindBuffer(h.ARRAY_BUFFER, null), h.useProgram(null), h.viewport(0, 0, h.drawingBufferWidth, h.drawingBufferHeight), h.clearColor(0, 0, 0, 0));
3643
3643
  }
3644
3644
  }();
3645
3645
  }), [2, { commonImageHash: I(L(a, f.width, f.height).data.toString()).toString() }];
@@ -3790,7 +3790,7 @@ const searchcraftStore = zustand.createStore((_set, get) => {
3790
3790
  // Reset to first page when response count changes
3791
3791
  count === state.searchResultsCount ? state.searchResultsPage : 1,
3792
3792
  searchResultsCount: count,
3793
- ...(facets && { searchResponseFacetPrime: facets }),
3793
+ searchResponseFacetPrime: facets,
3794
3794
  };
3795
3795
  });
3796
3796
  state.logger?.log(O.DEBUG, `Search results: ${JSON.stringify(items)}`);
@@ -5510,6 +5510,10 @@ class SearchcraftFacetList {
5510
5510
  if (!this.fieldName) {
5511
5511
  return;
5512
5512
  }
5513
+ /** When the search term is empty, clear all facets from facetRoot */
5514
+ if (!state.searchTerm) {
5515
+ this.facetRoot = undefined;
5516
+ }
5513
5517
  /** Things to do when the state's search term has changed, but before the response received */
5514
5518
  if (state.searchTerm !== this.lastSearchTerm ||
5515
5519
  state.searchMode !== this.lastSearchMode) {
@@ -5531,6 +5535,14 @@ class SearchcraftFacetList {
5531
5535
  this.facetRoot = mergeFacetRoots(this.fieldName, this.baseFacetRoot, incomingFacetRoot);
5532
5536
  }
5533
5537
  }
5538
+ else if (!facetPrime && Object.keys(this.selectedPaths).length === 0) {
5539
+ /**
5540
+ * If there's not facetPrime returned from the search response,
5541
+ * and no facets are currently selected.
5542
+ * Clear all the displayed facets
5543
+ */
5544
+ this.facetRoot = undefined;
5545
+ }
5534
5546
  this.lastSearchTerm = state.searchTerm;
5535
5547
  this.lastSearchMode = state.searchMode;
5536
5548
  this.lastSortType = state.sortType;
@@ -47,7 +47,7 @@ export interface SearchcraftStateValues {
47
47
  searchMode: 'fuzzy' | 'exact';
48
48
  searchClientResponseItems: SearchClientResponseItem[];
49
49
  searchResponseTimeTaken: number | undefined;
50
- searchResponseFacetPrime: FacetPrime | undefined;
50
+ searchResponseFacetPrime: FacetPrime | undefined | null;
51
51
  searchResultsCount: number;
52
52
  searchResultsPage: number;
53
53
  searchResultsPerPage: number;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@searchcraft/javascript-sdk",
3
3
  "private": false,
4
- "version": "0.10.3",
4
+ "version": "0.10.4",
5
5
  "description": "Searchcraft Javascript SDK",
6
6
  "author": "Searchcraft Inc.",
7
7
  "license": "Apache-2.0",
@@ -44,7 +44,7 @@
44
44
  "nanoid": "^5.0.9"
45
45
  },
46
46
  "devDependencies": {
47
- "@searchcraft/core": "^0.10.3",
47
+ "@searchcraft/core": "^0.10.4",
48
48
  "@stencil/core": "^4.7.0",
49
49
  "@stencil/react-output-target": "^0.8.2",
50
50
  "@stencil/sass": "^3.0.12",
@@ -52,5 +52,5 @@
52
52
  "@types/node": "^16.18.11",
53
53
  "zustand": "^5.0.1"
54
54
  },
55
- "gitHead": "2b3ed003f722e7433046195faaf64951fddba0db"
55
+ "gitHead": "70eeba4e82bb1ce41f5b23ea0d384d75754c676f"
56
56
  }
@@ -1 +0,0 @@
1
- {"file":"p-53c795bd.js","mappings":"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","names":[],"sources":["src/utils/facets.ts","src/components/searchcraft-facet-list/searchcraft-facet-list.tsx"],"sourcesContent":["import type {\n FacetChild,\n FacetChildObject,\n FacetRoot,\n} from '@searchcraft/core';\n\nfunction deepMergeWithSpread(obj1, obj2) {\n const result = { ...obj1 };\n\n for (const key in obj2) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n if (obj2.hasOwnProperty(key)) {\n if (obj2[key] instanceof Object && obj1[key] instanceof Object) {\n result[key] = deepMergeWithSpread(obj1[key], obj2[key]);\n } else {\n result[key] = obj2[key];\n }\n }\n }\n\n return result;\n}\n\n/**\n * Given an array of facet paths, removes parent facet paths.\n */\nexport function removeSubstringMatches(arr: string[]): string[] {\n return arr.filter(\n (entry, index, array) =>\n !array.some(\n (otherEntry, otherIndex) =>\n otherIndex !== index && otherEntry.includes(entry),\n ),\n );\n}\n\ntype FacetChildFragment = {\n count: number;\n path: string;\n};\n\nfunction facetToRecord(facet: FacetChild): Record<string, FacetChildFragment> {\n const records: Record<string, FacetChildFragment> = {};\n\n const traverseAndAddToFragments = (facetChild: FacetChild) => {\n records[facetChild.path] = {\n count: facetChild.count,\n path: facetChild.path,\n };\n\n facetChild.children?.forEach((child) => {\n traverseAndAddToFragments(child);\n });\n };\n\n traverseAndAddToFragments(facet);\n\n return records;\n}\n\nfunction recordToObject(\n record: Record<string, FacetChildFragment>,\n): FacetChildObject {\n const root: FacetChildObject = {\n count: 0,\n path: '/',\n children: {},\n };\n\n Object.keys(record).forEach((key) => {\n const fragment = record[key];\n if (!fragment) {\n return;\n }\n\n if (fragment.path === '/') {\n return;\n }\n const pathParts = fragment.path.substring(1).split('/');\n let currentRoot = root;\n let currentPath = '';\n\n pathParts.forEach((part, index) => {\n const nextPath = `${currentPath}/${part}`;\n if (!currentRoot.children[nextPath]) {\n currentRoot.children[nextPath] = {\n count: 0,\n path: nextPath,\n children: {},\n };\n }\n\n if (index === pathParts.length - 1) {\n currentRoot.children[nextPath].count = fragment.count;\n }\n\n currentPath = nextPath;\n currentRoot = currentRoot.children[nextPath];\n });\n });\n\n return root;\n}\n\nfunction objectToFacet(childObject: FacetChildObject): FacetChild {\n const transformed: FacetChild = {\n count: childObject.count,\n path: childObject.path,\n children: [],\n };\n\n if (Object.keys(childObject.children).length > 0) {\n transformed.children = Object.values(childObject.children).map(\n (subChildObject) => objectToFacet(subChildObject),\n );\n }\n\n return transformed;\n}\n\n/**\n * Filters records with the parent paths from record2 OUT of record1\n */\nfunction filterRecordByParentPaths(\n record1: Record<string, FacetChild>,\n record2: Record<string, FacetChild>,\n): Record<string, FacetChild> {\n // Extract all paths (keys) both records\n const paths1 = Object.keys(record1);\n const paths2 = Object.keys(record2);\n\n // Find all parent paths in record2\n const parentPaths = new Set(\n paths2\n .filter((path) => path.split('/').length > 2) // Only consider paths with more than one level\n .map((path) => path.substring(0, path.lastIndexOf('/'))),\n );\n\n // Filter out keys in record1 that share a parent path with any of the identified parent paths\n const filteredRecord = Object.fromEntries(\n paths1\n .filter(\n (path) => !parentPaths.has(path.substring(0, path.lastIndexOf('/'))),\n )\n .map((path) => [path, record1[path]]), // Reconstruct the key-value pairs\n );\n\n return filteredRecord as Record<string, FacetChild>;\n}\n\nexport function mergeFacetRoots(\n fieldName: string,\n currentRoot: FacetRoot,\n incomingRoot: FacetRoot,\n): FacetRoot {\n const currentArray = currentRoot[fieldName];\n const incomingArray = incomingRoot[fieldName];\n\n const currentRootFacetChild: FacetChild = {\n count: 0,\n path: '/',\n children: currentArray,\n };\n\n const incomingRootFacetChild: FacetChild = {\n count: 0,\n path: '/',\n children: incomingArray,\n };\n\n // Flatten them into records\n const currentRecord: Record<string, FacetChildFragment> = facetToRecord(\n currentRootFacetChild,\n );\n\n const incomingRecord: Record<string, FacetChildFragment> = facetToRecord(\n incomingRootFacetChild,\n );\n\n // Filter out the records from record1 (the current set of records)\n // that share a parent path with record2 (the incoming records)\n const filteredCurrentRecord = filterRecordByParentPaths(\n currentRecord,\n incomingRecord,\n );\n\n // Deep merge the records together\n const mergedRecord: Record<string, FacetChildFragment> = deepMergeWithSpread(\n filteredCurrentRecord,\n incomingRecord,\n );\n\n // Convert into a heirarchical object\n const mergedObject: FacetChildObject = recordToObject(mergedRecord);\n\n // Convert the heirarchical object back to the Facet child structure\n const mergedFacetChild = objectToFacet(mergedObject);\n\n return {\n [fieldName]: mergedFacetChild.children,\n } as FacetRoot;\n}\n","import {\n Component,\n h,\n State,\n Prop,\n Event,\n type EventEmitter,\n} from '@stencil/core';\n\nimport type { FacetChild, FacetRoot } from '@searchcraft/core';\n\nimport { searchcraftStore, type SearchcraftState } from '@store';\nimport { mergeFacetRoots, removeSubstringMatches } from '@utils';\n\n/**\n * This web component is designed to display facets in a search interface, allowing users to refine their search results by applying filters based on various attributes.\n * It is consumed within the `searchcraft-filter-panel`.\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-facet-list field-name=\"title\" />\n * ```\n *\n * ```js\n * // index.js\n * const facetList = document.querySelector('searchcraft-facet-list');\n *\n * facetList.addEventListener('facetSelectionUpdated', () => {\n * console.log('Facet selection updated');\n * });\n * ```\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-facet-list',\n shadow: false,\n})\nexport class SearchcraftFacetList {\n /**\n * The name of the field where facets are applied.\n */\n @Prop() fieldName = '';\n\n /**\n * When the facets are updated.\n */\n @Event() facetSelectionUpdated?: EventEmitter<{ paths: string[] }>;\n\n @State() baseFacetRoot: FacetRoot | undefined;\n @State() facetRoot: FacetRoot | undefined;\n @State() selectedPaths: Record<string, boolean> = {};\n @State() lastTimeTaken: number | undefined;\n hasNewSearchTerm = false;\n lastSearchTerm: string | undefined;\n lastSearchMode: string | undefined;\n lastSortType: string | undefined | null;\n unsubscribe: (() => void) | undefined;\n\n private searchStore = searchcraftStore.getState();\n\n handleStateUpdate(state: SearchcraftState) {\n const facetPrime = state.searchResponseFacetPrime;\n const timeTaken = state.searchResponseTimeTaken;\n\n if (!this.fieldName) {\n return;\n }\n\n /** Things to do when the state's search term has changed, but before the response received */\n if (\n state.searchTerm !== this.lastSearchTerm ||\n state.searchMode !== this.lastSearchMode\n ) {\n this.selectedPaths = {};\n this.hasNewSearchTerm = true;\n }\n\n /** Things to do when a new response with a new facet prime has been received */\n if (timeTaken !== this.lastTimeTaken && facetPrime) {\n this.facetRoot = undefined;\n const incomingFacetRoot: FacetRoot | undefined = facetPrime.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n\n /** Data is from a new search term: completely override our facets */\n if (this.hasNewSearchTerm) {\n this.baseFacetRoot = incomingFacetRoot;\n this.facetRoot = incomingFacetRoot;\n this.hasNewSearchTerm = false;\n } else if (this.baseFacetRoot && incomingFacetRoot) {\n /** Data is from an existing search term, merge the facets together */\n this.facetRoot = mergeFacetRoots(\n this.fieldName,\n this.baseFacetRoot,\n incomingFacetRoot,\n );\n }\n }\n\n this.lastSearchTerm = state.searchTerm;\n this.lastSearchMode = state.searchMode;\n this.lastSortType = state.sortType;\n this.lastTimeTaken = timeTaken;\n }\n\n connectedCallback() {\n this.handleStateUpdate(this.searchStore);\n\n this.unsubscribe = searchcraftStore.subscribe((state) => {\n this.handleStateUpdate(state);\n });\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n }\n\n handleCheckboxChange(path: string) {\n const isCheckboxChecked = !this.selectedPaths[path];\n\n if (isCheckboxChecked) {\n /**\n * Checkbox Checked: Add to the selectedPaths record\n * Uses spread operator here so UI updates.\n */\n this.selectedPaths = {\n ...this.selectedPaths,\n [path]: true,\n };\n } else {\n /**\n * Checkbox Uncheck: Remove any paths and sub-paths\n */\n const updatedPaths = Object.keys(this.selectedPaths).filter(\n (testPath) => !testPath.includes(path),\n );\n\n this.selectedPaths = updatedPaths.reduce(\n (acc, str) => {\n acc[str] = true;\n return acc;\n },\n {} as Record<string, boolean>,\n );\n }\n\n /**\n * Emit the paths array, with parent paths removed.\n */\n const paths = Object.keys(this.selectedPaths).filter(\n (path) => this.selectedPaths[path],\n );\n const pathsWithParentPathsRemoved = removeSubstringMatches(paths);\n\n this.facetSelectionUpdated?.emit({ paths: pathsWithParentPathsRemoved });\n }\n\n formatLabel = (facetChild: FacetChild): string => {\n const label = facetChild.path.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n formatSubLabel = (\n facetChild: FacetChild,\n facetChildAncestor: FacetChild,\n ): string => {\n const facetChildPath = facetChild.path.substring(\n facetChildAncestor.path.length,\n );\n const label = facetChildPath.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n render() {\n if (!this.fieldName) {\n return;\n }\n\n const firstFacet = this.facetRoot?.[this.fieldName];\n\n return (\n <div class='searchcraft-facet-list'>\n {!firstFacet && (\n <p class='searchcraft-facet-list-message'>\n Enter a search to view facets.\n </p>\n )}\n {firstFacet?.map((facetChild: FacetChild) => {\n const isChildSelected = facetChild.children\n ? facetChild.children?.some(\n (child) => this.selectedPaths[child.path],\n )\n : false;\n\n return (\n <div key={facetChild.path} class='searchcraft-facet-list-item'>\n <label class='searchcraft-facet-list-checkbox-label'>\n <div class='searchcraft-facet-list-checkbox-input-wrapper'>\n <input\n class='searchcraft-facet-list-checkbox-input'\n checked={this.selectedPaths[facetChild.path]}\n onChange={(_event: Event) =>\n this.handleCheckboxChange(facetChild.path)\n }\n type='checkbox'\n />\n {isChildSelected ? (\n <div class='searchcraft-facet-list-checkbox-input-dash-icon'>\n <svg width='14' height='3' viewBox='0 0 14 3' fill='none'>\n <title>Checkbox dash</title>\n <line\n x1='1.5'\n y1='1.5'\n x2='12.5'\n y2='1.5'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n />\n </svg>\n </div>\n ) : (\n <div class='searchcraft-facet-list-checkbox-input-check-icon'>\n <svg\n width='16'\n height='16'\n viewBox='0 0 16 16'\n fill='none'\n >\n <title>Checkbox check</title>\n <path\n d='M13.9999 2L5.74988 10L1.99988 6.36364'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n )}\n </div>\n {this.formatLabel(facetChild)}\n </label>\n {facetChild.children && facetChild.children.length > 0 && (\n <div class='searchcraft-facet-child-list'>\n {facetChild.children.map((grandchild) => (\n <label\n key={grandchild.path}\n class='searchcraft-facet-list-checkbox-label searchcraft-facet-child-list-checkbox-label'\n style={{\n display: this.selectedPaths[facetChild.path]\n ? 'flex'\n : 'none',\n }}\n >\n <div class='searchcraft-facet-list-checkbox-input-wrapper searchcraft-facet-child-list-checkbox-input-wrapper'>\n <input\n class='searchcraft-facet-list-checkbox-input searchcraft-facet-child-list-checkbox-input'\n checked={this.selectedPaths[grandchild.path]}\n onChange={(_event: Event) => {\n this.handleCheckboxChange(grandchild.path);\n }}\n type='checkbox'\n />\n <div class='searchcraft-facet-list-checkbox-input-check-icon searchcraft-facet-child-list-checkbox-input-check-icon'>\n <svg\n width='16'\n height='16'\n viewBox='0 0 16 16'\n fill='none'\n >\n <title>Checkbox check</title>\n <path\n d='M13.9999 2L5.74988 10L1.99988 6.36364'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n </div>\n {this.formatSubLabel(grandchild, facetChild)}\n </label>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n}\n"],"version":3}