@uniformdev/search 0.0.1 → 0.0.2

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/react.js CHANGED
@@ -21,10 +21,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var react_exports = {};
22
22
  __export(react_exports, {
23
23
  DOTS: () => DOTS,
24
+ SearchContext: () => SearchContext,
25
+ SearchItemDefaultUrlResolverProvider: () => SearchItemDefaultUrlResolverProvider,
26
+ SearchItemUrlResolverProvider: () => SearchItemUrlResolverProvider,
24
27
  SearchProvider: () => SearchProvider,
28
+ createDefaultUrlResolver: () => createDefaultUrlResolver,
25
29
  usePagination: () => usePagination,
26
30
  useSearch: () => useSearch,
27
- useSearchPagination: () => useSearchPagination
31
+ useSearchPagination: () => useSearchPagination,
32
+ useUrlResolver: () => useUrlResolver
28
33
  });
29
34
  module.exports = __toCommonJS(react_exports);
30
35
 
@@ -41,7 +46,14 @@ var DEFAULT_PAGE_SIZE = 10;
41
46
 
42
47
  // src/utils.ts
43
48
  var buildOrderByQuery = (orderBy) => {
44
- return `${orderBy.field}_${orderBy.direction}`;
49
+ var _a;
50
+ const field = orderBy.field;
51
+ if (field && typeof field === "object" && "field" in field) {
52
+ const sv = field;
53
+ return `${sv.field}_${sv.direction.toUpperCase()}`;
54
+ }
55
+ if (!field || field === "relevance") return "";
56
+ return `${field}_${(_a = orderBy.direction) != null ? _a : "ASC"}`;
45
57
  };
