@hitgrab/finder 0.1.17-alpha → 0.1.19-alpha

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 (63) hide show
  1. package/dist/index.cjs +1 -0
  2. package/dist/index.d.cts +538 -0
  3. package/dist/index.d.mts +538 -0
  4. package/dist/index.mjs +1 -0
  5. package/package.json +9 -16
  6. package/dist/core/__tests__/core.test.d.ts +0 -1
  7. package/dist/core/__tests__/effects.test.d.ts +0 -1
  8. package/dist/core/__tests__/events.test.d.ts +0 -1
  9. package/dist/core/__tests__/filter.test.d.ts +0 -1
  10. package/dist/core/__tests__/group-by.test.d.ts +0 -1
  11. package/dist/core/__tests__/pagination.test.d.ts +0 -1
  12. package/dist/core/__tests__/search.test.d.ts +0 -1
  13. package/dist/core/__tests__/sort-by.test.d.ts +0 -1
  14. package/dist/core/__tests__/test-constants.d.ts +0 -5
  15. package/dist/core/__tests__/test-types.d.ts +0 -6
  16. package/dist/core/__tests__/utils.test.d.ts +0 -1
  17. package/dist/core/core-constants.d.ts +0 -46
  18. package/dist/core/debounce-callback-registry.d.ts +0 -3
  19. package/dist/core/effect-book.d.ts +0 -12
  20. package/dist/core/event-emitter.d.ts +0 -12
  21. package/dist/core/filter-utils/boolean-filter.d.ts +0 -10
  22. package/dist/core/filter-utils/filter-factory.d.ts +0 -18
  23. package/dist/core/filter-utils/multiple-filter.d.ts +0 -10
  24. package/dist/core/filter-utils/single-filter.d.ts +0 -10
  25. package/dist/core/filters.d.ts +0 -28
  26. package/dist/core/finder-core-implementation.d.ts +0 -44
  27. package/dist/core/finder-core.d.ts +0 -99
  28. package/dist/core/finder-error.d.ts +0 -3
  29. package/dist/core/group-by.d.ts +0 -23
  30. package/dist/core/pagination.d.ts +0 -19
  31. package/dist/core/rule-book.d.ts +0 -14
  32. package/dist/core/search/calculate-character-match-indexes.d.ts +0 -1
  33. package/dist/core/search/calculate-string-match-segments.d.ts +0 -9
  34. package/dist/core/search/default-search-and-sort-algorithm.d.ts +0 -2
  35. package/dist/core/search/search-score.d.ts +0 -4
  36. package/dist/core/search/search-string-transform.d.ts +0 -8
  37. package/dist/core/search/string-match-haystack.d.ts +0 -15
  38. package/dist/core/search.d.ts +0 -18
  39. package/dist/core/sort-by.d.ts +0 -23
  40. package/dist/core/tester.d.ts +0 -8
  41. package/dist/core/types/core-types.d.ts +0 -93
  42. package/dist/core/types/effect-types.d.ts +0 -20
  43. package/dist/core/types/event-types.d.ts +0 -44
  44. package/dist/core/types/rule-types.d.ts +0 -93
  45. package/dist/core/types/string-match-types.d.ts +0 -10
  46. package/dist/core/utils/rule-type-enforcers.d.ts +0 -15
  47. package/dist/core/utils/rule-utils.d.ts +0 -9
  48. package/dist/index.d.ts +0 -13
  49. package/dist/index.js +0 -5041
  50. package/dist/index.umd.cjs +0 -27
  51. package/dist/react/components/finder-content-empty.d.ts +0 -7
  52. package/dist/react/components/finder-content-groups.d.ts +0 -7
  53. package/dist/react/components/finder-content-items.d.ts +0 -7
  54. package/dist/react/components/finder-content-loading.d.ts +0 -7
  55. package/dist/react/components/finder-content-no-matches.d.ts +0 -7
  56. package/dist/react/components/finder-content.d.ts +0 -25
  57. package/dist/react/components/finder-search-term-haystack.d.ts +0 -8
  58. package/dist/react/components/finder.d.ts +0 -9
  59. package/dist/react/components/string-match.d.ts +0 -12
  60. package/dist/react/hooks/use-finder-ref.d.ts +0 -2
  61. package/dist/react/hooks/use-finder.d.ts +0 -3
  62. package/dist/react/providers/finder-core-context.d.ts +0 -3
  63. package/dist/react/types/react-types.d.ts +0 -41
