{"version":3,"names":["stringifyAsLabel","filterCache","Map","stringifyLocale","locale","Array","isArray","map","value","join","String","getFilter","options","mergedOptions","usage","sensitivity","ignorePunctuation","cacheKey","JSON","stringify","cached","get","collator","Intl","Collator","filter","contains","item","query","itemToString","itemString","i","length","compare","slice","startsWith","endsWith","queryLength","set","createCollatorItemFilter","collatorFilter","itemToStringLabel","createSingleSelectionCollatorFilter","selectedValue","selectedString"],"sources":["filter.ts"],"sourcesContent":["/**\n * `Intl.Collator`-backed case/diacritics-insensitive filter used by the\n * combobox for client-side item filtering. Port of the runtime logic in\n * `packages/react/src/internals/filter.ts` + the `createCollatorItemFilter`\n * / `createSingleSelectionCollatorFilter` helpers from\n * `packages/react/src/combobox/root/utils/index.ts`. No framework-specific\n * shape — the React hook (`useCoreFilter`) collapses to a plain factory in\n * Solid since `getFilter` itself is already memoised via a module-level\n * cache.\n */\n\nimport { stringifyAsLabel } from \"./resolve-value-label\";\n\nconst filterCache = new Map<string, Filter>();\n\nexport interface Filter {\n\tcontains: <Item>(\n\t\titem: Item,\n\t\tquery: string,\n\t\titemToString?: (item: Item) => string,\n\t) => boolean;\n\tstartsWith: <Item>(\n\t\titem: Item,\n\t\tquery: string,\n\t\titemToString?: (item: Item) => string,\n\t) => boolean;\n\tendsWith: <Item>(\n\t\titem: Item,\n\t\tquery: string,\n\t\titemToString?: (item: Item) => string,\n\t) => boolean;\n}\n\nexport interface GetFilterParameters extends Intl.CollatorOptions {\n\tlocale?: Intl.LocalesArgument | undefined;\n}\n\nfunction stringifyLocale(locale?: Intl.LocalesArgument): string {\n\tif (Array.isArray(locale)) {\n\t\treturn locale.map((value) => stringifyLocale(value)).join(\",\");\n\t}\n\tif (locale == null) return \"\";\n\treturn String(locale);\n}\n\nexport function getFilter(options: GetFilterParameters = {}): Filter {\n\tconst mergedOptions: Intl.CollatorOptions = {\n\t\tusage: \"search\",\n\t\tsensitivity: \"base\",\n\t\tignorePunctuation: true,\n\t\t...options,\n\t};\n\n\tconst cacheKey = `${stringifyLocale(options.locale)}|${JSON.stringify(mergedOptions)}`;\n\tconst cached = filterCache.get(cacheKey);\n\tif (cached) return cached;\n\n\tconst collator = new Intl.Collator(options.locale, mergedOptions);\n\n\tconst filter: Filter = {\n\t\tcontains<Item>(\n\t\t\titem: Item,\n\t\t\tquery: string,\n\t\t\titemToString?: (item: Item) => string,\n\t\t) {\n\t\t\tif (!query) return true;\n\t\t\tconst itemString = stringifyAsLabel(\n\t\t\t\titem,\n\t\t\t\titemToString as ((item: unknown) => string) | undefined,\n\t\t\t);\n\t\t\tfor (let i = 0; i <= itemString.length - query.length; i += 1) {\n\t\t\t\tif (\n\t\t\t\t\tcollator.compare(itemString.slice(i, i + query.length), query) === 0\n\t\t\t\t) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tstartsWith<Item>(\n\t\t\titem: Item,\n\t\t\tquery: string,\n\t\t\titemToString?: (item: Item) => string,\n\t\t) {\n\t\t\tif (!query) return true;\n\t\t\tconst itemString = stringifyAsLabel(\n\t\t\t\titem,\n\t\t\t\titemToString as ((item: unknown) => string) | undefined,\n\t\t\t);\n\t\t\treturn collator.compare(itemString.slice(0, query.length), query) === 0;\n\t\t},\n\t\tendsWith<Item>(\n\t\t\titem: Item,\n\t\t\tquery: string,\n\t\t\titemToString?: (item: Item) => string,\n\t\t) {\n\t\t\tif (!query) return true;\n\t\t\tconst itemString = stringifyAsLabel(\n\t\t\t\titem,\n\t\t\t\titemToString as ((item: unknown) => string) | undefined,\n\t\t\t);\n\t\t\tconst queryLength = query.length;\n\t\t\treturn (\n\t\t\t\titemString.length >= queryLength &&\n\t\t\t\tcollator.compare(\n\t\t\t\t\titemString.slice(itemString.length - queryLength),\n\t\t\t\t\tquery,\n\t\t\t\t) === 0\n\t\t\t);\n\t\t},\n\t};\n\n\tfilterCache.set(cacheKey, filter);\n\treturn filter;\n}\n\n/**\n * Case-insensitive \"item contains query\" filter — matches the React\n * `createCollatorItemFilter` helper.\n */\nexport function createCollatorItemFilter(\n\tcollatorFilter: Filter,\n\titemToStringLabel?: (item: unknown) => string,\n): (item: unknown, query: string) => boolean {\n\treturn (item, query) => {\n\t\tif (item == null) return false;\n\t\tconst itemString = stringifyAsLabel(item, itemToStringLabel);\n\t\treturn collatorFilter.contains(itemString, query);\n\t};\n}\n\n/**\n * Single-select filter that shows all items when the query is empty or\n * matches the current selection. Mirrors React's\n * `createSingleSelectionCollatorFilter`.\n */\nexport function createSingleSelectionCollatorFilter(\n\tcollatorFilter: Filter,\n\titemToStringLabel?: (item: unknown) => string,\n\tselectedValue?: unknown,\n): (item: unknown, query: string) => boolean {\n\treturn (item, query) => {\n\t\tif (item == null) return false;\n\t\tif (!query) return true;\n\t\tconst itemString = stringifyAsLabel(item, itemToStringLabel);\n\t\tconst selectedString =\n\t\t\tselectedValue != null\n\t\t\t\t? stringifyAsLabel(selectedValue, itemToStringLabel)\n\t\t\t\t: \"\";\n\t\tif (\n\t\t\tselectedString &&\n\t\t\tcollatorFilter.contains(selectedString, query) &&\n\t\t\tselectedString.length === query.length\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\treturn collatorFilter.contains(itemString, query);\n\t};\n}\n"],"mappings":"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","ignoreList":[]}