import { DefaultMemoizeFields, CreateSelectorOptions } from 'reselect'; import { Path as Path$1, PathItem, ParsePath } from 'pathington'; interface PathObject { argIndex?: number; path: PathingtonPath; } type PathingtonPath = Path$1 | PathItem; type Path = ManualSelectInput | PathingtonPath | PathObject; type PathStructured = Record>; type IsNull = [T] extends [null] ? true : false; type IsUnknown = unknown extends T ? (IsNull extends false ? true : false) : false; type PickArray = Value[Index]; type PickObject = Value[Key]; type WidenUnknown = T extends [infer Head, ...infer Tail] ? IsUnknown extends true ? WidenUnknown : WidenUnknown : Result; type PickDeepInternal = IsUnknown extends true ? unknown : Property extends [infer Next, ...infer Rest] ? Value extends object ? Next extends keyof Value ? PickDeepInternal, Rest> : undefined : Value extends unknown[] ? Next extends number ? PickDeepInternal, Rest> : undefined : undefined : Value; type PickDeepInternalNormalized = Property extends unknown[] ? PickDeepInternal : Property extends readonly unknown[] ? PickDeepInternal : any; type PickDeep = PickDeepInternalNormalized>; type ManualSelectInput = (...params: WidenUnknown) => any; type SelectInputs = Paths extends [ infer Property, ...infer Remaining, ] ? Property extends PathingtonPath ? SelectInputs]> : Property extends PathObject ? Property['argIndex'] extends number ? SelectInputs]> : SelectInputs]> : Property extends ManualSelectInput ? SelectInputs]> : SelectInputs : Values; type UnionToIntersection = (Union extends unknown ? (distributedUnion: Union) => void : never) extends ( mergedIntersection: infer Intersection, ) => void ? Intersection & Union : never; type Push = [...T, V]; type LastOf = UnionToIntersection T : never> extends () => infer R ? R : never; type TuplifyUnion, N = [T] extends [never] ? true : false> = true extends N ? [] : Push>, L>; type ObjectValuesToTuple, R extends any[] = []> = KS extends [ infer K, ...infer KT, ] ? ObjectValuesToTuple : R; type SelectStructuredInputs> = { [Property in keyof Paths]: Paths[Property] extends PathingtonPath ? PickDeep : Paths[Property] extends PathObject ? Paths[Property]['argIndex'] extends number ? Paths[Property]['argIndex'] : PickDeep : Paths[Property] extends ManualSelectInput ? ReturnType : never; }; type ComputeValue = ( ...values: SelectInputs, Paths> ) => Result; type StructuredValues> = ObjectValuesToTuple< SelectStructuredInputs >; type ComputeStructuredValue, Result> = ( ...values: StructuredValues ) => Result; type IdentitySelectorFn = ( ...params: Params ) => SelectInputs, Paths>[0]; type IdentitySelector = IdentitySelectorFn & DefaultMemoizeFields; type IdentityStructuredSelectorFn> = ( ...params: Params ) => SelectStructuredInputs, Paths>; type IdentityStructuredSelector< Params extends unknown[], Paths extends Record, > = IdentityStructuredSelectorFn & DefaultMemoizeFields; type StandardSelectorFn = (...params: Params) => Result; type StandardSelector = StandardSelectorFn & DefaultMemoizeFields; /** * Create a selector without any boilerplate code * * @example * import { createSelector } from 'selectorator'; * * interface Item { * name: string; * value: number; * } * * interface State { * items: Item[]; * filter: { * value: string; * } * } * * const getFilteredItems = createSelector()( * ['items', 'filter.value'], * (items, filterValue) => items.filter((item) => item.includes(filterValue)), * ); * * const state = { * items: ['foo', 'bar', 'foo-bar'], * filter: { * value: 'foo' * } * }; * * console.log(getFilteredItems(state)); // ['foo', 'foo-bar']; * console.log(getFilteredItems(state)); // ['foo', 'foo-bar'], pulled from cache; */ declare function createSelector(options?: CreateSelectorOptions): { ]>( paths: Paths, getComputedValue?: undefined, ): IdentitySelector; < const Paths extends Array>, GetComputedValue extends ComputeValue, >( paths: Paths, getComputedValue: GetComputedValue, ): StandardSelector>; >( paths: Paths, ): IdentityStructuredSelector; < const Paths extends PathStructured, GetComputedValue extends ComputeStructuredValue, >( paths: Paths, getComputedValue: GetComputedValue, ): StandardSelector>; }; export { createSelector };