diff --git a/README.md b/README.md index 34bd845b3..586926be0 100644 --- a/README.md +++ b/README.md @@ -371,7 +371,7 @@ A customized [`createSelector`] function. | Name | Description | | :-------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MemoizeFunction` | The type of the memoize function that is used to memoize the `resultFunc` inside [`createSelector`] (e.g., `defaultMemoize` or `weakMapMemoize`). | -| `ArgsMemoizeFunction` | The type of the optional memoize function that is used to memoize the arguments passed into the [output selector] generated by [`createSelector`] (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `defaultMemoize` will be used. | +| `ArgsMemoizeFunction` | The type of the optional memoize function that is used to memoize the arguments passed into the [output selector] generated by [`createSelector`] (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `weakMapMemoize` will be used. | @@ -405,7 +405,7 @@ customSelector( `createSelectorCreator` can be used to make a customized version of [`createSelector`]. -The `memoize` argument is a memoization function to replace `defaultMemoize`. +The `memoize` argument is a memoization function to replace `weakMapMemoize`. The `...memoizeOptions` rest parameters are zero or more configuration options to be passed to `memoizeFunc`. The selectors `resultFunc` is passed as the first argument to `memoize` and the `memoizeOptions` are passed as the second argument onwards: @@ -494,8 +494,8 @@ A memoized structured selector. | Name | Description | | :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `InputSelectorsObject` | The shape of the [input selectors] object. | -| `MemoizeFunction` | The type of the memoize function that is used to create the structured selector. It defaults to `defaultMemoize`. | -| `ArgsMemoizeFunction` | The type of the of the memoize function that is used to memoize the arguments passed into the generated structured selector. It defaults to `defaultMemoize`. | +| `MemoizeFunction` | The type of the memoize function that is used to create the structured selector. It defaults to `weakMapMemoize`. | +| `ArgsMemoizeFunction` | The type of the of the memoize function that is used to memoize the arguments passed into the generated structured selector. It defaults to `weakMapMemoize`. | diff --git a/package.json b/package.json index 2c7fc5269..56196ebc3 100644 --- a/package.json +++ b/package.json @@ -56,14 +56,15 @@ "@types/react": "^18.2.38", "@types/react-dom": "^18.2.17", "@types/shelljs": "^0.8.11", - "@typescript-eslint/eslint-plugin": "5.1.0", - "@typescript-eslint/eslint-plugin-tslint": "5.1.0", - "@typescript-eslint/parser": "5.1.0", + "@typescript-eslint/eslint-plugin": "^6", + "@typescript-eslint/eslint-plugin-tslint": "^6", + "@typescript-eslint/parser": "^6", "@typescript/analyze-trace": "^0.10.1", "eslint": "^8.0.1", "eslint-plugin-react": "^7.26.1", "eslint-plugin-typescript": "0.14.0", "jsdom": "^23.0.0", + "lodash": "^4.17.21", "lodash.memoize": "^4.1.2", "memoize-one": "^6.0.0", "micro-memoize": "^4.0.9", @@ -74,7 +75,7 @@ "rimraf": "^3.0.2", "shelljs": "^0.8.5", "tsup": "^6.7.0", - "typescript": "^4.9", + "typescript": "5.2", "vitest": "^0.34" } } diff --git a/src/createSelectorCreator.ts b/src/createSelectorCreator.ts index 5d92015c7..51ee1030d 100644 --- a/src/createSelectorCreator.ts +++ b/src/createSelectorCreator.ts @@ -1,4 +1,4 @@ -import { defaultMemoize } from './defaultMemoize' +import { weakMapMemoize } from './weakMapMemoize' import type { Combiner, @@ -30,13 +30,13 @@ import { * An instance of `createSelector`, customized with a given memoize implementation. * * @template MemoizeFunction - The type of the memoize function that is used to memoize the `resultFunc` inside `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). - * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `defaultMemoize` will be used. + * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `weakMapMemoize` will be used. * * @public */ export interface CreateSelectorFunction< - MemoizeFunction extends UnknownMemoizer = typeof defaultMemoize, - ArgsMemoizeFunction extends UnknownMemoizer = typeof defaultMemoize + MemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize, + ArgsMemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize > { /** * Creates a memoized selector function. @@ -213,7 +213,7 @@ export function setInputStabilityCheckEnabled( * ``` * * @template MemoizeFunction - The type of the memoize function that is used to memoize the `resultFunc` inside `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). - * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `defaultMemoize` will be used. + * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `weakMapMemoize` will be used. * * @see {@link https://github.com/reduxjs/reselect#createselectorcreatormemoize--options-memoizeoptions createSelectorCreator} * @@ -222,13 +222,13 @@ export function setInputStabilityCheckEnabled( */ export function createSelectorCreator< MemoizeFunction extends UnknownMemoizer, - ArgsMemoizeFunction extends UnknownMemoizer = typeof defaultMemoize + ArgsMemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize >( options: Simplify< SetRequired< CreateSelectorOptions< - typeof defaultMemoize, - typeof defaultMemoize, + typeof weakMapMemoize, + typeof weakMapMemoize, MemoizeFunction, ArgsMemoizeFunction >, @@ -277,7 +277,7 @@ export function createSelectorCreator( * @returns A customized `createSelector` function. * * @template MemoizeFunction - The type of the memoize function that is used to memoize the `resultFunc` inside `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). - * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `defaultMemoize` will be used. + * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `weakMapMemoize` will be used. * @template MemoizeOrOptions - The type of the first argument. It can either be a `memoize` function or an `options` object containing the `memoize` function. */ export function createSelectorCreator< @@ -372,7 +372,7 @@ export function createSelectorCreator< const { memoize, memoizeOptions = [], - argsMemoize = defaultMemoize, + argsMemoize = weakMapMemoize, argsMemoizeOptions = [], inputStabilityCheck = globalStabilityCheck } = combinedOptions @@ -477,4 +477,4 @@ export function createSelectorCreator< * @public */ export const createSelector = - /* #__PURE__ */ createSelectorCreator(defaultMemoize) + /* #__PURE__ */ createSelectorCreator(weakMapMemoize) diff --git a/src/createStructuredSelector.ts b/src/createStructuredSelector.ts index a57897ea8..cfd3b8937 100644 --- a/src/createStructuredSelector.ts +++ b/src/createStructuredSelector.ts @@ -133,8 +133,8 @@ export interface StructuredSelectorCreator { * ``` * * @template InputSelectorsObject - The shape of the input selectors object. - * @template MemoizeFunction - The type of the memoize function that is used to create the structured selector. It defaults to `defaultMemoize`. - * @template ArgsMemoizeFunction - The type of the of the memoize function that is used to memoize the arguments passed into the generated structured selector. It defaults to `defaultMemoize`. + * @template MemoizeFunction - The type of the memoize function that is used to create the structured selector. It defaults to `weakMapMemoize`. + * @template ArgsMemoizeFunction - The type of the of the memoize function that is used to memoize the arguments passed into the generated structured selector. It defaults to `weakMapMemoize`. * * @see {@link https://github.com/reduxjs/reselect#createstructuredselector-inputselectorsobject--selectorcreator--createselector createStructuredSelector} */ diff --git a/src/types.ts b/src/types.ts index ef613b644..a28640814 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,5 @@ -import type { defaultMemoize } from './defaultMemoize' import type { MergeParameters } from './versionedTypes' +import type { weakMapMemoize } from './weakMapMemoize' export type { MergeParameters } from './versionedTypes' @@ -55,15 +55,15 @@ export type SelectorResultArray = * The options object used inside `createSelector` and `createSelectorCreator`. * * @template MemoizeFunction - The type of the memoize function that is used to memoize the `resultFunc` inside `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). - * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `defaultMemoize` will be used. + * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `weakMapMemoize` will be used. * @template OverrideMemoizeFunction - The type of the optional `memoize` function that could be passed into the options object inside `createSelector` to override the original `memoize` function that was initially passed into `createSelectorCreator`. - * @template OverrideArgsMemoizeFunction - The type of the optional `argsMemoize` function that could be passed into the options object inside `createSelector` to override the original `argsMemoize` function that was initially passed into `createSelectorCreator`. If none was initially provided, `defaultMemoize` will be used. + * @template OverrideArgsMemoizeFunction - The type of the optional `argsMemoize` function that could be passed into the options object inside `createSelector` to override the original `argsMemoize` function that was initially passed into `createSelectorCreator`. If none was initially provided, `weakMapMemoize` will be used. * * @public */ export interface CreateSelectorOptions< - MemoizeFunction extends UnknownMemoizer = typeof defaultMemoize, - ArgsMemoizeFunction extends UnknownMemoizer = typeof defaultMemoize, + MemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize, + ArgsMemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize, OverrideMemoizeFunction extends UnknownMemoizer = never, OverrideArgsMemoizeFunction extends UnknownMemoizer = never > { @@ -114,7 +114,7 @@ export interface CreateSelectorOptions< * * When passed directly into `createSelector`, it overrides the * `argsMemoize` function initially passed into `createSelectorCreator`. - * If none was initially provided, `defaultMemoize` will be used. + * If none was initially provided, `weakMapMemoize` will be used. * * @example * ```ts @@ -130,7 +130,7 @@ export interface CreateSelectorOptions< * ) * ``` * - * @default defaultMemoize + * @default weakMapMemoize * * @since 5.0.0 */ @@ -176,15 +176,15 @@ export interface CreateSelectorOptions< * @template InputSelectors - The type of the input selectors. * @template Result - The type of the result returned by the `resultFunc`. * @template MemoizeFunction - The type of the memoize function that is used to memoize the `resultFunc` inside `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). - * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `defaultMemoize` will be used. + * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `weakMapMemoize` will be used. * * @public */ export type OutputSelectorFields< InputSelectors extends SelectorArray = SelectorArray, Result = unknown, - MemoizeFunction extends UnknownMemoizer = typeof defaultMemoize, - ArgsMemoizeFunction extends UnknownMemoizer = typeof defaultMemoize + MemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize, + ArgsMemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize > = { /** * The final function passed to `createSelector`. Otherwise known as the `combiner`. @@ -250,15 +250,15 @@ export type OutputSelectorFields< * @template InputSelectors - The type of the input selectors. * @template Result - The type of the result returned by the `resultFunc`. * @template MemoizeFunction - The type of the memoize function that is used to memoize the `resultFunc` inside `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). - * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `defaultMemoize` will be used. + * @template ArgsMemoizeFunction - The type of the optional memoize function that is used to memoize the arguments passed into the output selector generated by `createSelector` (e.g., `defaultMemoize` or `weakMapMemoize`). If none is explicitly provided, `weakMapMemoize` will be used. * * @public */ export type OutputSelector< InputSelectors extends SelectorArray = SelectorArray, Result = unknown, - MemoizeFunction extends UnknownMemoizer = typeof defaultMemoize, - ArgsMemoizeFunction extends UnknownMemoizer = typeof defaultMemoize + MemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize, + ArgsMemoizeFunction extends UnknownMemoizer = typeof weakMapMemoize > = Selector< GetStateFromSelectors, Result, diff --git a/test/benchmarks/weakMapMemoize.bench.ts b/test/benchmarks/weakMapMemoize.bench.ts index a64bb93f5..cf3c77fd6 100644 --- a/test/benchmarks/weakMapMemoize.bench.ts +++ b/test/benchmarks/weakMapMemoize.bench.ts @@ -1,4 +1,5 @@ import type { OutputSelector, Selector } from 'reselect' +import { defaultMemoize } from 'reselect' import { unstable_autotrackMemoize as autotrackMemoize, createSelector, @@ -38,17 +39,26 @@ describe('Parametric selectors: weakMapMemoize vs others', () => { const selectorDefaultWithCacheSize = createSelector( [(state: RootState) => state.todos, (state: RootState, id: number) => id], (todos, id) => todos.find(todo => todo.id === id), - { memoizeOptions: { maxSize: 30 } } + { memoize: defaultMemoize, memoizeOptions: { maxSize: 30 } } ) const selectorDefaultWithArgsCacheSize = createSelector( [(state: RootState) => state.todos, (state: RootState, id: number) => id], (todos, id) => todos.find(todo => todo.id === id), - { argsMemoizeOptions: { maxSize: 30 } } + { + memoize: defaultMemoize, + argsMemoize: defaultMemoize, + argsMemoizeOptions: { maxSize: 30 } + } ) const selectorDefaultWithBothCacheSize = createSelector( [(state: RootState) => state.todos, (state: RootState, id: number) => id], (todos, id) => todos.find(todo => todo.id === id), - { memoizeOptions: { maxSize: 30 }, argsMemoizeOptions: { maxSize: 30 } } + { + memoize: defaultMemoize, + argsMemoize: defaultMemoize, + memoizeOptions: { maxSize: 30 }, + argsMemoizeOptions: { maxSize: 30 } + } ) const selectorWeakMap = createSelector( [(state: RootState) => state.todos, (state: RootState, id: number) => id], diff --git a/test/defaultMemoize.spec.ts b/test/defaultMemoize.spec.ts index 94e98d97e..7d3237f62 100644 --- a/test/defaultMemoize.spec.ts +++ b/test/defaultMemoize.spec.ts @@ -1,8 +1,13 @@ // TODO: Add test for React Redux connect function -import { createSelector, defaultMemoize } from 'reselect' +import { defaultMemoize, createSelectorCreator } from 'reselect' import { vi } from 'vitest' +const createSelector = createSelectorCreator({ + memoize: defaultMemoize, + argsMemoize: defaultMemoize +}) + describe('defaultMemoize', () => { test('Basic memoization', () => { let called = 0 diff --git a/test/inputStabilityCheck.spec.ts b/test/inputStabilityCheck.spec.ts index be17bc427..3dc0d28e6 100644 --- a/test/inputStabilityCheck.spec.ts +++ b/test/inputStabilityCheck.spec.ts @@ -1,4 +1,8 @@ -import { createSelector, setInputStabilityCheckEnabled } from 'reselect' +import { + createSelector, + defaultMemoize, + setInputStabilityCheckEnabled +} from 'reselect' import { shallowEqual } from 'react-redux' describe('inputStabilityCheck', () => { @@ -107,6 +111,7 @@ describe('inputStabilityCheck', () => { [unstableInput], ({ a, b }) => a + b, { + memoize: defaultMemoize, memoizeOptions: { equalityCheck: shallowEqual } diff --git a/test/perfComparisons.spec.ts b/test/perfComparisons.spec.ts index 2959eca21..ae66c01c0 100644 --- a/test/perfComparisons.spec.ts +++ b/test/perfComparisons.spec.ts @@ -337,11 +337,11 @@ describe('More perf comparisons', () => { cdTodoIdsAndNames(reduxStates[0]) - expect(cdTodoIdsAndNames.recomputations()).toBe(NUM_ITEMS + 1) + expect(cdTodoIdsAndNames.recomputations()).toBe(NUM_ITEMS) cdTodoIdsAndNames(reduxStates[1]) - expect(cdTodoIdsAndNames.recomputations()).toBe(NUM_ITEMS + 2) + expect(cdTodoIdsAndNames.recomputations()).toBe(NUM_ITEMS) // @ts-ignore reduxStates[0] = null diff --git a/test/reselect.bench.ts b/test/reselect.bench.ts deleted file mode 100644 index d212c821d..000000000 --- a/test/reselect.bench.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { createSelector } from '@reduxjs/toolkit' -import { bench } from 'vitest' -import { autotrackMemoize } from '../src/autotrackMemoize/autotrackMemoize' -import { weakMapMemoize } from '../src/weakMapMemoize' - -const options: NonNullable[2]> = { - iterations: 1_000_000, - time: 100 -} - -describe('bench', () => { - interface State { - todos: { - id: number - completed: boolean - }[] - } - const state: State = { - todos: [ - { id: 0, completed: false }, - { id: 1, completed: false }, - { id: 2, completed: false }, - { id: 3, completed: false }, - { id: 4, completed: false }, - { id: 5, completed: false }, - { id: 6, completed: false }, - { id: 7, completed: false }, - { id: 8, completed: false }, - { id: 9, completed: false }, - { id: 10, completed: false }, - { id: 11, completed: false }, - { id: 12, completed: false }, - { id: 13, completed: false }, - { id: 14, completed: false }, - { id: 15, completed: false }, - { id: 16, completed: false }, - { id: 17, completed: false }, - { id: 18, completed: false }, - { id: 19, completed: false }, - { id: 20, completed: false }, - { id: 21, completed: false }, - { id: 22, completed: false }, - { id: 23, completed: false }, - { id: 24, completed: false }, - { id: 25, completed: false }, - { id: 26, completed: false }, - { id: 27, completed: false }, - { id: 28, completed: false }, - { id: 29, completed: false }, - { id: 30, completed: false }, - { id: 31, completed: false }, - { id: 32, completed: false }, - { id: 33, completed: false }, - { id: 34, completed: false }, - { id: 35, completed: false }, - { id: 36, completed: false }, - { id: 37, completed: false }, - { id: 38, completed: false }, - { id: 39, completed: false }, - { id: 40, completed: false }, - { id: 41, completed: false }, - { id: 42, completed: false }, - { id: 43, completed: false }, - { id: 44, completed: false }, - { id: 45, completed: false }, - { id: 46, completed: false }, - { id: 47, completed: false }, - { id: 48, completed: false }, - { id: 49, completed: false }, - { id: 50, completed: false }, - { id: 51, completed: false }, - { id: 52, completed: false }, - { id: 53, completed: false }, - { id: 54, completed: false }, - { id: 55, completed: false }, - { id: 56, completed: false }, - { id: 57, completed: false }, - { id: 58, completed: false }, - { id: 59, completed: false }, - { id: 60, completed: false }, - { id: 61, completed: false }, - { id: 62, completed: false }, - { id: 63, completed: false }, - { id: 64, completed: false }, - { id: 65, completed: false }, - { id: 66, completed: false }, - { id: 67, completed: false }, - { id: 68, completed: false }, - { id: 69, completed: false }, - { id: 70, completed: false }, - { id: 71, completed: false }, - { id: 72, completed: false }, - { id: 73, completed: false }, - { id: 74, completed: false }, - { id: 75, completed: false }, - { id: 76, completed: false }, - { id: 77, completed: false }, - { id: 78, completed: false }, - { id: 79, completed: false }, - { id: 80, completed: false }, - { id: 81, completed: false }, - { id: 82, completed: false }, - { id: 83, completed: false }, - { id: 84, completed: false }, - { id: 85, completed: false }, - { id: 86, completed: false }, - { id: 87, completed: false }, - { id: 88, completed: false }, - { id: 89, completed: false }, - { id: 90, completed: false }, - { id: 91, completed: false }, - { id: 92, completed: false }, - { id: 93, completed: false }, - { id: 94, completed: false }, - { id: 95, completed: false }, - { id: 96, completed: false }, - { id: 97, completed: false }, - { id: 98, completed: false }, - { id: 99, completed: false } - ] - } - const selectorDefault = createSelector( - (state: State) => state.todos, - todos => todos.map(t => t.id) - ) - const selectorAutotrack = createSelector( - (state: State) => state.todos, - todos => todos.map(t => t.id), - { memoize: autotrackMemoize } - ) - const selectorWeakMap = createSelector( - (state: State) => state.todos, - todos => todos.map(t => t.id), - { memoize: weakMapMemoize } - ) - const selectorArgsAutotrack = createSelector( - (state: State) => state.todos, - todos => todos.map(t => t.id), - { argsMemoize: autotrackMemoize } - ) - const nonMemoizedSelector = (state: State) => state.todos.map(t => t.id) - const selectorArgsWeakMap = createSelector( - (state: State) => state.todos, - todos => todos.map(t => t.id), - { argsMemoize: weakMapMemoize } - ) - const parametricSelector = createSelector( - (state: State) => state.todos, - (state: State, id: number) => id, - (todos, id) => todos[id] - ) - const parametricSelectorWeakMapArgs = createSelector( - (state: State) => state.todos, - (state: State, id: number) => id, - (todos, id) => todos[id], - { - argsMemoize: weakMapMemoize - } - ) - bench( - 'selectorDefault', - () => { - selectorDefault(state) - }, - options - ) - - bench( - 'selectorAutotrack', - () => { - selectorAutotrack(state) - }, - options - ) - bench( - 'selectorWeakMap', - () => { - selectorWeakMap(state) - }, - options - ) - bench( - 'selectorArgsAutotrack', - () => { - selectorArgsAutotrack(state) - }, - options - ) - bench( - 'selectorArgsWeakMap', - () => { - selectorArgsWeakMap(state) - }, - options - ) - bench( - 'non-memoized selector', - () => { - nonMemoizedSelector(state) - }, - options - ) - bench( - 'parametricSelector', - () => { - parametricSelector(state, 0) - }, - options - ) - bench( - 'parametricSelectorWeakMapArgs', - () => { - parametricSelectorWeakMapArgs(state, 0) - }, - options - ) -}) diff --git a/test/reselect.spec.ts b/test/reselect.spec.ts index c46d96eaf..0f872c62a 100644 --- a/test/reselect.spec.ts +++ b/test/reselect.spec.ts @@ -134,7 +134,7 @@ describe('Basic selector behavior', () => { expect(selector(state1)).toBe(3) expect(selector.recomputations()).toBe(1) // Expected a million calls to a selector with the same arguments to take less than 1 second - expect(totalTime).toBeLessThan(1000) + expect(totalTime).toBeLessThan(2000) }) test('basic selector cache hit performance for state changes but shallowly equal selector args', () => { @@ -158,7 +158,7 @@ describe('Basic selector behavior', () => { expect(selector.recomputations()).toBe(1) // Expected a million calls to a selector with the same arguments to take less than 1 second - expect(totalTime).toBeLessThan(1000) + expect(totalTime).toBeLessThan(2000) }) }) test('memoized composite arguments', () => { @@ -344,6 +344,7 @@ describe('Customizing selectors', () => { (state: StateAB) => state.b, (a, b) => a + b, { + memoize: defaultMemoize, memoizeOptions: (a, b) => { memoizer1Calls++ return a === b @@ -361,6 +362,7 @@ describe('Customizing selectors', () => { (state: StateAB) => state.b, (a, b) => a + b, { + memoize: defaultMemoize, memoizeOptions: [ (a, b) => { memoizer2Calls++ @@ -404,6 +406,7 @@ describe('Customizing selectors', () => { todos => todos.map(({ id }) => id), { inputStabilityCheck: 'always', + memoize: defaultMemoize, memoizeOptions: { equalityCheck: (a, b) => false, resultEqualityCheck: (a, b) => false @@ -430,8 +433,7 @@ describe('argsMemoize and memoize', () => { const state = store.getState() const selectorDefault = createSelector( (state: RootState) => state.todos, - todos => todos.map(({ id }) => id), - { memoize: defaultMemoize } + todos => todos.map(({ id }) => id) ) const selectorDefaultParametric = createSelector( [(state: RootState, id: number) => id, (state: RootState) => state.todos], @@ -695,11 +697,11 @@ describe('argsMemoize and memoize', () => { expect(selectorDefaultParametric.dependencyRecomputations()).toBe(1) selectorDefaultParametric(store.getState(), 2) selectorDefaultParametric(store.getState(), 1) - expect(selectorDefaultParametric.recomputations()).toBe(3) - expect(selectorDefaultParametric.dependencyRecomputations()).toBe(3) + expect(selectorDefaultParametric.recomputations()).toBe(2) + expect(selectorDefaultParametric.dependencyRecomputations()).toBe(2) selectorDefaultParametric(store.getState(), 2) - expect(selectorDefaultParametric.recomputations()).toBe(4) - expect(selectorDefaultParametric.dependencyRecomputations()).toBe(4) + expect(selectorDefaultParametric.recomputations()).toBe(2) + expect(selectorDefaultParametric.dependencyRecomputations()).toBe(2) const selectorDefaultParametricArgsWeakMap = createSelector( [(state: RootState, id: number) => id, (state: RootState) => state.todos], (id, todos) => todos.filter(todo => todo.id === id), @@ -748,8 +750,8 @@ describe('argsMemoize and memoize', () => { selectorDefaultParametric(store.getState(), 4) selectorDefaultParametric(store.getState(), 5) } - expect(selectorDefaultParametric.recomputations()).toBe(54) - expect(selectorDefaultParametric.dependencyRecomputations()).toBe(54) + expect(selectorDefaultParametric.recomputations()).toBe(5) + expect(selectorDefaultParametric.dependencyRecomputations()).toBe(5) for (let i = 0; i < 10; i++) { selectorDefaultParametricWeakMap(store.getState(), 1) selectorDefaultParametricWeakMap(store.getState(), 2) @@ -758,7 +760,7 @@ describe('argsMemoize and memoize', () => { selectorDefaultParametricWeakMap(store.getState(), 5) } expect(selectorDefaultParametricWeakMap.recomputations()).toBe(5) - expect(selectorDefaultParametricWeakMap.dependencyRecomputations()).toBe(50) + expect(selectorDefaultParametricWeakMap.dependencyRecomputations()).toBe(5) }) localTest('passing argsMemoize to createSelectorCreator', ({ store }) => { diff --git a/test/selectorUtils.spec.ts b/test/selectorUtils.spec.ts index 78daee563..c493cc71e 100644 --- a/test/selectorUtils.spec.ts +++ b/test/selectorUtils.spec.ts @@ -1,11 +1,12 @@ -import { createSelector } from 'reselect' +import { createSelector, defaultMemoize } from 'reselect' import type { StateA, StateAB } from 'testTypes' describe('createSelector exposed utils', () => { test('resetRecomputations', () => { const selector = createSelector( (state: StateA) => state.a, - a => a + a => a, + { memoize: defaultMemoize, argsMemoize: defaultMemoize } ) expect(selector({ a: 1 })).toBe(1) expect(selector({ a: 1 })).toBe(1) diff --git a/test/weakmapMemoize.spec.ts b/test/weakmapMemoize.spec.ts index 999d36248..338441e54 100644 --- a/test/weakmapMemoize.spec.ts +++ b/test/weakmapMemoize.spec.ts @@ -112,8 +112,8 @@ describe('Basic selector behavior with weakMapMemoize', () => { expect(selector(state1)).toBe(3) expect(selector.recomputations()).toBe(1) - // Expected a million calls to a selector with the same arguments to take less than 1 second - expect(totalTime).toBeLessThan(1000) + // Expected a million calls to a selector with the same arguments to take less than 2 seconds + expect(totalTime).toBeLessThan(200) }) test('basic selector cache hit performance for state changes but shallowly equal selector args', () => { @@ -137,7 +137,7 @@ describe('Basic selector behavior with weakMapMemoize', () => { expect(selector.recomputations()).toBe(1) // Expected a million calls to a selector with the same arguments to take less than 1 second - expect(totalTime).toBeLessThan(1000) + expect(totalTime).toBeLessThan(2000) }) test('memoized composite arguments', () => { diff --git a/type-tests/argsMemoize.test-d.ts b/type-tests/argsMemoize.test-d.ts index 1d58e8ee7..2ed343480 100644 --- a/type-tests/argsMemoize.test-d.ts +++ b/type-tests/argsMemoize.test-d.ts @@ -1,10 +1,10 @@ import memoizeOne from 'memoize-one' import microMemoize from 'micro-memoize' import { + unstable_autotrackMemoize as autotrackMemoize, createSelector, createSelectorCreator, defaultMemoize, - unstable_autotrackMemoize as autotrackMemoize, weakMapMemoize } from 'reselect' import { assertType, describe, expectTypeOf, test } from 'vitest' @@ -265,8 +265,8 @@ describe('memoize and argsMemoize', () => { } ) const selectorWeakMapSeparateInlineArgsWithMemoizeOptions4 = - // @ts-expect-error createSelectorDefaultMemoize( + // @ts-expect-error (state: RootState) => state.todos, // @ts-expect-error todos => todos.map(t => t.id), @@ -854,7 +854,7 @@ describe('memoize and argsMemoize', () => { ).toEqualTypeOf(microMemoize) expectTypeOf( selectorMicroMemoizeArgsMemoizeOptionsFallbackToDefault.argsMemoize - ).toEqualTypeOf(defaultMemoize) + ).toEqualTypeOf(weakMapMemoize) const createSelectorWithWrongArgsMemoizeOptions = // @ts-expect-error If we don't pass in `argsMemoize`, the type for `argsMemoizeOptions` falls back to the options parameter of `defaultMemoize`. @@ -882,7 +882,6 @@ describe('memoize and argsMemoize', () => { ) }) - test('autotrackMemoize types', () => { const selector = createSelector( [(state: RootState) => state.todos], diff --git a/type-tests/tsconfig.json b/type-tests/tsconfig.json index cf6ec4117..a8a65e555 100644 --- a/type-tests/tsconfig.json +++ b/type-tests/tsconfig.json @@ -4,6 +4,7 @@ "esModuleInterop": true, "strict": true, "target": "ES2015", + "lib": ["ES2021.WeakRef"], "declaration": true, "noEmit": true, "skipLibCheck": true, diff --git a/typescript_test/argsMemoize.typetest.ts b/typescript_test/argsMemoize.typetest.ts index 2093b8920..808f4c081 100644 --- a/typescript_test/argsMemoize.typetest.ts +++ b/typescript_test/argsMemoize.typetest.ts @@ -1,10 +1,10 @@ import memoizeOne from 'memoize-one' import microMemoize from 'micro-memoize' import { + unstable_autotrackMemoize as autotrackMemoize, createSelector, createSelectorCreator, defaultMemoize, - unstable_autotrackMemoize as autotrackMemoize, weakMapMemoize } from 'reselect' import { expectExactType } from './typesTestUtils' @@ -260,19 +260,7 @@ function overrideOnlyArgsMemoizeInCreateSelector() { argsMemoizeOptions: [{ maxSize: 2 }] } ) - const selectorWeakMapSeparateInlineArgsWithMemoizeOptions4 = - // @ts-expect-error - createSelectorDefaultMemoize( - (state: RootState) => state.todos, - // @ts-expect-error - todos => todos.map(t => t.id), - { - memoizeOptions: [{ isPromise: false }], - argsMemoizeOptions: - // @ts-expect-error - (a, b) => a === b - } - ) + const selectorWeakMapSeparateInlineArgsWithMemoizeOptions5 = // @ts-expect-error createSelectorDefaultMemoize( @@ -283,7 +271,6 @@ function overrideOnlyArgsMemoizeInCreateSelector() { argsMemoize: weakMapMemoize, memoizeOptions: [{ isPromise: false }], argsMemoizeOptions: [] - // argsMemoizeOptions: (a, b) => a === b } ) const selectorWeakMapSeparateInlineArgsWithMemoizeOptions6 = @@ -686,22 +673,13 @@ function overrideMemoizeAndArgsMemoizeInCreateSelector() { argsMemoizeOptions: [{ isPromise: false }] // This field causes a type error since it does not match the options param of `defaultMemoize`. } ) - const selectorMicroMemoizePartiallyOverridden2 = - createSelectorMicroMemoize( - (state: RootState) => state.todos, - todos => todos.map(t => t.id), - { - // memoizeOptions: [ - // { - // equalityCheck: - // // @ts-expect-error - // (a, b) => a === b, - // maxSize: 2 - // } - // ], - argsMemoizeOptions: [{ isPromise: false }] - } - ) + const selectorMicroMemoizePartiallyOverridden2 = createSelectorMicroMemoize( + (state: RootState) => state.todos, + todos => todos.map(t => t.id), + { + argsMemoizeOptions: [{ isPromise: false }] + } + ) const selectorDefaultParametric = createSelector( (state: RootState, id: number) => id, @@ -849,7 +827,7 @@ function memoizeAndArgsMemoizeInCreateSelectorCreator() { expectExactType( selectorMicroMemoizeArgsMemoizeOptionsFallbackToDefault.memoize ) - expectExactType( + expectExactType( selectorMicroMemoizeArgsMemoizeOptionsFallbackToDefault.argsMemoize ) diff --git a/typescript_test/test.ts b/typescript_test/test.ts index 7f674d320..90423639c 100644 --- a/typescript_test/test.ts +++ b/typescript_test/test.ts @@ -1157,6 +1157,7 @@ function createSelectorConfigOptions() { (state: StateAB) => state.b, (a, b) => a + b, { + memoize: defaultMemoize, memoizeOptions: (a, b) => a === b } ) @@ -1166,6 +1167,7 @@ function createSelectorConfigOptions() { (state: StateAB) => state.b, (a, b) => a + b, { + memoize: defaultMemoize, memoizeOptions: { equalityCheck: (a, b) => a === b } @@ -1177,6 +1179,7 @@ function createSelectorConfigOptions() { (state: StateAB) => state.b, (a, b) => a + b, { + memoize: defaultMemoize, memoizeOptions: [(a, b) => a === b] } ) @@ -1338,12 +1341,16 @@ function testInputSelectorWithUndefinedReturn() { const selector2: SelectorType = createSelector( ({ field }: Input) => field, args => 'test', - { memoizeOptions: { maxSize: 42 } } + { + memoize: defaultMemoize, + memoizeOptions: { maxSize: 42 } + } ) // Make sure inference of functions works... const selector3: SelectorType = createSelector(input, result) const selector4: SelectorType = createSelector(input, result, { + memoize: defaultMemoize, memoizeOptions: { maxSize: 42 } }) } diff --git a/yarn.lock b/yarn.lock index f873c194a..50b53803a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -357,7 +357,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -368,7 +368,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": version: 4.10.0 resolution: "@eslint-community/regexpp@npm:4.10.0" checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b @@ -719,7 +719,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.12": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -783,6 +783,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.5.0": + version: 7.5.6 + resolution: "@types/semver@npm:7.5.6" + checksum: 563a0120ec0efcc326567db2ed920d5d98346f3638b6324ea6b50222b96f02a8add3c51a916b6897b51523aad8ac227d21d3dcf8913559f1bfc6c15b14d23037 + languageName: node + linkType: hard + "@types/shelljs@npm:^0.8.11": version: 0.8.15 resolution: "@types/shelljs@npm:0.8.15" @@ -800,117 +807,138 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin-tslint@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/eslint-plugin-tslint@npm:5.1.0" +"@typescript-eslint/eslint-plugin-tslint@npm:^6": + version: 6.13.1 + resolution: "@typescript-eslint/eslint-plugin-tslint@npm:6.13.1" dependencies: - "@typescript-eslint/experimental-utils": 5.1.0 - lodash: ^4.17.21 + "@typescript-eslint/utils": 6.13.1 peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 tslint: ^5.0.0 || ^6.0.0 typescript: "*" - checksum: 50c19f842a2befcab5da8e8ab221dfcebcd759105eafa255b72e0433465337cafbbd635d8d4f02d51dfa513a4437cf7c284aa799839c1a865e946075d0fdc93d + checksum: 689b1e2799661fedcf1d4eb805f23dfe4f08a85ce036682ddec3e7b599ce8f560d4e813d43b3af901cfa94c0e67632ae3675d10e4315a497aa5ff08b407d1f3a languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.1.0" +"@typescript-eslint/eslint-plugin@npm:^6": + version: 6.13.1 + resolution: "@typescript-eslint/eslint-plugin@npm:6.13.1" dependencies: - "@typescript-eslint/experimental-utils": 5.1.0 - "@typescript-eslint/scope-manager": 5.1.0 - debug: ^4.3.2 - functional-red-black-tree: ^1.0.1 - ignore: ^5.1.8 - regexpp: ^3.2.0 - semver: ^7.3.5 - tsutils: ^3.21.0 + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.13.1 + "@typescript-eslint/type-utils": 6.13.1 + "@typescript-eslint/utils": 6.13.1 + "@typescript-eslint/visitor-keys": 6.13.1 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: dd27bec00920600c79047bac2ec061712a0134dd6bc27254a5829031271cc91518609a073c09338c0ff8ccc34a48df13c0d45a071d9b09e9f3d80be9e6e1f2e3 + checksum: 568093d76c200a8502047d74f29300110a59b9f2a5cbf995a6cbe419c803a7ec22220e9592a884401d2dde72c79346b4cc0ee393e7b422924ad4a8a2040af3b0 languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/experimental-utils@npm:5.1.0" +"@typescript-eslint/parser@npm:^6": + version: 6.13.1 + resolution: "@typescript-eslint/parser@npm:6.13.1" dependencies: - "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.1.0 - "@typescript-eslint/types": 5.1.0 - "@typescript-eslint/typescript-estree": 5.1.0 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 + "@typescript-eslint/scope-manager": 6.13.1 + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/typescript-estree": 6.13.1 + "@typescript-eslint/visitor-keys": 6.13.1 + debug: ^4.3.4 peerDependencies: - eslint: "*" - checksum: 84b7efdaf28dae1f9d786477e429234f9a06df6588b50d27aa561109594f745663cac0c89ee424c87792380b9c0a4f02b0ee7eaf9fda5930e8be584813fa1bfc + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 58b7fef6f2d02c8f4737f9908a8d335a20bee20dba648233a69f28e7b39237791d2b9fbb818e628dcc053ddf16507b161ace7f1139e093d72365f1270c426de3 languageName: node linkType: hard -"@typescript-eslint/parser@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/parser@npm:5.1.0" +"@typescript-eslint/scope-manager@npm:6.13.1": + version: 6.13.1 + resolution: "@typescript-eslint/scope-manager@npm:6.13.1" dependencies: - "@typescript-eslint/scope-manager": 5.1.0 - "@typescript-eslint/types": 5.1.0 - "@typescript-eslint/typescript-estree": 5.1.0 - debug: ^4.3.2 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: c9479ae0333171e0583dc77b2e8d18ac0bf7955b2c7c11337b16d8f5d57147e534b2616c7ea500e1e48b93193408fc8b8bbb0b81dcb8691eb20a1801980999de + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/visitor-keys": 6.13.1 + checksum: 109a213f82719e10f8c6a0168f2e105dc1369c7e0c075c1f30af137030fc866a3a585a77ff78a9a3538afc213061c8aedbb4462a91f26cbd90eefbab8b89ea10 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/scope-manager@npm:5.1.0" +"@typescript-eslint/type-utils@npm:6.13.1": + version: 6.13.1 + resolution: "@typescript-eslint/type-utils@npm:6.13.1" dependencies: - "@typescript-eslint/types": 5.1.0 - "@typescript-eslint/visitor-keys": 5.1.0 - checksum: c3dabf624e6266d846a9bdf471f1765fa46277e6ef01ddc8d89d48e292d99a0588010090be58a955ae5a5e28983d5058b6180cbf7ebd55e5b17e697a9cc254e6 + "@typescript-eslint/typescript-estree": 6.13.1 + "@typescript-eslint/utils": 6.13.1 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: e39d28dd2f3b47a26b4f6aa2c7a301bdd769ce9148d734be93441a813c3d1111eba1d655677355bba5519f3d4dbe93e4ff4e46830216b0302df0070bf7a80057 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/types@npm:5.1.0" - checksum: 9a65a3b0b26fe96346290be12aff6268c5e88dc6714477ea6eb3ad71641a9515649577a38efd1417abbc906baec1d44023491ec5bb9f54bd600f307d21d467a6 +"@typescript-eslint/types@npm:6.13.1": + version: 6.13.1 + resolution: "@typescript-eslint/types@npm:6.13.1" + checksum: bb1d52f1646bab9acd3ec874567ffbaaaf7fe4a5f79845bdacbfea46d15698e58d45797da05b08c23f9496a17229b7f2c1363d000fd89ce4e79874fd57ba1d4a languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.1.0" +"@typescript-eslint/typescript-estree@npm:6.13.1": + version: 6.13.1 + resolution: "@typescript-eslint/typescript-estree@npm:6.13.1" dependencies: - "@typescript-eslint/types": 5.1.0 - "@typescript-eslint/visitor-keys": 5.1.0 - debug: ^4.3.2 - globby: ^11.0.4 + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/visitor-keys": 6.13.1 + debug: ^4.3.4 + globby: ^11.1.0 is-glob: ^4.0.3 - semver: ^7.3.5 - tsutils: ^3.21.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 peerDependenciesMeta: typescript: optional: true - checksum: 6142a59ca16b4bcaab5cc9bd8ca8adc5e3f1aad01c1f4f11406bea2a358e4799daef6e337a1a852f670b5ad518e1c40fc0cdc3e1e077451ce5988fadbe7689bc + checksum: 09aa0f5cbd60e84df4f58f3d479be352549600b24dbefe75c686ea89252526c52c1c06ce1ae56c0405dd7337002e741c2ba02b71fb1caa3b94a740a70fcc8699 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.13.1": + version: 6.13.1 + resolution: "@typescript-eslint/utils@npm:6.13.1" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.13.1 + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/typescript-estree": 6.13.1 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 14f64840869c8755af4d287cfc74abc424dc139559e87ca1a8b0e850f4fa56311d99dfb61a43dd4433eae5914be12b4b3390e55de1f236dce6701830d17e31c9 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.1.0": - version: 5.1.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.1.0" +"@typescript-eslint/visitor-keys@npm:6.13.1": + version: 6.13.1 + resolution: "@typescript-eslint/visitor-keys@npm:6.13.1" dependencies: - "@typescript-eslint/types": 5.1.0 - eslint-visitor-keys: ^3.0.0 - checksum: 2f53b6909a91275959a37ff1ca84f27cc8fbfed7d8b14bbdf338135638541640cedd872853c9b69adc216053649b4eab2ca454cd08a734222bd8a52ffa6ddd77 + "@typescript-eslint/types": 6.13.1 + eslint-visitor-keys: ^3.4.1 + checksum: d15d362203a2fe995ea62a59d5b44c15c8fb1fb30ff59dd1542a980f75b3b62035303dfb781d83709921613f6ac8cc5bf57b70f6e20d820aec8b7911f07152e9 languageName: node linkType: hard @@ -2036,16 +2064,6 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - "eslint-scope@npm:^7.2.2": version: 7.2.2 resolution: "eslint-scope@npm:7.2.2" @@ -2056,25 +2074,7 @@ __metadata: languageName: node linkType: hard -"eslint-utils@npm:^3.0.0": - version: 3.0.0 - resolution: "eslint-utils@npm:3.0.0" - dependencies: - eslint-visitor-keys: ^2.0.0 - peerDependencies: - eslint: ">=5" - checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.0.0, eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 @@ -2158,13 +2158,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -2392,13 +2385,6 @@ __metadata: languageName: node linkType: hard -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f - languageName: node - linkType: hard - "functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" @@ -2528,7 +2514,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.3, globby@npm:^11.0.4": +"globby@npm:^11.0.3, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -2679,7 +2665,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.8, ignore@npm:^5.2.0": +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.0 resolution: "ignore@npm:5.3.0" checksum: 2736da6621f14ced652785cb05d86301a66d70248597537176612bd0c8630893564bd5f6421f8806b09e8472e75c591ef01672ab8059c07c6eb2c09cefe04bf9 @@ -4154,13 +4140,6 @@ __metadata: languageName: node linkType: hard -"regexpp@npm:^3.2.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -4199,14 +4178,15 @@ __metadata: "@types/react": ^18.2.38 "@types/react-dom": ^18.2.17 "@types/shelljs": ^0.8.11 - "@typescript-eslint/eslint-plugin": 5.1.0 - "@typescript-eslint/eslint-plugin-tslint": 5.1.0 - "@typescript-eslint/parser": 5.1.0 + "@typescript-eslint/eslint-plugin": ^6 + "@typescript-eslint/eslint-plugin-tslint": ^6 + "@typescript-eslint/parser": ^6 "@typescript/analyze-trace": ^0.10.1 eslint: ^8.0.1 eslint-plugin-react: ^7.26.1 eslint-plugin-typescript: 0.14.0 jsdom: ^23.0.0 + lodash: ^4.17.21 lodash.memoize: ^4.1.2 memoize-one: ^6.0.0 micro-memoize: ^4.0.9 @@ -4217,7 +4197,7 @@ __metadata: rimraf: ^3.0.2 shelljs: ^0.8.5 tsup: ^6.7.0 - typescript: ^4.9 + typescript: 5.2 vitest: ^0.34 languageName: unknown linkType: soft @@ -4457,7 +4437,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5": +"semver@npm:^7.3.5, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -4940,6 +4920,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + languageName: node + linkType: hard + "ts-interface-checker@npm:^0.1.9": version: 0.1.13 resolution: "ts-interface-checker@npm:0.1.13" @@ -4947,13 +4936,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - "tsup@npm:^6.7.0": version: 6.7.0 resolution: "tsup@npm:6.7.0" @@ -4990,17 +4972,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -5071,23 +5042,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.9": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" +"typescript@npm:5.2": + version: 5.2.2 + resolution: "typescript@npm:5.2.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c languageName: node linkType: hard -"typescript@patch:typescript@^4.9#~builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=701156" +"typescript@patch:typescript@5.2#~builtin": + version: 5.2.2 + resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=701156" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 + checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 languageName: node linkType: hard