@usereactify/search 5.60.0-beta.0 → 5.60.0-beta.1

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 (51) hide show
  1. package/CHANGELOG.md +16 -2
  2. package/dist/package.json +1 -1
  3. package/dist/src/components/Sensor/SensorSearchTerm.d.ts +1 -2
  4. package/dist/src/components/Sensor/SensorSearchTerm.js +38 -120
  5. package/dist/src/components/Sensor/SensorSearchTerm.js.map +1 -1
  6. package/dist/src/components/Sensor/Sensors.d.ts +1 -3
  7. package/dist/src/components/Sensor/Sensors.js +10 -29
  8. package/dist/src/components/Sensor/Sensors.js.map +1 -1
  9. package/dist/src/components/Sensor/index.d.ts +0 -2
  10. package/dist/src/components/Sensor/index.js +0 -4
  11. package/dist/src/components/Sensor/index.js.map +1 -1
  12. package/dist/src/search-request-builder/base-builders.d.ts +18 -0
  13. package/dist/src/search-request-builder/base-builders.js +184 -0
  14. package/dist/src/search-request-builder/base-builders.js.map +1 -0
  15. package/dist/src/search-request-builder/curation-builders.d.ts +2 -0
  16. package/dist/src/search-request-builder/curation-builders.js +44 -0
  17. package/dist/src/search-request-builder/curation-builders.js.map +1 -0
  18. package/dist/src/search-request-builder/index.d.ts +3 -0
  19. package/dist/src/search-request-builder/index.js +12 -0
  20. package/dist/src/search-request-builder/index.js.map +1 -0
  21. package/dist/src/search-request-builder/search-request-builder.d.ts +3 -0
  22. package/dist/src/search-request-builder/search-request-builder.js +54 -0
  23. package/dist/src/search-request-builder/search-request-builder.js.map +1 -0
  24. package/dist/src/search-request-builder/types.d.ts +105 -0
  25. package/dist/src/search-request-builder/types.js +30 -0
  26. package/dist/src/search-request-builder/types.js.map +1 -0
  27. package/dist/src/search-request-builder/utils.d.ts +27 -0
  28. package/dist/src/search-request-builder/utils.js +144 -0
  29. package/dist/src/search-request-builder/utils.js.map +1 -0
  30. package/dist/src/types/elastic.d.ts +6 -9
  31. package/dist/src/types/elastic.js.map +1 -1
  32. package/dist/src/types/firestore.d.ts +2 -2
  33. package/dist/src/types/firestore.js.map +1 -1
  34. package/dist/src/utility/config.d.ts +2 -2
  35. package/dist/src/utility/config.js +5 -8
  36. package/dist/src/utility/config.js.map +1 -1
  37. package/dist/src/utility/props.d.ts +5 -224
  38. package/dist/src/utility/props.js +54 -101
  39. package/dist/src/utility/props.js.map +1 -1
  40. package/dist/src/utility/server.js +1 -1
  41. package/dist/src/utility/server.js.map +1 -1
  42. package/package.json +1 -1
  43. package/dist/src/components/Sensor/SensorCollectionWeighted.d.ts +0 -1
  44. package/dist/src/components/Sensor/SensorCollectionWeighted.js +0 -21
  45. package/dist/src/components/Sensor/SensorCollectionWeighted.js.map +0 -1
  46. package/dist/src/components/Sensor/SensorSearchWeighted.d.ts +0 -1
  47. package/dist/src/components/Sensor/SensorSearchWeighted.js +0 -22
  48. package/dist/src/components/Sensor/SensorSearchWeighted.js.map +0 -1
  49. package/dist/src/utility/queries.d.ts +0 -393
  50. package/dist/src/utility/queries.js +0 -197
  51. package/dist/src/utility/queries.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -2,12 +2,26 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
- ## [5.60.0-beta.0](///compare/beta-v5.59.0-beta.8...beta-v5.60.0-beta.0) (2026-01-14)
5
+ ## [5.60.0-beta.1](///compare/beta-v5.59.0-beta.8...beta-v5.60.0-beta.1) (2026-01-15)
6
6
 
7
7
 
8
8
  ### Features
9
9
 
10
- * add configBaseUrl override and split weighted search into separate base/curation flags 2678d7e
10
+ * add configBaseUrl prop to ReactifySearchProvider d585de4
11
+ * Implement modular search request builder 2975d84
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * reposition product card weight component to card level 4a387eb
17
+
18
+ ## [5.60.0-beta.0](///compare/beta-v5.59.0-beta.8...beta-v5.60.0-beta.0) (2026-01-15)
19
+
20
+
21
+ ### Features
22
+
23
+ * add configBaseUrl prop to ReactifySearchProvider d585de4
24
+ * Implement modular search request builder 2975d84
11
25
 
12
26
 
13
27
  ### Bug Fixes
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@usereactify/search",
3
3
  "description": "React UI library for Reactify Search",
4
- "version": "5.60.0-beta.0",
4
+ "version": "5.60.0-beta.1",
5
5
  "license": "MIT",
6
6
  "main": "dist/src/index.js",
7
7
  "types": "dist/src/index.d.ts",
@@ -1,2 +1 @@
1
- import React from "react";
2
- export declare const SensorSearchTerm: React.FC;
1
+ export declare function SensorSearchTerm(): JSX.Element | null;
@@ -1,28 +1,42 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SensorSearchTerm = void 0;
7
- const react_1 = __importDefault(require("react"));
29
+ exports.SensorSearchTerm = SensorSearchTerm;
30
+ const react_1 = __importStar(require("react"));
8
31
  const ahooks_1 = require("ahooks");
9
32
  const DataSearch_1 = __importDefault(require("@usereactify/search-internals/lib/components/search/DataSearch"));
10
33
  const hooks_1 = require("../../hooks");
