// Type definitions for Fuse.js v6.0.0 // TypeScript v3.8.3 export default Fuse export as namespace Fuse declare class Fuse> { constructor(list: ReadonlyArray, options?: O, 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 */ search( pattern: string, options?: Fuse.FuseSearchOptions ): Fuse.FuseResult[] setCollection(docs: ReadonlyArray, index?: FuseIndex): void /** * Adds a doc to the end the list. */ add(doc: T): void /** * Removes the doc at the specified index */ removeAt(idx: number): void getIndex(): FuseIndex /** * Return the current version */ 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 */ static createIndex( keys: Fuse.FuseOptionKeyObject[] | string[], list: ReadonlyArray, options?: Fuse.FuseIndexOptions ): FuseIndex static parseIndex( index: any, options?: Fuse.FuseIndexOptions ): FuseIndex } declare class FuseIndex { constructor(options?: Fuse.FuseIndexOptions) setCollection(docs: ReadonlyArray): void setKeys(keys: ReadonlyArray): void setRecords(records: Fuse.FuseIndexRecords): void create(): void add(doc: T): void toJSON(): { keys: ReadonlyArray collection: Fuse.FuseIndexRecords } } declare namespace Fuse { type FuseGetFunction = ( obj: T, path: string ) => ReadonlyArray | string export type FuseIndexOptions = { getFn: FuseGetFunction } // { // title: { '$': "Old Man's War" }, // 'author.firstName': { '$': 'Codenar' } // } // // OR // // { // tags: [ // { $: 'nonfiction', idx: 0 }, // { $: 'web development', idx: 1 }, // ] // } export type FuseSortFunctionItem = { [key: string]: { $: string } | { $: string; idx: number }[] } // { // score: 0.001, // key: 'author.firstName', // value: 'Codenar', // indices: [ [ 0, 3 ] ] // } export type FuseSortFunctionMatch = { score: number key: string value: string indices: ReadonlyArray[] } // { // score: 0, // key: 'tags', // value: 'nonfiction', // idx: 1, // indices: [ [ 0, 9 ] ] // } export type FuseSortFunctionMatchList = FuseSortFunctionMatch & { idx: number } export type FuseSortFunctionArg = { idx: number item: FuseSortFunctionItem score: number matches?: (FuseSortFunctionMatch | FuseSortFunctionMatchList)[] } export type FuseSortFunction = ( a: FuseSortFunctionArg, b: FuseSortFunctionArg ) => number // title: { // '$': "Old Man's War", // 'n': 0.5773502691896258 // } type RecordEntryObject = { v: string // The text value n: number // The field-length norm } // 'author.tags.name': [{ // 'v': 'pizza lover', // 'i': 2, // 'n: 0.7071067811865475 // } type RecordEntryArrayItem = ReadonlyArray // TODO: this makes it difficult to infer the type. Need to think more about this type RecordEntry = { [key: string]: RecordEntryObject | RecordEntryArrayItem } // { // 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 = { i: number // The index of the record in the source list $: RecordEntry } // { // keys: null, // list: [ // { v: 'one', i: 0, n: 1 }, // { v: 'two', i: 1, n: 1 }, // { v: 'three', i: 2, n: 1 } // ] // } type FuseIndexStringRecord = { i: number // The index of the record in the source list v: string // The text value n: number // The field-length norm } type FuseIndexRecords = | ReadonlyArray | ReadonlyArray // { // name: 'title', // weight: 0.7 // } export type FuseOptionKeyObject = { name: string weight: number } export interface IFuseOptions { isCaseSensitive?: boolean distance?: number findAllMatches?: boolean getFn?: FuseGetFunction includeMatches?: boolean includeScore?: boolean keys?: FuseOptionKeyObject[] | string[] location?: number minMatchCharLength?: number shouldSort?: boolean sortFn?: FuseSortFunction threshold?: number useExtendedSearch?: boolean } // Denotes the start/end indices of a match // start end // ↓ ↓ type RangeTuple = [number, number] export type FuseResultMatch = { indices: ReadonlyArray key?: string refIndex?: number value?: string } export type FuseSearchOptions = { limit: number } export type FuseResult = { item: T refIndex: number score?: number matches?: ReadonlyArray } }