@react-querybuilder/core 8.10.0 → 8.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/{arrayUtils-C9sO4qLO.mjs → arrayUtils-A_OXU9W1.mjs} +3 -3
  2. package/dist/{arrayUtils-C9sO4qLO.mjs.map → arrayUtils-A_OXU9W1.mjs.map} +1 -1
  3. package/dist/basic-B4vXboTG.d.mts +1257 -0
  4. package/dist/basic-BeKPP0_1.d.ts +1257 -0
  5. package/dist/cjs/react-querybuilder_core.cjs.development.d.ts +412 -278
  6. package/dist/cjs/react-querybuilder_core.cjs.development.js +53 -1
  7. package/dist/cjs/react-querybuilder_core.cjs.development.js.map +1 -1
  8. package/dist/cjs/react-querybuilder_core.cjs.production.d.ts +412 -278
  9. package/dist/cjs/react-querybuilder_core.cjs.production.js +1 -1
  10. package/dist/cjs/react-querybuilder_core.cjs.production.js.map +1 -1
  11. package/dist/{convertQuery-BUgyz1GA.mjs → convertQuery-CqX3rPvj.mjs} +3 -3
  12. package/dist/{convertQuery-BUgyz1GA.mjs.map → convertQuery-CqX3rPvj.mjs.map} +1 -1
  13. package/dist/{export-GUuxJ7zR.d.ts → export-BjRt-qrK.d.mts} +6 -7
  14. package/dist/{export-Ccjfea21.d.mts → export-CQB0nuvW.d.ts} +6 -7
  15. package/dist/formatQuery.d.mts +2 -3
  16. package/dist/formatQuery.d.ts +2 -3
  17. package/dist/formatQuery.mjs +6 -6
  18. package/dist/{import-Dxevzw_-.d.mts → import-Bc_p8ls9.d.mts} +3 -3
  19. package/dist/{import-D-hm1phN.d.ts → import-Dvayhrgj.d.ts} +3 -3
  20. package/dist/{isRuleGroup-CGe_rb2w.mjs → isRuleGroup-CYcfPgbg.mjs} +2 -2
  21. package/dist/{isRuleGroup-CGe_rb2w.mjs.map → isRuleGroup-CYcfPgbg.mjs.map} +1 -1
  22. package/dist/optGroupUtils-B0hTpodo.js.map +1 -1
  23. package/dist/{optGroupUtils-DrubUpx0.mjs → optGroupUtils-VeZ3k7-1.mjs} +3 -3
  24. package/dist/optGroupUtils-VeZ3k7-1.mjs.map +1 -0
  25. package/dist/parseCEL.d.mts +2 -3
  26. package/dist/parseCEL.d.ts +2 -3
  27. package/dist/parseCEL.js +761 -1095
  28. package/dist/parseCEL.js.map +1 -1
  29. package/dist/parseCEL.mjs +763 -1099
  30. package/dist/parseCEL.mjs.map +1 -1
  31. package/dist/parseJSONata.d.mts +2 -3
  32. package/dist/parseJSONata.d.ts +2 -3
  33. package/dist/parseJSONata.mjs +3 -3
  34. package/dist/parseJsonLogic.d.mts +4 -4
  35. package/dist/parseJsonLogic.d.ts +4 -4
  36. package/dist/parseJsonLogic.mjs +5 -5
  37. package/dist/parseMongoDB.d.mts +2 -3
  38. package/dist/parseMongoDB.d.ts +2 -3
  39. package/dist/parseMongoDB.mjs +5 -5
  40. package/dist/{parseNumber-B_-sR6d5.mjs → parseNumber-CXdMVNFx.mjs} +2 -2
  41. package/dist/{parseNumber-B_-sR6d5.mjs.map → parseNumber-CXdMVNFx.mjs.map} +1 -1
  42. package/dist/parseSQL.d.mts +2 -3
  43. package/dist/parseSQL.d.ts +2 -3
  44. package/dist/parseSQL.js +2681 -3021
  45. package/dist/parseSQL.js.map +1 -1
  46. package/dist/parseSQL.mjs +2684 -3026
  47. package/dist/parseSQL.mjs.map +1 -1
  48. package/dist/parseSpEL.d.mts +2 -3
  49. package/dist/parseSpEL.d.ts +2 -3
  50. package/dist/parseSpEL.mjs +4 -4
  51. package/dist/{prepareQueryObjects-CJNpnGcJ.mjs → prepareQueryObjects-DPCC-iHp.mjs} +4 -4
  52. package/dist/{prepareQueryObjects-CJNpnGcJ.mjs.map → prepareQueryObjects-DPCC-iHp.mjs.map} +1 -1
  53. package/dist/query-builder.css +1 -1
  54. package/dist/query-builder.css.map +1 -1
  55. package/dist/react-querybuilder_core.d.mts +412 -278
  56. package/dist/react-querybuilder_core.legacy-esm.d.ts +412 -278
  57. package/dist/react-querybuilder_core.legacy-esm.js +57 -9
  58. package/dist/react-querybuilder_core.legacy-esm.js.map +1 -1
  59. package/dist/react-querybuilder_core.mjs +50 -2
  60. package/dist/react-querybuilder_core.mjs.map +1 -1
  61. package/dist/react-querybuilder_core.production.d.mts +412 -278
  62. package/dist/react-querybuilder_core.production.mjs +1 -1
  63. package/dist/react-querybuilder_core.production.mjs.map +1 -1
  64. package/dist/styles/_main.scss +5 -0
  65. package/dist/{transformQuery-DHvtgDgZ.mjs → transformQuery-DCCpjtyq.mjs} +3 -3
  66. package/dist/{transformQuery-DHvtgDgZ.mjs.map → transformQuery-DCCpjtyq.mjs.map} +1 -1
  67. package/dist/transformQuery.d.mts +1 -1
  68. package/dist/transformQuery.d.ts +1 -1
  69. package/dist/transformQuery.mjs +2 -2
  70. package/package.json +11 -9
  71. package/dist/basic-BmpEwexQ.d.mts +0 -363
  72. package/dist/basic-CDDA-KZa.d.ts +0 -363
  73. package/dist/optGroupUtils-DrubUpx0.mjs.map +0 -1