@@ -0,0 +1,538 @@
1
+ import * as react0 from "react";
2
+ import { ElementType, PropsWithChildren, ReactElement, ReactNode, RefObject } from "react";
3
+ import * as react_jsx_runtime4 from "react/jsx-runtime";
4
+
5
+ //#region src/core/types/rule-types.d.ts
6
+ /**
7
+ * Select a property from the item to sort by.
8
+ */
9
+ type FinderPropertySelector<FItem, FContext = any> = (item: FItem, context: FContext) => string | number;
10
+ interface Rule {
11
+ id: string;
12
+ debounceMilliseconds?: number;
13
+ label?: string;
14
+ hidden?: boolean;
15
+ }
16
+ type RuleDefinition<FItem = any, FContext = any> = SearchRuleDefinition<FItem, FContext> | FilterRuleDefinition<FItem, FContext> | SortByRuleDefinition<FItem, FContext> | GroupByRuleDefinition<FItem, FContext>;
17
+ interface SearchRuleDefinition<FItem = any, FContext = any> extends Omit<Rule, "id"> {
18
+ id?: string;
19
+ searchFn?: (item: FItem, context: FContext) => string | string[];
20
+ }
21
+ /**
22
+ * Describes the display of a filter or sort option.
23
+ */
24
+ interface FilterOption<FValue = any> {
25
+ label?: string;
26
+ value: FValue;
27
+ disabled?: boolean;
28
+ }
29
+ interface FilterRuleDefinition<FItem = any, FValue = any, FContext = any> extends Rule {
30
+ filterFn: (item: FItem, value: FValue, context: FContext) => boolean;
31
+ required?: boolean;
32
+ strictOptions?: boolean;
33
+ multiple?: boolean;
34
+ boolean?: boolean;
35
+ options?: FilterOption<FValue>[] | ((options: {
36
+ items: FItem[];
37
+ context: FContext;
38
+ }) => FilterOption<FValue>[]);
39
+ }
40
+ type AnyFilterRuleDefinition<FItem = any, FValue = any> = Omit<FilterRuleDefinition<FItem, FValue>, "options">;
41
+ interface FilterRuleWithBooleanValue<FItem = any, FValue = boolean, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
42
+ multiple?: false;
43
+ boolean: true;
44
+ defaultValue?: boolean;
45
+ options?: never;
46
+ }
47
+ interface FilterRuleWithSingleValue<FItem = any, FValue = any, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
48
+ multiple?: false;
49
+ boolean?: false;
50
+ defaultValue?: FValue;
51
+ }
52
+ interface FilterRuleWithMultipleValues<FItem = any, FValue = any, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
53
+ multiple: true;
54
+ boolean?: false;
55
+ defaultValue?: FValue[];
56
+ }
57
+ /**
58
+ * A hydrated filter has rendered any option generator functions, and narrowed ambiguous properties from FilterRule.
59
+ */
60
+ interface HydratedFilterRuleDefinition<FItem = any, FValue = any, FContext = any> extends FilterRuleDefinition<FItem, FValue, FContext> {
61
+ options?: FilterOption<FValue>[];
62
+ multiple: boolean;
63
+ boolean: boolean;
64
+ _isHydrated: true;
65
+ }
66
+ interface SortByRuleDefinition<FItem = any, FContext = any> extends Rule {
67
+ sortFn: FinderPropertySelector<FItem, FContext> | FinderPropertySelector<FItem, FContext>[];
68
+ defaultSortDirection?: SortDirection;
69
+ }
70
+ interface GroupByRuleDefinition<FItem = any, FContext = any> extends Rule {
71
+ groupFn: FinderPropertySelector<FItem, FContext>;
72
+ sortGroupFn?: FinderPropertySelector<FinderResultGroup<FItem>, FContext>;
73
+ defaultGroupSortDirection?: SortDirection;
74
+ sticky?: {
75
+ header?: string | string[];
76
+ footer?: string | string[];
77
+ };
78
+ }
79
+ interface FilterTestOptions {
80
+ rules: HydratedFilterRuleDefinition[];
81
+ values?: Record<string, any>;
82
+ isAdditive?: boolean;
83
+ }
84
+ interface FilterTestRuleOptions {
85
+ rule: string | AnyFilterRuleDefinition;
86
+ value: any;
87
+ isAdditive?: boolean;
88
+ }
89
+ //#endregion
90
+ //#region src/core/core-constants.d.ts
91
+ declare const EVENTS: {
92
+ readonly INIT: "init";
93
+ readonly FIRST_USER_INTERACTION: "firstUserInteraction";
94
+ readonly READY: "ready";
95
+ readonly CHANGE: "change";
96
+ readonly SET_ITEMS: "setItems";
97
+ readonly SET_IS_LOADING: "setIsLoading";
98
+ readonly SET_IS_DISABLED: "setIsDisabled";
99
+ readonly SET_CONTEXT: "setContext";
100
+ readonly SET_SEARCH_TERM: "setSearchTerm";
101
+ readonly RESET_SEARCH_TERM: "resetSearchTerm";
102
+ readonly SET_FILTER: "setFilter";
103
+ readonly RESET_FILTERS: "resetFilters";
104
+ readonly SET_SORT_BY: "setSortBy";
105
+ readonly SET_SORT_BY_DIRECTION: "setSortDirection";
106
+ readonly SET_GROUP_BY: "setGroupBy";
107
+ readonly SET_GROUP_SORT_BY_DIRECTION: "setGroupBySortDirection";
108
+ readonly SET_PAGE: "setPage";
109
+ readonly SET_NUM_ITEMS_PER_PAGE: "setNumItemsPerPage";
110
+ readonly SYNC_UPDATED_AT: "syncUpdatedAt";
111
+ };
112
+ declare const EVENT_SOURCE: {
113
+ readonly CORE: "core";
114
+ readonly SEARCH: "search";
115
+ readonly FILTERS: "filters";
116
+ readonly GROUP_BY: "groupBy";
117
+ readonly SORT_BY: "sortBy";
118
+ readonly PAGINATION: "pagination";
119
+ };
120
+ //#endregion
121
+ //#region src/core/types/event-types.d.ts
122
+ type FinderTouchSource = (typeof EVENT_SOURCE)[keyof typeof EVENT_SOURCE];
123
+ interface FinderSharedEventProps {
124
+ source: string;
125
+ event: FinderEventName;
126
+ timestamp: number;
127
+ instance: FinderCore;
128
+ }
129
+ interface FinderInitEvent extends FinderSharedEventProps {
130
+ source: "core";
131
+ event: "init";
132
+ }
133
+ interface FinderFirstUserInteractionEvent extends FinderSharedEventProps {
134
+ source: "core";
135
+ event: "firstUserInteraction";
136
+ }
137
+ interface FinderReadyEvent extends FinderSharedEventProps {
138
+ source: "core";
139
+ event: "ready";
140
+ }
141
+ type FinderEvent = FinderInitEvent | FinderFirstUserInteractionEvent | FinderReadyEvent | FinderChangeEvent;
142
+ type FinderOnInitCallback = (event: FinderInitEvent) => void;
143
+ type FinderOnReadyCallback = (event: FinderReadyEvent) => void;
144
+ type FinderOnFirstUserInteractCallback = (event: FinderFirstUserInteractionEvent) => void;
145
+ type FinderOnChangeCallback = (event: FinderChangeEvent) => void;
146
+ /**
147
+ * Internal communication between mixins and core
148
+ */
149
+ interface FinderTouchEvent {
150
+ source: FinderTouchSource;
151
+ event: FinderEventName;
152
+ current: any;
153
+ initial: any;
154
+ rule?: RuleDefinition;
155
+ }
156
+ /**
157
+ * External type that consumers will receive
158
+ */
159
+ type FinderChangeEvent = FinderTouchEvent & FinderSharedEventProps;
160
+ type FinderEventName = (typeof EVENTS)[keyof typeof EVENTS];
161
+ //#endregion
162
+ //#region src/core/finder-core.d.ts
163
+ /**
164
+ * This thin wrapper around FinderCoreImplementation defines the mixin interfaces and hides private methods.
165
+ */
166
+ declare class FinderCore<FItem = any, FContext = any> {
167
+ #private;
168
+ constructor(items: FItem[] | null | undefined, options: FinderConstructorOptions<FItem, FContext>);
169
+ get items(): FItem[];
170
+ get context(): FContext;
171
+ get isReady(): boolean;
172
+ get isEmpty(): boolean;
173
+ get hasMatches(): boolean;
174
+ get isLoading(): boolean;
175
+ get disabled(): boolean;
176
+ get state(): "loading" | "empty" | "groups" | "items" | "noMatches";
177
+ get updatedAt(): number;
178
+ get events(): {
179
+ on: (event: FinderEventName, callback: EventCallback) => void;
180
+ off: (event: FinderEventName, callback: EventCallback) => void;
181
+ silently: (callback: EventCallback) => void;
182
+ isSilent: () => boolean;
183
+ };
184
+ /**
185
+ * Mixin interfaces
186
+ */
187
+ get matches(): ResultSnapshot<FItem>;
188
+ get search(): {
189
+ rule: SearchRuleDefinition<unknown, any> | undefined;
190
+ searchTerm: string;
191
+ hasSearchTerm: boolean;
192
+ hasSearchRule: boolean;
193
+ setSearchTerm: (value: string) => void;
194
+ reset: () => void;
195
+ test: (searchTerm: string, isAdditive?: boolean) => FItem[];
196
+ };
197
+ get filters(): {
198
+ values: Record<string, any>;
199
+ raw: Record<string, any>;
200
+ activeRules: HydratedFilterRuleDefinition<any, any, any>[];
201
+ rules: HydratedFilterRuleDefinition<any, any, any>[];
202
+ isActive: (identifier: string | AnyFilterRuleDefinition<any, any>) => boolean;
203
+ get: (identifier: string | AnyFilterRuleDefinition<any, any>) => any;
204
+ add: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, optionValue?: FValue | FilterOption<FValue>) => void;
205
+ has: (identifier: string | AnyFilterRuleDefinition<any, any>, optionValue?: any) => boolean;
206
+ getRule: (identifier: string | AnyFilterRuleDefinition<any, any>) => HydratedFilterRuleDefinition<any, any, any>;
207
+ toggle: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, optionValue?: FValue | FilterOption<FValue>) => void;
208
+ set: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, value?: FValue | FValue[]) => void;
209
+ delete: <FValue>(identifier: string | AnyFilterRuleDefinition<any, FValue>, optionValue?: FValue | FilterOption<FValue>) => void;
210
+ reset: () => void;
211
+ test: (options: FilterTestOptions) => any[];
212
+ testRule: ({
213
+ rule: identifier,
214
+ value,
215
+ ...options
216
+ }: FilterTestRuleOptions) => any[];
217
+ testRuleOptions: (identifier: string | AnyFilterRuleDefinition<any, any>, isAdditive?: boolean) => Map<any, any>;
218
+ };
219
+ get sortBy(): {
220
+ activeRule: SortByRuleDefinition<unknown, any> | undefined;
221
+ sortDirection: SortDirection;
222
+ userHasSetSortDirection: boolean;
223
+ rules: SortByRuleDefinition<unknown, any>[];
224
+ set: (identifier?: string | SortByRuleDefinition, incomingSortDirection?: SortDirection) => void;
225
+ setSortDirection: (incomingSortDirection?: SortDirection) => void;
226
+ cycleSortDirection: () => void;
227
+ toggleSortDirection: () => void;
228
+ reset: () => void;
229
+ };
230
+ get groupBy(): {
231
+ activeRule: GroupByRuleDefinition<unknown, any> | undefined;
232
+ requireGroup: boolean;
233
+ rules: GroupByRuleDefinition<unknown, any>[];
234
+ groupBySortDirection: SortDirection | undefined;
235
+ set: (identifier?: string | GroupByRuleDefinition<any, any>) => void;
236
+ toggle: (identifier: string | GroupByRuleDefinition<any, any>) => void;
237
+ setGroupSortDirection: (direction?: SortDirection) => void;
238
+ reset: () => void;
239
+ };
240
+ get pagination(): {
241
+ page: number;
242
+ offset: number;
243
+ numItemsPerPage: number | undefined;
244
+ numTotalItems: number;
245
+ lastPage: number | undefined;
246
+ isPaginated: boolean;
247
+ setPage: (value: number) => void;
248
+ setNumItemsPerPage: (value?: number) => void;
249
+ };
250
+ /**
251
+ * Mutators
252
+ */
253
+ setItems(items: FItem[] | null | undefined): void;
254
+ setIsLoading(value?: boolean): void;
255
+ setIsDisabled(value?: boolean): void;
256
+ setRules(definitions: RuleDefinition<FItem>[]): void;
257
+ setContext(context: FContext): void;
258
+ /**
259
+ * Utils
260
+ */
261
+ test(mixins: SnapshotSerializedMixins, isAdditive?: boolean): FItem[];
262
+ getRule<T extends RuleDefinition<FItem>>(identifier: string | RuleDefinition<FItem>): T | undefined;
263
+ toJSON(): Omit<FinderConstructorOptions<FItem, any>, "rules">;
264
+ }
265
+ //#endregion
266
+ //#region src/core/types/effect-types.d.ts
267
+ interface RuleEffect<FItem = any, FContext = any> {
268
+ rules: string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[] | ((items: FItem[], context: FContext) => string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[]);
269
+ onChange: (instance: FinderCore<FItem, FContext>, rule: RuleDefinition<FItem>) => void;
270
+ }
271
+ interface SearchEffect<FItem = any, FContext = any> {
272
+ haystack: string | string[] | ((items: FItem[], context: FContext) => string | string[]);
273
+ onChange: (instance: FinderCore<FItem, FContext>, searchTerm: string) => void;
274
+ }
275
+ //#endregion
276
+ //#region src/core/types/core-types.d.ts
277
+ interface FinderConstructorOptions<FItem, FContext = any> {
278
+ rules: RuleDefinition<FItem>[];
279
+ effects?: (RuleEffect | SearchEffect)[];
280
+ context?: FContext;
281
+ isLoading?: boolean;
282
+ disabled?: boolean;
283
+ initialSearchTerm?: string;
284
+ initialSortBy?: string;
285
+ initialSortDirection?: SortDirection;
286
+ initialGroupBy?: string;
287
+ initialGroupBySortDirection?: SortDirection;
288
+ initialFilters?: Record<string, any>;
289
+ ignoreSortByRulesWhileSearchRuleIsActive?: boolean;
290
+ requireGroup?: boolean;
291
+ page?: number;
292
+ numItemsPerPage?: number;
293
+ onInit?: FinderOnInitCallback;
294
+ onReady?: FinderOnReadyCallback;
295
+ onFirstUserInteraction?: FinderOnFirstUserInteractCallback;
296
+ onChange?: FinderOnChangeCallback;
297
+ }
298
+ interface FinderResultGroup<FItem> {
299
+ id: string;
300
+ items: FItem[];
301
+ }
302
+ type SortDirection = "asc" | "desc" | ("asc" | "desc")[];
303
+ interface ResultSnapshot<FItem> {
304
+ items?: FItem[];
305
+ groups?: FinderResultGroup<FItem>[];
306
+ numMatchedItems: number;
307
+ numTotalItems: number;
308
+ hasGroupByRule: boolean;
309
+ }
310
+ type EventCallback = (payload?: any) => void;
311
+ interface SnapshotSerializedMixins {
312
+ search?: SerializedSearchMixin;
313
+ filters?: SerializedFiltersMixin;
314
+ sortBy?: SerializedSortByMixin;
315
+ pagination?: SerializedPaginationMixin;
316
+ groupBy?: SerializedGroupByMixin;
317
+ }
318
+ interface SerializedSearchMixin {
319
+ searchTerm: string;
320
+ rule?: SearchRuleDefinition;
321
+ }
322
+ interface SerializedFiltersMixin {
323
+ rules: HydratedFilterRuleDefinition[];
324
+ values: Record<string, any>;
325
+ }
326
+ interface SerializedSortByMixin {
327
+ rule?: SortByRuleDefinition;
328
+ sortDirection?: SortDirection;
329
+ }
330
+ interface SerializedPaginationMixin {
331
+ page: number;
332
+ numItemsPerPage?: number;
333
+ }
334
+ interface SerializedGroupByMixin {
335
+ rule?: GroupByRuleDefinition;
336
+ groupBySortDirection?: SortDirection;
337
+ }
338
+ interface PaginationMixinInterface {
339
+ page: number;
340
+ offset: number;
341
+ numItemsPerPage: number | undefined;
342
+ numTotalItems: number;
343
+ lastPage: number | undefined;
344
+ isPaginated: boolean;
345
+ setPage: (value: number) => void;
346
+ setNumItemsPerPage: (value: number) => void;
347
+ }
348
+ //#endregion
349
+ //#region src/core/types/string-match-types.d.ts
350
+ /**
351
+ * These values all point to the transformed haystack.
352
+ */
353
+ interface StringMatchSegment {
354
+ index: number;
355
+ length: number;
356
+ is_match: boolean;
357
+ value: string;
358
+ }
359
+ //#endregion
360
+ //#region src/react/types/react-types.d.ts
361
+ interface FinderProps<FItem, FContext> extends FinderConstructorOptions<FItem, FContext>, PropsWithChildren {
362
+ items: FItem[] | undefined | null;
363
+ controllerRef?: RefObject<FinderCore<FItem, FContext> | null>;
364
+ }
365
+ interface FinderContentProps<FItem = any, FContext = any> {
366
+ empty: {
367
+ pagination: PaginationMixinInterface;
368
+ context: FContext;
369
+ };
370
+ loading: {
371
+ pagination: PaginationMixinInterface;
372
+ context: FContext;
373
+ };
374
+ noMatches: {
375
+ pagination: PaginationMixinInterface;
376
+ context: FContext;
377
+ };
378
+ items: {
379
+ items: FItem[];
380
+ pagination: PaginationMixinInterface;
381
+ context: FContext;
382
+ };
383
+ groups: {
384
+ groups: FinderResultGroup<FItem>[];
385
+ pagination: PaginationMixinInterface;
386
+ context: FContext;
387
+ };
388
+ }
389
+ interface StringMatchSegmentProps {
390
+ segment: StringMatchSegment;
391
+ segmentIndex: number;
392
+ }
393
+ type FinderSearchTermProp = keyof HTMLElementTagNameMap | ElementType | ElementType<StringMatchSegmentProps>;
394
+ //#endregion
395
+ //#region src/core/utils/rule-type-enforcers.d.ts
396
+ /**
397
+ * Enforce structure for an array of rule of mixed types.
398
+ */
399
+ declare function finderRuleset<FItem, FContext = any>(rules: RuleDefinition<FItem, FContext>[]): RuleDefinition<FItem, FContext>[];
400
+ declare function searchRule<FItem, FContext = any>(rule: SearchRuleDefinition<FItem, FContext>): SearchRuleDefinition<FItem, FContext>;
401
+ declare function filterRule<FItem, FValue = any, FContext = any, T = FilterRuleWithMultipleValues<FItem, FValue, FContext>>(rule: T): FilterRuleWithMultipleValues<FItem, FValue>;
402
+ declare function filterRule<FItem, FValue = boolean, FContext = any, T = FilterRuleWithBooleanValue<FItem, FValue, FContext>>(rule: T): FilterRuleWithBooleanValue<FItem, FValue>;
403
+ declare function filterRule<FItem, FValue = any, FContext = any, T = FilterRuleWithSingleValue<FItem, FValue, FContext>>(rule: T): FilterRuleWithSingleValue<FItem, FValue>;
404
+ declare function sortByRule<FItem, FContext = any>(rule: SortByRuleDefinition<FItem, FContext>): SortByRuleDefinition<FItem, FContext>;
405
+ declare function groupByRule<FItem, FContext = any>(rule: GroupByRuleDefinition<FItem, FContext>): GroupByRuleDefinition<FItem, FContext>;
406
+ declare function ruleEffect<FItem, FContext = any>(rules: string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[] | ((items: FItem[], context: FContext) => string | RuleDefinition<FItem> | (string | RuleDefinition<FItem>)[]), onChange: (instance: FinderCore<FItem, FContext>, rule: RuleDefinition) => void): RuleEffect<FItem, FContext>;
407
+ declare function searchEffect<FItem, FContext = any>(haystack: string | string[] | ((items: FItem[], context: FContext) => string | string[]), onChange: (instance: FinderCore<FItem, FContext>, searchTerm: string) => void): SearchEffect<FItem, FContext>;
408
+ declare function transformFilterToSingleValue<FItem, FValue, FContext = any>(filter: AnyFilterRuleDefinition<FItem, FValue>): FilterRuleWithMultipleValues<FItem, FValue, FContext>;
409
+ declare function transformFilterToBoolean<FItem, FValue, FContext = any>(filter: AnyFilterRuleDefinition<FItem, FValue>): FilterRuleWithBooleanValue<FItem, boolean, FContext>;
410
+ declare function transformFilterToMultiple<FItem, FValue, FContext = any>(filter: AnyFilterRuleDefinition<FItem, FValue>): FilterRuleWithMultipleValues<FItem, FValue, FContext>;
411
+ //#endregion
412
+ //#region src/react/hooks/use-finder.d.ts
413
+ declare function useFinder<FItem = any, FContext = undefined>(): FinderCore<FItem, FContext>;
414
+ //#endregion
415
+ //#region src/react/components/finder-content-loading.d.ts
416
+ interface FinderContentLoadingProps<FItem, FContext> {
417
+ children: ElementType<FinderContentProps<FItem, FContext>["loading"]> | ReactElement<FinderContentProps<FItem, FContext>["loading"]> | Iterable<ReactNode>;
418
+ }
419
+ declare function FinderContentLoading<FItem, FContext>({
420
+ children: Component
421
+ }: FinderContentLoadingProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
422
+ //#endregion
423
+ //#region src/react/components/finder-content-empty.d.ts
424
+ interface FinderContentEmptyProps<FItem, FContext> {
425
+ children: ElementType<FinderContentProps<FItem, FContext>["empty"]> | ReactElement<FinderContentProps<FItem, FContext>["empty"]> | Iterable<ReactNode>;
426
+ }
427
+ declare function FinderContentEmpty<FItem = any, FContext = any>({
428
+ children: Component
429
+ }: FinderContentEmptyProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
430
+ //#endregion
431
+ //#region src/react/components/finder-content-no-matches.d.ts
432
+ interface FinderContentNoMatchesProps<FItem, FContext> {
433
+ children: ElementType<FinderContentProps<FItem, FContext>["noMatches"]> | ReactElement<FinderContentProps<FItem, FContext>["noMatches"]> | Iterable<ReactNode>;
434
+ }
435
+ declare function FinderContentNoMatches<FItem = any, FContext = any>({
436
+ children: Component
437
+ }: FinderContentNoMatchesProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
438
+ //#endregion
439
+ //#region src/react/components/finder-content-items.d.ts
440
+ interface FinderContentItemsProps<FItem, FContext> {
441
+ children: ElementType<FinderContentProps<FItem, FContext>["items"]> | ReactElement<FinderContentProps<FItem, FContext>["items"]> | Iterable<ReactNode>;
442
+ }
443
+ declare function FinderContentItems<FItem = any, FContext = any>({
444
+ children: Component
445
+ }: FinderContentItemsProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
446
+ //#endregion
447
+ //#region src/react/components/finder-content-groups.d.ts
448
+ interface FinderContentGroupsProps<FItem, FContext> {
449
+ children: ElementType<FinderContentProps<FItem, FContext>["groups"]> | ReactElement<FinderContentProps<FItem, FContext>["groups"]> | Iterable<ReactNode>;
450
+ }
451
+ declare function FinderContentGroups<FItem = any, FContext = any>({
452
+ children: Component
453
+ }: FinderContentGroupsProps<FItem, FContext>): react_jsx_runtime4.JSX.Element | Iterable<ReactNode> | null;
454
+ //#endregion
455
+ //#region src/react/components/finder-content.d.ts
456
+ interface FinderContentContainerProps<FItem, FContext> {
457
+ children: {
458
+ loading?: ElementType<FinderContentProps<FItem, FContext>["loading"]> | ReactElement<FinderContentProps<FItem, FContext>["loading"]> | Iterable<ReactNode>;
459
+ empty?: ElementType<FinderContentProps<FItem, FContext>["empty"]> | ReactElement<FinderContentProps<FItem, FContext>["empty"]> | Iterable<ReactNode>;
460
+ noMatches?: ElementType<FinderContentProps<FItem, FContext>["noMatches"]> | ReactElement<FinderContentProps<FItem, FContext>["noMatches"]> | Iterable<ReactNode>;
461
+ items?: ElementType<FinderContentProps<FItem, FContext>["items"]> | ReactElement<FinderContentProps<FItem, FContext>["items"]> | Iterable<ReactNode>;
462
+ groups?: ElementType<FinderContentProps<FItem, FContext>["groups"]> | ReactElement<FinderContentProps<FItem, FContext>["groups"]> | Iterable<ReactNode>;
463
+ };
464
+ }
465
+ declare function FinderContent<FItem = any, FContext = any>({
466
+ children: renderProps
467
+ }: FinderContentContainerProps<FItem, FContext>): (react_jsx_runtime4.JSX.Element | undefined)[];
468
+ declare namespace FinderContent {
469
+ var Loading: typeof FinderContentLoading;
470
+ var Empty: typeof FinderContentEmpty;
471
+ var NoMatches: typeof FinderContentNoMatches;
472
+ var Items: typeof FinderContentItems;
473
+ var Groups: typeof FinderContentGroups;
474
+ }
475
+ //#endregion
476
+ //#region src/react/components/finder-search-term-haystack.d.ts
477
+ interface FinderSearchTermHaystackProps {
478
+ children: string;
479
+ Match?: FinderSearchTermProp;
480
+ Miss?: FinderSearchTermProp;
481
+ }
482
+ declare function FinderSearchTermHaystack({
483
+ Match,
484
+ Miss,
485
+ children: haystack
486
+ }: FinderSearchTermHaystackProps): string | react_jsx_runtime4.JSX.Element;
487
+ //#endregion
488
+ //#region src/react/components/finder.d.ts
489
+ declare function Finder<FItem = any, FContext = any>({
490
+ items,
491
+ rules,
492
+ effects,
493
+ initialSearchTerm,
494
+ initialSortBy,
495
+ initialSortDirection,
496
+ initialGroupBy,
497
+ initialGroupBySortDirection,
498
+ initialFilters,
499
+ context,
500
+ isLoading,
501
+ disabled,
502
+ page,
503
+ numItemsPerPage,
504
+ requireGroup,
505
+ ignoreSortByRulesWhileSearchRuleIsActive,
506
+ onInit,
507
+ onReady,
508
+ onFirstUserInteraction,
509
+ onChange,
510
+ controllerRef,
511
+ children
512
+ }: FinderProps<FItem, FContext>): react_jsx_runtime4.JSX.Element;
513
+ declare namespace Finder {
514
+ var Content: typeof FinderContent;
515
+ var SearchTermHaystack: typeof FinderSearchTermHaystack;
516
+ }
517
+ //#endregion
518
+ //#region src/react/hooks/use-finder-ref.d.ts
519
+ declare function useFinderRef<FItem = any, FContext = any>(): react0.RefObject<FinderCore<FItem, FContext> | null>;
520
+ //#endregion
521
+ //#region src/react/components/string-match.d.ts
522
+ interface StringMatchProps {
523
+ needle: string;
524
+ haystack: string;
525
+ Match?: FinderSearchTermProp;
526
+ Miss?: FinderSearchTermProp;
527
+ }
528
+ /**
529
+ * Split a string into result segment components .
530
+ */
531
+ declare function StringMatch({
532
+ needle,
533
+ haystack,
534
+ Match,
535
+ Miss
536
+ }: StringMatchProps): string | (string | react_jsx_runtime4.JSX.Element)[];
537
+ //#endregion
538
+ export { type AnyFilterRuleDefinition, type FilterOption, type FilterRuleDefinition, Finder, type FinderChangeEvent, type FinderConstructorOptions, type FinderContentProps, type FinderEvent, type FinderFirstUserInteractionEvent, type FinderInitEvent, type FinderProps, type FinderReadyEvent, type FinderResultGroup, type GroupByRuleDefinition, type RuleEffect, type SearchEffect, type SearchRuleDefinition, type SortByRuleDefinition, type SortDirection, StringMatch, type StringMatchSegmentProps, filterRule, finderRuleset, groupByRule, ruleEffect, searchEffect, searchRule, sortByRule, transformFilterToBoolean, transformFilterToMultiple, transformFilterToSingleValue, useFinder, useFinderRef };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{createContext as e,useContext as t,useImperativeHandle as n,useMemo as r,useRef as i,useState as a}from"react";import{jsx as o}from"react/jsx-runtime";import{clamp as s,debounce as c,groupBy as l,isEqual as u,orderBy as d,range as f,uniqBy as p}from"lodash";function m(e){return e}function h(e){return e}function g(e){return e}function _(e){return e}function v(e){return e}function y(e,t){return{rules:e,onChange:t}}function b(e,t){return{haystack:e,onChange:t}}function x(e){let t={...e};return delete t.boolean,delete t.multiple,t}function S(e){let t={...e};return delete t.multiple,{...t,boolean:!0}}function C(e){let t={...e};return delete t.boolean,{...t,multiple:!0}}const w=e(null);function T(){let e=t(w);if(e===null)throw Error(`useFinder requires a FinderContext.`);let[n]=e;return n}function E({children:e}){let t=T();return t.isLoading?typeof e==`function`?o(e,{pagination:t.pagination,context:t.context}):e:null}function D({children:e}){let t=T();return t.isEmpty?typeof e==`function`?o(e,{pagination:t.pagination,context:t.context}):e:null}function O({children:e}){let t=T();return t.isEmpty===!1&&t.hasMatches===!1?typeof e==`function`?o(e,{pagination:t.pagination,context:t.context}):e:null}function k({children:e}){let t=T();return t.hasMatches&&t.matches.items?typeof e==`function`?o(e,{items:t.matches.items,pagination:t.pagination,context:t.context}):e:null}function A({children:e}){let t=T();return t.hasMatches&&t.matches.groups?typeof e==`function`?o(e,{groups:t.matches.groups,pagination:t.pagination,context:t.context}):e:null}function j({children:e}){if(Object.values(e).length===0)throw Error(`No render props were found.`);return[e.loading&&o(E,{children:e.loading},`loading`),e.empty&&o(D,{children:e.empty},`empty`),e.noMatches&&o(O,{children:e.noMatches},`noMatches`),e.items&&o(k,{children:e.items},`items`),e.groups&&o(A,{children:e.groups},`groups`)]}j.Loading=E,j.Empty=D,j.NoMatches=O,j.Items=k,j.Groups=A;function M(e){return e.toLowerCase().replace(/[^\w\d]+/g,``)}function N(e,t){let n=new RegExp(/"(.*?)"/g),r=t,i=[],a,o=!1;for(;(a=n.exec(t))!==null&&o===!1;){let t=ee(e,M(String(a[1])));t===void 0?o=!0:(i=i.concat(t),r=r.replace(a[0],``))}if(o)return;let s=te(e,M(r));if(s!==void 0)return i=i.concat(s),i.sort((e,t)=>e-t)}function ee(e,t){if(e.length<t.length)return;let n=e.indexOf(t);if(n!==-1)return f(n,n+t.length).map(e=>e)}function te(e,t){if(e.length<t.length)return;let n=Array.from(t),r=[],i=e,a=0,o=!1;for(let e of n){let t=i.indexOf(e);if(t===-1&&(o=!0),o===!1){r.push(a+t);let e=t+1;a+=e,i=i.substring(e)}}if(!o)return r}var ne=class e{#e;constructor(t){this.source=t;let n=e.composeTransformedHaystackSegments(t);this.#e=n,this.transformed=n.map(e=>e.value).join(``).toLowerCase()}getSourceCharacterIndex(e){let t=0;return this.#e.reduce((n,r)=>{if(n!==1/0)return n;let i=t+r.value.length;if(e>=t&&e<=i){let i=e-t;n=r.index+i}return t+=r.value.length,n},1/0)}static composeTransformedHaystackSegments(e){let t=e.matchAll(/[\w\d]+/g),n=[];for(let e of t)n.push({value:e[0],index:e.index,length:e[0].length});return n}};function re(e,t){return(Array.isArray(e)?e:[e]).map(e=>new ne(e)).reduce((e,n)=>{if(e!==void 0)return e;let r=N(n.transformed,t);return r===void 0?e:oe(ae(n,ie(r,n.transformed)))},void 0)}function ie(e,t){let n=[...e],r=[],i=0;for(;n.length>0&&i<100;){let e=n.at(0);if(e===void 0)throw Error(`Should never get here`);let a=1;for(let t=1;t<=n.length;t+=1){let r=n.at(t);r!==void 0&&e+t===r&&(a+=1)}let o=e,s=e+a,c=t.substring(o,s);r.push({index:o,value:c,is_match:!0,length:c.length}),n.splice(0,a),i+=1}return r}function ae(e,t){return t.reduce((n,r,i)=>{if(i===0&&r.index!==0){let t=e.source.substring(0,e.getSourceCharacterIndex(r.index));n.push({index:0,value:t,is_match:!1,length:t.length})}let a=e.getSourceCharacterIndex(r.index),o=e.getSourceCharacterIndex(r.index+r.length),s=e.source.substring(a,o);n.push({index:a,value:s,is_match:!0,length:s.length});let c=t.at(i+1);if(c){let t=e.getSourceCharacterIndex(r.index+r.length),i=e.getSourceCharacterIndex(c.index),a=e.source.substring(t,i);n.push({index:t,value:a,is_match:!1,length:a.length})}else if(a+s.length!==e.source.length){let t=a+s.length,r=e.source.substring(t);n.push({index:t,value:r,is_match:!1,length:r.length})}return n},[])}function oe(e){let t=/\S/,n=[...e];return n.forEach((e,r)=>{if(e.is_match){let i=e.value.search(t);if(i!==0){let t=n.at(r-1);t&&(t.length+=i,t.value+=e.value.substring(0,i),e.value=e.value.substring(i),e.index+=i)}}}),n}function se(e,t){return(Array.isArray(e)?e:[e]).some(e=>N(M(e),t)!==void 0)}function P({needle:e,haystack:t,Match:n=`mark`,Miss:i}){let a=r(()=>re(t,e),[t,e]);return a===void 0?t:a.map((e,t)=>{let r=[e.value,t].join();return e.is_match?typeof n==`string`?o(n,{"data-is-match":e.is_match,children:e.value},r):o(n,{"data-is-match":e.is_match,segment:e,segmentIndex:t},r):i===void 0?e.value:typeof i==`string`?o(i,{"data-is-match":e.is_match,children:e.value},r):o(i,{"data-is-match":e.is_match,segment:e,segmentIndex:t},r)})}function ce({Match:e=`mark`,Miss:t,children:n}){let r=T();return r.search.hasSearchTerm===!1?n:o(P,{needle:r.search.searchTerm,haystack:n,Match:e,Miss:t})}function le(){let e=new Map;return(t,n)=>t.debounceMilliseconds===void 0?n():(e.has(t)===!1&&e.set(t,c(e=>e(),t.debounceMilliseconds)),e.get(t)?.(n))}var ue=class{#e=new Map;#t=!1;on(e,t){this.#e.has(e)===!1&&this.#e.set(e,new Set),this.#e.get(e)?.add(t)}off(e,t){if(this.#e.has(e)!==!1){if(t===void 0){this.#e.delete(e);return}this.#e.get(e)?.delete(t)}}emit(e,t){this.#t||this.#e.get(e)?.forEach(e=>{e(t)})}silently(e){this.#t=!0,e(),this.#t=!1}isSilent(){return this.#t}};const F={INIT:`init`,FIRST_USER_INTERACTION:`firstUserInteraction`,READY:`ready`,CHANGE:`change`,SET_ITEMS:`setItems`,SET_IS_LOADING:`setIsLoading`,SET_IS_DISABLED:`setIsDisabled`,SET_CONTEXT:`setContext`,SET_SEARCH_TERM:`setSearchTerm`,RESET_SEARCH_TERM:`resetSearchTerm`,SET_FILTER:`setFilter`,RESET_FILTERS:`resetFilters`,SET_SORT_BY:`setSortBy`,SET_SORT_BY_DIRECTION:`setSortDirection`,SET_GROUP_BY:`setGroupBy`,SET_GROUP_SORT_BY_DIRECTION:`setGroupBySortDirection`,SET_PAGE:`setPage`,SET_NUM_ITEMS_PER_PAGE:`setNumItemsPerPage`,SYNC_UPDATED_AT:`syncUpdatedAt`},I={CORE:`core`,SEARCH:`search`,FILTERS:`filters`,GROUP_BY:`groupBy`,SORT_BY:`sortBy`,PAGINATION:`pagination`},L={RULE_NOT_FOUND:`Finder could not locate requested rule`,WRONG_RULE_TYPE_FOR_MIXIN:`The requested rule is not valid for this mixin.`,NO_SEARCH_RULE_SET:`Unable to set search term; no SearchRule was found.`,INVALID_SEARCH_TERM_TYPE:`Search terms must be strings.`,NO_MATCHING_OPTION_FOUND_WITH_STRICT_OPTIONS:`Finder could not find a matching option with the passed value could be found. If this is intended, set 'strictOptions:false' in the rule definition.`,SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY:`Finder could not set this filter value, as the rule requires an array.`,ADDING_OPTION_TO_MULTIPLE_FILTER_WITHOUT_OPTION_VALUE:`Finder could not add to this filter, as no optionValue was passed.`,DELETING_OPTION_VALUE_FROM_NON_MULTIPLE_FILTER:`Finder could not delete an option from this filter, as it does not support multiple values.`,SETTING_BOOLEAN_FILTER_WITHOUT_BOOLEAN_VALUE:`Finder could not set this filter value, as the rule requires a boolean.`,ADDING_OPTION_VALUE_TO_NON_MULTIPLE_FILTER:`Finder could not add to this filter value, as the rule is a boolean.`,TOGGLING_OPTION_ON_RULE_WITH_NO_OPTIONS:`Finder could not toggle this filter rule option, as the filter does not have any options.`,TOGGLING_OPTION_ON_RULE_WITH_SINGLE_VALUE:`Finder could not toggle this filter rule option, as the rule does not allow multiple values.`,TOGGLING_OPTION_THAT_DOES_NOT_EXIST:`Finder could not toggle this filter rule option, as the option was not found.`,TOGGLING_OPTION_WITHOUT_PASSING_OPTION:`Finder could not toggle this filter rule option, as the option was not found.`,TOGGLING_BOOLEAN_FILTER_WITH_UNUSED_VALUE:`Finder could not toggle this filter rule option, as boolean filters do not have options.`,TESTING_OPTIONS_ON_RULE_WITH_NO_OPTIONS:`Finder was unable to test the options for this filter rule. It must be a boolean or have defined options.`,INVALID_RULE_WITHOUT_ID:`Init failed: Missing rule id.`,INVALID_RULE_SHAPE:`Init failed: Malformed rule definition`,INVALID_RULE_DUPLICATE:`Init failed: Duplicate rule id.`};var R=class extends Error{constructor(e,t){let n=`${e} ${JSON.stringify({...t})}`;super(n),this.name=`FinderError`}};function z(e){return typeof e==`object`&&!!e&&`sortFn`in e}function B(e){return typeof e==`object`&&!!e&&`searchFn`in e}function V(e){return typeof e==`object`&&!!e&&`filterFn`in e}function H(e){return V(e)&&typeof e.options!=`function`}function U(e){return typeof e==`object`&&!!e&&`groupFn`in e}function de(e){return typeof e==`object`&&!!e&&(`rules`in e||`callback`in e)}function fe(e){return typeof e==`object`&&!!e&&(`haystack`in e||`callback`in e)}function pe(e){return V(e)&&e.boolean===!0}function me(e){return V(e)&&e.multiple===!0}function he(e){return V(e)&&e.multiple!==!0&&e.boolean!==!0}function ge(e){return{validate(t){if(t!==void 0&&typeof t!=`boolean`)throw new R(L.SETTING_BOOLEAN_FILTER_WITHOUT_BOOLEAN_VALUE,{rule:e,value:t});return!0},parse(t){return typeof t!=`boolean`&&t!==void 0?!1:t===void 0?e.required?!0:e.defaultValue===void 0?!1:e.defaultValue:t},has(e){return this.parse(e)},toggle(t,n){let r=this.parse(t);if(typeof r!=`boolean`)throw new R(L.SETTING_BOOLEAN_FILTER_WITHOUT_BOOLEAN_VALUE,{rule:e,value:r,optionValue:n});return!r},add(t,n){throw new R(L.ADDING_OPTION_VALUE_TO_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},delete(t,n){if(n!==void 0)throw new R(L.DELETING_OPTION_VALUE_FROM_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},isActive(t){return e.required?!0:this.parse(t)===!0},isMatch(t,n,r){return e.filterFn(t,n,r)}}}function _e(e){return{validate(t){if(t!==void 0&&Array.isArray(t)===!1)throw new R(L.SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY,{rule:e,value:t});if(e.strictOptions&&Array.isArray(e.options)&&Array.isArray(t)&&t.every(t=>e.options?.some(e=>e.value===t))===!1)throw new R(L.NO_MATCHING_OPTION_FOUND_WITH_STRICT_OPTIONS,{rule:e,value:t});return!0},parse(t){if(t===void 0)return e.required&&Array.isArray(e.options)&&e.options.length>0?[e.options.at(0)?.value]:[];if(Array.isArray(t))return t;throw new R(L.SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY,{rule:e,value:t})},has(t,n){if(n===void 0)return Array.isArray(t)&&t.length>0;if(Array.isArray(n))return n.every(t=>this.has(e,t));let r=e.options?.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);return Array.isArray(t)&&r!==void 0&&t.includes(r.value)},toggle(t,n){let r=this.parse(t);if(Array.isArray(r)===!1)throw new R(L.SETTING_MULTIPLE_FILTER_WITHOUT_ARRAY,{rule:e,value:r});if(n===void 0)throw new R(L.TOGGLING_OPTION_WITHOUT_PASSING_OPTION,{rule:e});if(e.options===void 0)throw new R(L.TOGGLING_OPTION_ON_RULE_WITH_NO_OPTIONS,{rule:e,optionValue:n});let i=e.options.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);if(i===void 0)throw new R(L.TOGGLING_OPTION_THAT_DOES_NOT_EXIST,{rule:e,optionValue:n});return r.includes(i.value)?[...r.filter(e=>e!==i.value)]:[...r,i.value]},add(t,n){let r=this.parse(t);if(n===void 0)throw new R(L.ADDING_OPTION_TO_MULTIPLE_FILTER_WITHOUT_OPTION_VALUE,{rule:e,optionValue:n});let i=e.options?.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);return i===void 0?[...r,n]:r.includes(i.value)===!1?[...r,i.value]:r},delete(t,n){if(n===void 0)return;let r=this.parse(t),i=e.options?.find(e=>typeof n==`object`&&`value`in n?e.value===n.value:e.value===n);return i!==void 0&&r.includes(i.value)?r.filter(e=>e!==i.value):r.filter(e=>e!==n)},isActive(t){return e.required?!0:this.parse(t).length>0},isMatch(t,n,r){return Array.isArray(n)?n.some(n=>e.filterFn(t,n,r)):!1}}}function ve(e){return{validate(t){if(e.strictOptions&&Array.isArray(e.options)&&e.options.find(e=>e.value===t)===void 0)throw new R(L.NO_MATCHING_OPTION_FOUND_WITH_STRICT_OPTIONS,{rule:e,value:t});return!0},parse(t){if(t===void 0&&e.required){if(e.defaultValue)return e.defaultValue;if(Array.isArray(e.options)&&e.options.length>0)return e.options.at(0)?.value}return t},has(e){return e!==void 0},toggle(t,n){throw new R(L.TOGGLING_OPTION_ON_RULE_WITH_SINGLE_VALUE,{rule:e,value:t,optionValue:n})},add(t,n){throw new R(L.ADDING_OPTION_VALUE_TO_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},delete(t,n){if(n!==void 0)throw new R(L.DELETING_OPTION_VALUE_FROM_NON_MULTIPLE_FILTER,{rule:e,value:t,optionValue:n})},isActive(t){return e.required?!0:!(t===void 0||typeof t==`string`&&t.trim()===``)},isMatch(t,n,r){return e.filterFn(t,n,r)}}}function W(e){if(me(e))return _e(e);if(pe(e))return ge(e);if(he(e))return ve(e);throw new R(L.INVALID_RULE_SHAPE,{definition:e})}var G=class{#e;#t;constructor({initialFilters:e},t){this.#e=e??{},this.#t=t}set(e,t){if(this.#t.isDisabled())return;let n=this.getRule(e),r=this.get(e),i=typeof t==`string`&&t.trim()===``?void 0:t;W(n).validate(t),!(this.#e[n.id]!==void 0&&this.#e[n.id]===i)&&this.#t.debouncer(n,()=>{this.#e={...this.#e,[n.id]:i},this.#t.touch({source:I.FILTERS,event:F.SET_FILTER,current:i,initial:r,rule:n})})}get rules(){return this.#t.getRuleBook().rules.filter(H)}get activeRules(){return this.rules.filter(e=>W(e).isActive(this.#e[e.id]))}get(e){let t=this.getRule(e),n=this.#e[t.id];return W(t).parse(n)}has(e,t){let n=this.getRule(e),r=this.#e[n.id];return W(n).has(r,t)}getRule(e){let t=this.#t.getRuleBook().getRule(e);if(!H(t))throw new R(L.WRONG_RULE_TYPE_FOR_MIXIN,{rule:t});return t}add(e,t){let n=this.getRule(e),r=this.#e[n.id];this.set(n,W(n).add(r,t))}delete(e,t){let n=this.getRule(e),r=this.#e[n.id];this.set(n,W(n).delete(r,t))}toggle(e,t){let n=this.getRule(e),r=this.#e[n.id];if(n.boolean&&t!==void 0)throw new R(L.TOGGLING_BOOLEAN_FILTER_WITH_UNUSED_VALUE,{rule:n,value:r});let i=W(n).toggle(r,t);this.set(n,i)}reset(){let e=this.values;this.#e={},this.#t.touch({source:I.FILTERS,event:F.RESET_FILTERS,current:this.values,initial:e})}isRuleActive(e){let t=this.getRule(e),n=this.#e[t.id];return W(t).isActive(n)}test(e){if(this.#t.isLoading())return[];if(e.isAdditive){let t=p([...this.rules,...e.rules],`id`),n={...this.values,...e.values};return this.#t.test({filters:{rules:t,values:n}},!0)}return this.#t.test({filters:{rules:e.rules,values:e.values??{}}})}testRule({rule:e,value:t,...n}){let r=this.getRule(e);return this.test({rules:[r],values:{[r.id]:t},...n})}testRuleOptions(e,t){if(this.#t.isLoading())return new Map;let n=this.getRule(e);if(n.boolean){let e=new Map;return e.set(!0,this.testRule({rule:n,value:!0})),e.set(!1,this.testRule({rule:n,value:!1})),e}if(Array.isArray(n.options)){let e=new Map;return n.options.forEach(r=>{let i;i=n.multiple?[r.value]:r.value,e.set(r,this.testRule({rule:n,value:i,isAdditive:t}))}),e}throw new R(L.TESTING_OPTIONS_ON_RULE_WITH_NO_OPTIONS,n)}get values(){return this.rules.reduce((e,t)=>(e[t.id]=this.get(t),e),{})}get raw(){return this.#e}serialize(){return{rules:this.rules,values:this.values}}static process(e,t,n){let r=e.rules.filter(t=>H(t)&&W(t).isActive(e.values[t.id]));return r.length===0?t:t.filter(t=>r.every(r=>H(r)&&W(r).isMatch(t,e.values[r.id],n)))}},K=class{#e;#t;#n;constructor({initialGroupBy:e,initialGroupBySortDirection:t,requireGroup:n},r){this.#n=r,e&&(this.#e=this.getRule(e)),this.#t=t,this.requireGroup=n}getRule(e){let t=this.#n.getRuleBook().getRule(e);if(U(t)===!1)throw new R(L.WRONG_RULE_TYPE_FOR_MIXIN,{rule:t});return t}get rules(){return this.#n.getRuleBook().rules.filter(U)}get activeRule(){let e=this.requireGroup?this.rules.at(0):void 0;return this.#e??e}get hasGroupByRule(){return this.activeRule!==void 0}get groupBySortDirection(){return this.#t??this.activeRule?.defaultGroupSortDirection}set(e){if(this.#n.isDisabled())return;let t=this.#e,n,r=typeof e==`string`&&e.trim()===``;r&&(n=void 0),r===!1&&e!==void 0&&(n=this.getRule(e)),this.#e!==n&&(this.#e=n,this.#t=void 0,this.#n.touch({source:I.GROUP_BY,event:F.SET_GROUP_BY,current:n?.id,initial:t?.id,rule:n}))}setGroupSortDirection(e){let t=this.#t;this.#t=e,this.#n.touch({source:I.GROUP_BY,event:F.SET_GROUP_SORT_BY_DIRECTION,current:e,initial:t,rule:this.activeRule})}toggle(e){let t=this.getRule(e);if(this.activeRule===t){this.set(void 0);return}this.set(t)}reset(){this.setGroupSortDirection(void 0),this.set(void 0)}serialize(){return{rule:this.activeRule,groupBySortDirection:this.#t}}static process(e,t,n){let r=l(t,t=>e.rule?.groupFn(t,n)),i=Object.entries(r).map(([e,t])=>({id:e,items:t})),a=e.rule?.sticky!==void 0,o=[],s=[];return a&&e.rule&&(o.push(ye(e.rule)),s.push(`asc`)),e.rule?.sortGroupFn&&(o.push(e.rule.sortGroupFn),s.push(e.groupBySortDirection??`asc`)),o.length>0?d(i,o,s):i}};function ye(e){let t=[];e.sticky?.header!==void 0&&(Array.isArray(e.sticky.header)&&(t=e.sticky.header),typeof e.sticky.header==`string`&&(t=[e.sticky.header]));let n=[];return e.sticky?.footer!==void 0&&(Array.isArray(e.sticky.footer)&&(n=e.sticky.footer),typeof e.sticky.footer==`string`&&(n=[e.sticky.footer])),e=>{if(t.includes(e.id)){let n=t.findIndex(t=>e.id===t);return(t.length-n)*-1}return n.includes(e.id)?1+n.findIndex(t=>e.id===t):0}}var q=class{#e;#t;constructor({page:e,numItemsPerPage:t},n){this.#e=e??1,this.numItemsPerPage=t,this.#t=n}setPage(e){if(e!==this.#e){let t=this.#e;this.#e=e,this.#t.touch({source:I.PAGINATION,event:F.SET_PAGE,current:{page:this.#e},initial:{page:t}})}}setNumItemsPerPage(e){if(e!==this.numItemsPerPage){let t=this.numItemsPerPage;this.numItemsPerPage=e,this.#t.touch({source:I.PAGINATION,event:F.SET_NUM_ITEMS_PER_PAGE,current:{numItemsPerPage:this.numItemsPerPage},initial:{numItemsPerPage:t}})}}get lastPage(){if(this.numItemsPerPage!==void 0)return Math.ceil(this.#t.getItems().length/this.numItemsPerPage)}get numTotalItems(){return this.#t.getItems().length}get page(){return this.numItemsPerPage&&this.lastPage?s(this.#e,1,this.lastPage):this.#e}get offset(){return this.numItemsPerPage&&this.lastPage?(s(this.#e,1,this.lastPage)-1)*this.numItemsPerPage:0}serialize(){return{page:this.#e,numItemsPerPage:this.numItemsPerPage}}static process(e,t){if(e.numItemsPerPage===void 0)return t;let n=Math.ceil(t.length/e.numItemsPerPage),r=(s(e.page,1,n)-1)*e.numItemsPerPage;return t.slice(r,r+e.numItemsPerPage)}};function be(e,t){let n=e.length/t.length,r=1,i=1,a=0;for(let t=0;t<e.length;t+=1)a!==void 0&&e.at(t)===a+1&&(i+=1,i>=r&&(r=i)),a=e.at(t);return{percentOfHaystackMatched:n,longestSequentialSequence:r}}function xe(e,t,n){let r=t.reduce((t,r)=>{if(e.rule?.searchFn===void 0)return t;let i=e.rule.searchFn(r,n),a=(Array.isArray(i)?i.map(M):[M(i)]).reduce((t,n)=>{let r=N(n,e.searchTerm);return r!==void 0&&t.push(be(r,n)),t},[]);if(a.length>0){let e=d(a,[`percentOfHaystackMatched`,`longestSequentialSequence`],[`desc`,`asc`]).at(0);e&&t.push({item:r,score:e})}return t},[]),i=r.reduce((e,t)=>(t.score.longestSequentialSequence>e&&(e=t.score.longestSequentialSequence),e),0);return d(r,[e=>e.score.percentOfHaystackMatched*100+e.score.longestSequentialSequence/i*100],[`desc`]).map(e=>e.item)}var J=class{#e;constructor({initialSearchTerm:e},t){if(this.searchTerm=``,e&&t.getRuleBook().rules.find(B)===void 0)throw new R(L.NO_SEARCH_RULE_SET);this.searchTerm=e??``,this.#e=t}get rule(){return this.#e.getRuleBook().rules.find(B)}get hasSearchRule(){return this.rule!==void 0}get hasSearchTerm(){return this.searchTerm!==``}setSearchTerm(e){let t=this.rule;if(!t)throw new R(L.NO_SEARCH_RULE_SET);if(typeof e!=`string`)throw new R(L.INVALID_SEARCH_TERM_TYPE);if(this.#e.isDisabled())return;let n=this.searchTerm;this.searchTerm=e,n!==e&&this.#e.debouncer(t,()=>{this.#e.touch({source:I.SEARCH,event:F.SET_SEARCH_TERM,current:e,initial:n,rule:t})})}reset(){if(this.#e.isDisabled())return;let e=this.searchTerm;this.searchTerm=``,this.#e.touch({source:I.SEARCH,event:F.RESET_SEARCH_TERM,current:``,initial:e,rule:this.rule})}serialize(){return{searchTerm:this.searchTerm,rule:this.rule}}test(e,t=!1){return this.#e.test({search:{searchTerm:e,rule:this.rule}},t)}static process(e,t,n){if(e.rule===void 0)throw new R(L.NO_SEARCH_RULE_SET);return e.searchTerm===``?t:xe(e,t,n)}};const Y=[void 0,`desc`,`asc`];var X=class{#e;#t;#n;constructor({initialSortBy:e,initialSortDirection:t},n){this.#n=n,e&&(this.#e=this.getRule(e)),this.#t=t}getRule(e){let t=this.#n.getRuleBook().getRule(e);if(z(t)===!1)throw new R(L.WRONG_RULE_TYPE_FOR_MIXIN,{rule:t});return t}get rules(){return this.#n.getRuleBook().rules.filter(z)}get activeRule(){let e=this.rules.at(0);return this.#e??e}get sortDirection(){return this.#t??this.activeRule?.defaultSortDirection??`asc`}get userHasSetSortDirection(){return this.#t!==void 0}setSortDirection(e){if(this.#n.isDisabled()||!this.activeRule)return;let t=this.#t;this.#t=e,this.#n.touch({source:I.SORT_BY,event:F.SET_SORT_BY_DIRECTION,current:{sortDirection:e},initial:{sortDirection:t},rule:this.activeRule})}cycleSortDirection(){let e=Y.findIndex(e=>e===this.#t);if(e!==-1){let t=e+1%(Y.length-1);this.setSortDirection(Y[t])}}toggleSortDirection(){if((this.#t??this.activeRule?.defaultSortDirection)===`desc`){this.setSortDirection(`asc`);return}this.setSortDirection(`desc`)}set(e,t){if(this.#n.isDisabled()||!this.activeRule)return;let n=this.#t,r=this.#e,i=e?this.getRule(e):void 0;this.#e=i,this.#t=t,this.#n.touch({source:I.SORT_BY,event:F.SET_SORT_BY,current:{rule:i?.id,sortDirection:t},initial:{rule:r?.id,sortDirection:n},rule:this.activeRule})}reset(){this.set(void 0,void 0)}serialize(){return{rule:this.activeRule,sortDirection:this.sortDirection}}static process(e,t,n){return e.rule===void 0?t:d(t,t=>typeof e.rule?.sortFn==`function`?e.rule.sortFn(t,n):-1/0,e.sortDirection)}},Z=class e{constructor(){this.snapshot={},this.isStale=!0}setIsStale(e){this.isStale=e}takeSnapshot({items:t,context:n,mixins:r}){let i=e.test({mixins:r,items:t,context:n}),a=r.pagination?q.process(r.pagination,i):i,o=[],s=r.groupBy!==void 0;r.groupBy&&(o=K.process(r.groupBy,a,n)),this.snapshot={items:s?void 0:a,groups:s?o:void 0,numMatchedItems:i.length,numTotalItems:t.length,hasGroupByRule:s}}static test({mixins:e,items:t,context:n}){let r=[...t];return e.search&&(r=J.process(e.search,r,n)),e.filters&&(r=G.process(e.filters,r,n)),e.sortBy&&(r=X.process(e.sortBy,r,n)),r}},Se=class{#e;constructor(e){this.effects=[],this.#e=e}hydrateDefinitions(e,t){this.effects=this.#e.map(n=>{let r=typeof n.rules==`function`?n.rules(e,t):n.rules,i=Array.isArray(r)?r:[r];return{...n,rules:i,_isHydrated:!0}})}setEffects(e){this.#e=e}onChange(e,t){this.effects.forEach(n=>{n.rules.some(t=>typeof t==`string`&&e.id===t||typeof t==`object`&&e.id===t.id)&&n.onChange(t,e)})}},Ce=class e{constructor(t){this.rules=[],e.validateDefinitions(t),this.definitions=t}hydrateDefinitions(e,t){this.rules=this.definitions.map(n=>{if(V(n)){let r=typeof n.options==`function`?n.options({items:e,context:t}):n.options;return{...n,boolean:!!n.boolean,multiple:!!n.multiple,strictOptions:n.strictOptions??!0,options:r}}return n})}getRule(e){let t=this.rules.find(t=>typeof e==`object`?t.id===e.id:t.id===e);if(t===void 0)throw new R(L.RULE_NOT_FOUND,e);return t}setRules(t){e.validateDefinitions(t),this.definitions=t}static validateDefinitions(e){if(e.length===0)return!1;let t=[B,V,z,U],n=new Set;return e.forEach(e=>{if(e.id===void 0&&!B(e))throw new R(L.INVALID_RULE_WITHOUT_ID,e);if(t.some(t=>t(e))===!1)throw new R(L.INVALID_RULE_SHAPE,e);if(e.id){if(n.has(e.id))throw new R(L.INVALID_RULE_DUPLICATE,e);n.add(e.id)}}),!0}},we=class{#e;constructor(e){this.effects=[],this.#e=e}hydrateDefinitions(e,t){this.effects=this.#e.map(n=>{let r=typeof n.haystack==`function`?n.haystack(e,t):n.haystack,i=Array.isArray(r)?r:[r];return{...n,haystack:i}})}setEffects(e){this.#e=e}processSearchTerm(e,t){this.effects.forEach(n=>{se(n.haystack,e)&&n.onChange(t,e)})}},Q=class{constructor({rules:e,ruleEffects:t,searchEffects:n}){this.list=new Ce(e),this.ruleEffects=new Se(t),this.searchEffects=new we(n)}hydrateDefinitions(e,t){this.list.hydrateDefinitions(e,t),this.searchEffects.hydrateDefinitions(e,t),this.ruleEffects.hydrateDefinitions(e,t)}onChange(e,t){B(e)&&t.search.hasSearchTerm&&this.searchEffects.processSearchTerm(t.search.searchTerm,t),this.ruleEffects.onChange(e,t)}},Te=class{#e;#t=!1;#n;#r=new ue;#i=new Z;#a;constructor(e,{rules:t,effects:n,initialSearchTerm:r,initialSortBy:i,initialSortDirection:a,initialGroupBy:o,initialGroupBySortDirection:s,initialFilters:c,context:l,page:u,numItemsPerPage:d,isLoading:f,disabled:p,requireGroup:m,ignoreSortByRulesWhileSearchRuleIsActive:h,onInit:g,onReady:_,onFirstUserInteraction:v,onChange:y},b){this.isReady=!1,this.#e=e,this.disabled=!!p,this.isLoading=!!f,this.isReady=!f&&Array.isArray(e)&&e.length>0,this.getInstanceInterfaceFn=b,this.updatedAt=Date.now(),this.context=l,this.#n=h,this.#a=new Q({rules:t,ruleEffects:n?.filter(de)??[],searchEffects:n?.filter(fe)??[]}),this.#a.hydrateDefinitions(e??[],l);let x={getItems:()=>this.items,getRuleBook:()=>this.#a.list,isLoading:()=>this.isLoading,isDisabled:()=>this.disabled,test:(e,t)=>this.test(e,t),touch:e=>this.#o(e),debouncer:le()};this.search=new J({initialSearchTerm:r},x),this.filters=new G({initialFilters:c},x),this.sortBy=new X({initialSortBy:i,initialSortDirection:a},x),this.groupBy=new K({initialGroupBy:o,initialGroupBySortDirection:s,requireGroup:!!m},x),this.pagination=new q({page:u,numItemsPerPage:d},x),this.#r.silently(()=>{let e={source:I.CORE,event:F.INIT,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};g&&g(e)}),y&&this.#r.on(F.CHANGE,y),v&&this.#r.on(F.FIRST_USER_INTERACTION,v),_&&this.isReady&&_({source:I.CORE,event:F.READY,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()}),this.isReady===!1&&_&&this.#r.on(F.READY,_)}#o(e){if(this.#r.isSilent())return;this.emitFirstUserInteraction(),this.#c(),this.#i.setIsStale(!0);let t={...e,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};this.#r.emit(F.CHANGE,t),this.#r.silently(()=>{e.rule&&this.#a.onChange(e.rule,this.getInstanceInterfaceFn())})}#s(e){this.#i.setIsStale(!0),this.#c();let t={...e,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};this.#r.emit(e.event,t)}#c(){this.updatedAt=Date.now(),this.#r.emit(F.SYNC_UPDATED_AT,this.updatedAt)}emitFirstUserInteraction(){if(this.#t===!1){this.#t=!0;let e={source:I.CORE,event:F.FIRST_USER_INTERACTION,timestamp:Date.now(),instance:this.getInstanceInterfaceFn()};this.#r.emit(F.FIRST_USER_INTERACTION,e)}}#l(){this.isReady===!1&&(this.isReady=!0,this.#r.emit(F.READY,{source:I.CORE,event:F.READY,timestamp:Date.now()}))}get items(){return Array.isArray(this.#e)?this.#e:[]}get matches(){return this.#i.isStale&&(this.#i.takeSnapshot({items:this.items,context:this.context,mixins:this.#u()}),this.#i.setIsStale(!1)),this.#i.snapshot}test(e,t=!1){if(t){let t={...this.#u(),...e};return Z.test({mixins:t,items:this.items,context:this.context})}return Z.test({mixins:e,items:this.items,context:this.context})}#u(){let e=this.search.hasSearchRule&&this.search.hasSearchTerm,t=e&&this.#n,n={};return e&&(n.search=this.search.serialize()),this.filters.activeRules.length>0&&(n.filters=this.filters.serialize()),this.pagination.numItemsPerPage&&(n.pagination=this.pagination.serialize()),t===!1&&(n.sortBy=this.sortBy.serialize()),this.groupBy.activeRule!==void 0&&(n.groupBy=this.groupBy.serialize()),n}get isEmpty(){return this.isLoading===!1&&this.items.length===0}get hasMatches(){let e=Array.isArray(this.matches.items)&&this.matches.items.length>0,t=Array.isArray(this.matches.groups)&&this.matches.groups.length>0;return e||t}get events(){return{on:(e,t)=>this.#r.on(e,t),off:(e,t)=>this.#r.off(e,t),silently:e=>this.#r.silently(e),isSilent:()=>this.#r.isSilent()}}getRule(e){return this.#a.list.getRule(e)}get state(){if(this.isLoading)return`loading`;if(this.isEmpty)return`empty`;let e=this.groupBy.activeRule!==void 0;return e&&Array.isArray(this.matches.groups)&&this.matches.groups.length>0?`groups`:e===!1&&Array.isArray(this.matches.items)&&this.matches.items.length>0?`items`:`noMatches`}setItems(e){if(u(e,this.#e)===!1){let t=this.#e;this.#e=e,this.#a.hydrateDefinitions(this.items,this.context),this.#s({source:I.CORE,event:F.SET_ITEMS,current:e,initial:t})}}setIsLoading(e){if(!!e!==this.isLoading){let t=this.isLoading;this.isLoading=!!e,this.#s({source:I.CORE,event:F.SET_IS_LOADING,current:!!e,initial:t}),this.isLoading===!1&&this.#l()}}setIsDisabled(e){if(!!e!==this.disabled){let t=this.disabled;this.disabled=!!e,this.#s({source:I.CORE,event:F.SET_IS_DISABLED,current:!!e,initial:t})}}setRules(e){u(e,this.#a.list.definitions)===!1&&(this.#a.list.setRules(e),this.#a.list.hydrateDefinitions(this.items,this.context))}setContext(e){let t=this.context;u(e,t)===!1&&(this.context=e,this.#a.hydrateDefinitions(this.items,this.context),this.#s({source:I.CORE,event:F.SET_CONTEXT,current:e,initial:t}))}toJSON(){return{disabled:this.disabled,initialSearchTerm:this.search.searchTerm,initialFilters:this.filters.raw,page:this.pagination.page,numItemsPerPage:this.pagination.numItemsPerPage,initialSortBy:this.sortBy.activeRule?.id,initialSortDirection:this.sortBy.sortDirection,ignoreSortByRulesWhileSearchRuleIsActive:this.#n,initialGroupBy:this.groupBy.activeRule?.id,initialGroupBySortDirection:this.groupBy.groupBySortDirection,requireGroup:this.groupBy.requireGroup}}},Ee=class{#e;constructor(e,t){this.#e=new Te(e,t,()=>this)}get items(){return this.#e.items}get context(){return this.#e.context}get isReady(){return this.#e.isReady}get isEmpty(){return this.#e.isEmpty}get hasMatches(){return this.#e.hasMatches}get isLoading(){return this.#e.isLoading}get disabled(){return this.#e.disabled}get state(){return this.#e.state}get updatedAt(){return this.#e.updatedAt}get events(){return this.#e.events}get matches(){return this.#e.matches}get search(){let e=this.#e.search;return{rule:e.rule,searchTerm:e.searchTerm,hasSearchTerm:e.hasSearchTerm,hasSearchRule:e.hasSearchRule,setSearchTerm:e.setSearchTerm.bind(e),reset:e.reset.bind(e),test:e.test.bind(e)}}get filters(){let e=this.#e.filters;return{values:e.values,raw:e.raw,activeRules:e.activeRules,rules:e.rules,isActive:e.isRuleActive.bind(e),get:e.get.bind(e),add:e.add.bind(e),has:e.has.bind(e),getRule:e.getRule.bind(e),toggle:e.toggle.bind(e),set:e.set.bind(e),delete:e.delete.bind(e),reset:e.reset.bind(e),test:e.test.bind(e),testRule:e.testRule.bind(e),testRuleOptions:e.testRuleOptions.bind(e)}}get sortBy(){let e=this.#e.sortBy;return{activeRule:e.activeRule,sortDirection:e.sortDirection,userHasSetSortDirection:e.userHasSetSortDirection,rules:e.rules,set:e.set.bind(e),setSortDirection:e.setSortDirection.bind(e),cycleSortDirection:e.cycleSortDirection.bind(e),toggleSortDirection:e.toggleSortDirection.bind(e),reset:e.reset.bind(e)}}get groupBy(){let e=this.#e.groupBy;return{activeRule:e.activeRule,requireGroup:e.requireGroup,rules:e.rules,groupBySortDirection:e.groupBySortDirection,set:e.set.bind(e),toggle:e.toggle.bind(e),setGroupSortDirection:e.setGroupSortDirection.bind(e),reset:e.reset.bind(e)}}get pagination(){let e=this.#e.pagination;return{page:e.page,offset:e.offset,numItemsPerPage:e.numItemsPerPage,numTotalItems:e.numTotalItems,lastPage:e.lastPage,isPaginated:e.numItemsPerPage!==void 0,setPage:e.setPage.bind(e),setNumItemsPerPage:e.setNumItemsPerPage.bind(e)}}setItems(e){return this.#e.setItems(e)}setIsLoading(e){return this.#e.setIsLoading(e)}setIsDisabled(e){return this.#e.setIsDisabled(e)}setRules(e){return this.#e.setRules(e)}setContext(e){return this.#e.setContext(e)}test(e,t=!1){return this.#e.test(e,t)}getRule(e){return this.#e.getRule(e)}toJSON(){return this.#e.toJSON()}};function $({items:e,rules:t,effects:i,initialSearchTerm:s,initialSortBy:c,initialSortDirection:l,initialGroupBy:u,initialGroupBySortDirection:d,initialFilters:f,context:p,isLoading:m,disabled:h,page:g,numItemsPerPage:_,requireGroup:v,ignoreSortByRulesWhileSearchRuleIsActive:y,onInit:b,onReady:x,onFirstUserInteraction:S,onChange:C,controllerRef:T,children:E}){let[D,O]=a(Date.now()),[k]=a(()=>{let n=new Ee(e,{rules:t,effects:i,initialSearchTerm:s,initialSortBy:c,initialSortDirection:l,initialGroupBy:u,initialGroupBySortDirection:d,initialFilters:f,context:p,isLoading:m,disabled:h,page:g,numItemsPerPage:_,requireGroup:v,ignoreSortByRulesWhileSearchRuleIsActive:y,onInit:b,onReady:x,onFirstUserInteraction:S,onChange:C});return n.events.on(F.SYNC_UPDATED_AT,e=>O(e)),n});k.setItems(e),k.setIsLoading(m),k.setIsDisabled(h),k.setRules(t),p!==void 0&&k.setContext(p),g!==void 0&&k.pagination.setPage(g),_!==void 0&&k.pagination.setNumItemsPerPage(_),n(T,()=>k,[k]);let A=r(()=>[k,D],[k,D]);return o(w.Provider,{value:A,children:E})}$.Content=j,$.SearchTermHaystack=ce;function De(){return i(null)}export{$ as Finder,P as StringMatch,g as filterRule,m as finderRuleset,v as groupByRule,y as ruleEffect,b as searchEffect,h as searchRule,_ as sortByRule,S as transformFilterToBoolean,C as transformFilterToMultiple,x as transformFilterToSingleValue,T as useFinder,De as useFinderRef};
package/package.json CHANGED
@@ -1,30 +1,21 @@
1
1
  {
2
2
  "name": "@hitgrab/finder",
3
- "version": "0.1.17-alpha",
4
- "description": "Headless datatables for things that aren't tables.",
3
+ "version": "0.1.19-alpha",
4
+ "description": "Effortless data manipulation with static rules.",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist/**/*"
8
8
  ],
9
- "main": "./dist/index.umd.cjs",
10
- "types": "./dist/index.d.ts",
9
+ "main": "./dist/index.cjs",
10
+ "types": "./dist/index.d.cts",
11
11
  "module": "./dist/index.js",
12
12
  "exports": {
13
- ".": {
14
- "import": {
15
- "types": "./dist/index.d.ts",
16
- "default": "./dist/index.js"
17
- },
18
- "require": {
19
- "types": "./dist/index.d.ts",
20
- "default": "./dist/index.umd.cjs"
21
- }
22
- },
13
+ ".": "./dist/index.cjs",
23
14
  "./package.json": "./package.json"
24
15
  },
25
16
  "scripts": {
26
17
  "dev": "vite",
27
- "build": "vite build && tsc --project tsconfig.production.json",
18
+ "build": "tsdown",
28
19
  "build:docs": "npm --prefix docusaurus run build && rm -r docs && cp -r ./docusaurus/build ./docs && mkdir ./docs/examples && mkdir ./docs/examples/armory && mkdir ./docs/examples/shoes",
29
20
  "build:armory": "npm --prefix examples/pixel-armory run build && rm -r ./docs/examples/armory && cp -r ./examples/pixel-armory/dist ./docs/examples/armory",
30
21
  "build:shoes": "npm --prefix examples/shoe-store run build && rm -r ./docs/examples/shoes && cp -r ./examples/shoe-store/dist ./docs/examples/shoes",
@@ -39,7 +30,8 @@
39
30
  "filter",
40
31
  "search",
41
32
  "sort",
42
- "group"
33
+ "group",
34
+ "paginate"
43
35
  ],
44
36
  "author": "HitGrab Inc.",
45
37
  "license": "ISC",
@@ -57,6 +49,7 @@
57
49
  "eslint-plugin-react": "^7.37.5",
58
50
  "eslint-plugin-react-hooks": "^5.2.0",
59
51
  "prettier": "^3.6.2",
52
+ "tsdown": "^0.16.1",
60
53
  "typescript": "^5.9.3",
61
54
  "typescript-eslint": "^8.46.1",
62
55
  "vite": "^7.1.9",