11
- const SensorSearchTerm = () => {
34
+ const props_1 = require("../../utility/props");
35
+ function SensorSearchTerm() {
12
36
  const { options, config } = (0, hooks_1.useReactifySearchContext)();
13
37
  const { track } = (0, hooks_1.useAnalytics)();
14
38
  const { searchTerm } = (0, hooks_1.useSearch)();
15
- const [searchTermDebounced, setSearchTermDebounced] = react_1.default.useState(searchTerm);
16
- // ignore search fields only set for instant search
17
- const searchFields = react_1.default.useMemo(() => {
18
- if (options.mode === "search") {
19
- return config.fields.filter((field) => ["always_search", "search_page"].includes(field.searchType));
20
- }
21
- if (options.mode === "instant-search") {
22
- return config.fields.filter((field) => ["always_search", "instant_search"].includes(field.searchType));
23
- }
24
- return [];
25
- }, [config.fields]);
39
+ const [searchTermDebounced, setSearchTermDebounced] = (0, react_1.useState)(searchTerm);
26
40
  const { run: runDebouncedTriggerQuery, cancel: cancelDebouncedTriggerQuery } = (0, ahooks_1.useDebounceFn)((value) => {
27
41
  setSearchTermDebounced(value);
28
42
  let trimmedSearchTerm = searchTerm.trim();
@@ -30,114 +44,18 @@ const SensorSearchTerm = () => {
30
44
  return;
31
45
  track({ eventName: "search", payload: { searchTerm: trimmedSearchTerm } });
32
46
  }, { wait: 300 });
33
- react_1.default.useEffect(() => {
47
+ (0, react_1.useEffect)(() => {
34
48
  runDebouncedTriggerQuery(searchTerm);
35
49
  }, [searchTerm]);
36
- if (searchFields.length === 0)
50
+ const reactiveProps = (0, props_1.getPropsSensorSearchTerm)({
51
+ config: config,
52
+ provider: options,
53
+ searchTerm: searchTermDebounced,
54
+ });
55
+ if (!reactiveProps) {
37
56
  return null;
57
+ }
38
58
  return (react_1.default.createElement(react_1.default.Fragment, null,
39
- react_1.default.createElement(DataSearch_1.default, { fuzziness: 1, queryFormat: "and", autosuggest: false, value: searchTermDebounced, componentId: "SensorSearchTerm", style: { display: "none" }, dataField: searchFields.map((field) => field.field), fieldWeights: searchFields.map((field) => field.importance), customQuery: (value, props) => {
40
- const valueNormal = value.toLowerCase().trim();
41
- const conditions = [];
42
- if (valueNormal) {
43
- if (options.market) {
44
- conditions.push({
45
- nested: {
46
- path: "curations",
47
- query: {
48
- bool: {
49
- must: [
50
- {
51
- term: {
52
- "curations.searchTerm.keyword": valueNormal,
53
- },
54
- },
55
- {
56
- term: {
57
- "curations.markets.keyword": options.market,
58
- },
59
- },
60
- ],
61
- },
62
- },
63
- },
64
- });
65
- }
66
- else {
67
- conditions.push({
68
- nested: {
69
- path: "curations",
70
- query: {
71
- term: {
72
- "curations.searchTerm.keyword": valueNormal,
73
- },
74
- },
75
- },
76
- });
77
- }
78
- }
79
- const fieldsPhrase = props.dataField.map((field, index) => `${field}^${props.fieldWeights[index]}`);
80
- if (fieldsPhrase.length > 0) {
81
- conditions.push({
82
- multi_match: {
83
- query: valueNormal,
84
- fields: fieldsPhrase,
85
- type: "phrase",
86
- operator: "and",
87
- },
88
- });
89
- }
90
- const fieldsPhrasePrefix = props.dataField
91
- .map((field, index) => `${field}^${props.fieldWeights[index]}`)
92
- .filter((field) => !field.includes("."));
93
- if (fieldsPhrasePrefix.length > 0) {
94
- conditions.push({
95
- multi_match: {
96
- query: valueNormal,
97
- fields: fieldsPhrasePrefix,
98
- type: "phrase_prefix",
99
- operator: "and",
100
- },
101
- });
102
- }
103
- const fieldsCrossFields = props.dataField.map((field, index) => `${field}^${props.fieldWeights[index]}`);
104
- if (fieldsCrossFields.length > 0) {
105
- conditions.push({
106
- multi_match: {
107
- query: valueNormal,
108
- fields: fieldsCrossFields,
109
- type: "cross_fields",
110
- operator: "and",
111
- },
112
- });
113
- }
114
- const fieldsSpanFirst = props.dataField
115
- .filter((field) => {
116
- if (field.endsWith(".keyword")) {
117
- return false;
118
- }
119
- return true;
120
- })
121
- .map((field) => ({
122
- span_first: {
123
- match: {
124
- span_term: { [`${field}`]: valueNormal },
125
- },
126
- end: 1,
127
- },
128
- }));
129
- if (fieldsSpanFirst.length > 0) {
130
- conditions.push(...fieldsSpanFirst);
131
- }
132
- return {
133
- query: {
134
- bool: {
135
- should: conditions,
136
- minimum_should_match: "1",
137
- },
138
- },
139
- };
140
- } })));
141
- };
142
- exports.SensorSearchTerm = SensorSearchTerm;
59
+ react_1.default.createElement(DataSearch_1.default, { fuzziness: 1, queryFormat: "and", autosuggest: false, value: searchTermDebounced, componentId: "SensorSearchTerm", style: { display: "none" }, dataField: reactiveProps.dataField, fieldWeights: reactiveProps.fieldWeights, customQuery: reactiveProps.customQuery })));
60
+ }
143
61
  //# sourceMappingURL=SensorSearchTerm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SensorSearchTerm.js","sourceRoot":"","sources":["../../../../src/components/Sensor/SensorSearchTerm.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { useDebounceFn } from \"ahooks\";\nimport DataSearch from \"@usereactify/search-internals/lib/components/search/DataSearch\";\n\nimport { useAnalytics, useReactifySearchContext, useSearch } from \"../../hooks\";\n\nexport const SensorSearchTerm: React.FC = () => {\n const { options, config } = useReactifySearchContext();\n const { track } = useAnalytics();\n const { searchTerm } = useSearch();\n\n const [searchTermDebounced, setSearchTermDebounced] = React.useState<string>(searchTerm);\n\n // ignore search fields only set for instant search\n const searchFields = React.useMemo(() => {\n if (options.mode === \"search\") {\n return config.fields.filter((field) => [\"always_search\", \"search_page\"].includes(field.searchType));\n }\n if (options.mode === \"instant-search\") {\n return config.fields.filter((field) => [\"always_search\", \"instant_search\"].includes(field.searchType));\n }\n return [];\n }, [config.fields]);\n\n const { run: runDebouncedTriggerQuery, cancel: cancelDebouncedTriggerQuery } = useDebounceFn(\n (value: string) => {\n setSearchTermDebounced(value);\n let trimmedSearchTerm = searchTerm.trim();\n if (!trimmedSearchTerm || (trimmedSearchTerm && trimmedSearchTerm.length < 3)) return;\n track({ eventName: \"search\", payload: { searchTerm: trimmedSearchTerm } });\n },\n { wait: 300 }\n );\n\n React.useEffect(() => {\n runDebouncedTriggerQuery(searchTerm);\n }, [searchTerm]);\n\n if (searchFields.length === 0) return null;\n\n return (\n <>\n <DataSearch\n fuzziness={1}\n queryFormat=\"and\"\n autosuggest={false}\n value={searchTermDebounced}\n componentId=\"SensorSearchTerm\"\n style={{ display: \"none\" }}\n dataField={searchFields.map((field) => field.field)}\n fieldWeights={searchFields.map((field) => field.importance)}\n customQuery={(value, props) => {\n const valueNormal = value.toLowerCase().trim();\n const conditions: Array<unknown> = [];\n\n if (valueNormal) {\n if (options.market) {\n conditions.push({\n nested: {\n path: \"curations\",\n query: {\n bool: {\n must: [\n {\n term: {\n \"curations.searchTerm.keyword\": valueNormal,\n },\n },\n {\n term: {\n \"curations.markets.keyword\": options.market,\n },\n },\n ],\n },\n },\n },\n });\n } else {\n conditions.push({\n nested: {\n path: \"curations\",\n query: {\n term: {\n \"curations.searchTerm.keyword\": valueNormal,\n },\n },\n },\n });\n }\n }\n\n const fieldsPhrase = props.dataField.map(\n (field: string, index: number) => `${field}^${props.fieldWeights[index]}`\n );\n if (fieldsPhrase.length > 0) {\n conditions.push({\n multi_match: {\n query: valueNormal,\n fields: fieldsPhrase,\n type: \"phrase\",\n operator: \"and\",\n },\n });\n }\n\n const fieldsPhrasePrefix = props.dataField\n .map((field: string, index: number) => `${field}^${props.fieldWeights[index]}`)\n .filter((field: string) => !field.includes(\".\"));\n\n if (fieldsPhrasePrefix.length > 0) {\n conditions.push({\n multi_match: {\n query: valueNormal,\n fields: fieldsPhrasePrefix,\n type: \"phrase_prefix\",\n operator: \"and\",\n },\n });\n }\n\n const fieldsCrossFields = props.dataField.map(\n (field: string, index: number) => `${field}^${props.fieldWeights[index]}`\n );\n if (fieldsCrossFields.length > 0) {\n conditions.push({\n multi_match: {\n query: valueNormal,\n fields: fieldsCrossFields,\n type: \"cross_fields\",\n operator: \"and\",\n },\n });\n }\n\n const fieldsSpanFirst: any = props.dataField\n .filter((field: string) => {\n if (field.endsWith(\".keyword\")) {\n return false;\n }\n\n return true;\n })\n .map((field: string) => ({\n span_first: {\n match: {\n span_term: { [`${field}`]: valueNormal },\n },\n end: 1,\n },\n }));\n if (fieldsSpanFirst.length > 0) {\n conditions.push(...fieldsSpanFirst);\n }\n\n return {\n query: {\n bool: {\n should: conditions,\n minimum_should_match: \"1\",\n },\n },\n };\n }}\n />\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"SensorSearchTerm.js","sourceRoot":"","sources":["../../../../src/components/Sensor/SensorSearchTerm.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,4CA8CC;AArDD,+CAAmD;AACnD,mCAAuC;AACvC,gHAAwF;AAExF,uCAAgF;AAChF,+CAA+D;AAE/D,SAAgB,gBAAgB;IAC9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAA,gCAAwB,GAAE,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,oBAAY,GAAE,CAAC;IACjC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,iBAAS,GAAE,CAAC;IAEnC,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,IAAA,gBAAQ,EAAS,UAAU,CAAC,CAAC;IAEnF,MAAM,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,GAAG,IAAA,sBAAa,EAC1F,CAAC,KAAa,EAAE,EAAE;QAChB,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,iBAAiB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;YAAE,OAAO;QACtF,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC,EACD,EAAE,IAAI,EAAE,GAAG,EAAE,CACd,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,wBAAwB,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,aAAa,GAAG,IAAA,gCAAwB,EAAC;QAC7C,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,mBAAmB;KAChC,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL;QACE,8BAAC,oBAAU,IACT,SAAS,EAAE,CAAC,EACZ,WAAW,EAAC,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,KAAK,EAAE,mBAAmB,EAC1B,WAAW,EAAC,kBAAkB,EAC9B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAC1B,SAAS,EAAE,aAAa,CAAC,SAAS,EAClC,YAAY,EAAE,aAAa,CAAC,YAAY,EACxC,WAAW,EAAE,aAAa,CAAC,WAAW,GACtC,CACD,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useDebounceFn } from \"ahooks\";\nimport DataSearch from \"@usereactify/search-internals/lib/components/search/DataSearch\";\n\nimport { useAnalytics, useReactifySearchContext, useSearch } from \"../../hooks\";\nimport { getPropsSensorSearchTerm } from \"../../utility/props\";\n\nexport function SensorSearchTerm() {\n const { options, config } = useReactifySearchContext();\n const { track } = useAnalytics();\n const { searchTerm } = useSearch();\n\n const [searchTermDebounced, setSearchTermDebounced] = useState<string>(searchTerm);\n\n const { run: runDebouncedTriggerQuery, cancel: cancelDebouncedTriggerQuery } = useDebounceFn(\n (value: string) => {\n setSearchTermDebounced(value);\n let trimmedSearchTerm = searchTerm.trim();\n if (!trimmedSearchTerm || (trimmedSearchTerm && trimmedSearchTerm.length < 3)) return;\n track({ eventName: \"search\", payload: { searchTerm: trimmedSearchTerm } });\n },\n { wait: 300 }\n );\n\n useEffect(() => {\n runDebouncedTriggerQuery(searchTerm);\n }, [searchTerm]);\n\n const reactiveProps = getPropsSensorSearchTerm({\n config: config,\n provider: options,\n searchTerm: searchTermDebounced,\n });\n\n if (!reactiveProps) {\n return null;\n }\n\n return (\n <>\n <DataSearch\n fuzziness={1}\n queryFormat=\"and\"\n autosuggest={false}\n value={searchTermDebounced}\n componentId=\"SensorSearchTerm\"\n style={{ display: \"none\" }}\n dataField={reactiveProps.dataField}\n fieldWeights={reactiveProps.fieldWeights}\n customQuery={reactiveProps.customQuery}\n />\n </>\n );\n}\n"]}
@@ -1,3 +1 @@
1
- import React from "react";
2
- export type SensorsProps = {};
3
- export declare const Sensors: React.FC<SensorsProps>;
1
+ export declare function Sensors(): JSX.Element | null;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Sensors = void 0;
6
+ exports.Sensors = Sensors;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const hooks_1 = require("../../hooks");
9
9
  const SensorSort_1 = require("./SensorSort");
@@ -12,49 +12,30 @@ const SensorCollection_1 = require("./SensorCollection");
12
12
  const SensorSearchTerm_1 = require("./SensorSearchTerm");
13
13
  const SensorInventoryAvailable_1 = require("./SensorInventoryAvailable");
14
14
  const SensorCustom_1 = require("./SensorCustom");
15
- const SensorCollectionWeighted_1 = require("./SensorCollectionWeighted");
16
- const SensorSearchWeighted_1 = require("./SensorSearchWeighted");
17
15
  const SensorExplain_1 = require("./SensorExplain");
18
- const Sensors = () => {
19
- var _a, _b, _c, _d;
16
+ function Sensors() {
17
+ var _a, _b;
20
18
  const { config, options } = (0, hooks_1.useReactifySearchContext)();
21
- const useWeightedBaseSearchRequest = (_b = (_a = config.featureFlags) === null || _a === void 0 ? void 0 : _a.includes("use_weighted_base_search_request")) !== null && _b !== void 0 ? _b : false;
22
- const useWeightedCurationSearchRequest = (_d = (_c = config.featureFlags) === null || _c === void 0 ? void 0 : _c.includes("use_weighted_curation_search_request")) !== null && _d !== void 0 ? _d : false;
19
+ const isWeighted = ((_a = config.featureFlags) === null || _a === void 0 ? void 0 : _a.includes("use_weighted_base_search_request")) ||
20
+ ((_b = config.featureFlags) === null || _b === void 0 ? void 0 : _b.includes("use_weighted_curation_search_request"));
23
21
  if (options.mode === "search" || options.mode === "instant-search") {
24
- if (useWeightedBaseSearchRequest) {
25
- return (react_1.default.createElement(react_1.default.Fragment, null,
26
- react_1.default.createElement(SensorSort_1.SensorSort, null),
27
- react_1.default.createElement(SensorPublished_1.SensorPublished, null),
28
- react_1.default.createElement(SensorSearchWeighted_1.SensorSearchWeighted, null),
29
- react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
30
- react_1.default.createElement(SensorCustom_1.SensorCustom, null),
31
- react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
32
- }
33
22
  return (react_1.default.createElement(react_1.default.Fragment, null,
34
23
  react_1.default.createElement(SensorSort_1.SensorSort, null),
35
24
  react_1.default.createElement(SensorPublished_1.SensorPublished, null),
36
25
  react_1.default.createElement(SensorSearchTerm_1.SensorSearchTerm, null),
37
26
  react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
38
- react_1.default.createElement(SensorCustom_1.SensorCustom, null)));
27
+ react_1.default.createElement(SensorCustom_1.SensorCustom, null),
28
+ isWeighted && react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
39
29
  }
40
30
  if (options.mode === "collection") {
41
- if (useWeightedCurationSearchRequest) {
42
- return (react_1.default.createElement(react_1.default.Fragment, null,
43
- react_1.default.createElement(SensorSort_1.SensorSort, null),
44
- react_1.default.createElement(SensorPublished_1.SensorPublished, null),
45
- react_1.default.createElement(SensorCollectionWeighted_1.SensorCollectionWeighted, null),
46
- react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
47
- react_1.default.createElement(SensorCustom_1.SensorCustom, null),
48
- react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
49
- }
50
31
  return (react_1.default.createElement(react_1.default.Fragment, null,
51
32
  react_1.default.createElement(SensorSort_1.SensorSort, null),
52
33
  react_1.default.createElement(SensorPublished_1.SensorPublished, null),
53
34
  react_1.default.createElement(SensorCollection_1.SensorCollection, null),
54
35
  react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
55
- react_1.default.createElement(SensorCustom_1.SensorCustom, null)));
36
+ react_1.default.createElement(SensorCustom_1.SensorCustom, null),
37
+ isWeighted && react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
56
38
  }
57
39
  return null;
58
- };
59
- exports.Sensors = Sensors;
40
+ }
60
41
  //# sourceMappingURL=Sensors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sensors.js","sourceRoot":"","sources":["../../../../src/components/Sensor/Sensors.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,uCAAuD;AAEvD,6CAA0C;AAC1C,uDAAoD;AACpD,yDAAsD;AACtD,yDAAsD;AACtD,yEAAsE;AACtE,iDAA8C;AAC9C,yEAAsE;AACtE,iEAA8D;AAC9D,mDAAgD;AAMzC,MAAM,OAAO,GAA2B,GAAG,EAAE;;IAClD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,gCAAwB,GAAE,CAAC;IAEvD,MAAM,4BAA4B,GAAG,MAAA,MAAA,MAAM,CAAC,YAAY,0CAAE,QAAQ,CAAC,kCAAkC,CAAC,mCAAI,KAAK,CAAC;IAChH,MAAM,gCAAgC,GACpC,MAAA,MAAA,MAAM,CAAC,YAAY,0CAAE,QAAQ,CAAC,sCAAsC,CAAC,mCAAI,KAAK,CAAC;IAEjF,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnE,IAAI,4BAA4B,EAAE,CAAC;YACjC,OAAO,CACL;gBACE,8BAAC,uBAAU,OAAG;gBACd,8BAAC,iCAAe,OAAG;gBACnB,8BAAC,2CAAoB,OAAG;gBACxB,8BAAC,mDAAwB,OAAG;gBAC5B,8BAAC,2BAAY,OAAG;gBAChB,8BAAC,6BAAa,OAAG,CAChB,CACJ,CAAC;QACJ,CAAC;QACD,OAAO,CACL;YACE,8BAAC,uBAAU,OAAG;YACd,8BAAC,iCAAe,OAAG;YACnB,8BAAC,mCAAgB,OAAG;YACpB,8BAAC,mDAAwB,OAAG;YAC5B,8BAAC,2BAAY,OAAG,CACf,CACJ,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,IAAI,gCAAgC,EAAE,CAAC;YACrC,OAAO,CACL;gBACE,8BAAC,uBAAU,OAAG;gBACd,8BAAC,iCAAe,OAAG;gBACnB,8BAAC,mDAAwB,OAAG;gBAC5B,8BAAC,mDAAwB,OAAG;gBAC5B,8BAAC,2BAAY,OAAG;gBAChB,8BAAC,6BAAa,OAAG,CAChB,CACJ,CAAC;QACJ,CAAC;QACD,OAAO,CACL;YACE,8BAAC,uBAAU,OAAG;YACd,8BAAC,iCAAe,OAAG;YACnB,8BAAC,mCAAgB,OAAG;YACpB,8BAAC,mDAAwB,OAAG;YAC5B,8BAAC,2BAAY,OAAG,CACf,CACJ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAxDW,QAAA,OAAO,WAwDlB","sourcesContent":["import React from \"react\";\n\nimport { useReactifySearchContext } from \"../../hooks\";\n\nimport { SensorSort } from \"./SensorSort\";\nimport { SensorPublished } from \"./SensorPublished\";\nimport { SensorCollection } from \"./SensorCollection\";\nimport { SensorSearchTerm } from \"./SensorSearchTerm\";\nimport { SensorInventoryAvailable } from \"./SensorInventoryAvailable\";\nimport { SensorCustom } from \"./SensorCustom\";\nimport { SensorCollectionWeighted } from \"./SensorCollectionWeighted\";\nimport { SensorSearchWeighted } from \"./SensorSearchWeighted\";\nimport { SensorExplain } from \"./SensorExplain\";\n\nexport type SensorsProps = {\n /** This component does not support any props */\n};\n\nexport const Sensors: React.FC<SensorsProps> = () => {\n const { config, options } = useReactifySearchContext();\n\n const useWeightedBaseSearchRequest = config.featureFlags?.includes(\"use_weighted_base_search_request\") ?? false;\n const useWeightedCurationSearchRequest =\n config.featureFlags?.includes(\"use_weighted_curation_search_request\") ?? false;\n\n if (options.mode === \"search\" || options.mode === \"instant-search\") {\n if (useWeightedBaseSearchRequest) {\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorSearchWeighted />\n <SensorInventoryAvailable />\n <SensorCustom />\n <SensorExplain />\n </>\n );\n }\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorSearchTerm />\n <SensorInventoryAvailable />\n <SensorCustom />\n </>\n );\n }\n\n if (options.mode === \"collection\") {\n if (useWeightedCurationSearchRequest) {\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorCollectionWeighted />\n <SensorInventoryAvailable />\n <SensorCustom />\n <SensorExplain />\n </>\n );\n }\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorCollection />\n <SensorInventoryAvailable />\n <SensorCustom />\n </>\n );\n }\n\n return null;\n};\n"]}
1
+ {"version":3,"file":"Sensors.js","sourceRoot":"","sources":["../../../../src/components/Sensor/Sensors.tsx"],"names":[],"mappings":";;;;;AAaA,0BAkCC;AA/CD,kDAA0B;AAE1B,uCAAuD;AAEvD,6CAA0C;AAC1C,uDAAoD;AACpD,yDAAsD;AACtD,yDAAsD;AACtD,yEAAsE;AACtE,iDAA8C;AAE9C,mDAAgD;AAEhD,SAAgB,OAAO;;IACrB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,gCAAwB,GAAE,CAAC;IAEvD,MAAM,UAAU,GACd,CAAA,MAAA,MAAM,CAAC,YAAY,0CAAE,QAAQ,CAAC,kCAAkC,CAAC;SACjE,MAAA,MAAM,CAAC,YAAY,0CAAE,QAAQ,CAAC,sCAAsC,CAAC,CAAA,CAAC;IAExE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnE,OAAO,CACL;YACE,8BAAC,uBAAU,OAAG;YACd,8BAAC,iCAAe,OAAG;YACnB,8BAAC,mCAAgB,OAAG;YACpB,8BAAC,mDAAwB,OAAG;YAC5B,8BAAC,2BAAY,OAAG;YACf,UAAU,IAAI,8BAAC,6BAAa,OAAG,CAC/B,CACJ,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,CACL;YACE,8BAAC,uBAAU,OAAG;YACd,8BAAC,iCAAe,OAAG;YACnB,8BAAC,mCAAgB,OAAG;YACpB,8BAAC,mDAAwB,OAAG;YAC5B,8BAAC,2BAAY,OAAG;YACf,UAAU,IAAI,8BAAC,6BAAa,OAAG,CAC/B,CACJ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import React from \"react\";\n\nimport { useReactifySearchContext } from \"../../hooks\";\n\nimport { SensorSort } from \"./SensorSort\";\nimport { SensorPublished } from \"./SensorPublished\";\nimport { SensorCollection } from \"./SensorCollection\";\nimport { SensorSearchTerm } from \"./SensorSearchTerm\";\nimport { SensorInventoryAvailable } from \"./SensorInventoryAvailable\";\nimport { SensorCustom } from \"./SensorCustom\";\n\nimport { SensorExplain } from \"./SensorExplain\";\n\nexport function Sensors() {\n const { config, options } = useReactifySearchContext();\n\n const isWeighted =\n config.featureFlags?.includes(\"use_weighted_base_search_request\") ||\n config.featureFlags?.includes(\"use_weighted_curation_search_request\");\n\n if (options.mode === \"search\" || options.mode === \"instant-search\") {\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorSearchTerm />\n <SensorInventoryAvailable />\n <SensorCustom />\n {isWeighted && <SensorExplain />}\n </>\n );\n }\n\n if (options.mode === \"collection\") {\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorCollection />\n <SensorInventoryAvailable />\n <SensorCustom />\n {isWeighted && <SensorExplain />}\n </>\n );\n }\n\n return null;\n}\n"]}
@@ -5,8 +5,6 @@ export * from "./SensorPublished";
5
5
  export * from "./SensorCollection";
6
6
  export * from "./SensorSearchTerm";
7
7
  export * from "./SensorInventoryAvailable";
8
- export * from "./SensorCollectionWeighted";
9
- export * from "./SensorSearchWeighted";
10
8
  export * from "./SensorExplain";
11
9
  export * from "./Sensors";
12
10
  export declare const SENSOR_IDS: (mode: ReactifySearchMode, config: Config, variation?: string) => string[];
@@ -20,8 +20,6 @@ __exportStar(require("./SensorPublished"), exports);
20
20
  __exportStar(require("./SensorCollection"), exports);
21
21
  __exportStar(require("./SensorSearchTerm"), exports);
22
22
  __exportStar(require("./SensorInventoryAvailable"), exports);
23
- __exportStar(require("./SensorCollectionWeighted"), exports);
24
- __exportStar(require("./SensorSearchWeighted"), exports);
25
23
  __exportStar(require("./SensorExplain"), exports);
26
24
  __exportStar(require("./Sensors"), exports);
27
25
  // This is consumed by the react prop in various components
@@ -32,8 +30,6 @@ const SENSOR_IDS = (mode, config, variation) => {
32
30
  "SensorCollection",
33
31
  "SensorSearchTerm",
34
32
  "SensorInventoryAvailable",
35
- "SensorCollectionWeighted",
36
- "SensorSearchWeighted",
37
33
  "SensorExplain",
38
34
  ];
39
35
  const sensorType = mode === "collection" ? "collection" : "search";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/Sensor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAGA,+CAA6B;AAC7B,oDAAkC;AAClC,qDAAmC;AACnC,qDAAmC;AACnC,6DAA2C;AAC3C,6DAA2C;AAC3C,yDAAuC;AACvC,kDAAgC;AAEhC,4CAA0B;AAE1B,2DAA2D;AACpD,MAAM,UAAU,GAAG,CAAC,IAAwB,EAAE,MAAc,EAAE,SAAkB,EAAE,EAAE;IACzF,MAAM,SAAS,GAAG;QAChB,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,0BAA0B;QAC1B,0BAA0B;QAC1B,sBAAsB;QACtB,eAAe;KAChB,CAAC;IAEF,MAAM,UAAU,GACd,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAElD,MAAM,aAAa,GAAG,UAAU,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IACtG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AArBW,QAAA,UAAU,cAqBrB","sourcesContent":["import { ReactifySearchMode } from \"../../hooks\";\nimport { Config } from \"../../types\";\n\nexport * from \"./SensorSort\";\nexport * from \"./SensorPublished\";\nexport * from \"./SensorCollection\";\nexport * from \"./SensorSearchTerm\";\nexport * from \"./SensorInventoryAvailable\";\nexport * from \"./SensorCollectionWeighted\";\nexport * from \"./SensorSearchWeighted\";\nexport * from \"./SensorExplain\";\n\nexport * from \"./Sensors\";\n\n// This is consumed by the react prop in various components\nexport const SENSOR_IDS = (mode: ReactifySearchMode, config: Config, variation?: string) => {\n const sensorIds = [\n \"SensorSort\",\n \"SensorPublished\",\n \"SensorCollection\",\n \"SensorSearchTerm\",\n \"SensorInventoryAvailable\",\n \"SensorCollectionWeighted\",\n \"SensorSearchWeighted\",\n \"SensorExplain\",\n ];\n \n const sensorType = \n mode === \"collection\" ? \"collection\" : \"search\";\n \n const customSensors = sensorType === \"collection\" ? config.sensors.collection : config.sensors.search;\n if (customSensors.length > 0) {\n sensorIds.push(...customSensors.map((item, index) => `SensorCustom_${index}`));\n }\n\n return sensorIds;\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/Sensor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAGA,+CAA6B;AAC7B,oDAAkC;AAClC,qDAAmC;AACnC,qDAAmC;AACnC,6DAA2C;AAE3C,kDAAgC;AAEhC,4CAA0B;AAE1B,2DAA2D;AACpD,MAAM,UAAU,GAAG,CAAC,IAAwB,EAAE,MAAc,EAAE,SAAkB,EAAE,EAAE;IACzF,MAAM,SAAS,GAAG;QAChB,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,0BAA0B;QAC1B,eAAe;KAChB,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEnE,MAAM,aAAa,GAAG,UAAU,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IACtG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAlBW,QAAA,UAAU,cAkBrB","sourcesContent":["import { ReactifySearchMode } from \"../../hooks\";\nimport { Config } from \"../../types\";\n\nexport * from \"./SensorSort\";\nexport * from \"./SensorPublished\";\nexport * from \"./SensorCollection\";\nexport * from \"./SensorSearchTerm\";\nexport * from \"./SensorInventoryAvailable\";\n\nexport * from \"./SensorExplain\";\n\nexport * from \"./Sensors\";\n\n// This is consumed by the react prop in various components\nexport const SENSOR_IDS = (mode: ReactifySearchMode, config: Config, variation?: string) => {\n const sensorIds = [\n \"SensorSort\",\n \"SensorPublished\",\n \"SensorCollection\",\n \"SensorSearchTerm\",\n \"SensorInventoryAvailable\",\n \"SensorExplain\",\n ];\n\n const sensorType = mode === \"collection\" ? \"collection\" : \"search\";\n\n const customSensors = sensorType === \"collection\" ? config.sensors.collection : config.sensors.search;\n if (customSensors.length > 0) {\n sensorIds.push(...customSensors.map((item, index) => `SensorCustom_${index}`));\n }\n\n return sensorIds;\n};\n"]}
@@ -0,0 +1,18 @@
1
+ import { Boosting, SearchableField } from "../types/firestore";
2
+ import { FunctionScoreQuery, GenerateSearchRequestOptions, QueryContainer, SearchRequest, CollectionSearchRequestOptions } from "./types";
3
+ export declare function generateBaseSearchRequest(options: GenerateSearchRequestOptions): SearchRequest;
4
+ export declare function generateCollectionSearchRequest(options: CollectionSearchRequestOptions): SearchRequest;
5
+ export declare function generateCollectionBaseQuery(options: CollectionSearchRequestOptions): QueryContainer;
6
+ export declare function generateWeightedSearchQuery(options: {
7
+ searchTerm: string;
8
+ searchableFields: SearchableField[];
9
+ boostingRules: Boosting[];
10
+ markets: string[];
11
+ market?: string;
12
+ }): FunctionScoreQuery;
13
+ export declare function generateWeightedCollectionQuery(options: {
14
+ collectionHandle: string;
15
+ boostingRules: Boosting[];
16
+ markets: string[];
17
+ market?: string;
18
+ }): FunctionScoreQuery;
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateBaseSearchRequest = generateBaseSearchRequest;
4
+ exports.generateCollectionSearchRequest = generateCollectionSearchRequest;
5
+ exports.generateCollectionBaseQuery = generateCollectionBaseQuery;
6
+ exports.generateWeightedSearchQuery = generateWeightedSearchQuery;
7
+ exports.generateWeightedCollectionQuery = generateWeightedCollectionQuery;
8
+ const types_1 = require("./types");
9
+ const utils_1 = require("./utils");
10
+ // Base Search Request Generation
11
+ function generateBaseSearchRequest(options) {
12
+ var _a, _b, _c, _d;
13
+ if ((0, types_1.isCollectionOptions)(options)) {
14
+ // Collection search mode
15
+ const markets = (_b = (_a = options.curation) === null || _a === void 0 ? void 0 : _a.markets) !== null && _b !== void 0 ? _b : [];
16
+ return generateCollectionSearchRequest({
17
+ collectionHandle: options.collectionHandle,
18
+ markets: markets,
19
+ });
20
+ }
21
+ if ((0, types_1.isSearchOptions)(options)) {
22
+ // Term search mode
23
+ const markets = (_d = (_c = options.curation) === null || _c === void 0 ? void 0 : _c.markets) !== null && _d !== void 0 ? _d : [];
24
+ return generateTermSearchRequest({
25
+ searchTerm: options.searchTerm,
26
+ baseSearchRequestMode: options.baseSearchRequestMode,
27
+ relevanceFields: options.relevanceFields,
28
+ searchableFields: options.searchableFields,
29
+ markets: markets,
30
+ });
31
+ }
32
+ throw new Error("Invalid options: must be either search or collection options");
33
+ }
34
+ // Term Search Request Generation
35
+ function generateTermSearchRequest(options) {
36
+ (0, utils_1.validateSearchInputs)(options);
37
+ if (options.baseSearchRequestMode === types_1.BaseSearchRequestMode.Weighted) {
38
+ return generateWeightedTermSearchRequest(options);
39
+ }
40
+ return generateRelevanceTermSearchRequest(options);
41
+ }
42
+ function generateWeightedTermSearchRequest(options) {
43
+ if (!options.searchableFields) {
44
+ throw new Error("SearchableFields required for weighted search");
45
+ }
46
+ const functionScoreQuery = generateWeightedSearchQuery({
47
+ searchTerm: options.searchTerm,
48
+ searchableFields: options.searchableFields,
49
+ boostingRules: [],
50
+ markets: options.markets,
51
+ });
52
+ return { query: { function_score: functionScoreQuery } };
53
+ }
54
+ function generateRelevanceTermSearchRequest(options) {
55
+ const fieldMappings = (0, utils_1.prepareRelevanceFields)(options.relevanceFields);
56
+ const multiMatchQueries = (0, utils_1.generateMultiMatchQueries)(options.searchTerm, fieldMappings);
57
+ const query = buildRelevanceQueryStructure(multiMatchQueries, options.markets);
58
+ return { query };
59
+ }
60
+ function buildRelevanceQueryStructure(multiMatchQueries, markets) {
61
+ return {
62
+ bool: {
63
+ must: [{ bool: { should: multiMatchQueries, minimum_should_match: "1" } }],
64
+ filter: (0, utils_1.generateMarketsFilter)(markets),
65
+ },
66
+ };
67
+ }
68
+ // Collection Search Request Generation
69
+ function generateCollectionSearchRequest(options) {
70
+ const query = generateCollectionBaseQuery(options);
71
+ return { query };
72
+ }
73
+ function generateCollectionBaseQuery(options) {
74
+ const mustClauses = [
75
+ {
76
+ nested: {
77
+ path: "collections",
78
+ query: {
79
+ term: { ["collections.handle"]: options.collectionHandle },
80
+ },
81
+ },
82
+ },
83
+ ];
84
+ const marketClause = (0, utils_1.generateMarketsFilter)(options.markets);
85
+ if (marketClause.length > 0) {
86
+ mustClauses.push(...marketClause);
87
+ }
88
+ return { bool: { must: mustClauses } };
89
+ }
90
+ // Weighted Search Implementation - using corrected property names
91
+ function generateWeightedSearchQuery(options) {
92
+ var _a, _b;
93
+ const searchTerms = (_b = (_a = options.searchTerm) === null || _a === void 0 ? void 0 : _a.split(" ")) !== null && _b !== void 0 ? _b : [];
94
+ const searchQueries = [];
95
+ for (const searchableField of options.searchableFields) {
96
+ const baseField = searchableField.field;
97
+ const maxEdits = searchableField.maxEdits;
98
+ for (const searchTerm of searchTerms) {
99
+ searchQueries.push({
100
+ match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "regular_analyzer" } },
101
+ });
102
+ if (searchableField.synonymEnabled) {
103
+ searchQueries.push({
104
+ match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "synonym_analyzer" } },
105
+ });
106
+ }
107
+ }
108
+ }
109
+ const searchScores = [];
110
+ for (const field of options.searchableFields) {
111
+ const baseField = field.field;
112
+ const maxPoints = field.points;
113
+ const maxEdits = field.maxEdits;
114
+ for (let edits = 0; edits <= maxEdits; edits++) {
115
+ const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);
116
+ const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);
117
+ const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;
118
+ for (const searchTerm of searchTerms) {
119
+ searchScores.push({
120
+ filter: {
121
+ match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
122
+ },
123
+ weight: weightBase,
124
+ });
125
+ if (field.synonymEnabled && field.synonymPenaltyPercent > 0) {
126
+ const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);
127
+ searchScores.push({
128
+ filter: {
129
+ bool: {
130
+ must_not: {
131
+ match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
132
+ },
133
+ must: {
134
+ match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "synonym_analyzer" } },
135
+ },
136
+ },
137
+ },
138
+ weight: weightSynonyms,
139
+ });
140
+ }
141
+ }
142
+ }
143
+ }
144
+ const marketClause = (0, utils_1.generateMarketsClause)(options.markets);
145
+ const boolQuery = { should: [...searchQueries] };
146
+ if (marketClause) {
147
+ boolQuery.filter = [marketClause];
148
+ }
149
+ return {
150
+ query: {
151
+ bool: boolQuery,
152
+ },
153
+ functions: [
154
+ ...searchScores,
155
+ ...(0, utils_1.generateBoostingRules)({ boostingRules: options.boostingRules, market: options.market }),
156
+ ],
157
+ score_mode: "sum",
158
+ boost_mode: "replace",
159
+ };
160
+ }
161
+ function generateWeightedCollectionQuery(options) {
162
+ const mustClauses = [
163
+ {
164
+ nested: {
165
+ path: "collections",
166
+ query: {
167
+ term: { ["collections.handle"]: options.collectionHandle },
168
+ },
169
+ },
170
+ },
171
+ ];
172
+ const marketClause = (0, utils_1.generateMarketsClause)(options.markets);
173
+ if (marketClause)
174
+ mustClauses.push(marketClause);
175
+ return {
176
+ query: {
177
+ bool: { must: mustClauses },
178
+ },
179
+ functions: (0, utils_1.generateBoostingRules)({ boostingRules: options.boostingRules, market: options.market }),
180
+ score_mode: "sum",
181
+ boost_mode: "replace",
182
+ };
183
+ }
184
+ //# sourceMappingURL=base-builders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-builders.js","sourceRoot":"","sources":["../../../src/search-request-builder/base-builders.ts"],"names":[],"mappings":"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","sourcesContent":["import { Boosting, SearchableField } from \"../types/firestore\";\nimport {\n BaseSearchRequestMode,\n FunctionScoreContainer,\n FunctionScoreQuery,\n GenerateSearchRequestOptions,\n QueryContainer,\n SearchRequest,\n TermSearchRequestOptions,\n CollectionSearchRequestOptions,\n isSearchOptions,\n isCollectionOptions,\n} from \"./types\";\nimport {\n generateBoostingRules,\n generateMarketsClause,\n generateMarketsFilter,\n generateMultiMatchQueries,\n prepareRelevanceFields,\n validateSearchInputs,\n} from \"./utils\";\n\n// Base Search Request Generation\nexport function generateBaseSearchRequest(options: GenerateSearchRequestOptions): SearchRequest {\n if (isCollectionOptions(options)) {\n // Collection search mode\n const markets = options.curation?.markets ?? [];\n return generateCollectionSearchRequest({\n collectionHandle: options.collectionHandle,\n markets: markets,\n });\n }\n\n if (isSearchOptions(options)) {\n // Term search mode\n const markets = options.curation?.markets ?? [];\n return generateTermSearchRequest({\n searchTerm: options.searchTerm,\n baseSearchRequestMode: options.baseSearchRequestMode,\n relevanceFields: options.relevanceFields,\n searchableFields: options.searchableFields,\n markets: markets,\n });\n }\n\n throw new Error(\"Invalid options: must be either search or collection options\");\n}\n\n// Term Search Request Generation\nfunction generateTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n validateSearchInputs(options);\n\n if (options.baseSearchRequestMode === BaseSearchRequestMode.Weighted) {\n return generateWeightedTermSearchRequest(options);\n }\n\n return generateRelevanceTermSearchRequest(options);\n}\n\nfunction generateWeightedTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n if (!options.searchableFields) {\n throw new Error(\"SearchableFields required for weighted search\");\n }\n\n const functionScoreQuery = generateWeightedSearchQuery({\n searchTerm: options.searchTerm,\n searchableFields: options.searchableFields,\n boostingRules: [],\n markets: options.markets,\n });\n\n return { query: { function_score: functionScoreQuery } };\n}\n\nfunction generateRelevanceTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n const fieldMappings = prepareRelevanceFields(options.relevanceFields);\n const multiMatchQueries = generateMultiMatchQueries(options.searchTerm, fieldMappings);\n const query = buildRelevanceQueryStructure(multiMatchQueries, options.markets);\n return { query };\n}\n\nfunction buildRelevanceQueryStructure(multiMatchQueries: QueryContainer[], markets: string[]): QueryContainer {\n return {\n bool: {\n must: [{ bool: { should: multiMatchQueries, minimum_should_match: \"1\" } }],\n filter: generateMarketsFilter(markets),\n },\n };\n}\n\n// Collection Search Request Generation\nexport function generateCollectionSearchRequest(options: CollectionSearchRequestOptions): SearchRequest {\n const query = generateCollectionBaseQuery(options);\n return { query };\n}\n\nexport function generateCollectionBaseQuery(options: CollectionSearchRequestOptions): QueryContainer {\n const mustClauses: QueryContainer[] = [\n {\n nested: {\n path: \"collections\",\n query: {\n term: { [\"collections.handle\"]: options.collectionHandle },\n },\n },\n },\n ];\n\n const marketClause = generateMarketsFilter(options.markets);\n if (marketClause.length > 0) {\n mustClauses.push(...marketClause);\n }\n\n return { bool: { must: mustClauses } };\n}\n\n// Weighted Search Implementation - using corrected property names\nexport function generateWeightedSearchQuery(options: {\n searchTerm: string;\n searchableFields: SearchableField[];\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}): FunctionScoreQuery {\n const searchTerms = options.searchTerm?.split(\" \") ?? [];\n\n const searchQueries: QueryContainer[] = [];\n for (const searchableField of options.searchableFields) {\n const baseField = searchableField.field;\n const maxEdits = searchableField.maxEdits;\n for (const searchTerm of searchTerms) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"regular_analyzer\" } },\n });\n if (searchableField.synonymEnabled) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"synonym_analyzer\" } },\n });\n }\n }\n }\n\n const searchScores: FunctionScoreContainer[] = [];\n for (const field of options.searchableFields) {\n const baseField = field.field;\n const maxPoints = field.points;\n const maxEdits = field.maxEdits;\n\n for (let edits = 0; edits <= maxEdits; edits++) {\n const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);\n const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);\n const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;\n\n for (const searchTerm of searchTerms) {\n searchScores.push({\n filter: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n weight: weightBase,\n });\n\n if (field.synonymEnabled && field.synonymPenaltyPercent > 0) {\n const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);\n\n searchScores.push({\n filter: {\n bool: {\n must_not: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n must: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"synonym_analyzer\" } },\n },\n },\n },\n weight: weightSynonyms,\n });\n }\n }\n }\n }\n\n const marketClause = generateMarketsClause(options.markets);\n const boolQuery: any = { should: [...searchQueries] };\n\n if (marketClause) {\n boolQuery.filter = [marketClause];\n }\n\n return {\n query: {\n bool: boolQuery,\n },\n functions: [\n ...searchScores,\n ...generateBoostingRules({ boostingRules: options.boostingRules, market: options.market }),\n ],\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n}\n\nexport function generateWeightedCollectionQuery(options: {\n collectionHandle: string;\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}): FunctionScoreQuery {\n const mustClauses: QueryContainer[] = [\n {\n nested: {\n path: \"collections\",\n query: {\n term: { [\"collections.handle\"]: options.collectionHandle },\n },\n },\n },\n ];\n\n const marketClause = generateMarketsClause(options.markets);\n if (marketClause) mustClauses.push(marketClause);\n\n return {\n query: {\n bool: { must: mustClauses },\n },\n functions: generateBoostingRules({ boostingRules: options.boostingRules, market: options.market }),\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { GenerateSearchRequestOptions, SearchRequest } from "./types";
2
+ export declare function generateCurationSearchRequest(options: GenerateSearchRequestOptions): Partial<SearchRequest>;