46
58
  var getSearchParamsFromUrl = (urlString) => {
47
59
  if (!urlString) {
@@ -61,13 +73,13 @@ var getSearchParamsFromUrl = (urlString) => {
61
73
 
62
74
  // src/flattenBlockParams.ts
63
75
  function resolveFieldValue(field, locale = "en-us") {
64
- var _a, _b;
76
+ var _a;
65
77
  if (!field || typeof field !== "object") return field;
66
78
  if (field.type === "$block" && Array.isArray(field.value)) {
67
79
  return flattenBlockParams(field.value, locale);
68
80
  }
69
81
  if (field.locales && typeof field.locales === "object") {
70
- return (_b = (_a = field.locales[locale]) != null ? _a : Object.values(field.locales)[0]) != null ? _b : field.value;
82
+ return (_a = field.locales[locale]) != null ? _a : field.value;
71
83
  }
72
84
  return field.value;
73
85
  }
@@ -87,44 +99,31 @@ function flattenBlockParams(items, locale = "en-us") {
87
99
 
88
100
  // src/react/SearchProvider.tsx
89
101
  var import_jsx_runtime = require("react/jsx-runtime");
90
- var ALL_COLLECTIONS = ["entries", "compositions", "assets"];
91
102
  var SearchContext = (0, import_react.createContext)(null);
92
103
  var SearchProvider = ({
93
104
  children,
94
105
  performSearch,
95
- contentType,
96
- filterBy: filterByRaw,
97
106
  orderBy: orderByRaw,
98
- baseFilters: baseFiltersRaw,
107
+ baseFilterString,
99
108
  pageSizes: pageSizesRaw,
100
- collections: collectionsRaw,
101
- searchDebounceMs = 300
109
+ queryBy,
110
+ searchDebounceMs = 300,
111
+ locale,
112
+ maxFacetValues = 100
102
113
  }) => {
103
114
  var _a;
104
- const filterBy = (0, import_react.useMemo)(() => flattenBlockParams(filterByRaw), [filterByRaw]);
105
- const baseFiltersFlat = (0, import_react.useMemo)(() => flattenBlockParams(baseFiltersRaw), [baseFiltersRaw]);
115
+ const [filterBy, setFilterOptions] = (0, import_react.useState)([]);
116
+ const registerFilterOption = (0, import_react.useCallback)((filter) => {
117
+ if (!(filter == null ? void 0 : filter.fieldKey)) return;
118
+ setFilterOptions((prev) => [...prev.filter((f) => f.fieldKey !== filter.fieldKey), filter]);
119
+ }, []);
120
+ const unregisterFilterOption = (0, import_react.useCallback)((fieldKey) => {
121
+ setFilterOptions((prev) => prev.filter((f) => f.fieldKey !== fieldKey));
122
+ }, []);
106
123
  const orderByFlat = (0, import_react.useMemo)(() => flattenBlockParams(orderByRaw), [orderByRaw]);
107
124
  const pageSizesFlat = (0, import_react.useMemo)(() => flattenBlockParams(pageSizesRaw), [pageSizesRaw]);
108
- const initCollections = (0, import_react.useMemo)(() => {
109
- if (!collectionsRaw) return void 0;
110
- const items = Array.isArray(collectionsRaw) ? collectionsRaw : collectionsRaw.split(",").map((s) => s.trim());
111
- const valid = items.filter(
112
- (c) => ["entries", "compositions", "assets"].includes(c)
113
- );
114
- return valid.length > 0 ? valid : void 0;
115
- }, [collectionsRaw]);
116
- const baseFilterQuery = (0, import_react.useMemo)(
117
- () => baseFiltersFlat.reduce((acc, filter) => {
118
- if (!(filter == null ? void 0 : filter.fieldKey) || !Array.isArray(filter.values)) return acc;
119
- return {
120
- ...acc,
121
- [`${filter.fieldKey}[eq]`]: filter.values.map((v) => v.value)
122
- };
123
- }, {}),
124
- [baseFiltersFlat]
125
- );
126
125
  const facetBy = (0, import_react.useMemo)(
127
- () => filterBy.filter((f) => (f == null ? void 0 : f.enableFaceting) && (f == null ? void 0 : f.fieldKey)).map((f) => f.fieldKey).join(","),
126
+ () => filterBy.filter((f) => f == null ? void 0 : f.fieldKey).map((f) => f.fieldKey).join(","),
128
127
  [filterBy]
129
128
  );
130
129
  const defaultOrderByQuery = (0, import_react.useMemo)(
@@ -136,18 +135,13 @@ var SearchProvider = ({
136
135
  [orderByFlat]
137
136
  );
138
137
  const initPerPage = ((_a = pageSizesFlat[0]) == null ? void 0 : _a.size) || DEFAULT_PAGE_SIZE;
139
- const hasFetchedInitial = (0, import_react.useRef)(false);
140
138
  const searchDebounceRef = (0, import_react.useRef)(null);
141
- const [selectedCollections, setSelectedCollections] = (0, import_react.useState)(
142
- initCollections || ALL_COLLECTIONS
143
- );
139
+ const searchRequestIdRef = (0, import_react.useRef)(0);
144
140
  const [urlParams, setUrlParams] = (0, import_react.useState)(() => {
145
141
  if (typeof window === "undefined") return {};
146
142
  return getSearchParamsFromUrl(window.location.href);
147
143
  });
148
- const [searchBoxValue, setSearchBoxValue] = (0, import_react.useState)(
149
- (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || ""
150
- );
144
+ const [searchBoxValue, setSearchBoxValue] = (0, import_react.useState)((urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || "");
151
145
  const [isLoading, setIsLoading] = (0, import_react.useState)(true);
152
146
  const [entries, setEntries] = (0, import_react.useState)({
153
147
  items: [],
@@ -157,17 +151,16 @@ var SearchProvider = ({
157
151
  totalPages: 0
158
152
  });
159
153
  const [facets, setFacets] = (0, import_react.useState)({});
160
- const [collectionResults, setCollectionResults] = (0, import_react.useState)({});
161
154
  const pathname = (0, import_react.useMemo)(() => {
162
155
  if (typeof window === "undefined") return "/";
163
156
  return window.location.pathname;
164
157
  }, []);
165
- const page = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 && Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 > 0 ? Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 : FIRST_PAGE;
158
+ const page = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 > 0 ? Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_KEY]) - 1 : FIRST_PAGE;
166
159
  const search = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_QUERY_KEY]) || "";
167
160
  const perPage = Number(urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_PAGE_SIZE_KEY]) || initPerPage;
168
161
  const selectedFilters = (0, import_react.useMemo)(
169
162
  () => filterBy.reduce((acc, filter) => {
170
- const value2 = urlParams == null ? void 0 : urlParams[filter.fieldId];
163
+ const value2 = urlParams == null ? void 0 : urlParams[filter.fieldKey];
171
164
  if (value2) {
172
165
  acc[filter.fieldKey] = Array.isArray(value2) ? value2 : [value2];
173
166
  }
@@ -176,10 +169,13 @@ var SearchProvider = ({
176
169
  [filterBy, urlParams]
177
170
  );
178
171
  (0, import_react.useEffect)(() => {
172
+ const requestId = ++searchRequestIdRef.current;
179
173
  const doFetch = async () => {
180
- var _a2;
181
- const filterQuery = Object.entries(selectedFilters).reduce((acc, [fieldKey, values]) => {
174
+ var _a2, _b;
175
+ const currentOrderByQuery = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery;
176
+ const buildFilters = (excludeField) => Object.entries(selectedFilters).reduce((acc, [fieldKey, values]) => {
182
177
  var _a3;
178
+ if (excludeField && fieldKey === excludeField) return acc;
183
179
  if (!values || values.length === 0) return acc;
184
180
  const filterType = (_a3 = filterBy.find((f) => f.fieldKey === fieldKey)) == null ? void 0 : _a3.type;
185
181
  if (filterType === "range") {
@@ -188,65 +184,69 @@ var SearchProvider = ({
188
184
  }
189
185
  return { ...acc, [`${fieldKey}[in]`]: values };
190
186
  }, {});
191
- const currentOrderByQuery = (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery;
192
- const filters = {
193
- ...baseFilterQuery,
194
- ...filterQuery
195
- };
196
- if (contentType) {
197
- filters["contentType[eq]"] = contentType;
198
- }
199
- const { results } = await performSearch({
200
- page,
201
- perPage,
202
- filters,
203
- facetBy,
204
- search,
205
- orderBy: currentOrderByQuery,
206
- collections: selectedCollections
187
+ const selectedFacetFields = Object.keys(selectedFilters).filter((k) => {
188
+ var _a3;
189
+ return ((_a3 = selectedFilters[k]) == null ? void 0 : _a3.length) > 0;
207
190
  });
208
- setCollectionResults(results || {});
209
- const allItems = [];
210
- let totalCount = 0;
211
- let mergedFacets = {};
212
- for (const col of selectedCollections) {
213
- const colResult = results == null ? void 0 : results[col];
214
- if ((_a2 = colResult == null ? void 0 : colResult.data) == null ? void 0 : _a2.items) {
215
- allItems.push(...colResult.data.items);
216
- totalCount += colResult.data.total || 0;
217
- }
218
- if (colResult == null ? void 0 : colResult.facets) {
219
- mergedFacets = { ...mergedFacets, ...colResult.facets };
220
- }
221
- }
222
- setEntries({
223
- items: allItems,
224
- total: totalCount,
225
- page,
226
- perPage,
227
- totalPages: Math.ceil(totalCount / perPage)
191
+ const queryByString = (queryBy == null ? void 0 : queryBy.length) ? queryBy.join(",") : void 0;
192
+ const [mainResult, ...disjunctiveResults] = await Promise.all([
193
+ performSearch({
194
+ page,
195
+ perPage,
196
+ filters: buildFilters(),
197
+ baseFilterBy: baseFilterString,
198
+ facetBy,
199
+ queryBy: queryByString,
200
+ search,
201
+ orderBy: currentOrderByQuery,
202
+ locale,
203
+ maxFacetValues
204
+ }),
205
+ ...selectedFacetFields.map(
206
+ (field) => performSearch({
207
+ page: 0,
208
+ perPage: 0,
209
+ filters: buildFilters(field),
210
+ baseFilterBy: baseFilterString,
211
+ facetBy: field,
212
+ queryBy: queryByString,
213
+ search,
214
+ orderBy: currentOrderByQuery,
215
+ locale,
216
+ maxFacetValues
217
+ })
218
+ )
219
+ ]);
220
+ if (requestId !== searchRequestIdRef.current) return;
221
+ const mergedFacets = { ...(_a2 = mainResult.facets) != null ? _a2 : {} };
222
+ selectedFacetFields.forEach((field, i) => {
223
+ var _a3, _b2;
224
+ const counts = (_b2 = (_a3 = disjunctiveResults[i]) == null ? void 0 : _a3.facets) == null ? void 0 : _b2[field];
225
+ if (counts) mergedFacets[field] = counts;
228
226
  });
227
+ setEntries((_b = mainResult.data) != null ? _b : { items: [], total: 0, page, perPage, totalPages: 0 });
229
228
  setFacets(mergedFacets);
230
229
  };
231
230
  setIsLoading(true);
232
- doFetch().catch((error) => console.error("[alex] Search fetch error:", error)).finally(() => {
233
- setIsLoading(false);
234
- hasFetchedInitial.current = true;
235
- });
231
+ doFetch().catch((error) => console.error("[alex] Search fetch error:", error)).finally(() => setIsLoading(false));
236
232
  }, [
237
- baseFilterQuery,
238
- contentType,
233
+ baseFilterString,
239
234
  defaultOrderByQuery,
240
235
  facetBy,
241
236
  filterBy,
237
+ locale,
242
238
  urlParams,
243
239
  page,
244
240
  perPage,
245
241
  performSearch,
246
242
  search,
247
- selectedCollections,
248
243
  selectedFilters
249
244
  ]);
245
+ (0, import_react.useEffect)(() => {
246
+ return () => {
247
+ if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);
248
+ };
249
+ }, []);
250
250
  const updateUrl = (0, import_react.useCallback)(
251
251
  (params, { replace = false } = {}) => {
252
252
  const qs = params.toString();
@@ -276,26 +276,15 @@ var SearchProvider = ({
276
276
  const setSearchQuery = (0, import_react.useCallback)(
277
277
  (value2) => {
278
278
  setSearchBoxValue(value2);
279
- if (searchDebounceRef.current) {
280
- clearTimeout(searchDebounceRef.current);
281
- }
279
+ if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);
282
280
  if (!value2) {
283
281
  commitSearchToUrl(value2);
284
282
  } else {
285
- searchDebounceRef.current = setTimeout(() => {
286
- commitSearchToUrl(value2);
287
- }, searchDebounceMs);
283
+ searchDebounceRef.current = setTimeout(() => commitSearchToUrl(value2), searchDebounceMs);
288
284
  }
289
285
  },
290
286
  [commitSearchToUrl, searchDebounceMs]
291
287
  );
292
- (0, import_react.useEffect)(() => {
293
- return () => {
294
- if (searchDebounceRef.current) {
295
- clearTimeout(searchDebounceRef.current);
296
- }
297
- };
298
- }, []);
299
288
  const setPage = (0, import_react.useCallback)(
300
289
  (p) => {
301
290
  const params = new URLSearchParams(window.location.search);
@@ -328,28 +317,22 @@ var SearchProvider = ({
328
317
  );
329
318
  const setSelectedFilters = (0, import_react.useCallback)(
330
319
  (nextSelected) => {
331
- const params = new URLSearchParams();
320
+ const params = new URLSearchParams(window.location.search);
332
321
  params.delete(UNIFORM_SEARCH_PAGE_KEY);
333
- if (search) {
334
- params.set(UNIFORM_SEARCH_QUERY_KEY, search);
335
- }
322
+ filterBy.forEach((f) => params.delete(f.fieldKey));
336
323
  Object.entries(nextSelected).forEach(([key, value2]) => {
337
324
  const filter = filterBy.find((f) => f.fieldKey === key);
338
325
  if (!filter) return;
339
- value2.forEach((v) => {
340
- params.append(filter.fieldId, v);
341
- });
326
+ value2.forEach((v) => params.append(key, v));
342
327
  });
343
328
  updateUrl(params);
344
329
  },
345
- [filterBy, search, updateUrl]
330
+ [filterBy, updateUrl]
346
331
  );
347
332
  const clearFilters = (0, import_react.useCallback)(() => {
348
333
  setIsLoading(true);
349
334
  setSearchBoxValue("");
350
- if (searchDebounceRef.current) {
351
- clearTimeout(searchDebounceRef.current);
352
- }
335
+ if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);
353
336
  window.history.pushState({}, "", pathname);
354
337
  setUrlParams(getSearchParamsFromUrl(window.location.href));
355
338
  }, [pathname]);
@@ -374,7 +357,6 @@ var SearchProvider = ({
374
357
  results: entries,
375
358
  facets,
376
359
  isLoading,
377
- collectionResults,
378
360
  searchBoxValue,
379
361
  setSearchQuery,
380
362
  page,
@@ -386,20 +368,23 @@ var SearchProvider = ({
386
368
  selectedOrderBy: (urlParams == null ? void 0 : urlParams[UNIFORM_SEARCH_ORDER_BY_KEY]) || defaultOrderByQuery,
387
369
  setOrderBy,
388
370
  filterOptions: filterBy,
371
+ setFilterOptions,
372
+ registerFilterOption,
373
+ unregisterFilterOption,
389
374
  selectedFilters,
390
375
  setSelectedFilters,
391
376
  clearFilters,
392
- selectedCollections,
393
- setSelectedCollections,
394
377
  formatResultsSummary
395
378
  }),
396
379
  [
397
380
  clearFilters,
398
- collectionResults,
399
381
  defaultOrderByQuery,
400
382
  entries,
401
383
  facets,
402
384
  filterBy,
385
+ setFilterOptions,
386
+ registerFilterOption,
387
+ unregisterFilterOption,
403
388
  formatResultsSummary,
404
389
  isLoading,
405
390
  orderByOptions,
@@ -407,7 +392,6 @@ var SearchProvider = ({
407
392
  pageSizesFlat,
408
393
  perPage,
409
394
  searchBoxValue,
410
- selectedCollections,
411
395
  selectedFilters,
412
396
  setOrderBy,
413
397
  setPage,
@@ -508,12 +492,74 @@ function useSearchPagination(siblingCount) {
508
492
  isLoading
509
493
  };
510
494
  }
495
+
496
+ // src/react/SearchItemUrlResolver.tsx
497
+ var import_react5 = require("react");
498
+ var import_jsx_runtime2 = require("react/jsx-runtime");
499
+ var NOOP_RESOLVER = () => void 0;
500
+ var UserUrlResolverContext = (0, import_react5.createContext)(null);
501
+ var DefaultUrlResolverContext = (0, import_react5.createContext)(NOOP_RESOLVER);
502
+ var SearchItemUrlResolverProvider = ({
503
+ resolver,
504
+ children
505
+ }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(UserUrlResolverContext.Provider, { value: resolver, children });
506
+ var SearchItemDefaultUrlResolverProvider = ({
507
+ resolver,
508
+ children
509
+ }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(DefaultUrlResolverContext.Provider, { value: resolver, children });
510
+ function useUrlResolver() {
511
+ const user = (0, import_react5.useContext)(UserUrlResolverContext);
512
+ const def = (0, import_react5.useContext)(DefaultUrlResolverContext);
513
+ return user != null ? user : def;
514
+ }
515
+ function resolveField(obj, path) {
516
+ return path.split(".").reduce((current, key) => {
517
+ if (current == null) {
518
+ return void 0;
519
+ }
520
+ if (Array.isArray(current)) {
521
+ current = current[0];
522
+ }
523
+ return current == null ? void 0 : current[key];
524
+ }, obj);
525
+ }
526
+ function createDefaultUrlResolver(configs, options = {}) {
527
+ const { pathsByNodeId = {}, locale } = options;
528
+ return (hit) => {
529
+ var _a;
530
+ const hitSource = typeof hit.source === "string" ? hit.source : "";
531
+ const hitType = typeof hit.type === "string" ? hit.type : "";
532
+ const config = configs.find((c) => c.source === hitSource && c.type === hitType);
533
+ if (config) {
534
+ const template = (_a = config.nodeId ? pathsByNodeId[config.nodeId] : void 0) != null ? _a : config.urlTemplate;
535
+ if (template) {
536
+ return template.replace(/:([a-zA-Z0-9_-]+)/g, (_, token) => {
537
+ var _a2, _b;
538
+ if (token === "locale") return locale != null ? locale : "";
539
+ const fieldKey = (_a2 = config.tokenMapping) == null ? void 0 : _a2[token];
540
+ if (!fieldKey) return "";
541
+ const val = resolveField(hit, fieldKey);
542
+ return Array.isArray(val) ? String((_b = val[0]) != null ? _b : "") : String(val != null ? val : "");
543
+ });
544
+ }
545
+ }
546
+ if (hitSource === "composition" && typeof hit.path === "string") {
547
+ return hit.path;
548
+ }
549
+ return void 0;
550
+ };
551
+ }
511
552
  // Annotate the CommonJS export names for ESM import in node:
512
553
  0 && (module.exports = {
513
554
  DOTS,
555
+ SearchContext,
556
+ SearchItemDefaultUrlResolverProvider,
557
+ SearchItemUrlResolverProvider,
514
558
  SearchProvider,
559
+ createDefaultUrlResolver,
515
560
  usePagination,
516
561
  useSearch,
517
- useSearchPagination
562
+ useSearchPagination,
563
+ useUrlResolver
518
564
  });
519
565
  //# sourceMappingURL=react.js.map
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/index.ts","../src/react/SearchProvider.tsx","../src/constants.ts","../src/utils.ts","../src/flattenBlockParams.ts","../src/react/useSearch.ts","../src/react/usePagination.ts","../src/react/useSearchPagination.ts"],"sourcesContent":["export { SearchProvider } from './SearchProvider';\nexport { useSearch } from './useSearch';\nexport { usePagination, DOTS } from './usePagination';\nexport { useSearchPagination } from './useSearchPagination';\nexport type { SearchProviderProps, UseSearchReturn } from './SearchProvider';\nexport type { UseSearchPaginationReturn } from './useSearchPagination';\n","import {\n createContext,\n FC,\n useMemo,\n useCallback,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\n\nimport {\n DEFAULT_PAGE_SIZE,\n UNIFORM_SEARCH_ORDER_BY_KEY,\n UNIFORM_SEARCH_PAGE_KEY,\n UNIFORM_SEARCH_PAGE_SIZE_KEY,\n UNIFORM_SEARCH_QUERY_KEY,\n FIRST_PAGE,\n} from '../constants';\nimport { getSearchParamsFromUrl, buildOrderByQuery } from '../utils';\nimport { flattenBlockParams } from '../flattenBlockParams';\nimport type {\n SearchCollection,\n SearchHit,\n FilterBy,\n Pagination,\n Facets,\n OrderBy,\n PageSize,\n FilterQuery,\n MultiSearchResult,\n} from '../types';\nimport type { SearchParams } from '../client';\n\nconst ALL_COLLECTIONS: SearchCollection[] = ['entries', 'compositions', 'assets'];\n\nexport interface SearchProviderProps {\n children: ReactNode;\n performSearch: (params: SearchParams) => Promise<{ results: MultiSearchResult }>;\n contentType?: string;\n filterBy?: unknown;\n orderBy?: unknown;\n baseFilters?: unknown;\n pageSizes?: unknown;\n collections?: string | string[];\n searchDebounceMs?: number;\n}\n\nexport interface UseSearchReturn {\n results: Pagination<SearchHit>;\n facets: Facets | null;\n isLoading: boolean;\n collectionResults: MultiSearchResult;\n\n searchBoxValue: string;\n setSearchQuery: (value: string) => void;\n\n page: number;\n setPage: (page: number) => void;\n pageSize: number;\n setPageSize: (size: number) => void;\n pageSizes: PageSize[];\n\n orderByOptions: Array<{ title: string; value: string }>;\n selectedOrderBy: string;\n setOrderBy: (query: string) => void;\n\n filterOptions: FilterBy[];\n selectedFilters: Record<string, string[]>;\n setSelectedFilters: (filters: Record<string, string[]>) => void;\n clearFilters: () => void;\n\n selectedCollections: SearchCollection[];\n setSelectedCollections: (collections: SearchCollection[]) => void;\n\n formatResultsSummary: (template: string) => string;\n}\n\nexport const SearchContext = createContext<UseSearchReturn | null>(null);\n\nexport const SearchProvider: FC<SearchProviderProps> = ({\n children,\n performSearch,\n contentType,\n filterBy: filterByRaw,\n orderBy: orderByRaw,\n baseFilters: baseFiltersRaw,\n pageSizes: pageSizesRaw,\n collections: collectionsRaw,\n searchDebounceMs = 300,\n}) => {\n const filterBy = useMemo(() => flattenBlockParams<FilterBy>(filterByRaw), [filterByRaw]);\n const baseFiltersFlat = useMemo(() => flattenBlockParams<FilterBy>(baseFiltersRaw), [baseFiltersRaw]);\n const orderByFlat = useMemo(() => flattenBlockParams<OrderBy>(orderByRaw), [orderByRaw]);\n const pageSizesFlat = useMemo(() => flattenBlockParams<PageSize>(pageSizesRaw), [pageSizesRaw]);\n\n const initCollections = useMemo<SearchCollection[] | undefined>(() => {\n if (!collectionsRaw) return undefined;\n const items = Array.isArray(collectionsRaw)\n ? collectionsRaw\n : collectionsRaw.split(',').map(s => s.trim());\n const valid: SearchCollection[] = items.filter(\n (c): c is SearchCollection => ['entries', 'compositions', 'assets'].includes(c)\n );\n return valid.length > 0 ? valid : undefined;\n }, [collectionsRaw]);\n\n const baseFilterQuery = useMemo(\n () =>\n baseFiltersFlat.reduce<FilterQuery>((acc, filter) => {\n if (!filter?.fieldKey || !Array.isArray(filter.values)) return acc;\n return {\n ...acc,\n [`${filter.fieldKey}[eq]`]: filter.values.map(v => v.value),\n };\n }, {}),\n [baseFiltersFlat]\n );\n\n const facetBy = useMemo(\n () =>\n filterBy\n .filter(f => f?.enableFaceting && f?.fieldKey)\n .map(f => f.fieldKey)\n .join(','),\n [filterBy]\n );\n\n const defaultOrderByQuery = useMemo(\n () => (orderByFlat[0] ? buildOrderByQuery(orderByFlat[0]) : 'created_at_DESC'),\n [orderByFlat]\n );\n\n const orderByOptions = useMemo(\n () => orderByFlat.map(o => ({ title: o.title, value: buildOrderByQuery(o) })),\n [orderByFlat]\n );\n\n const initPerPage = pageSizesFlat[0]?.size || DEFAULT_PAGE_SIZE;\n\n const hasFetchedInitial = useRef(false);\n const searchDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [selectedCollections, setSelectedCollections] = useState<SearchCollection[]>(\n initCollections || ALL_COLLECTIONS\n );\n\n const [urlParams, setUrlParams] = useState<Record<string, string | string[]>>(() => {\n if (typeof window === 'undefined') return {};\n return getSearchParamsFromUrl(window.location.href);\n });\n\n const [searchBoxValue, setSearchBoxValue] = useState(\n (urlParams?.[UNIFORM_SEARCH_QUERY_KEY] as string) || ''\n );\n const [isLoading, setIsLoading] = useState(true);\n const [entries, setEntries] = useState<Pagination<SearchHit>>({\n items: [],\n page: FIRST_PAGE,\n perPage: initPerPage,\n total: 0,\n totalPages: 0,\n });\n const [facets, setFacets] = useState<Facets>({});\n const [collectionResults, setCollectionResults] = useState<MultiSearchResult>({});\n\n const pathname = useMemo(() => {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname;\n }, []);\n\n const page =\n Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1 && Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1 > 0\n ? Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1\n : FIRST_PAGE;\n const search = (urlParams?.[UNIFORM_SEARCH_QUERY_KEY] as string) || '';\n const perPage = Number(urlParams?.[UNIFORM_SEARCH_PAGE_SIZE_KEY]) || initPerPage;\n\n const selectedFilters = useMemo(\n () =>\n filterBy.reduce<Record<string, string[]>>((acc, filter) => {\n const value = urlParams?.[filter.fieldId];\n if (value) {\n acc[filter.fieldKey] = Array.isArray(value) ? value : [value];\n }\n return acc;\n }, {}),\n [filterBy, urlParams]\n );\n\n useEffect(() => {\n const doFetch = async () => {\n const filterQuery = Object.entries(selectedFilters).reduce<Record<string, unknown>>((acc, [fieldKey, values]) => {\n if (!values || values.length === 0) return acc;\n const filterType = filterBy.find(f => f.fieldKey === fieldKey)?.type;\n\n if (filterType === 'range') {\n const [min, max] = values;\n return { ...acc, [`${fieldKey}[gte]`]: min, [`${fieldKey}[lte]`]: max };\n }\n\n return { ...acc, [`${fieldKey}[in]`]: values };\n }, {});\n\n const currentOrderByQuery = (urlParams?.[UNIFORM_SEARCH_ORDER_BY_KEY] as string) || defaultOrderByQuery;\n\n const filters: Record<string, unknown> = {\n ...baseFilterQuery,\n ...filterQuery,\n };\n\n if (contentType) {\n filters['contentType[eq]'] = contentType;\n }\n\n const { results } = await performSearch({\n page,\n perPage,\n filters,\n facetBy,\n search,\n orderBy: currentOrderByQuery,\n collections: selectedCollections,\n });\n\n setCollectionResults(results || {});\n\n const allItems: SearchHit[] = [];\n let totalCount = 0;\n let mergedFacets: Facets = {};\n\n for (const col of selectedCollections) {\n const colResult = results?.[col];\n if (colResult?.data?.items) {\n allItems.push(...colResult.data.items);\n totalCount += colResult.data.total || 0;\n }\n if (colResult?.facets) {\n mergedFacets = { ...mergedFacets, ...colResult.facets };\n }\n }\n\n setEntries({\n items: allItems,\n total: totalCount,\n page,\n perPage,\n totalPages: Math.ceil(totalCount / perPage),\n });\n setFacets(mergedFacets);\n };\n\n setIsLoading(true);\n doFetch()\n .catch(error => console.error('[alex] Search fetch error:', error))\n .finally(() => {\n setIsLoading(false);\n hasFetchedInitial.current = true;\n });\n }, [\n baseFilterQuery,\n contentType,\n defaultOrderByQuery,\n facetBy,\n filterBy,\n urlParams,\n page,\n perPage,\n performSearch,\n search,\n selectedCollections,\n selectedFilters,\n ]);\n\n const updateUrl = useCallback(\n (params: URLSearchParams, { replace = false }: { replace?: boolean } = {}) => {\n const qs = params.toString();\n const url = qs ? `${pathname}?${qs}` : pathname;\n if (replace) {\n window.history.replaceState({}, '', url);\n } else {\n window.history.pushState({}, '', url);\n }\n setUrlParams(getSearchParamsFromUrl(window.location.href));\n },\n [pathname]\n );\n\n const commitSearchToUrl = useCallback(\n (value: string) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n if (!value) {\n params.delete(UNIFORM_SEARCH_QUERY_KEY);\n } else {\n params.set(UNIFORM_SEARCH_QUERY_KEY, value);\n }\n updateUrl(params, { replace: true });\n },\n [updateUrl]\n );\n\n const setSearchQuery = useCallback(\n (value: string) => {\n setSearchBoxValue(value);\n if (searchDebounceRef.current) {\n clearTimeout(searchDebounceRef.current);\n }\n if (!value) {\n commitSearchToUrl(value);\n } else {\n searchDebounceRef.current = setTimeout(() => {\n commitSearchToUrl(value);\n }, searchDebounceMs);\n }\n },\n [commitSearchToUrl, searchDebounceMs]\n );\n\n useEffect(() => {\n return () => {\n if (searchDebounceRef.current) {\n clearTimeout(searchDebounceRef.current);\n }\n };\n }, []);\n\n const setPage = useCallback(\n (p: number) => {\n const params = new URLSearchParams(window.location.search);\n if (p === 0) {\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n } else {\n params.set(UNIFORM_SEARCH_PAGE_KEY, (p + 1).toString());\n }\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setPageSize = useCallback(\n (size: number) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n params.set(UNIFORM_SEARCH_PAGE_SIZE_KEY, size.toString());\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setOrderBy = useCallback(\n (orderByQuery: string) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n params.set(UNIFORM_SEARCH_ORDER_BY_KEY, orderByQuery);\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setSelectedFilters = useCallback(\n (nextSelected: Record<string, string[]>) => {\n const params = new URLSearchParams();\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n if (search) {\n params.set(UNIFORM_SEARCH_QUERY_KEY, search);\n }\n Object.entries(nextSelected).forEach(([key, value]) => {\n const filter = filterBy.find(f => f.fieldKey === key);\n if (!filter) return;\n value.forEach(v => {\n params.append(filter.fieldId, v);\n });\n });\n updateUrl(params);\n },\n [filterBy, search, updateUrl]\n );\n\n const clearFilters = useCallback(() => {\n setIsLoading(true);\n setSearchBoxValue('');\n if (searchDebounceRef.current) {\n clearTimeout(searchDebounceRef.current);\n }\n window.history.pushState({}, '', pathname);\n setUrlParams(getSearchParamsFromUrl(window.location.href));\n }, [pathname]);\n\n const formatResultsSummary = useCallback(\n (template: string) => {\n if (!template) return '';\n const vars: Record<string, number | undefined> = {\n page: entries.page,\n perPage: entries.perPage,\n totalItems: entries.total,\n totalPages: entries.totalPages,\n };\n return template.replace(/{(\\w+)}/g, (match, key) => {\n const val = vars[key];\n return val != null ? String(val) : match;\n });\n },\n [entries]\n );\n\n const value: UseSearchReturn = useMemo(\n () => ({\n results: entries,\n facets,\n isLoading,\n collectionResults,\n\n searchBoxValue,\n setSearchQuery,\n\n page,\n setPage,\n pageSize: perPage,\n setPageSize,\n pageSizes: pageSizesFlat,\n\n orderByOptions,\n selectedOrderBy: (urlParams?.[UNIFORM_SEARCH_ORDER_BY_KEY] as string) || defaultOrderByQuery,\n setOrderBy,\n\n filterOptions: filterBy,\n selectedFilters,\n setSelectedFilters,\n clearFilters,\n\n selectedCollections,\n setSelectedCollections,\n\n formatResultsSummary,\n }),\n [\n clearFilters,\n collectionResults,\n defaultOrderByQuery,\n entries,\n facets,\n filterBy,\n formatResultsSummary,\n isLoading,\n orderByOptions,\n page,\n pageSizesFlat,\n perPage,\n searchBoxValue,\n selectedCollections,\n selectedFilters,\n setOrderBy,\n setPage,\n setPageSize,\n setSearchQuery,\n setSelectedFilters,\n urlParams,\n ]\n );\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n","export const UNIFORM_SEARCH_QUERY_KEY = 'search';\nexport const UNIFORM_SEARCH_PAGE_KEY = 'page';\nexport const UNIFORM_SEARCH_PAGE_SIZE_KEY = 'pageSize';\nexport const UNIFORM_SEARCH_ORDER_BY_KEY = 'orderBy';\nexport const FIRST_PAGE = 0;\nexport const DEFAULT_PAGE_SIZE = 10;\n","import type { OrderBy } from './types';\n\nexport const buildOrderByQuery = (orderBy: OrderBy) => {\n return `${orderBy.field}_${orderBy.direction}`;\n};\n\nexport const getSearchParamsFromUrl = (urlString: string): Record<string, string | string[]> => {\n if (!urlString) {\n return {};\n }\n\n const url = new URL(urlString);\n const params: Record<string, string | string[]> = {};\n\n url.searchParams.forEach((value, key) => {\n if (params[key]) {\n params[key] = Array.isArray(params[key])\n ? [...(params[key] as string[]), value]\n : [params[key] as string, value];\n } else {\n params[key] = value;\n }\n });\n\n return params;\n};\n","type RawField = {\n type?: string;\n value?: unknown;\n locales?: Record<string, unknown>;\n};\n\ntype RawBlockItem = {\n type?: string;\n fields?: Record<string, RawField>;\n};\n\nfunction resolveFieldValue(field: RawField, locale = 'en-us'): unknown {\n if (!field || typeof field !== 'object') return field;\n\n if (field.type === '$block' && Array.isArray(field.value)) {\n return flattenBlockParams(field.value as RawBlockItem[], locale);\n }\n\n if (field.locales && typeof field.locales === 'object') {\n return field.locales[locale] ?? Object.values(field.locales)[0] ?? field.value;\n }\n\n return field.value;\n}\n\nexport function flattenBlockParams<T = Record<string, unknown>>(\n items: unknown,\n locale = 'en-us'\n): T[] {\n if (!Array.isArray(items)) return [];\n return items.map(item => {\n const result: Record<string, unknown> = {};\n const blockItem = item as RawBlockItem;\n if (blockItem.fields) {\n for (const [key, field] of Object.entries(blockItem.fields)) {\n result[key] = resolveFieldValue(field, locale);\n }\n }\n return result as T;\n });\n}\n","import { useContext } from 'react';\nimport { SearchContext } from './SearchProvider';\nimport type { UseSearchReturn } from './SearchProvider';\n\nexport function useSearch(): UseSearchReturn {\n const context = useContext(SearchContext);\n if (!context) {\n throw new Error('useSearch must be used within a <SearchProvider>');\n }\n return context;\n}\n","import { useMemo } from 'react';\n\nexport const DOTS = '...';\n\ninterface UsePaginationParams {\n currentPage: number;\n totalCount: number;\n perPage: number;\n siblingCount?: number;\n}\n\nconst range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, idx) => idx + start);\n};\n\nexport const usePagination = ({ totalCount, perPage, siblingCount = 1, currentPage }: UsePaginationParams) =>\n useMemo(() => {\n const totalPageCount = Math.ceil(totalCount / perPage);\n const totalPageNumbers = siblingCount + 5;\n\n if (totalPageNumbers >= totalPageCount) {\n return range(1, totalPageCount);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPageCount);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPageCount;\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = 2 + 2 * siblingCount;\n const leftRange = range(1, leftItemCount);\n return [...leftRange, DOTS, totalPageCount];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = 2 + 2 * siblingCount;\n const rightRange = range(totalPageCount - rightItemCount + 1, totalPageCount);\n return [firstPageIndex, DOTS, ...rightRange];\n }\n\n if (shouldShowLeftDots && shouldShowRightDots) {\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\n }\n }, [totalCount, perPage, siblingCount, currentPage]);\n","import { useMemo, useCallback } from 'react';\nimport { useSearch } from './useSearch';\nimport { usePagination, DOTS } from './usePagination';\n\nexport interface UseSearchPaginationReturn {\n pages: (number | string)[];\n currentPage: number;\n hasPrev: boolean;\n hasNext: boolean;\n goToPage: (page: number) => void;\n goToPrev: () => void;\n goToNext: () => void;\n isLoading: boolean;\n}\n\nexport function useSearchPagination(siblingCount?: number): UseSearchPaginationReturn {\n const { page, pageSize, results, setPage, isLoading } = useSearch();\n\n const pages = usePagination({\n currentPage: page,\n totalCount: results.total,\n perPage: pageSize,\n siblingCount,\n }) || [];\n\n const lastPage = useMemo(\n () => Number(pages[pages.length - 1]) || 0,\n [pages]\n );\n\n const goToPage = useCallback(\n (p: number) => { if (!isLoading) setPage(p); },\n [isLoading, setPage]\n );\n\n const goToPrev = useCallback(\n () => { if (page > 0 && !isLoading) setPage(page - 1); },\n [page, isLoading, setPage]\n );\n\n const goToNext = useCallback(\n () => { if (page < lastPage && !isLoading) setPage(page + 1); },\n [page, lastPage, isLoading, setPage]\n );\n\n return {\n pages,\n currentPage: page,\n hasPrev: page > 0,\n hasNext: page < lastPage,\n goToPage,\n goToPrev,\n goToNext,\n isLoading,\n };\n}\n\nexport { DOTS };\n"],"mappings":"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","names":["value","_a","import_react","import_react","import_react"]}
1
+ {"version":3,"sources":["../src/react/index.ts","../src/react/SearchProvider.tsx","../src/constants.ts","../src/utils.ts","../src/flattenBlockParams.ts","../src/react/useSearch.ts","../src/react/usePagination.ts","../src/react/useSearchPagination.ts","../src/react/SearchItemUrlResolver.tsx"],"sourcesContent":["export { SearchProvider, SearchContext } from './SearchProvider';\nexport { useSearch } from './useSearch';\nexport { usePagination, DOTS } from './usePagination';\nexport { useSearchPagination } from './useSearchPagination';\nexport {\n SearchItemUrlResolverProvider,\n SearchItemDefaultUrlResolverProvider,\n useUrlResolver,\n createDefaultUrlResolver,\n} from './SearchItemUrlResolver';\nexport type { SearchProviderProps, UseSearchReturn } from './SearchProvider';\nexport type { UseSearchPaginationReturn } from './useSearchPagination';\nexport type { UrlResolver } from './SearchItemUrlResolver';\n","import { createContext, FC, useMemo, useCallback, useState, useEffect, useRef, type ReactNode } from 'react';\n\nimport {\n DEFAULT_PAGE_SIZE,\n UNIFORM_SEARCH_ORDER_BY_KEY,\n UNIFORM_SEARCH_PAGE_KEY,\n UNIFORM_SEARCH_PAGE_SIZE_KEY,\n UNIFORM_SEARCH_QUERY_KEY,\n FIRST_PAGE,\n} from '../constants';\nimport { getSearchParamsFromUrl, buildOrderByQuery } from '../utils';\nimport { flattenBlockParams } from '../flattenBlockParams';\nimport type {\n SearchHit,\n FacetBy,\n FilterByItem,\n Pagination,\n Facets,\n OrderBy,\n PageSize,\n FilterQuery,\n CollectionResult,\n} from '../types';\nimport type { SearchParams } from '../client';\n\nexport interface SearchProviderProps {\n children: ReactNode;\n performSearch: (params: SearchParams) => Promise<CollectionResult>;\n orderBy?: unknown;\n baseFilterString?: string;\n pageSizes?: unknown;\n queryBy?: string[];\n searchDebounceMs?: number;\n locale?: string;\n maxFacetValues?: number;\n}\n\nexport interface UseSearchReturn {\n results: Pagination<SearchHit>;\n facets: Facets | null;\n isLoading: boolean;\n\n searchBoxValue: string;\n setSearchQuery: (value: string) => void;\n\n page: number;\n setPage: (page: number) => void;\n pageSize: number;\n setPageSize: (size: number) => void;\n pageSizes: PageSize[];\n\n orderByOptions: Array<{ title: string; value: string }>;\n selectedOrderBy: string;\n setOrderBy: (query: string) => void;\n\n filterOptions: FacetBy[];\n setFilterOptions: (filters: FacetBy[]) => void;\n /** Additive registration of a single facet option (keyed by fieldKey). Used by facet\n * components that mount independently (e.g. App Router slots) rather than being\n * enumerated by a parent. */\n registerFilterOption: (filter: FacetBy) => void;\n unregisterFilterOption: (fieldKey: string) => void;\n selectedFilters: Record<string, string[]>;\n setSelectedFilters: (filters: Record<string, string[]>) => void;\n clearFilters: () => void;\n\n formatResultsSummary: (template: string) => string;\n}\n\nexport const SearchContext = createContext<UseSearchReturn | null>(null);\n\nexport const SearchProvider: FC<SearchProviderProps> = ({\n children,\n performSearch,\n orderBy: orderByRaw,\n baseFilterString,\n pageSizes: pageSizesRaw,\n queryBy,\n searchDebounceMs = 300,\n locale,\n maxFacetValues = 100,\n}) => {\n const [filterBy, setFilterOptions] = useState<FacetBy[]>([]);\n\n const registerFilterOption = useCallback((filter: FacetBy) => {\n if (!filter?.fieldKey) return;\n setFilterOptions((prev) => [...prev.filter((f) => f.fieldKey !== filter.fieldKey), filter]);\n }, []);\n\n const unregisterFilterOption = useCallback((fieldKey: string) => {\n setFilterOptions((prev) => prev.filter((f) => f.fieldKey !== fieldKey));\n }, []);\n\n const orderByFlat = useMemo(() => flattenBlockParams<OrderBy>(orderByRaw), [orderByRaw]);\n const pageSizesFlat = useMemo(() => flattenBlockParams<PageSize>(pageSizesRaw), [pageSizesRaw]);\n\n const facetBy = useMemo(\n () =>\n filterBy\n .filter((f) => f?.fieldKey)\n .map((f) => f.fieldKey)\n .join(','),\n [filterBy]\n );\n\n const defaultOrderByQuery = useMemo(\n () => (orderByFlat[0] ? buildOrderByQuery(orderByFlat[0]) : 'created_at_DESC'),\n [orderByFlat]\n );\n\n const orderByOptions = useMemo(\n () => orderByFlat.map((o) => ({ title: o.title, value: buildOrderByQuery(o) })),\n [orderByFlat]\n );\n\n const initPerPage = pageSizesFlat[0]?.size || DEFAULT_PAGE_SIZE;\n\n const searchDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const searchRequestIdRef = useRef(0);\n\n const [urlParams, setUrlParams] = useState<Record<string, string | string[]>>(() => {\n if (typeof window === 'undefined') return {};\n return getSearchParamsFromUrl(window.location.href);\n });\n\n const [searchBoxValue, setSearchBoxValue] = useState((urlParams?.[UNIFORM_SEARCH_QUERY_KEY] as string) || '');\n const [isLoading, setIsLoading] = useState(true);\n const [entries, setEntries] = useState<Pagination<SearchHit>>({\n items: [],\n page: FIRST_PAGE,\n perPage: initPerPage,\n total: 0,\n totalPages: 0,\n });\n const [facets, setFacets] = useState<Facets>({});\n\n const pathname = useMemo(() => {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname;\n }, []);\n\n const page =\n Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1 > 0\n ? Number(urlParams?.[UNIFORM_SEARCH_PAGE_KEY]) - 1\n : FIRST_PAGE;\n const search = (urlParams?.[UNIFORM_SEARCH_QUERY_KEY] as string) || '';\n const perPage = Number(urlParams?.[UNIFORM_SEARCH_PAGE_SIZE_KEY]) || initPerPage;\n\n const selectedFilters = useMemo(\n () =>\n filterBy.reduce<Record<string, string[]>>((acc, filter) => {\n const value = urlParams?.[filter.fieldKey];\n if (value) {\n acc[filter.fieldKey] = Array.isArray(value) ? value : [value];\n }\n return acc;\n }, {}),\n [filterBy, urlParams]\n );\n\n useEffect(() => {\n const requestId = ++searchRequestIdRef.current;\n\n const doFetch = async () => {\n const currentOrderByQuery = (urlParams?.[UNIFORM_SEARCH_ORDER_BY_KEY] as string) || defaultOrderByQuery;\n\n const buildFilters = (excludeField?: string) =>\n Object.entries(selectedFilters).reduce<Record<string, unknown>>((acc, [fieldKey, values]) => {\n if (excludeField && fieldKey === excludeField) return acc;\n if (!values || values.length === 0) return acc;\n const filterType = filterBy.find((f) => f.fieldKey === fieldKey)?.type;\n if (filterType === 'range') {\n const [min, max] = values;\n return { ...acc, [`${fieldKey}[gte]`]: min, [`${fieldKey}[lte]`]: max };\n }\n return { ...acc, [`${fieldKey}[in]`]: values };\n }, {});\n\n // Fields that have active selections need disjunctive queries so their\n // option lists stay complete (user can add more values via OR logic).\n const selectedFacetFields = Object.keys(selectedFilters).filter((k) => selectedFilters[k]?.length > 0);\n const queryByString = queryBy?.length ? queryBy.join(',') : undefined;\n const [mainResult, ...disjunctiveResults] = await Promise.all([\n performSearch({\n page,\n perPage,\n filters: buildFilters(),\n baseFilterBy: baseFilterString,\n facetBy,\n queryBy: queryByString,\n search,\n orderBy: currentOrderByQuery,\n locale,\n maxFacetValues,\n }),\n ...selectedFacetFields.map((field) =>\n performSearch({\n page: 0,\n perPage: 0,\n filters: buildFilters(field),\n baseFilterBy: baseFilterString,\n facetBy: field,\n queryBy: queryByString,\n search,\n orderBy: currentOrderByQuery,\n locale,\n maxFacetValues,\n })\n ),\n ]);\n\n if (requestId !== searchRequestIdRef.current) return;\n\n // Replace main facet counts for selected fields with their disjunctive counts.\n const mergedFacets = { ...(mainResult.facets ?? {}) };\n selectedFacetFields.forEach((field, i) => {\n const counts = disjunctiveResults[i]?.facets?.[field];\n if (counts) mergedFacets[field] = counts;\n });\n\n setEntries(mainResult.data ?? { items: [], total: 0, page, perPage, totalPages: 0 });\n setFacets(mergedFacets);\n };\n\n setIsLoading(true);\n doFetch()\n .catch((error) => console.error('[alex] Search fetch error:', error))\n .finally(() => setIsLoading(false));\n }, [\n baseFilterString,\n defaultOrderByQuery,\n facetBy,\n filterBy,\n locale,\n urlParams,\n page,\n perPage,\n performSearch,\n search,\n selectedFilters,\n ]);\n\n useEffect(() => {\n return () => {\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n };\n }, []);\n\n const updateUrl = useCallback(\n (params: URLSearchParams, { replace = false }: { replace?: boolean } = {}) => {\n const qs = params.toString();\n const url = qs ? `${pathname}?${qs}` : pathname;\n if (replace) {\n window.history.replaceState({}, '', url);\n } else {\n window.history.pushState({}, '', url);\n }\n setUrlParams(getSearchParamsFromUrl(window.location.href));\n },\n [pathname]\n );\n\n const commitSearchToUrl = useCallback(\n (value: string) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n if (!value) {\n params.delete(UNIFORM_SEARCH_QUERY_KEY);\n } else {\n params.set(UNIFORM_SEARCH_QUERY_KEY, value);\n }\n updateUrl(params, { replace: true });\n },\n [updateUrl]\n );\n\n const setSearchQuery = useCallback(\n (value: string) => {\n setSearchBoxValue(value);\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n if (!value) {\n commitSearchToUrl(value);\n } else {\n searchDebounceRef.current = setTimeout(() => commitSearchToUrl(value), searchDebounceMs);\n }\n },\n [commitSearchToUrl, searchDebounceMs]\n );\n\n const setPage = useCallback(\n (p: number) => {\n const params = new URLSearchParams(window.location.search);\n if (p === 0) {\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n } else {\n params.set(UNIFORM_SEARCH_PAGE_KEY, (p + 1).toString());\n }\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setPageSize = useCallback(\n (size: number) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n params.set(UNIFORM_SEARCH_PAGE_SIZE_KEY, size.toString());\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setOrderBy = useCallback(\n (orderByQuery: string) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n params.set(UNIFORM_SEARCH_ORDER_BY_KEY, orderByQuery);\n updateUrl(params);\n },\n [updateUrl]\n );\n\n const setSelectedFilters = useCallback(\n (nextSelected: Record<string, string[]>) => {\n const params = new URLSearchParams(window.location.search);\n params.delete(UNIFORM_SEARCH_PAGE_KEY);\n filterBy.forEach((f) => params.delete(f.fieldKey));\n Object.entries(nextSelected).forEach(([key, value]) => {\n const filter = filterBy.find((f) => f.fieldKey === key);\n if (!filter) return;\n value.forEach((v) => params.append(key, v));\n });\n updateUrl(params);\n },\n [filterBy, updateUrl]\n );\n\n const clearFilters = useCallback(() => {\n setIsLoading(true);\n setSearchBoxValue('');\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n window.history.pushState({}, '', pathname);\n setUrlParams(getSearchParamsFromUrl(window.location.href));\n }, [pathname]);\n\n const formatResultsSummary = useCallback(\n (template: string) => {\n if (!template) return '';\n const vars: Record<string, number | undefined> = {\n page: entries.page,\n perPage: entries.perPage,\n totalItems: entries.total,\n totalPages: entries.totalPages,\n };\n return template.replace(/{(\\w+)}/g, (match, key) => {\n const val = vars[key];\n return val != null ? String(val) : match;\n });\n },\n [entries]\n );\n\n const value: UseSearchReturn = useMemo(\n () => ({\n results: entries,\n facets,\n isLoading,\n\n searchBoxValue,\n setSearchQuery,\n\n page,\n setPage,\n pageSize: perPage,\n setPageSize,\n pageSizes: pageSizesFlat,\n\n orderByOptions,\n selectedOrderBy: (urlParams?.[UNIFORM_SEARCH_ORDER_BY_KEY] as string) || defaultOrderByQuery,\n setOrderBy,\n\n filterOptions: filterBy,\n setFilterOptions,\n registerFilterOption,\n unregisterFilterOption,\n selectedFilters,\n setSelectedFilters,\n clearFilters,\n\n formatResultsSummary,\n }),\n [\n clearFilters,\n defaultOrderByQuery,\n entries,\n facets,\n filterBy,\n setFilterOptions,\n registerFilterOption,\n unregisterFilterOption,\n formatResultsSummary,\n isLoading,\n orderByOptions,\n page,\n pageSizesFlat,\n perPage,\n searchBoxValue,\n selectedFilters,\n setOrderBy,\n setPage,\n setPageSize,\n setSearchQuery,\n setSelectedFilters,\n urlParams,\n ]\n );\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n","export const UNIFORM_SEARCH_QUERY_KEY = 'search';\nexport const UNIFORM_SEARCH_PAGE_KEY = 'page';\nexport const UNIFORM_SEARCH_PAGE_SIZE_KEY = 'pageSize';\nexport const UNIFORM_SEARCH_ORDER_BY_KEY = 'orderBy';\nexport const FIRST_PAGE = 0;\nexport const DEFAULT_PAGE_SIZE = 10;\n","import type { OrderBy } from './types';\n\nexport const buildOrderByQuery = (orderBy: OrderBy) => {\n const field = orderBy.field as unknown;\n // sortByConfig produces an object value: { field: string; direction: 'asc' | 'desc' }\n if (field && typeof field === 'object' && 'field' in (field as object)) {\n const sv = field as { field: string; direction: string };\n return `${sv.field}_${sv.direction.toUpperCase()}`;\n }\n // Plain string \"relevance\" or missing direction → no sort\n if (!field || field === 'relevance') return '';\n return `${field}_${orderBy.direction ?? 'ASC'}`;\n};\n\nexport const getSearchParamsFromUrl = (urlString: string): Record<string, string | string[]> => {\n if (!urlString) {\n return {};\n }\n\n const url = new URL(urlString);\n const params: Record<string, string | string[]> = {};\n\n url.searchParams.forEach((value, key) => {\n if (params[key]) {\n params[key] = Array.isArray(params[key])\n ? [...(params[key] as string[]), value]\n : [params[key] as string, value];\n } else {\n params[key] = value;\n }\n });\n\n return params;\n};\n","type RawField = {\n type?: string;\n value?: unknown;\n locales?: Record<string, unknown>;\n};\n\ntype RawBlockItem = {\n type?: string;\n fields?: Record<string, RawField>;\n};\n\nfunction resolveFieldValue(field: RawField, locale = 'en-us'): unknown {\n if (!field || typeof field !== 'object') return field;\n\n if (field.type === '$block' && Array.isArray(field.value)) {\n return flattenBlockParams(field.value as RawBlockItem[], locale);\n }\n\n if (field.locales && typeof field.locales === 'object') {\n return field.locales[locale] ?? field.value;\n }\n\n return field.value;\n}\n\nexport function flattenBlockParams<T = Record<string, unknown>>(\n items: unknown,\n locale = 'en-us'\n): T[] {\n if (!Array.isArray(items)) return [];\n return items.map(item => {\n const result: Record<string, unknown> = {};\n const blockItem = item as RawBlockItem;\n if (blockItem.fields) {\n for (const [key, field] of Object.entries(blockItem.fields)) {\n result[key] = resolveFieldValue(field, locale);\n }\n }\n return result as T;\n });\n}\n","import { useContext } from 'react';\nimport { SearchContext } from './SearchProvider';\nimport type { UseSearchReturn } from './SearchProvider';\n\nexport function useSearch(): UseSearchReturn {\n const context = useContext(SearchContext);\n if (!context) {\n throw new Error('useSearch must be used within a <SearchProvider>');\n }\n return context;\n}\n","import { useMemo } from 'react';\n\nexport const DOTS = '...';\n\ninterface UsePaginationParams {\n currentPage: number;\n totalCount: number;\n perPage: number;\n siblingCount?: number;\n}\n\nconst range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, idx) => idx + start);\n};\n\nexport const usePagination = ({ totalCount, perPage, siblingCount = 1, currentPage }: UsePaginationParams) =>\n useMemo(() => {\n const totalPageCount = Math.ceil(totalCount / perPage);\n const totalPageNumbers = siblingCount + 5;\n\n if (totalPageNumbers >= totalPageCount) {\n return range(1, totalPageCount);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPageCount);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPageCount;\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = 2 + 2 * siblingCount;\n const leftRange = range(1, leftItemCount);\n return [...leftRange, DOTS, totalPageCount];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = 2 + 2 * siblingCount;\n const rightRange = range(totalPageCount - rightItemCount + 1, totalPageCount);\n return [firstPageIndex, DOTS, ...rightRange];\n }\n\n if (shouldShowLeftDots && shouldShowRightDots) {\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex];\n }\n }, [totalCount, perPage, siblingCount, currentPage]);\n","import { useMemo, useCallback } from 'react';\nimport { useSearch } from './useSearch';\nimport { usePagination, DOTS } from './usePagination';\n\nexport interface UseSearchPaginationReturn {\n pages: (number | string)[];\n currentPage: number;\n hasPrev: boolean;\n hasNext: boolean;\n goToPage: (page: number) => void;\n goToPrev: () => void;\n goToNext: () => void;\n isLoading: boolean;\n}\n\nexport function useSearchPagination(siblingCount?: number): UseSearchPaginationReturn {\n const { page, pageSize, results, setPage, isLoading } = useSearch();\n\n const pages = usePagination({\n currentPage: page,\n totalCount: results.total,\n perPage: pageSize,\n siblingCount,\n }) || [];\n\n const lastPage = useMemo(\n () => Number(pages[pages.length - 1]) || 0,\n [pages]\n );\n\n const goToPage = useCallback(\n (p: number) => { if (!isLoading) setPage(p); },\n [isLoading, setPage]\n );\n\n const goToPrev = useCallback(\n () => { if (page > 0 && !isLoading) setPage(page - 1); },\n [page, isLoading, setPage]\n );\n\n const goToNext = useCallback(\n () => { if (page < lastPage && !isLoading) setPage(page + 1); },\n [page, lastPage, isLoading, setPage]\n );\n\n return {\n pages,\n currentPage: page,\n hasPrev: page > 0,\n hasNext: page < lastPage,\n goToPage,\n goToPrev,\n goToNext,\n isLoading,\n };\n}\n\nexport { DOTS };\n","import { createContext, useContext, type FC, type ReactNode } from 'react';\nimport type { SearchHit, SearchItemConfig } from '../types';\n\nexport type UrlResolver = (hit: SearchHit) => string | undefined;\n\nconst NOOP_RESOLVER: UrlResolver = () => undefined;\n\n// Set by the user to override URL resolution for the entire subtree.\nconst UserUrlResolverContext = createContext<UrlResolver | null>(null);\n\n// Set by SearchList to provide config-driven defaults within its subtree.\nconst DefaultUrlResolverContext = createContext<UrlResolver>(NOOP_RESOLVER);\n\n/** Wrap your search tree to override URL building for all hits. */\nexport const SearchItemUrlResolverProvider: FC<{ resolver: UrlResolver; children: ReactNode }> = ({\n resolver,\n children,\n}) => (\n <UserUrlResolverContext.Provider value={resolver}>\n {children}\n </UserUrlResolverContext.Provider>\n);\n\n/** Used internally by SearchList to register the Canvas-config-driven default. */\nexport const SearchItemDefaultUrlResolverProvider: FC<{ resolver: UrlResolver; children: ReactNode }> = ({\n resolver,\n children,\n}) => (\n <DefaultUrlResolverContext.Provider value={resolver}>\n {children}\n </DefaultUrlResolverContext.Provider>\n);\n\n/**\n * Always returns a resolver. User-provided resolver (SearchItemUrlResolverProvider)\n * takes priority over the default registered by SearchList.\n */\nexport function useUrlResolver(): UrlResolver {\n const user = useContext(UserUrlResolverContext);\n const def = useContext(DefaultUrlResolverContext);\n return user ?? def;\n}\n\nexport interface UrlResolverOptions {\n /** nodeId → resolved locale-specific path (from project map). */\n pathsByNodeId?: Record<string, string>;\n /** Current locale, used as fallback for legacy :locale token in urlTemplate. */\n locale?: string;\n}\n\n/**\n * Builds the default URL resolver from Canvas SearchItem configs.\n * Exported so custom resolvers can compose with it.\n */\nfunction resolveField<T = unknown>(obj: SearchHit, path: string): T | undefined {\n return path\n .split(\".\")\n .reduce<any>((current, key) => {\n if (current == null) {\n return undefined;\n }\n\n // If current value is an array, use first item\n if (Array.isArray(current)) {\n current = current[0];\n }\n\n return current?.[key];\n }, obj);\n\n}\n\nexport function createDefaultUrlResolver(\n configs: SearchItemConfig[],\n options: UrlResolverOptions = {}\n): UrlResolver {\n const { pathsByNodeId = {}, locale } = options;\n\n return (hit: SearchHit): string | undefined => {\n const hitSource = typeof hit.source === 'string' ? hit.source : '';\n const hitType = typeof hit.type === 'string' ? hit.type : '';\n const config = configs.find(c => c.source === hitSource && c.type === hitType);\n if (config) {\n const template =\n (config.nodeId ? pathsByNodeId[config.nodeId] : undefined) ?? config.urlTemplate;\n\n if (template) {\n return template.replace(/:([a-zA-Z0-9_-]+)/g, (_, token) => {\n if (token === 'locale') return locale ?? '';\n const fieldKey = config.tokenMapping?.[token];\n if (!fieldKey) return '';\n const val = resolveField(hit, fieldKey);\n return Array.isArray(val) ? String(val[0] ?? '') : String(val ?? '');\n });\n }\n }\n\n if (hitSource === 'composition' && typeof hit.path === 'string') {\n return hit.path;\n }\n\n return undefined;\n };\n}\n"],"mappings":"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","names":["value","_a","_b","import_react","import_react","import_react","import_react","import_jsx_runtime","_a"]}