Comparing version 4.1.7 to 4.1.8
@@ -24,3 +24,3 @@ import type { Selector, GetParamsFromSelectors, OutputSelector, SelectorArray, SelectorResultArray, DropFirst, MergeParameters, Expand, ObjValueTuple, Head, Tail } from './types'; | ||
(...args: SelectorResultArray<Selectors>) => Result | ||
]): OutputSelector<Selectors, Result, (...args: SelectorResultArray<Selectors>) => Result & Keys, GetParamsFromSelectors<Selectors>> & Keys; | ||
]): OutputSelector<Selectors, Result, (...args: SelectorResultArray<Selectors>) => Result, GetParamsFromSelectors<Selectors>, Keys> & Keys; | ||
/** Input selectors as separate inline arguments with memoizeOptions passed */ | ||
@@ -31,5 +31,5 @@ <Selectors extends SelectorArray, Result>(...items: [ | ||
CreateSelectorOptions<MemoizeOptions> | ||
]): OutputSelector<Selectors, Result, ((...args: SelectorResultArray<Selectors>) => Result) & Keys, GetParamsFromSelectors<Selectors>> & Keys; | ||
]): OutputSelector<Selectors, Result, ((...args: SelectorResultArray<Selectors>) => Result), GetParamsFromSelectors<Selectors>, Keys> & Keys; | ||
/** Input selectors as a separate array */ | ||
<Selectors extends SelectorArray, Result>(selectors: [...Selectors], combiner: (...args: SelectorResultArray<Selectors>) => Result, options?: CreateSelectorOptions<MemoizeOptions>): OutputSelector<Selectors, Result, (...args: SelectorResultArray<Selectors>) => Result & Keys, GetParamsFromSelectors<Selectors>> & Keys; | ||
<Selectors extends SelectorArray, Result>(selectors: [...Selectors], combiner: (...args: SelectorResultArray<Selectors>) => Result, options?: CreateSelectorOptions<MemoizeOptions>): OutputSelector<Selectors, Result, (...args: SelectorResultArray<Selectors>) => Result, GetParamsFromSelectors<Selectors>, Keys> & Keys; | ||
} | ||
@@ -36,0 +36,0 @@ export declare const createSelector: CreateSelectorFunction<(...args: unknown[]) => unknown, typeof defaultMemoize, [equalityCheckOrOptions?: import("./types").EqualityFn | DefaultMemoizeOptions | undefined], { |
@@ -10,7 +10,7 @@ import type { MergeParameters } from './versionedTypes'; | ||
/** Selectors generated by Reselect have several additional fields attached: */ | ||
export interface OutputSelectorFields<Combiner extends UnknownFunction> { | ||
export interface OutputSelectorFields<Combiner extends UnknownFunction, Keys> { | ||
/** The final function passed to `createSelector` */ | ||
resultFunc: Combiner; | ||
/** The same function, memoized */ | ||
memoizedResultFunc: Combiner; | ||
memoizedResultFunc: Combiner & Keys; | ||
/** Returns the last result calculated by the selector */ | ||
@@ -30,3 +30,4 @@ lastResult: () => ReturnType<Combiner>; | ||
*/ | ||
export type OutputSelector<S extends SelectorArray, Result, Combiner extends UnknownFunction, Params extends readonly any[] = never> = Selector<GetStateFromSelectors<S>, Result, Params> & OutputSelectorFields<Combiner>; | ||
export type OutputSelector<S extends SelectorArray, Result, Combiner extends UnknownFunction, Params extends readonly any[] = never, // MergeParameters<S> | ||
Keys = {}> = Selector<GetStateFromSelectors<S>, Result, Params> & OutputSelectorFields<Combiner, Keys>; | ||
/** A selector that is assumed to have one additional argument, such as | ||
@@ -40,3 +41,3 @@ * the props from a React component | ||
/** A generated selector that is assumed to have one additional argument */ | ||
export type OutputParametricSelector<State, Props, Result, Combiner extends UnknownFunction> = ParametricSelector<State, Props, Result> & OutputSelectorFields<Combiner>; | ||
export type OutputParametricSelector<State, Props, Result, Combiner extends UnknownFunction, Keys = {}> = ParametricSelector<State, Props, Result> & OutputSelectorFields<Combiner, Keys>; | ||
/** An array of input selectors */ | ||
@@ -62,2 +63,13 @@ export type SelectorArray = ReadonlyArray<Selector>; | ||
export type Tail<A> = A extends [any, ...infer Rest] ? Rest : never; | ||
/** Last item in an array. Recursion also enables this to work with rest syntax - where the type of rest is extracted */ | ||
export type ReverseHead<S extends readonly unknown[][]> = Tail<S> extends [ | ||
unknown | ||
] ? S : Tail<S> extends readonly unknown[][] ? ReverseHead<Tail<S>> : never; | ||
/** All elements in array except last | ||
* | ||
* Recursion makes this work also when rest syntax has been used | ||
* Runs _ReverseTail twice, because first pass turns last element into "never", and second pass removes it. | ||
**/ | ||
export type ReverseTail<S> = _ReverseTail<_ReverseTail<S>>; | ||
type _ReverseTail<S> = Tail<S> extends [unknown] ? [Head<S>] : Tail<S> extends unknown[] ? [Head<S>, ..._ReverseTail<Tail<S>>] : never; | ||
/** Extract only numeric keys from an array type */ | ||
@@ -64,0 +76,0 @@ export type AllArrayKeys<A extends readonly any[]> = A extends any ? { |
@@ -0,13 +1,12 @@ | ||
import { ReverseHead, ReverseTail } from '../types'; | ||
type UnknownFunction = (...args: any[]) => any; | ||
type LongestTuple<T extends readonly unknown[][]> = T extends [ | ||
infer U extends unknown[] | ||
] ? U : T extends [infer U, ...infer R extends unknown[][]] ? MostProperties<U, LongestTuple<R>> : never; | ||
type LongestTuple<T> = T extends [infer U extends unknown[]] ? U : T extends [infer U, ...infer R extends unknown[][]] ? MostProperties<U, LongestTuple<R>> : never; | ||
type MostProperties<T, U> = keyof U extends keyof T ? T : U; | ||
type ElementAt<T extends unknown[], N extends keyof any> = N extends keyof T ? T[N] : unknown; | ||
type ElementsAt<T extends readonly unknown[][], N extends keyof any> = { | ||
type ElementAt<T, N extends keyof any> = N extends keyof T ? T[N] : unknown; | ||
type ElementsAt<T, N extends keyof any> = { | ||
[K in keyof T]: ElementAt<T[K], N>; | ||
}; | ||
type Intersect<T extends readonly unknown[]> = T extends [] ? unknown : T extends [infer H, ...infer T] ? H & Intersect<T> : T[number]; | ||
type MergeTuples<T extends readonly unknown[][], L extends unknown[] = LongestTuple<T>> = { | ||
[K in keyof L]: Intersect<ElementsAt<T, K>>; | ||
type MergeTuples<T, L extends unknown[] = LongestTuple<T>> = { | ||
[K in keyof L]: Intersect<ElementsAt<T, K> extends readonly unknown[] ? ElementsAt<T, K> : never>; | ||
}; | ||
@@ -17,3 +16,10 @@ type ExtractParameters<T extends readonly UnknownFunction[]> = { | ||
}; | ||
export type MergeParameters<T extends readonly UnknownFunction[]> = '0' extends keyof T ? MergeTuples<ExtractParameters<T>> : Parameters<T[number]>; | ||
export type MergeParameters<T extends readonly UnknownFunction[]> = '0' extends keyof T ? MergeTuples<MakeRestExplicit<ExtractParameters<T>>> : Parameters<T[number]>; | ||
type HasRest<S extends readonly unknown[]> = number extends S['length'] ? true : false; | ||
type HasExplicit<S extends readonly unknown[]> = '0' extends keyof S ? true : false; | ||
type HasCombined<S extends readonly unknown[]> = true extends HasExplicit<S> & HasRest<S> ? true : false; | ||
type MakeRestExplicit<T extends readonly unknown[][]> = true extends HasCombined<T> ? [ | ||
...ReverseTail<T>, | ||
ReverseHead<T> extends readonly unknown[] ? ReverseHead<T>[number] : never | ||
] : true extends HasRest<T> ? [...T] : T; | ||
export {}; |
{ | ||
"name": "reselect", | ||
"version": "4.1.7", | ||
"version": "4.1.8", | ||
"description": "Selectors for Redux.", | ||
@@ -38,5 +38,5 @@ "main": "./lib/index.js", | ||
"lint": "eslint src test", | ||
"prepublishOnly": "yarn build", | ||
"test": "jest", | ||
"test:cov": "jest --coverage", | ||
"prepack": "yarn build", | ||
"test": "vitest run", | ||
"test:cov": "vitest run --coverage", | ||
"test:typescript": "tsc --noEmit -p typescript_test/tsconfig.json" | ||
@@ -65,4 +65,3 @@ }, | ||
"@babel/register": "^7.15.3", | ||
"@microsoft/api-extractor": "^7.18.16", | ||
"@reduxjs/toolkit": "^1.9.0-rc.1", | ||
"@reduxjs/toolkit": "^1.9.3", | ||
"@rollup/plugin-babel": "^5.3.0", | ||
@@ -77,5 +76,2 @@ "@rollup/plugin-commonjs": "^21.0.1", | ||
"@typescript-eslint/parser": "5.1.0", | ||
"chai": "^4.3.4", | ||
"codecov.io": "^0.1.6", | ||
"coveralls": "^3.1.1", | ||
"cross-env": "^7.0.3", | ||
@@ -90,3 +86,2 @@ "eslint": "^8.0.1", | ||
"mkdirp": "^1.0.4", | ||
"mocha": "^9.1.3", | ||
"ncp": "^2.0.0", | ||
@@ -99,6 +94,6 @@ "nyc": "^15.1.0", | ||
"rollup-plugin-terser": "^7.0.2", | ||
"ts-jest": "27.0.7", | ||
"tslint": "6.1.3", | ||
"typescript": "4.8.3" | ||
"typescript": "^4.9", | ||
"vitest": "^0.29.8" | ||
} | ||
} |
@@ -179,4 +179,5 @@ import type { | ||
Result, | ||
(...args: SelectorResultArray<Selectors>) => Result & Keys, | ||
GetParamsFromSelectors<Selectors> | ||
(...args: SelectorResultArray<Selectors>) => Result, | ||
GetParamsFromSelectors<Selectors>, | ||
Keys | ||
> & | ||
@@ -195,4 +196,5 @@ Keys | ||
Result, | ||
((...args: SelectorResultArray<Selectors>) => Result) & Keys, | ||
GetParamsFromSelectors<Selectors> | ||
((...args: SelectorResultArray<Selectors>) => Result), | ||
GetParamsFromSelectors<Selectors>, | ||
Keys | ||
> & | ||
@@ -209,4 +211,5 @@ Keys | ||
Result, | ||
(...args: SelectorResultArray<Selectors>) => Result & Keys, | ||
GetParamsFromSelectors<Selectors> | ||
(...args: SelectorResultArray<Selectors>) => Result, | ||
GetParamsFromSelectors<Selectors>, | ||
Keys | ||
> & | ||
@@ -213,0 +216,0 @@ Keys |
@@ -29,7 +29,7 @@ import type { MergeParameters } from './versionedTypes' | ||
/** Selectors generated by Reselect have several additional fields attached: */ | ||
export interface OutputSelectorFields<Combiner extends UnknownFunction> { | ||
export interface OutputSelectorFields<Combiner extends UnknownFunction, Keys> { | ||
/** The final function passed to `createSelector` */ | ||
resultFunc: Combiner | ||
/** The same function, memoized */ | ||
memoizedResultFunc: Combiner | ||
memoizedResultFunc: Combiner & Keys | ||
/** Returns the last result calculated by the selector */ | ||
@@ -54,5 +54,6 @@ lastResult: () => ReturnType<Combiner> | ||
Combiner extends UnknownFunction, | ||
Params extends readonly any[] = never // MergeParameters<S> | ||
Params extends readonly any[] = never, // MergeParameters<S> | ||
Keys = {} | ||
> = Selector<GetStateFromSelectors<S>, Result, Params> & | ||
OutputSelectorFields<Combiner> | ||
OutputSelectorFields<Combiner, Keys> | ||
@@ -73,4 +74,6 @@ /** A selector that is assumed to have one additional argument, such as | ||
Result, | ||
Combiner extends UnknownFunction | ||
> = ParametricSelector<State, Props, Result> & OutputSelectorFields<Combiner> | ||
Combiner extends UnknownFunction, | ||
Keys = {} | ||
> = ParametricSelector<State, Props, Result> & | ||
OutputSelectorFields<Combiner, Keys> | ||
@@ -122,2 +125,23 @@ /** An array of input selectors */ | ||
/** Last item in an array. Recursion also enables this to work with rest syntax - where the type of rest is extracted */ | ||
export type ReverseHead<S extends readonly unknown[][]> = Tail<S> extends [ | ||
unknown | ||
] | ||
? S | ||
: Tail<S> extends readonly unknown[][] | ||
? ReverseHead<Tail<S>> | ||
: never | ||
/** All elements in array except last | ||
* | ||
* Recursion makes this work also when rest syntax has been used | ||
* Runs _ReverseTail twice, because first pass turns last element into "never", and second pass removes it. | ||
**/ | ||
export type ReverseTail<S> = _ReverseTail<_ReverseTail<S>> | ||
type _ReverseTail<S> = Tail<S> extends [unknown] | ||
? [Head<S>] | ||
: Tail<S> extends unknown[] | ||
? [Head<S>, ..._ReverseTail<Tail<S>>] | ||
: never | ||
/** Extract only numeric keys from an array type */ | ||
@@ -124,0 +148,0 @@ export type AllArrayKeys<A extends readonly any[]> = A extends any |
// This entire implementation courtesy of Anders Hjelsberg: | ||
// https://github.com/microsoft/TypeScript/pull/50831#issuecomment-1253830522 | ||
import { ReverseHead, ReverseTail } from '../types' | ||
type UnknownFunction = (...args: any[]) => any | ||
type LongestTuple<T extends readonly unknown[][]> = T extends [ | ||
infer U extends unknown[] | ||
] | ||
type LongestTuple<T> = T extends [infer U extends unknown[]] | ||
? U | ||
@@ -16,7 +16,5 @@ : T extends [infer U, ...infer R extends unknown[][]] | ||
type ElementAt<T extends unknown[], N extends keyof any> = N extends keyof T | ||
? T[N] | ||
: unknown | ||
type ElementAt<T, N extends keyof any> = N extends keyof T ? T[N] : unknown | ||
type ElementsAt<T extends readonly unknown[][], N extends keyof any> = { | ||
type ElementsAt<T, N extends keyof any> = { | ||
[K in keyof T]: ElementAt<T[K], N> | ||
@@ -31,7 +29,6 @@ } | ||
type MergeTuples< | ||
T extends readonly unknown[][], | ||
L extends unknown[] = LongestTuple<T> | ||
> = { | ||
[K in keyof L]: Intersect<ElementsAt<T, K>> | ||
type MergeTuples<T, L extends unknown[] = LongestTuple<T>> = { | ||
[K in keyof L]: Intersect< | ||
ElementsAt<T, K> extends readonly unknown[] ? ElementsAt<T, K> : never | ||
> | ||
} | ||
@@ -45,3 +42,28 @@ | ||
'0' extends keyof T | ||
? MergeTuples<ExtractParameters<T>> | ||
? MergeTuples<MakeRestExplicit<ExtractParameters<T>>> | ||
: Parameters<T[number]> | ||
type HasRest<S extends readonly unknown[]> = number extends S['length'] | ||
? true | ||
: false | ||
type HasExplicit<S extends readonly unknown[]> = '0' extends keyof S | ||
? true | ||
: false | ||
type HasCombined<S extends readonly unknown[]> = true extends HasExplicit<S> & | ||
HasRest<S> | ||
? true | ||
: false | ||
type MakeRestExplicit<T extends readonly unknown[][]> = | ||
true extends HasCombined<T> | ||
? [ | ||
...ReverseTail<T>, | ||
ReverseHead<T> extends readonly unknown[] | ||
? ReverseHead<T>[number] | ||
: never | ||
] | ||
: true extends HasRest<T> | ||
? [...T] | ||
: T |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
174587
34
5132
0