// Type definitions for Fuse.js v7.0.0 // TypeScript v4.9.5 declare class Fuse { public constructor( list: ReadonlyArray, options?: IFuseOptions, index?: FuseIndex ) /** * Search function for the Fuse instance. * * ```typescript * const list: MyType[] = [myType1, myType2, etc...] * const options: Fuse.IFuseOptions = { * keys: ['key1', 'key2'] * } * * const myFuse = new Fuse(list, options) * let result = myFuse.search('pattern') * ``` * * @param pattern The pattern to search * @param options `Fuse.FuseSearchOptions` * @returns An array of search results */ public search( pattern: string | Expression, options?: FuseSearchOptions ): FuseResult[] public setCollection(docs: ReadonlyArray, index?: FuseIndex): void /** * Adds a doc to the end the list. */ public add(doc: T): void /** * Removes all documents from the list which the predicate returns truthy for, * and returns an array of the removed docs. * The predicate is invoked with two arguments: (doc, index). */ public remove(predicate: (doc: T, idx: number) => boolean): T[] /** * Removes the doc at the specified index. */ public removeAt(idx: number): void /** * Returns the generated Fuse index */ public getIndex(): FuseIndex /** * Return the current version. */ public static version: string /** * Use this method to pre-generate the index from the list, and pass it * directly into the Fuse instance. * * _Note that Fuse will automatically index the table if one isn't provided * during instantiation._ * * ```typescript * const list: MyType[] = [myType1, myType2, etc...] * * const index = Fuse.createIndex( * keys: ['key1', 'key2'] * list: list * ) * * const options: Fuse.IFuseOptions = { * keys: ['key1', 'key2'] * } * * const myFuse = new Fuse(list, options, index) * ``` * @param keys The keys to index * @param list The list from which to create an index * @param options? * @returns An indexed list */ public static createIndex( keys: Array>, list: ReadonlyArray, options?: FuseIndexOptions ): FuseIndex public static parseIndex( index: any, options?: FuseIndexOptions ): FuseIndex public static config: Required> } declare class FuseIndex { public constructor(options?: FuseIndexOptions) public setSources(docs: ReadonlyArray): void public setKeys(keys: ReadonlyArray): void public setIndexRecords(records: FuseIndexRecords): void public create(): void public add(doc: T): void public toJSON(): { keys: ReadonlyArray records: FuseIndexRecords } } type FuseGetFunction = ( obj: T, path: string | string[] ) => ReadonlyArray | string type FuseIndexOptions = { getFn: FuseGetFunction } /** * @example * ```ts * { * title: { '$': "Old Man's War" }, * 'author.firstName': { '$': 'Codenar' } * } * ``` * @example * ```ts * { * tags: [ * { $: 'nonfiction', idx: 0 }, * { $: 'web development', idx: 1 }, * ] * } * ``` */ type FuseSortFunctionItem = { [key: string]: { $: string } | { $: string; idx: number }[] } /** * @example * ```ts * { * score: 0.001, * key: 'author.firstName', * value: 'Codenar', * indices: [ [ 0, 3 ] ] * } * ``` */ type FuseSortFunctionMatch = { score: number key: string value: string indices: ReadonlyArray[] } /** * @example * ```ts * { * score: 0, * key: 'tags', * value: 'nonfiction', * idx: 1, * indices: [ [ 0, 9 ] ] * } * ``` */ type FuseSortFunctionMatchList = FuseSortFunctionMatch & { idx: number } type FuseSortFunctionArg = { idx: number item: FuseSortFunctionItem score: number matches?: (FuseSortFunctionMatch | FuseSortFunctionMatchList)[] } type FuseSortFunction = ( a: FuseSortFunctionArg, b: FuseSortFunctionArg ) => number /** * @example * ```ts * title: { * '$': "Old Man's War", * 'n': 0.5773502691896258 * } * ``` */ type RecordEntryObject = { /** The text value */ v: string /** The field-length norm */ n: number } /** * @example * ```ts * 'author.tags.name': [{ * 'v': 'pizza lover', * 'i': 2, * 'n: 0.7071067811865475 * } * ``` */ type RecordEntryArrayItem = ReadonlyArray< RecordEntryObject & { i: number } > // TODO: this makes it difficult to infer the type. Need to think more about this type RecordEntry = { [key: string]: RecordEntryObject | RecordEntryArrayItem } /** * @example * ```ts * { * i: 0, * '$': { * '0': { v: "Old Man's War", n: 0.5773502691896258 }, * '1': { v: 'Codenar', n: 1 }, * '2': [ * { v: 'pizza lover', i: 2, n: 0.7071067811865475 }, * { v: 'helo wold', i: 1, n: 0.7071067811865475 }, * { v: 'hello world', i: 0, n: 0.7071067811865475 } * ] * } * } * ``` */ type FuseIndexObjectRecord = { /** The index of the record in the source list */ i: number $: RecordEntry } /** * @example * ```ts * { * keys: null, * list: [ * { v: 'one', i: 0, n: 1 }, * { v: 'two', i: 1, n: 1 }, * { v: 'three', i: 2, n: 1 } * ] * } * ``` */ type FuseIndexStringRecord = { /** The index of the record in the source list */ i: number /** The text value */ v: string /** The field-length norm */ n: number } type FuseIndexRecords = | ReadonlyArray | ReadonlyArray /** * @example * ```ts * { * name: 'title', * weight: 0.7 * } * ``` */ type FuseOptionKeyObject = { name: string | string[] weight?: number getFn?: (obj: T) => ReadonlyArray | string } type FuseOptionKey = FuseOptionKeyObject | string | string[] interface IFuseOptions { /** Indicates whether comparisons should be case sensitive. */ isCaseSensitive?: boolean /** Determines how close the match must be to the fuzzy location (specified by `location`). An exact letter match which is `distance` characters away from the fuzzy location would score as a complete mismatch. A `distance` of `0` requires the match be at the exact `location` specified. A distance of `1000` would require a perfect match to be within `800` characters of the `location` to be found using a `threshold` of `0.8`. */ distance?: number /** When true, the matching function will continue to the end of a search pattern even if a perfect match has already been located in the string. */ findAllMatches?: boolean /** The function to use to retrieve an object's value at the provided path. The default will also search nested paths. */ getFn?: FuseGetFunction /** When `true`, search will ignore `location` and `distance`, so it won't matter where in the string the pattern appears. */ ignoreLocation?: boolean /** When `true`, the calculation for the relevance score (used for sorting) will ignore the `field-length norm`. */ ignoreFieldNorm?: boolean /** Determines how much the `field-length norm` affects scoring. A value of `0` is equivalent to ignoring the field-length norm. A value of `0.5` will greatly reduce the effect of field-length norm, while a value of `2.0` will greatly increase it. */ fieldNormWeight?: number /** Whether the matches should be included in the result set. When `true`, each record in the result set will include the indices of the matched characters. These can consequently be used for highlighting purposes. */ includeMatches?: boolean /** Whether the score should be included in the result set. A score of `0`indicates a perfect match, while a score of `1` indicates a complete mismatch. */ includeScore?: boolean /** List of keys that will be searched. This supports nested paths, weighted search, searching in arrays of `strings` and `objects`. */ keys?: Array> /** Determines approximately where in the text is the pattern expected to be found. */ location?: number /** Only the matches whose length exceeds this value will be returned. (For instance, if you want to ignore single character matches in the result, set it to `2`). */ minMatchCharLength?: number /** Whether to sort the result list, by score. */ shouldSort?: boolean /** The function to use to sort all the results. The default will sort by ascending relevance score, ascending index. */ sortFn?: FuseSortFunction /** At what point does the match algorithm give up. A threshold of `0.0` requires a perfect match (of both letters and location), a threshold of `1.0` would match anything. */ threshold?: number /** When `true`, it enables the use of unix-like search commands. See [example](/examples.html#extended-search). */ useExtendedSearch?: boolean } /** * Denotes the start/end indices of a match * * @example * * ```ts * const startIndex = 0; * const endIndex = 5; * * const range: RangeTuple = [startIndex, endIndex]; * ``` */ type RangeTuple = [number, number] type FuseResultMatch = { indices: ReadonlyArray key?: string refIndex?: number value?: string } type FuseSearchOptions = { limit: number } type FuseResult = { item: T refIndex: number score?: number matches?: ReadonlyArray } type Expression = | { [key: string]: string } | { $path: ReadonlyArray $val: string } | { $and?: Expression[] } | { $or?: Expression[] } export { Expression, FuseGetFunction, FuseIndex, FuseIndexObjectRecord, FuseIndexOptions, FuseIndexRecords, FuseIndexStringRecord, FuseOptionKey, FuseOptionKeyObject, FuseResult, FuseResultMatch, FuseSearchOptions, FuseSortFunction, FuseSortFunctionArg, FuseSortFunctionItem, FuseSortFunctionMatch, FuseSortFunctionMatchList, IFuseOptions, RangeTuple, RecordEntry, RecordEntryArrayItem, RecordEntryObject, Fuse as default };