@@ -1,363 +0,0 @@
1
- import { Except, RequireAtLeastOne, SetRequired, Simplify } from "type-fest";
2
-
3
- //#region src/types/options.d.ts
4
-
5
- /**
6
- * Adds an `unknown` index property to an interface.
7
- */
8
- type WithUnknownIndex<T> = T & {
9
- [key: string]: unknown;
10
- };
11
- /**
12
- * Do not use this type directly; use {@link Option}, {@link ValueOption},
13
- * or {@link FullOption} instead. For specific option types, you can use
14
- * {@link FullField}, {@link FullOperator}, or {@link FullCombinator},
15
- * all of which extend {@link FullOption}.
16
- *
17
- * @group Option Lists
18
- */
19
- interface BaseOption<N extends string = string> {
20
- name?: N;
21
- value?: N;
22
- label: string;
23
- disabled?: boolean;
24
- }
25
- /**
26
- * A generic option. Used directly in {@link OptionList} or
27
- * as the child element of an {@link OptionGroup}.
28
- *
29
- * @group Option Lists
30
- */
31
- type Option<N extends string = string> = Simplify<WithUnknownIndex<SetRequired<BaseOption<N>, "name">>>;
32
- /**
33
- * A generic {@link Option} with either a `name` or `value` as its primary identifier.
34
- * {@link OptionList}-type props on the {@link QueryBuilder} component accept this type,
35
- * but corresponding props passed down to subcomponents will always be translated
36
- * to {@link FullOption} first.
37
- *
38
- * @group Option Lists
39
- */
40
- type FlexibleOption<N extends string = string> = Simplify<WithUnknownIndex<RequireAtLeastOne<BaseOption<N>, "name" | "value">>>;
41
- /**
42
- * Utility type to turn an {@link Option}, {@link ValueOption}, or {@link BaseOption}
43
- * into a {@link FlexibleOption}.
44
- *
45
- * @group Option Lists
46
- */
47
- type ToFlexibleOption<Opt extends BaseOption | string> = WithUnknownIndex<RequireAtLeastOne<Opt extends string ? FlexibleOption<Opt> : Opt, "name" | "value">>;
48
- /**
49
- * A generic {@link Option} requiring both `name` _and_ `value` properties.
50
- * Props that extend {@link OptionList} accept {@link BaseOption}, but
51
- * corresponding props sent to subcomponents will always be translated to this
52
- * type first to ensure both `name` and `value` are available.
53
- *
54
- * NOTE: Do not extend from this type directly. Use {@link BaseFullOption}
55
- * (optionally wrapped in {@link WithUnknownIndex}) instead, otherwise
56
- * the `unknown` index property will cause issues. See {@link Option} and
57
- * {@link ValueOption} for examples.
58
- *
59
- * @group Option Lists
60
- */
61
- type FullOption<N extends string = string> = Simplify<WithUnknownIndex<SetRequired<BaseOption<N>, "name" | "value">>>;
62
- /**
63
- * This type is identical to {@link FullOption} but without the `unknown` index
64
- * property. Extend from this type instead of {@link FullOption} directly.
65
- *
66
- * @group Option Lists
67
- */
68
- type BaseFullOption<N extends string = string> = Simplify<SetRequired<BaseOption<N>, "name" | "value">>;
69
- /**
70
- * Utility type to turn an {@link Option}, {@link ValueOption} or
71
- * {@link BaseOption} into a {@link FullOption}.
72
- *
73
- * @group Option Lists
74
- */
75
- type ToFullOption<Opt extends BaseOption> = Opt extends BaseFullOption ? Opt : Opt extends BaseOption<infer IdentifierType> ? WithUnknownIndex<Opt & FullOption<IdentifierType>> : never;
76
- /**
77
- * A group of {@link Option}s, usually within an {@link OptionList}.
78
- *
79
- * @group Option Lists
80
- */
81
- interface OptionGroup<Opt extends BaseOption = FlexibleOption> {
82
- label: string;
83
- options: WithUnknownIndex<Opt>[];
84
- }
85
- /**
86
- * A group of {@link BaseOption}s, usually within a {@link FlexibleOptionList}.
87
- *
88
- * @group Option Lists
89
- */
90
- type FlexibleOptionGroup<Opt extends BaseOption | string = BaseOption> = {
91
- label: string;
92
- options: (Opt extends BaseFullOption ? Opt : ToFlexibleOption<Opt>)[];
93
- };
94
- /**
95
- * Either an array of {@link Option}s or an array of {@link OptionGroup}s.
96
- *
97
- * @group Option Lists
98
- */
99
- type OptionList<Opt extends Option = Option> = Opt[] | OptionGroup<Opt>[];
100
- /**
101
- * An array of options or option groups, like {@link OptionList} but the option type
102
- * may use either `name` or `value` as the primary identifier.
103
- *
104
- * @group Option Lists
105
- */
106
- type FlexibleOptionList<Opt extends BaseOption> = ToFlexibleOption<Opt>[] | FlexibleOptionGroup<ToFlexibleOption<Opt>>[];
107
- /**
108
- * An array of options or option groups, like {@link OptionList}, but using
109
- * {@link FullOption} instead of {@link Option}. This means that every member is
110
- * guaranteed to have both `name` and `value`.
111
- *
112
- * @group Option Lists
113
- */
114
- type FullOptionList<Opt extends BaseOption> = Opt extends BaseFullOption ? Opt[] | OptionGroup<Opt>[] : ToFullOption<Opt>[] | OptionGroup<ToFullOption<Opt>>[];
115
- //#endregion
116
- //#region src/types/ruleGroups.d.ts
117
- /**
118
- * Properties common to both rules and groups.
119
- */
120
- interface CommonRuleAndGroupProperties {
121
- path?: Path;
122
- id?: string;
123
- disabled?: boolean;
124
- /**
125
- * Whether this rule or group is muted. When muted, the rule or group
126
- * is excluded from query export formats (SQL, JSON, MongoDB, etc.).
127
- * For groups, muting recursively mutes all children.
128
- */
129
- muted?: boolean;
130
- }
131
- /**
132
- * The main rule type. The `field`, `operator`, and `value` properties
133
- * can be narrowed with generics.
134
- */
135
- interface RuleType<F extends string = string, O extends string = string, V = any, C extends string = string> extends CommonRuleAndGroupProperties {
136
- field: F;
137
- operator: O;
138
- value: V;
139
- valueSource?: ValueSource;
140
- match?: MatchConfig;
141
- /**
142
- * Only used when adding a rule to a query that uses independent combinators.
143
- */
144
- combinatorPreceding?: C;
145
- }
146
- /**
147
- * The main rule group type. This type is used for query definitions as well as
148
- * all sub-groups of queries.
149
- */
150
- interface RuleGroupType<R extends RuleType = RuleType, C extends string = string> extends CommonRuleAndGroupProperties {
151
- combinator: C;
152
- rules: RuleGroupArray<RuleGroupType<R, C>, R>;
153
- not?: boolean;
154
- }
155
- /**
156
- * The type of the `rules` array in a {@link RuleGroupType}.
157
- */
158
- type RuleGroupArray<RG extends RuleGroupType = RuleGroupType, R extends RuleType = RuleType> = (R | RG)[];
159
- /**
160
- * The type of the `rules` array in a {@link DefaultRuleGroupType}.
161
- */
162
- type DefaultRuleGroupArray<F extends string = string> = RuleGroupArray<DefaultRuleGroupType, DefaultRuleType<F>>;
163
- /**
164
- * {@link RuleGroupType} with the `combinator` property limited to
165
- * {@link DefaultCombinatorNameExtended} and `rules` limited to {@link DefaultRuleType}.
166
- */
167
- type DefaultRuleGroupType<F extends string = string> = RuleGroupType<DefaultRuleType<F>, DefaultCombinatorNameExtended> & {
168
- rules: DefaultRuleGroupArray<F>;
169
- };
170
- /**
171
- * {@link RuleType} with the `operator` property limited to {@link DefaultOperatorName}.
172
- */
173
- type DefaultRuleType<F extends string = string> = RuleType<F, DefaultOperatorName>;
174
- /**
175
- * Default allowed values for the `combinator` property.
176
- *
177
- * @group Option Lists
178
- */
179
- type DefaultCombinatorName = "and" | "or";
180
- /**
181
- * Default allowed values for the `combinator` property, plus `"xor"`.
182
- *
183
- * @group Option Lists
184
- */
185
- type DefaultCombinatorNameExtended = DefaultCombinatorName | "xor";
186
- /**
187
- * Default values for the `operator` property.
188
- *
189
- * @group Option Lists
190
- */
191
- type DefaultOperatorName = "=" | "!=" | "<" | ">" | "<=" | ">=" | "contains" | "beginsWith" | "endsWith" | "doesNotContain" | "doesNotBeginWith" | "doesNotEndWith" | "null" | "notNull" | "in" | "notIn" | "between" | "notBetween";
192
- //#endregion
193
- //#region src/types/ruleGroupsIC.utils.d.ts
194
- type MAXIMUM_ALLOWED_BOUNDARY = 80;
195
- type MappedTuple<Tuple extends Array<unknown>, Result extends Array<unknown> = [], Count extends ReadonlyArray<number> = []> = Count["length"] extends MAXIMUM_ALLOWED_BOUNDARY ? Result : Tuple extends [] ? [] : Result extends [] ? MappedTuple<Tuple, Tuple, [...Count, 1]> : MappedTuple<Tuple, Result | [...Result, ...Tuple], [...Count, 1]>;
196
- //#endregion
197
- //#region src/types/ruleGroupsIC.d.ts
198
- /**
199
- * The main rule group interface when using independent combinators. This type is used
200
- * for query definitions as well as all sub-groups of queries.
201
- */
202
- interface RuleGroupTypeIC<R extends RuleType = RuleType, C extends string = string> extends Except<RuleGroupType<R, C>, "combinator" | "rules"> {
203
- combinator?: undefined;
204
- rules: RuleGroupICArray<RuleGroupTypeIC<R, C>, R, C>;
205
- /**
206
- * Only used when adding a rule to a query that uses independent combinators
207
- */
208
- combinatorPreceding?: C;
209
- }
210
- /**
211
- * Shorthand for "either {@link RuleGroupType} or {@link RuleGroupTypeIC}".
212
- */
213
- type RuleGroupTypeAny<R extends RuleType = RuleType, C extends string = string> = RuleGroupType<R, C> | RuleGroupTypeIC<R, C>;
214
- /**
215
- * The type of the `rules` array in a {@link RuleGroupTypeIC}.
216
- */
217
- type RuleGroupICArray<RG extends RuleGroupTypeIC = RuleGroupTypeIC, R extends RuleType = RuleType, C extends string = string> = [R | RG] | [R | RG, ...MappedTuple<[C, R | RG]>] | ((R | RG)[] & {
218
- length: 0;
219
- });
220
- /**
221
- * The type of the `rules` array in a {@link DefaultRuleGroupTypeIC}.
222
- */
223
- type DefaultRuleGroupICArray<F extends string = string> = RuleGroupICArray<DefaultRuleGroupTypeIC<F>, DefaultRuleType<F>, DefaultCombinatorName>;
224
- /**
225
- * {@link RuleGroupTypeIC} with combinators limited to
226
- * {@link DefaultCombinatorName} and rules limited to {@link DefaultRuleType}.
227
- */
228
- interface DefaultRuleGroupTypeIC<F extends string = string> extends RuleGroupTypeIC<DefaultRuleType<F>> {
229
- rules: DefaultRuleGroupICArray<F>;
230
- }
231
- //#endregion
232
- //#region src/types/validation.d.ts
233
- /**
234
- * Object with a `valid` boolean value and optional `reasons`.
235
- */
236
- interface ValidationResult {
237
- valid: boolean;
238
- reasons?: any[];
239
- }
240
- /**
241
- * Map of rule/group `id` to its respective {@link ValidationResult}.
242
- */
243
- type ValidationMap = Record<string, boolean | ValidationResult>;
244
- /**
245
- * Function that validates a query.
246
- */
247
- type QueryValidator = (query: RuleGroupTypeAny) => boolean | ValidationMap;
248
- /**
249
- * Function that validates a rule.
250
- */
251
- type RuleValidator = (rule: RuleType) => boolean | ValidationResult;
252
- //#endregion
253
- //#region src/types/basic.d.ts
254
- /**
255
- * @see https://react-querybuilder.js.org/docs/tips/path
256
- */
257
- type Path = number[];
258
- /**
259
- * String of classnames, array of classname strings, or object where the
260
- * keys are classnames and those with truthy values will be included.
261
- * Suitable for passing to the `clsx` package.
262
- */
263
- type Classname = string | string[] | Record<string, any>;
264
- /**
265
- * A source for the `value` property of a rule.
266
- */
267
- type ValueSource = "value" | "field";
268
- /**
269
- * Type of {@link ValueEditor} that will be displayed.
270
- */
271
- type ValueEditorType = "text" | "select" | "checkbox" | "radio" | "textarea" | "switch" | "multiselect" | null;
272
- /**
273
- * A valid array of potential value sources.
274
- *
275
- * @see {@link ValueSource}
276
- */
277
- type ValueSources = ["value"] | ["value", "field"] | ["field", "value"] | ["field"];
278
- type ValueSourceFlexibleOptions = ToFlexibleOptionArrays<ValueSources>;
279
- type ToFlexibleOptionArrays<Sources extends readonly string[]> = Sources extends unknown ? { [K in keyof Sources]: FlexibleOption<Sources[K]> } : never;
280
- type WithOptionalClassName<T> = T & {
281
- className?: Classname;
282
- };
283
- /**
284
- * HTML5 input types
285
- */
286
- type InputType = "button" | "checkbox" | "color" | "date" | "datetime-local" | "email" | "file" | "hidden" | "image" | "month" | "number" | "password" | "radio" | "range" | "reset" | "search" | "submit" | "tel" | "text" | "time" | "url" | "week" | "bigint" | (string & {});
287
- /**
288
- * Quantification mode describing how many elements of the value array must pass
289
- * the filter for the rule itself to pass.
290
- *
291
- * For "atLeast", "atMost", and "exactly", the threshold value will be converted to
292
- * a percentage if the number is less than 1. Non-numeric values and numbers less
293
- * than 0 will be ignored.
294
- */
295
- interface MatchConfig {
296
- mode: MatchMode;
297
- threshold?: number | null | undefined;
298
- }
299
- type MatchMode = "all" | "some" | "none" | "atLeast" | "atMost" | "exactly";
300
- /**
301
- * Base for all Field types/interfaces.
302
- */
303
- interface BaseFullField<FieldName extends string = string, OperatorName extends string = string, ValueName extends string = string, OperatorObj extends FullOption = FullOption<OperatorName>, ValueObj extends FullOption = FullOption<ValueName>> extends WithOptionalClassName<BaseFullOption<FieldName>> {
304
- id?: string;
305
- operators?: FlexibleOptionList<OperatorObj> | OperatorName[] | FlexibleOption<OperatorName>[] | (OperatorName | FlexibleOption<OperatorName>)[];
306
- valueEditorType?: ValueEditorType | ((operator: OperatorName) => ValueEditorType);
307
- valueSources?: ValueSources | ValueSourceFlexibleOptions | ((operator: OperatorName) => ValueSources | ValueSourceFlexibleOptions);
308
- inputType?: InputType | null;
309
- values?: FlexibleOptionList<ValueObj>;
310
- matchModes?: boolean | MatchMode[] | FlexibleOption<MatchMode>[];
311
- /** Properties of items in the value. */
312
- subproperties?: FlexibleOptionList<FullField>;
313
- defaultOperator?: OperatorName;
314
- defaultValue?: any;
315
- placeholder?: string;
316
- validator?: RuleValidator;
317
- comparator?: string | ((f: FullField, operator: string) => boolean);
318
- }
319
- /**
320
- * Full field definition used in the `fields` prop of {@link QueryBuilder}.
321
- * This type requires both `name` and `value`, but the `fields` prop itself
322
- * can use a {@link FlexibleOption} where only one of `name` or `value` is
323
- * required (along with `label`), or {@link Field} where only `name` and
324
- * `label` are required.
325
- *
326
- * The `name`/`value`, `operators`, and `values` properties of this interface
327
- * can be narrowed with generics.
328
- *
329
- * @group Option Lists
330
- */
331
- type FullField<FieldName extends string = string, OperatorName extends string = string, ValueName extends string = string, OperatorObj extends FullOption = FullOption<OperatorName>, ValueObj extends FullOption = FullOption<ValueName>> = Simplify<FullOption<FieldName> & BaseFullField<FieldName, OperatorName, ValueName, OperatorObj, ValueObj>>;
332
- /**
333
- * Allowed values of the {@link FullOperator} property `arity`. A value of `"unary"` or
334
- * a number less than two will cause the default {@link ValueEditor} to render `null`.
335
- */
336
- type Arity = number | "unary" | "binary" | "ternary";
337
- /**
338
- * Full operator definition used in the `operators`/`getOperators` props of
339
- * {@link QueryBuilder}. This type requires both `name` and `value`, but the
340
- * `operators`/`getOperators` props themselves can use a {@link FlexibleOption}
341
- * where only one of `name` or `value` is required, or {@link FullOperator} where
342
- * only `name` is required.
343
- *
344
- * The `name`/`value` properties of this interface can be narrowed with generics.
345
- *
346
- * @group Option Lists
347
- */
348
- interface FullOperator<N extends string = string> extends WithOptionalClassName<FullOption<N>> {
349
- arity?: Arity;
350
- }
351
- type ParseNumberMethodName = "enhanced" | "native" | "strict";
352
- /**
353
- * Parsing algorithms used by {@link parseNumber}.
354
- */
355
-
356
- type ParseNumbersModerationLevel = "-limited" | "";
357
- /**
358
- * Options for the `parseNumbers` prop of {@link QueryBuilder}.
359
- */
360
- type ParseNumbersPropConfig = boolean | `${ParseNumberMethodName}${ParseNumbersModerationLevel}`;
361
- //#endregion
362
- export { DefaultCombinatorName, DefaultOperatorName, DefaultRuleGroupType, DefaultRuleGroupTypeIC, FlexibleOptionList, FullField, FullOperator, FullOptionList, InputType, OptionList, ParseNumbersPropConfig, QueryValidator, RuleGroupType, RuleGroupTypeAny, RuleGroupTypeIC, RuleType, RuleValidator, ValidationMap, ValidationResult, ValueSource, ValueSources };
363
- //# sourceMappingURL=basic-CDDA-KZa.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"optGroupUtils-DrubUpx0.mjs","names":["defaultPlaceholderFieldName: typeof defaultPlaceholderName","defaultPlaceholderOperatorName: typeof defaultPlaceholderName","defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName>","defaultCombinators: DefaultCombinators","defaultCombinatorsExtended: DefaultCombinatorsExtended","idObj: { name?: string; value?: string }","newArray: T[]"],"sources":["../src/defaults.ts","../src/utils/objectUtils.ts","../src/utils/optGroupUtils.ts"],"sourcesContent":["import type {\n BaseTranslationsFull,\n Classnames,\n DefaultCombinatorName,\n DefaultCombinatorNameExtended,\n DefaultOperatorName,\n MatchMode,\n Path,\n StringUnionToFullOptionArray,\n} from './types';\n\n// DO NOT ALTER OR REMOVE REGION NAMES. Some of them are used\n// to generate code snippets in the documentation.\n\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderName = '~';\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderLabel = '------';\n/**\n * Default `name` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueGroupLabel: typeof defaultPlaceholderLabel =\n defaultPlaceholderLabel;\n\n/**\n * Default configuration of translatable strings.\n *\n * @group Defaults\n */\n// #region docs-translations\nexport const defaultTranslations: BaseTranslationsFull = {\n fields: {\n title: 'Field',\n placeholderName: defaultPlaceholderFieldName,\n placeholderLabel: defaultPlaceholderFieldLabel,\n placeholderGroupLabel: defaultPlaceholderFieldGroupLabel,\n } as const,\n operators: {\n title: 'Operator',\n placeholderName: defaultPlaceholderOperatorName,\n placeholderLabel: defaultPlaceholderOperatorLabel,\n placeholderGroupLabel: defaultPlaceholderOperatorGroupLabel,\n } as const,\n values: {\n title: 'Values',\n placeholderName: defaultPlaceholderValueName,\n placeholderLabel: defaultPlaceholderValueLabel,\n placeholderGroupLabel: defaultPlaceholderValueGroupLabel,\n } as const,\n matchMode: { title: 'Match mode' } as const,\n matchThreshold: { title: 'Match threshold' } as const,\n value: { title: 'Value' } as const,\n removeRule: { label: '⨯', title: 'Remove rule' } as const,\n removeGroup: { label: '⨯', title: 'Remove group' } as const,\n addRule: { label: '+ Rule', title: 'Add rule' } as const,\n addGroup: { label: '+ Group', title: 'Add group' } as const,\n combinators: { title: 'Combinator' } as const,\n notToggle: { label: 'Not', title: 'Invert this group' } as const,\n cloneRule: { label: '⧉', title: 'Clone rule' } as const,\n cloneRuleGroup: { label: '⧉', title: 'Clone group' } as const,\n shiftActionUp: { label: '˄', title: 'Shift up' } as const,\n shiftActionDown: { label: '˅', title: 'Shift down' } as const,\n dragHandle: { label: '⁞⁞', title: 'Drag handle' } as const,\n lockRule: { label: '🔓', title: 'Lock rule' } as const,\n lockGroup: { label: '🔓', title: 'Lock group' } as const,\n lockRuleDisabled: { label: '🔒', title: 'Unlock rule' } as const,\n lockGroupDisabled: { label: '🔒', title: 'Unlock group' } as const,\n muteRule: { label: '🔊', title: 'Mute rule' } as const,\n muteGroup: { label: '🔊', title: 'Mute group' } as const,\n unmuteRule: { label: '🔇', title: 'Unmute rule' } as const,\n unmuteGroup: { label: '🔇', title: 'Unmute group' } as const,\n valueSourceSelector: { title: 'Value source' } as const,\n} satisfies BaseTranslationsFull;\n// #endregion\n\n/**\n * Default character used to `.join` and `.split` arrays.\n *\n * @group Defaults\n */\nexport const defaultJoinChar = ',';\n\nexport type DefaultOperators = StringUnionToFullOptionArray<DefaultOperatorName>;\n\nexport const defaultOperatorLabelMap: Record<DefaultOperatorName, string> = {\n '=': '=',\n '!=': '!=',\n '<': '<',\n '>': '>',\n '<=': '<=',\n '>=': '>=',\n contains: 'contains',\n beginsWith: 'begins with',\n endsWith: 'ends with',\n doesNotContain: 'does not contain',\n doesNotBeginWith: 'does not begin with',\n doesNotEndWith: 'does not end with',\n null: 'is null',\n notNull: 'is not null',\n in: 'in',\n notIn: 'not in',\n between: 'between',\n notBetween: 'not between',\n};\n\nexport const defaultCombinatorLabelMap: Record<DefaultCombinatorNameExtended, string> = {\n and: 'AND',\n or: 'OR',\n xor: 'XOR',\n};\n\n/**\n * Default operator list.\n *\n * @group Defaults\n */\n// #region docs-operators\nexport const defaultOperators: DefaultOperators = [\n { name: '=', value: '=', label: '=' },\n { name: '!=', value: '!=', label: '!=' },\n { name: '<', value: '<', label: '<' },\n { name: '>', value: '>', label: '>' },\n { name: '<=', value: '<=', label: '<=' },\n { name: '>=', value: '>=', label: '>=' },\n { name: 'contains', value: 'contains', label: 'contains' },\n { name: 'beginsWith', value: 'beginsWith', label: 'begins with' },\n { name: 'endsWith', value: 'endsWith', label: 'ends with' },\n { name: 'doesNotContain', value: 'doesNotContain', label: 'does not contain' },\n { name: 'doesNotBeginWith', value: 'doesNotBeginWith', label: 'does not begin with' },\n { name: 'doesNotEndWith', value: 'doesNotEndWith', label: 'does not end with' },\n { name: 'null', value: 'null', label: 'is null' },\n { name: 'notNull', value: 'notNull', label: 'is not null' },\n { name: 'in', value: 'in', label: 'in' },\n { name: 'notIn', value: 'notIn', label: 'not in' },\n { name: 'between', value: 'between', label: 'between' },\n { name: 'notBetween', value: 'notBetween', label: 'not between' },\n];\n// #endregion\n\n/**\n * Map of default operators to their respective opposite/negating operators.\n *\n * @group Defaults\n */\nexport const defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName> = {\n '=': '!=',\n '!=': '=',\n '<': '>=',\n '<=': '>',\n '>': '<=',\n '>=': '<',\n beginsWith: 'doesNotBeginWith',\n doesNotBeginWith: 'beginsWith',\n endsWith: 'doesNotEndWith',\n doesNotEndWith: 'endsWith',\n contains: 'doesNotContain',\n doesNotContain: 'contains',\n between: 'notBetween',\n notBetween: 'between',\n in: 'notIn',\n notIn: 'in',\n notNull: 'null',\n null: 'notNull',\n} satisfies Record<DefaultOperatorName, DefaultOperatorName>;\n\nexport type DefaultCombinators = StringUnionToFullOptionArray<DefaultCombinatorName>;\n\n/**\n * Default combinator list.\n *\n * @group Defaults\n */\n// #region docs-combinators\nexport const defaultCombinators: DefaultCombinators = [\n { name: 'and', value: 'and', label: 'AND' } as const,\n { name: 'or', value: 'or', label: 'OR' } as const,\n];\n// #endregion\n\nexport type DefaultCombinatorsExtended =\n StringUnionToFullOptionArray<DefaultCombinatorNameExtended>;\n\n/**\n * Default combinator list, with `XOR` added.\n *\n * @group Defaults\n */\nexport const defaultCombinatorsExtended: DefaultCombinatorsExtended = [\n ...defaultCombinators,\n { name: 'xor', value: 'xor', label: 'XOR' } as const,\n];\n\nexport type DefaultMatchModes = StringUnionToFullOptionArray<MatchMode>;\n\n/**\n * Default match modes.\n *\n * @group Defaults\n */\n// #region docs-matchmodes\nexport const defaultMatchModes: DefaultMatchModes = [\n { name: 'all', value: 'all', label: 'all' },\n { name: 'some', value: 'some', label: 'some' },\n { name: 'none', value: 'none', label: 'none' },\n { name: 'atLeast', value: 'atLeast', label: 'at least' },\n { name: 'atMost', value: 'atMost', label: 'at most' },\n { name: 'exactly', value: 'exactly', label: 'exactly' },\n];\n// #endregion\n\n/**\n * Standard classnames applied to each component.\n *\n * @group Defaults\n */\n// #region docs-standardclassnames\nexport const standardClassnames = {\n queryBuilder: 'queryBuilder',\n ruleGroup: 'ruleGroup',\n header: 'ruleGroup-header',\n body: 'ruleGroup-body',\n combinators: 'ruleGroup-combinators',\n addRule: 'ruleGroup-addRule',\n addGroup: 'ruleGroup-addGroup',\n cloneRule: 'rule-cloneRule',\n cloneGroup: 'ruleGroup-cloneGroup',\n removeGroup: 'ruleGroup-remove',\n notToggle: 'ruleGroup-notToggle',\n rule: 'rule',\n fields: 'rule-fields',\n matchMode: 'rule-matchMode',\n matchThreshold: 'rule-matchThreshold',\n operators: 'rule-operators',\n value: 'rule-value',\n removeRule: 'rule-remove',\n betweenRules: 'betweenRules',\n valid: 'queryBuilder-valid',\n invalid: 'queryBuilder-invalid',\n shiftActions: 'shiftActions',\n dndDragging: 'dndDragging',\n dndOver: 'dndOver',\n dndCopy: 'dndCopy',\n dndGroup: 'dndGroup',\n dndDropNotAllowed: 'dndDropNotAllowed',\n dragHandle: 'queryBuilder-dragHandle',\n disabled: 'queryBuilder-disabled',\n muted: 'queryBuilder-muted',\n lockRule: 'rule-lock',\n lockGroup: 'ruleGroup-lock',\n muteRule: 'rule-mute',\n muteGroup: 'ruleGroup-mute',\n valueSource: 'rule-valueSource',\n valueListItem: 'rule-value-list-item',\n branches: 'queryBuilder-branches',\n justified: 'queryBuilder-justified',\n hasSubQuery: 'rule-hasSubQuery',\n} as const;\n// #endregion\n\n/**\n * Default classnames for each component.\n *\n * @group Defaults\n */\nexport const defaultControlClassnames: Classnames = {\n queryBuilder: '',\n ruleGroup: '',\n header: '',\n body: '',\n combinators: '',\n addRule: '',\n addGroup: '',\n cloneRule: '',\n cloneGroup: '',\n removeGroup: '',\n notToggle: '',\n rule: '',\n fields: '',\n matchMode: '',\n matchThreshold: '',\n operators: '',\n value: '',\n removeRule: '',\n shiftActions: '',\n dragHandle: '',\n lockRule: '',\n lockGroup: '',\n muteRule: '',\n muteGroup: '',\n muted: '',\n valueSource: '',\n actionElement: '',\n valueSelector: '',\n betweenRules: '',\n valid: '',\n invalid: '',\n dndDragging: '',\n dndOver: '',\n dndGroup: '',\n dndCopy: '',\n dndDropNotAllowed: '',\n disabled: '',\n valueListItem: '',\n branches: '',\n hasSubQuery: '',\n} satisfies Classnames;\n\n/**\n * Default reason codes for a group being invalid.\n *\n * @group Defaults\n */\nexport const groupInvalidReasons = {\n empty: 'empty',\n invalidCombinator: 'invalid combinator',\n invalidIndependentCombinators: 'invalid independent combinators',\n} as const;\n\n/**\n * Component identifiers for testing.\n *\n * @group Defaults\n */\nexport const TestID = {\n rule: 'rule',\n ruleGroup: 'rule-group',\n inlineCombinator: 'inline-combinator',\n addGroup: 'add-group',\n removeGroup: 'remove-group',\n cloneGroup: 'clone-group',\n cloneRule: 'clone-rule',\n addRule: 'add-rule',\n removeRule: 'remove-rule',\n combinators: 'combinators',\n fields: 'fields',\n operators: 'operators',\n valueEditor: 'value-editor',\n notToggle: 'not-toggle',\n shiftActions: 'shift-actions',\n dragHandle: 'drag-handle',\n lockRule: 'lock-rule',\n lockGroup: 'lock-group',\n muteRule: 'mute-rule',\n muteGroup: 'mute-group',\n valueSourceSelector: 'value-source-selector',\n matchModeEditor: 'match-mode-editor',\n} as const;\n\nexport const LogType = {\n parentPathDisabled: 'action aborted: parent path disabled',\n pathDisabled: 'action aborted: path is disabled',\n queryUpdate: 'query updated',\n onAddRuleFalse: 'onAddRule callback returned false',\n onAddGroupFalse: 'onAddGroup callback returned false',\n onGroupRuleFalse: 'onGroupRule callback returned false',\n onGroupGroupFalse: 'onGroupGroup callback returned false',\n onMoveRuleFalse: 'onMoveRule callback returned false',\n onMoveGroupFalse: 'onMoveGroup callback returned false',\n onRemoveFalse: 'onRemove callback returned false',\n add: 'rule or group added',\n remove: 'rule or group removed',\n update: 'rule or group updated',\n move: 'rule or group moved',\n group: 'rule or group grouped with another',\n} as const;\n\n/**\n * The {@link Path} of the root group.\n *\n * @group Defaults\n */\nexport const rootPath: Path = [] satisfies Path;\n","// All code in this file is adapted from:\n// npm: https://www.npmjs.com/package/ts-extras\n// src: https://github.com/sindresorhus/ts-extras\n\n/**\n * Original looked like this (not sure why template string is used):\n * ```\n * type ObjectKeys<T extends object> = `${Exclude<keyof T, symbol>}`;\n * ```\n */\ntype ObjectKeys<T extends object> = Exclude<keyof T, symbol>;\n\n/**\n * A strongly-typed version of `Object.keys()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-keys.ts)\n */\nexport const objectKeys = Object.keys as <Type extends object>(\n value: Type\n) => Array<ObjectKeys<Type>>;\n\n/**\n * A strongly-typed version of `Object.entries()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-entries.ts)\n */\nexport const objectEntries = Object.entries as <Type extends Record<PropertyKey, unknown>>(\n value: Type\n) => Array<[ObjectKeys<Type>, Type[ObjectKeys<Type>]]>;\n","import type { Draft } from 'immer';\nimport { produce } from 'immer';\nimport type { RequireAtLeastOne } from 'type-fest';\nimport { defaultPlaceholderLabel, defaultPlaceholderName } from '../defaults';\nimport type {\n BaseOption,\n BaseOptionMap,\n FlexibleOption,\n FlexibleOptionGroup,\n FlexibleOptionList,\n FlexibleOptionListProp,\n FullOption,\n FullOptionList,\n FullOptionMap,\n FullOptionRecord,\n GetOptionIdentifierType,\n Option,\n OptionGroup,\n Placeholder,\n ToFullOption,\n ValueOption,\n WithUnknownIndex,\n} from '../types';\nimport { isPojo } from './misc';\nimport { objectKeys } from './objectUtils';\n\nconst isOptionWithName = (opt: BaseOption): opt is Option =>\n isPojo(opt) && 'name' in opt && typeof opt.name === 'string';\nconst isOptionWithValue = (opt: BaseOption): opt is ValueOption =>\n isPojo(opt) && 'value' in opt && typeof opt.value === 'string';\n\n/**\n * Converts an {@link Option} or {@link ValueOption} (i.e., {@link BaseOption})\n * into a {@link FullOption}. Full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOption<Opt extends BaseOption>(\n opt: Opt | string,\n baseProperties?: Record<string, unknown>,\n labelMap?: Record<string, unknown>\n): ToFullOption<Opt> {\n const recipe: (o: Opt | string) => ToFullOption<Opt> = produce(draft => {\n const idObj: { name?: string; value?: string } = {};\n let needsUpdating = !!baseProperties;\n\n if (typeof draft === 'string') {\n return {\n ...baseProperties,\n name: draft,\n value: draft,\n label: labelMap?.[draft] ?? draft,\n } as Draft<Opt>;\n }\n\n if (isOptionWithName(draft) && !isOptionWithValue(draft)) {\n idObj.value = draft.name;\n needsUpdating = true;\n } else if (!isOptionWithName(draft) && isOptionWithValue(draft)) {\n idObj.name = draft.value;\n needsUpdating = true;\n }\n\n if (needsUpdating) {\n return Object.assign({}, baseProperties, draft, idObj);\n }\n });\n return recipe(opt);\n}\n\n/**\n * Converts an {@link OptionList} or {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionList<Opt extends BaseOption>(\n optList: unknown[],\n baseProperties?: Record<string, unknown>,\n labelMap?: Record<string, unknown>\n): FullOptionList<Opt> {\n if (!Array.isArray(optList)) {\n return [] as unknown as FullOptionList<Opt>;\n }\n\n const recipe: (ol: FlexibleOptionList<Opt>) => FullOptionList<Opt> = produce(draft => {\n if (isFlexibleOptionGroupArray(draft)) {\n for (const optGroup of draft) {\n for (const [idx, opt] of optGroup.options.entries())\n optGroup.options[idx] = toFullOption(opt, baseProperties, labelMap);\n }\n } else {\n for (const [idx, opt] of (draft as Opt[]).entries())\n draft[idx] = toFullOption(opt, baseProperties, labelMap);\n }\n });\n\n return recipe(optList as FlexibleOptionList<Opt>);\n}\n\n/**\n * Converts a {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionMap<OptMap extends BaseOptionMap>(\n optMap: OptMap,\n baseProperties?: Record<string, unknown>\n): OptMap extends BaseOptionMap<infer V, infer K> ? Partial<Record<K, ToFullOption<V>>> : never {\n type FullOptMapType =\n OptMap extends BaseOptionMap<infer VT, infer KT>\n ? Partial<Record<KT, ToFullOption<VT>>>\n : never;\n\n return Object.fromEntries(\n (Object.entries(optMap) as [string, FlexibleOption][]).map(([k, v]) => [\n k,\n toFullOption(v, baseProperties),\n ])\n ) as FullOptMapType;\n}\n\n/**\n * @deprecated Renamed to {@link uniqByIdentifier}.\n *\n * @group Option Lists\n */\nexport const uniqByName = <\n T extends { name: string; value?: string } | { name?: string; value: string },\n>(\n originalArray: T[]\n): T[] => uniqByIdentifier(originalArray);\n\n/**\n * Generates a new array of objects with duplicates removed based\n * on the identifying property (`value` or `name`)\n *\n * @group Option Lists\n */\nexport const uniqByIdentifier = <\n T extends RequireAtLeastOne<{ name: string; value: string }, 'name' | 'value'>,\n>(\n originalArray: T[]\n): T[] => {\n const names = new Set<string>();\n const newArray: T[] = [];\n for (const el of originalArray) {\n if (!names.has((el.value ?? el.name)!)) {\n names.add((el.value ?? el.name)!);\n newArray.push(el);\n }\n }\n return originalArray.length === newArray.length ? originalArray : newArray;\n};\n\n/**\n * Determines if an {@link OptionList} is an {@link OptionGroup} array.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isOptionGroupArray = (arr: any): arr is OptionGroup<BaseOption>[] =>\n Array.isArray(arr) &&\n arr.length > 0 &&\n isPojo(arr[0]) &&\n 'options' in arr[0] &&\n Array.isArray(arr[0].options);\n\n/**\n * Determines if an array is a flat array of {@link FlexibleOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFlexibleOptionArray = (arr: any): arr is FlexibleOption[] => {\n let isFOA = false;\n if (Array.isArray(arr)) {\n for (const o of arr) {\n if (isOptionWithName(o) || isOptionWithValue(o)) {\n isFOA = true;\n } else {\n return false;\n }\n }\n }\n return isFOA;\n};\n\n/**\n * Determines if an array is a flat array of {@link FullOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFullOptionArray = (arr: any): arr is FullOption[] => {\n let isFOA = false;\n if (Array.isArray(arr)) {\n for (const o of arr) {\n if (isOptionWithName(o) && isOptionWithValue(o)) {\n isFOA = true;\n } else {\n return false;\n }\n }\n }\n return isFOA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link FlexibleOptionGroup} array.\n *\n * @group Option Lists\n */\nexport const isFlexibleOptionGroupArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n arr: any,\n { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is FlexibleOptionGroup[] => {\n let isFOGA = false;\n if (Array.isArray(arr)) {\n for (const og of arr) {\n if (\n isPojo(og) &&\n 'options' in og &&\n (isFlexibleOptionArray(og.options) ||\n (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n ) {\n isFOGA = true;\n } else {\n return false;\n }\n }\n }\n return isFOGA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link OptionGroup} array of {@link FullOption}.\n *\n * @group Option Lists\n */\nexport const isFullOptionGroupArray = (\n // oxlint-disable-next-line typescript/no-explicit-any\n arr: any,\n { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is OptionGroup<FullOption>[] => {\n let isFOGA = false;\n if (Array.isArray(arr)) {\n for (const og of arr) {\n if (\n isPojo(og) &&\n 'options' in og &&\n (isFullOptionArray(og.options) ||\n (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n ) {\n isFOGA = true;\n } else {\n return false;\n }\n }\n }\n return isFOGA;\n};\n\n/**\n * Gets the option from an {@link OptionList} with the given `name`. Handles\n * {@link Option} arrays as well as {@link OptionGroup} arrays.\n *\n * @group Option Lists\n */\nexport function getOption<OptType extends FullOption>(\n arr: FullOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends ValueOption>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends Option>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined;\nexport function getOption<OptType extends BaseOption>(\n arr: FlexibleOptionList<OptType>,\n name: string\n): OptType | undefined {\n const options = isFlexibleOptionGroupArray(arr, { allowEmpty: true })\n ? arr.flatMap(og => og.options)\n : arr;\n return options.find(op => op.value === name || op.name === name) as OptType | undefined;\n}\n\n/**\n * Gets the first option from an {@link OptionList}.\n *\n * @group Option Lists\n */\nexport function getFirstOption<Opt extends FullOption>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends ValueOption>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends Option>(\n arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends BaseOption>(\n arr?: FlexibleOptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null {\n if (!Array.isArray(arr) || arr.length === 0) {\n return null;\n } else if (isFlexibleOptionGroupArray(arr, { allowEmpty: true })) {\n for (const og of arr) {\n if (og.options.length > 0) {\n return (og.options[0].value ?? og.options[0].name) as GetOptionIdentifierType<Opt>;\n }\n }\n // istanbul ignore next\n return null;\n }\n\n return (arr[0].value ?? arr[0].name) as GetOptionIdentifierType<Opt>;\n}\n\n/**\n * Flattens {@link FlexibleOptionGroup} arrays into {@link BaseOption} arrays.\n * If the array is already flat, it is returned as is.\n *\n * @group Option Lists\n */\nexport const toFlatOptionArray = <T extends FullOption, OL extends FullOptionList<T>>(arr: OL) =>\n uniqByIdentifier(isOptionGroupArray(arr) ? arr.flatMap(og => og.options) : arr) as T[];\n\n/**\n * Generates a new {@link OptionGroup} array with duplicates\n * removed based on the identifying property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptGroups = <T extends BaseOption>(\n originalArray: FlexibleOptionGroup<T>[]\n): OptionGroup<ToFullOption<T>>[] => {\n type K = T extends BaseOption<infer KT> ? KT : never;\n const labels = new Set<string>();\n const names = new Set<K>();\n const newArray: OptionGroup<ToFullOption<T>>[] = [];\n for (const el of originalArray) {\n if (!labels.has(el.label)) {\n labels.add(el.label);\n const optionsForThisGroup: WithUnknownIndex<ToFullOption<T>>[] = [];\n for (const opt of el.options) {\n if (!names.has((opt.value ?? opt.name) as K)) {\n names.add((opt.value ?? opt.name) as K);\n optionsForThisGroup.push(toFullOption(opt) as WithUnknownIndex<ToFullOption<T>>);\n }\n }\n newArray.push({ ...el, options: optionsForThisGroup });\n }\n }\n return newArray;\n};\n\n/**\n * Generates a new {@link Option} or {@link OptionGroup} array with duplicates\n * removed based on the identifier property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptList = <T extends BaseOption>(\n originalArray: FlexibleOptionList<T>\n): WithUnknownIndex<BaseOption & FullOption>[] | OptionGroup<ToFullOption<T>>[] => {\n if (isFlexibleOptionGroupArray(originalArray)) {\n return uniqOptGroups(originalArray) as OptionGroup<ToFullOption<T>>[];\n }\n return uniqByIdentifier((originalArray as BaseOption[]).map(o => toFullOption(o)));\n};\n\nexport interface PreparedOptionList<O extends FullOption> {\n defaultOption: FullOption;\n optionList: O[] | OptionGroup<O>[];\n optionsMap: Partial<FullOptionRecord<FullOption>>;\n}\n\nexport interface PrepareOptionListParams<O extends FullOption> {\n placeholder?: Placeholder;\n optionList?: FlexibleOptionListProp<O> | BaseOptionMap<O>;\n baseOption?: Record<string, unknown>;\n labelMap?: Record<string, string>;\n autoSelectOption?: boolean;\n}\n\nexport const prepareOptionList = <O extends FullOption>(\n props: PrepareOptionListParams<O>\n): PreparedOptionList<O> => {\n type OptionIdentifier = GetOptionIdentifierType<O>;\n\n // istanbul ignore next\n const {\n optionList: optionListPropOriginal,\n baseOption = {},\n labelMap = {},\n placeholder: {\n placeholderName = defaultPlaceholderName,\n placeholderLabel = defaultPlaceholderLabel,\n placeholderGroupLabel = defaultPlaceholderLabel,\n } = {},\n autoSelectOption = true,\n } = props;\n\n const defaultOption = {\n id: placeholderName,\n name: placeholderName,\n value: placeholderName,\n label: placeholderLabel,\n } as FullOption;\n\n const optionsProp = optionListPropOriginal ?? ([defaultOption] as FlexibleOptionList<O>);\n\n let optionList: O[] | OptionGroup<O>[] = [];\n const opts = (\n Array.isArray(optionsProp)\n ? toFullOptionList(optionsProp, baseOption, labelMap)\n : (objectKeys(toFullOptionMap(optionsProp, baseOption)) as unknown as OptionIdentifier[])\n .map<FullOption<OptionIdentifier>>(opt => ({\n ...optionsProp[opt]!,\n name: opt,\n value: opt,\n }))\n // oxlint-disable-next-line no-array-sort\n .sort((a, b) => a.label.localeCompare(b.label))\n ) as FullOptionList<O>;\n if (isFlexibleOptionGroupArray(opts)) {\n optionList = autoSelectOption\n ? (uniqOptGroups(opts) as FullOptionList<O>)\n : (uniqOptGroups([\n {\n label: placeholderGroupLabel,\n options: [defaultOption],\n },\n ...opts,\n ]) as FullOptionList<O>);\n } else {\n optionList = autoSelectOption\n ? (uniqByIdentifier(opts as O[]) as FullOptionList<O>)\n : (uniqByIdentifier([defaultOption, ...(opts as O[])]) as FullOptionList<O>);\n }\n\n let optionsMap: Partial<FullOptionRecord<FullOption>> = {};\n if (!Array.isArray(optionsProp)) {\n const op = toFullOptionMap(optionsProp, baseOption) as FullOptionMap<\n FullOption,\n OptionIdentifier\n >;\n optionsMap = autoSelectOption ? op : { ...op, [placeholderName]: defaultOption };\n } else {\n if (isFlexibleOptionGroupArray(optionList)) {\n for (const og of optionList) {\n for (const opt of og.options) {\n optionsMap[(opt.value ?? /* istanbul ignore next */ opt.name) as OptionIdentifier] =\n toFullOption(opt, baseOption) as FullOption;\n }\n }\n } else {\n for (const opt of optionList) {\n optionsMap[(opt.value ?? /* istanbul ignore next */ opt.name) as OptionIdentifier] =\n toFullOption(opt, baseOption) as FullOption;\n }\n }\n }\n\n return { defaultOption, optionList, optionsMap };\n};\n"],"mappings":"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"}