diff --git a/packages/toolkit/.size-limit.js b/packages/toolkit/.size-limit.js index 458676495e..70f8386b54 100644 --- a/packages/toolkit/.size-limit.js +++ b/packages/toolkit/.size-limit.js @@ -19,30 +19,30 @@ function withRtkPath(suffix) { join(__dirname) ), new webpack.NormalModuleReplacementPlugin( - /rtk-query-react.esm.js/, + /rtk-query-react.modern.js/, (r) => { const old = r.request r.request = r.request.replace( - /rtk-query-react.esm.js$/, + /rtk-query-react.modern.js$/, `rtk-query-react.${suffix}` ) // console.log(old, '=>', r.request) } ), - new webpack.NormalModuleReplacementPlugin(/rtk-query.esm.js/, (r) => { + new webpack.NormalModuleReplacementPlugin(/rtk-query.modern.js/, (r) => { const old = r.request r.request = r.request.replace( - /rtk-query.esm.js$/, + /rtk-query.modern.js$/, `rtk-query.${suffix}` ) // console.log(old, '=>', r.request) }), new webpack.NormalModuleReplacementPlugin( - /redux-toolkit.esm.js$/, + /redux-toolkit.modern.js$/, (r) => { const old = r.request r.request = r.request.replace( - /redux-toolkit.esm.js$/, + /redux-toolkit.modern.js$/, `redux-toolkit.${suffix}` ) // console.log(old, '=>', r.request) @@ -69,29 +69,29 @@ const ignoreAll = [ module.exports = [ { name: `1. entry point: @reduxjs/toolkit`, - path: 'dist/redux-toolkit.esm.js', + path: 'dist/redux-toolkit.modern.js', }, { name: `1. entry point: @reduxjs/toolkit/query`, - path: 'dist/query/rtk-query.esm.js', + path: 'dist/query/rtk-query.modern.js', }, { name: `1. entry point: @reduxjs/toolkit/query/react`, - path: 'dist/query/react/rtk-query-react.esm.js', + path: 'dist/query/react/rtk-query-react.modern.js', }, { name: `2. entry point: @reduxjs/toolkit (without dependencies)`, - path: 'dist/redux-toolkit.esm.js', + path: 'dist/redux-toolkit.modern.js', ignore: ignoreAll, }, { name: `2. entry point: @reduxjs/toolkit/query (without dependencies)`, - path: 'dist/query/rtk-query.esm.js', + path: 'dist/query/rtk-query.modern.js', ignore: ignoreAll, }, { name: `2. entry point: @reduxjs/toolkit/query/react (without dependencies)`, - path: 'dist/query/react/rtk-query-react.esm.js', + path: 'dist/query/react/rtk-query-react.modern.js', ignore: ignoreAll, }, ] diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 2d1e48e666..683570c207 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -23,7 +23,7 @@ "access": "public" }, "main": "dist/index.js", - "module": "dist/redux-toolkit.esm.js", + "module": "dist/redux-toolkit.modern.js", "unpkg": "dist/redux-toolkit.umd.min.js", "types": "dist/index.d.ts", "devDependencies": { diff --git a/packages/toolkit/query/package.json b/packages/toolkit/query/package.json index 0abc176e05..f093468b90 100644 --- a/packages/toolkit/query/package.json +++ b/packages/toolkit/query/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "", "main": "../dist/query/index.js", - "module": "../dist/query/rtk-query.esm.js", + "module": "../dist/query/rtk-query.modern.js", "unpkg": "../dist/query/rtk-query.umd.min.js", "types": "../dist/query/index.d.ts", "author": "Mark Erikson ", diff --git a/packages/toolkit/query/react/package.json b/packages/toolkit/query/react/package.json index 664a7e3e95..69f96cec3b 100644 --- a/packages/toolkit/query/react/package.json +++ b/packages/toolkit/query/react/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "", "main": "../../dist/query/react/index.js", - "module": "../../dist/query/react/rtk-query-react.esm.js", + "module": "../../dist/query/react/rtk-query-react.modern.js", "unpkg": "../../dist/query/react/rtk-query-react.umd.min.js", "author": "Mark Erikson ", "license": "MIT", diff --git a/packages/toolkit/scripts/build.ts b/packages/toolkit/scripts/build.ts index c77391d79a..6a2effdf8d 100644 --- a/packages/toolkit/scripts/build.ts +++ b/packages/toolkit/scripts/build.ts @@ -36,28 +36,22 @@ const buildTargets: BuildOptions[] = [ { format: 'cjs', name: 'cjs.development', + target: 'es2018', minify: false, env: 'development', }, - { format: 'cjs', name: 'cjs.production.min', + target: 'es2018', minify: true, env: 'production', }, - // ESM, embedded `process`, ES5 syntax: typical Webpack dev - { - format: 'esm', - name: 'esm', - minify: false, - env: '', - }, // ESM, embedded `process`, ES2017 syntax: modern Webpack dev { format: 'esm', name: 'modern', - target: 'es2017', + target: 'es2018', minify: false, env: '', }, @@ -65,7 +59,7 @@ const buildTargets: BuildOptions[] = [ { format: 'esm', name: 'modern.development', - target: 'es2017', + target: 'es2018', minify: false, env: 'development', }, @@ -73,19 +67,21 @@ const buildTargets: BuildOptions[] = [ { format: 'esm', name: 'modern.production.min', - target: 'es2017', + target: 'es2018', minify: true, env: 'production', }, { format: 'umd', name: 'umd', + target: 'es2018', minify: false, env: 'development', }, { format: 'umd', name: 'umd.min', + target: 'es2018', minify: true, env: 'production', }, @@ -197,7 +193,7 @@ async function bundle(options: BuildOptions & EntryPointOptions) { const esVersion = target in esVersionMappings ? esVersionMappings[target] - : ts.ScriptTarget.ES5 + : ts.ScriptTarget.ES2017 const origin = chunk.text const sourcemap = extractInlineSourcemap(origin) diff --git a/packages/toolkit/scripts/types.ts b/packages/toolkit/scripts/types.ts index 31f2fbe9b9..cf0d8f889c 100644 --- a/packages/toolkit/scripts/types.ts +++ b/packages/toolkit/scripts/types.ts @@ -11,7 +11,7 @@ export interface BuildOptions { | 'umd.min' minify: boolean env: 'development' | 'production' | '' - target?: 'es2017' + target?: 'es2017' | 'es2018' | 'es2019' | 'es2020' } export interface EntryPointOptions { diff --git a/packages/toolkit/src/createReducer.ts b/packages/toolkit/src/createReducer.ts index 2ccb730864..dd749f398e 100644 --- a/packages/toolkit/src/createReducer.ts +++ b/packages/toolkit/src/createReducer.ts @@ -151,91 +151,20 @@ export function createReducer>( builderCallback: (builder: ActionReducerMapBuilder) => void ): ReducerWithInitialState -/** - * A utility function that allows defining a reducer as a mapping from action - * type to *case reducer* functions that handle these action types. The - * reducer's initial state is passed as the first argument. - * - * The body of every case reducer is implicitly wrapped with a call to - * `produce()` from the [immer](https://github.com/mweststrate/immer) library. - * This means that rather than returning a new state object, you can also - * mutate the passed-in state object directly; these mutations will then be - * automatically and efficiently translated into copies, giving you both - * convenience and immutability. - * - * @overloadSummary - * This overload accepts an object where the keys are string action types, and the values - * are case reducer functions to handle those action types. - * - * @param initialState - `State | (() => State)`: The initial state that should be used when the reducer is called the first time. This may also be a "lazy initializer" function, which should return an initial state value when called. This will be used whenever the reducer is called with `undefined` as its state value, and is primarily useful for cases like reading initial state from `localStorage`. - * @param actionsMap - An object mapping from action types to _case reducers_, each of which handles one specific action type. - * @param actionMatchers - An array of matcher definitions in the form `{matcher, reducer}`. - * All matching reducers will be executed in order, independently if a case reducer matched or not. - * @param defaultCaseReducer - A "default case" reducer that is executed if no case reducer and no matcher - * reducer was executed for this action. - * - * @example -```js -const counterReducer = createReducer(0, { - increment: (state, action) => state + action.payload, - decrement: (state, action) => state - action.payload -}) - -// Alternately, use a "lazy initializer" to provide the initial state -// (works with either form of createReducer) -const initialState = () => 0 -const counterReducer = createReducer(initialState, { - increment: (state, action) => state + action.payload, - decrement: (state, action) => state - action.payload -}) -``` - - * Action creators that were generated using [`createAction`](./createAction) may be used directly as the keys here, using computed property syntax: - -```js -const increment = createAction('increment') -const decrement = createAction('decrement') - -const counterReducer = createReducer(0, { - [increment]: (state, action) => state + action.payload, - [decrement.type]: (state, action) => state - action.payload -}) -``` - * @public - */ -export function createReducer< - S extends NotFunction, - CR extends CaseReducers = CaseReducers ->( - initialState: S | (() => S), - actionsMap: CR, - actionMatchers?: ActionMatcherDescriptionCollection, - defaultCaseReducer?: CaseReducer -): ReducerWithInitialState - export function createReducer>( initialState: S | (() => S), - mapOrBuilderCallback: - | CaseReducers - | ((builder: ActionReducerMapBuilder) => void), - actionMatchers: ReadonlyActionMatcherDescriptionCollection = [], - defaultCaseReducer?: CaseReducer + mapOrBuilderCallback: (builder: ActionReducerMapBuilder) => void ): ReducerWithInitialState { if (process.env.NODE_ENV !== 'production') { if (typeof mapOrBuilderCallback === 'object') { - if (!hasWarnedAboutObjectNotation) { - hasWarnedAboutObjectNotation = true - console.warn( - "The object notation for `createReducer` is deprecated, and will be removed in RTK 2.0. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createReducer" - ) - } + throw new Error( + "The object notation for `createReducer` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createReducer" + ) } } let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = - typeof mapOrBuilderCallback === 'function' - ? executeReducerBuilderCallback(mapOrBuilderCallback) - : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer] + executeReducerBuilderCallback(mapOrBuilderCallback) // Ensure the initial state gets frozen either way (if draftable) let getInitialState: () => S diff --git a/packages/toolkit/src/createSlice.ts b/packages/toolkit/src/createSlice.ts index 8406a5b98e..b9d3fd0d0f 100644 --- a/packages/toolkit/src/createSlice.ts +++ b/packages/toolkit/src/createSlice.ts @@ -141,9 +141,7 @@ createSlice({ }) ``` */ - extraReducers?: - | CaseReducers, any> - | ((builder: ActionReducerMapBuilder>) => void) + extraReducers?: (builder: ActionReducerMapBuilder>) => void } /** @@ -330,12 +328,9 @@ export function createSlice< function buildReducer() { if (process.env.NODE_ENV !== 'production') { if (typeof options.extraReducers === 'object') { - if (!hasWarnedAboutObjectNotation) { - hasWarnedAboutObjectNotation = true - console.warn( - "The object notation for `createSlice.extraReducers` is deprecated, and will be removed in RTK 2.0. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createSlice" - ) - } + throw new Error( + "The object notation for `createSlice.extraReducers` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createSlice" + ) } } const [ diff --git a/packages/toolkit/src/index.ts b/packages/toolkit/src/index.ts index 24501035d2..61b9af0b5e 100644 --- a/packages/toolkit/src/index.ts +++ b/packages/toolkit/src/index.ts @@ -1,4 +1,3 @@ -import { enableES5 } from 'immer' export * from 'redux' export { default as createNextState, @@ -18,12 +17,6 @@ export type { export { createDraftSafeSelector } from './createDraftSafeSelector' export type { ThunkAction, ThunkDispatch, ThunkMiddleware } from 'redux-thunk' -// We deliberately enable Immer's ES5 support, on the grounds that -// we assume RTK will be used with React Native and other Proxy-less -// environments. In addition, that's how Immer 4 behaved, and since -// we want to ship this in an RTK minor, we should keep the same behavior. -enableES5() - export { // js configureStore, diff --git a/packages/toolkit/src/tests/createReducer.test.ts b/packages/toolkit/src/tests/createReducer.test.ts index 5c3a181168..078f26618c 100644 --- a/packages/toolkit/src/tests/createReducer.test.ts +++ b/packages/toolkit/src/tests/createReducer.test.ts @@ -27,11 +27,14 @@ interface ToggleTodoPayload { type TodoState = Todo[] type TodosReducer = Reducer> -type AddTodoReducer = CaseReducer> +type AddTodoReducer = CaseReducer< + TodoState, + PayloadAction +> type ToggleTodoReducer = CaseReducer< TodoState, - PayloadAction + PayloadAction > type CreateReducer = typeof createReducer @@ -58,9 +61,8 @@ describe('createReducer', () => { todo.completed = !todo.completed } - const todosReducer = createReducer([] as TodoState, { - ADD_TODO: addTodo, - TOGGLE_TODO: toggleTodo, + const todosReducer = createReducer([] as TodoState, (builder) => { + builder.addCase('ADD_TODO', addTodo).addCase('TOGGLE_TODO', toggleTodo) }) behavesLikeReducer(todosReducer) @@ -77,25 +79,31 @@ describe('createReducer', () => { process.env.NODE_ENV = originalNodeEnv }) - it('Warns about object notation deprecation, once', () => { + it('Throws an error if the legacy object notation is used', () => { const { createReducer } = require('../createReducer') - let dummyReducer = (createReducer as CreateReducer)([] as TodoState, {}) + const wrapper = () => { + // @ts-ignore + let dummyReducer = (createReducer as CreateReducer)([] as TodoState, {}) + } - expect(getLog().levels.warn).toMatch( - /The object notation for `createReducer` is deprecated/ + expect(wrapper).toThrowError( + /The object notation for `createReducer` has been removed/ ) - restore = mockConsole(createConsole()) - dummyReducer = (createReducer as CreateReducer)([] as TodoState, {}) - expect(getLog().levels.warn).toBe('') + expect(wrapper).toThrowError( + /The object notation for `createReducer` has been removed/ + ) }) - it('Does not warn in production', () => { + it('Crashes in production', () => { process.env.NODE_ENV = 'production' const { createReducer } = require('../createReducer') - let dummyReducer = (createReducer as CreateReducer)([] as TodoState, {}) + const wrapper = () => { + // @ts-ignore + let dummyReducer = (createReducer as CreateReducer)([] as TodoState, {}) + } - expect(getLog().levels.warn).toBe('') + expect(wrapper).toThrowError() }) }) @@ -112,7 +120,8 @@ describe('createReducer', () => { }) test('Freezes data in production', () => { - const { createReducer } = require('../createReducer') + const createReducer: CreateReducer = + require('../createReducer').createReducer const addTodo: AddTodoReducer = (state, action) => { const { newTodo } = action.payload state.push({ ...newTodo, completed: false }) @@ -124,9 +133,8 @@ describe('createReducer', () => { todo.completed = !todo.completed } - const todosReducer = createReducer([] as TodoState, { - ADD_TODO: addTodo, - TOGGLE_TODO: toggleTodo, + const todosReducer = createReducer([] as TodoState, (builder) => { + builder.addCase('ADD_TODO', addTodo).addCase('TOGGLE_TODO', toggleTodo) }) const result = todosReducer([], { @@ -142,7 +150,7 @@ describe('createReducer', () => { test('Freezes initial state', () => { const initialState = [{ text: 'Buy milk' }] - const todosReducer = createReducer(initialState, {}) + const todosReducer = createReducer(initialState, () => {}) const frozenInitialState = todosReducer(undefined, { type: 'dummy' }) const mutateStateOutsideReducer = () => @@ -152,7 +160,9 @@ describe('createReducer', () => { ) }) test('does not throw error if initial state is not draftable', () => { - expect(() => createReducer(new URLSearchParams(), {})).not.toThrowError() + expect(() => + createReducer(new URLSearchParams(), () => {}) + ).not.toThrowError() }) }) @@ -174,9 +184,8 @@ describe('createReducer', () => { }) } - const todosReducer = createReducer([] as TodoState, { - ADD_TODO: addTodo, - TOGGLE_TODO: toggleTodo, + const todosReducer = createReducer([] as TodoState, (builder) => { + builder.addCase('ADD_TODO', addTodo).addCase('TOGGLE_TODO', toggleTodo) }) behavesLikeReducer(todosReducer) @@ -196,9 +205,8 @@ describe('createReducer', () => { const lazyStateInit = () => [] as TodoState - const todosReducer = createReducer(lazyStateInit, { - ADD_TODO: addTodo, - TOGGLE_TODO: toggleTodo, + const todosReducer = createReducer([] as TodoState, (builder) => { + builder.addCase('ADD_TODO', addTodo).addCase('TOGGLE_TODO', toggleTodo) }) behavesLikeReducer(todosReducer) @@ -206,7 +214,7 @@ describe('createReducer', () => { it('Should only call the init function when `undefined` state is passed in', () => { const spy = jest.fn().mockReturnValue(42) - const dummyReducer = createReducer(spy, {}) + const dummyReducer = createReducer(spy, () => {}) expect(spy).not.toHaveBeenCalled() dummyReducer(123, { type: 'dummy' }) @@ -233,9 +241,8 @@ describe('createReducer', () => { todo.completed = !todo.completed } - const todosReducer = createReducer([] as TodoState, { - ADD_TODO: addTodo, - TOGGLE_TODO: toggleTodo, + const todosReducer = createReducer([] as TodoState, (builder) => { + builder.addCase('ADD_TODO', addTodo).addCase('TOGGLE_TODO', toggleTodo) }) const wrappedReducer: TodosReducer = (state = [], action) => { @@ -247,120 +254,6 @@ describe('createReducer', () => { behavesLikeReducer(wrappedReducer) }) - describe('actionMatchers argument', () => { - const prepareNumberAction = (payload: number) => ({ - payload, - meta: { type: 'number_action' }, - }) - const prepareStringAction = (payload: string) => ({ - payload, - meta: { type: 'string_action' }, - }) - - const numberActionMatcher = (a: AnyAction): a is PayloadAction => - a.meta && a.meta.type === 'number_action' - const stringActionMatcher = (a: AnyAction): a is PayloadAction => - a.meta && a.meta.type === 'string_action' - - const incrementBy = createAction('increment', prepareNumberAction) - const decrementBy = createAction('decrement', prepareNumberAction) - const concatWith = createAction('concat', prepareStringAction) - - const initialState = { numberActions: 0, stringActions: 0 } - const numberActionsCounter = { - matcher: numberActionMatcher, - reducer(state: typeof initialState) { - state.numberActions = state.numberActions * 10 + 1 - }, - } - const stringActionsCounter = { - matcher: stringActionMatcher, - reducer(state: typeof initialState) { - state.stringActions = state.stringActions * 10 + 1 - }, - } - - test('uses the reducer of matching actionMatchers', () => { - const reducer = createReducer(initialState, {}, [ - numberActionsCounter, - stringActionsCounter, - ]) - expect(reducer(undefined, incrementBy(1))).toEqual({ - numberActions: 1, - stringActions: 0, - }) - expect(reducer(undefined, decrementBy(1))).toEqual({ - numberActions: 1, - stringActions: 0, - }) - expect(reducer(undefined, concatWith('foo'))).toEqual({ - numberActions: 0, - stringActions: 1, - }) - }) - test('fallback to default case', () => { - const reducer = createReducer( - initialState, - {}, - [numberActionsCounter, stringActionsCounter], - (state) => { - state.numberActions = -1 - state.stringActions = -1 - } - ) - expect(reducer(undefined, { type: 'somethingElse' })).toEqual({ - numberActions: -1, - stringActions: -1, - }) - }) - test('runs reducer cases followed by all matching actionMatchers', () => { - const reducer = createReducer( - initialState, - { - [incrementBy.type](state) { - state.numberActions = state.numberActions * 10 + 2 - }, - }, - [ - { - matcher: numberActionMatcher, - reducer(state) { - state.numberActions = state.numberActions * 10 + 3 - }, - }, - numberActionsCounter, - stringActionsCounter, - ] - ) - expect(reducer(undefined, incrementBy(1))).toEqual({ - numberActions: 231, - stringActions: 0, - }) - expect(reducer(undefined, decrementBy(1))).toEqual({ - numberActions: 31, - stringActions: 0, - }) - expect(reducer(undefined, concatWith('foo'))).toEqual({ - numberActions: 0, - stringActions: 1, - }) - }) - test('works with `actionCreator.match`', () => { - const reducer = createReducer(initialState, {}, [ - { - matcher: incrementBy.match, - reducer(state) { - state.numberActions += 100 - }, - }, - ]) - expect(reducer(undefined, incrementBy(1))).toEqual({ - numberActions: 100, - stringActions: 0, - }) - }) - }) - describe('alternative builder callback for actionMap', () => { const increment = createAction('increment') const decrement = createAction('decrement') diff --git a/packages/toolkit/src/tests/createReducer.typetest.ts b/packages/toolkit/src/tests/createReducer.typetest.ts index 6e4b3e1520..bcfb885025 100644 --- a/packages/toolkit/src/tests/createReducer.typetest.ts +++ b/packages/toolkit/src/tests/createReducer.typetest.ts @@ -7,16 +7,19 @@ import { expectType } from './helpers' * Test: createReducer() infers type of returned reducer. */ { - type CounterAction = - | { type: 'increment'; payload: number } - | { type: 'decrement'; payload: number } + const incrementHandler = ( + state: number, + action: { type: 'increment'; payload: number } + ) => state + 1 + const decrementHandler = ( + state: number, + action: { type: 'decrement'; payload: number } + ) => state - 1 - const incrementHandler = (state: number, action: CounterAction) => state + 1 - const decrementHandler = (state: number, action: CounterAction) => state - 1 - - const reducer = createReducer(0 as number, { - increment: incrementHandler, - decrement: decrementHandler, + const reducer = createReducer(0 as number, (builder) => { + builder + .addCase('increment', incrementHandler) + .addCase('decrement', decrementHandler) }) const numberReducer: Reducer = reducer @@ -29,25 +32,28 @@ import { expectType } from './helpers' * Test: createReducer() state type can be specified expliclity. */ { - type CounterAction = - | { type: 'increment'; payload: number } - | { type: 'decrement'; payload: number } - - const incrementHandler = (state: number, action: CounterAction) => - state + action.payload + const incrementHandler = ( + state: number, + action: { type: 'increment'; payload: number } + ) => state + action.payload - const decrementHandler = (state: number, action: CounterAction) => - state - action.payload + const decrementHandler = ( + state: number, + action: { type: 'decrement'; payload: number } + ) => state - action.payload - createReducer(0, { - increment: incrementHandler, - decrement: decrementHandler, + createReducer(0 as number, (builder) => { + builder + .addCase('increment', incrementHandler) + .addCase('decrement', decrementHandler) }) // @ts-expect-error - createReducer(0, { - increment: incrementHandler, - decrement: decrementHandler, + createReducer(0 as number, (builder) => { + // @ts-expect-error + builder + .addCase('increment', incrementHandler) + .addCase('decrement', decrementHandler) }) } @@ -57,10 +63,10 @@ import { expectType } from './helpers' { const initialState: { readonly counter: number } = { counter: 0 } - createReducer(initialState, { - increment: (state) => { + createReducer(initialState, (builder) => { + builder.addCase('increment', (state) => { state.counter += 1 - }, + }) }) } diff --git a/packages/toolkit/src/tests/createSlice.test.ts b/packages/toolkit/src/tests/createSlice.test.ts index bea220ba6a..8cbe39340a 100644 --- a/packages/toolkit/src/tests/createSlice.test.ts +++ b/packages/toolkit/src/tests/createSlice.test.ts @@ -183,9 +183,13 @@ describe('createSlice', () => { increment: (state) => state + 1, multiply: (state, action) => state * action.payload, }, - extraReducers: { - [addMore.type]: (state, action) => state + action.payload.amount, + extraReducers: (builder) => { + builder.addCase( + addMore, + (state, action) => state + action.payload.amount + ) }, + initialState: 0, }) @@ -372,7 +376,7 @@ describe('createSlice', () => { }) }) - describe.only('Deprecation warnings', () => { + describe('Deprecation warnings', () => { let originalNodeEnv = process.env.NODE_ENV beforeEach(() => { @@ -385,7 +389,7 @@ describe('createSlice', () => { }) // NOTE: This needs to be in front of the later `createReducer` call to check the one-time warning - it('Warns about object notation deprecation, once', () => { + it('Throws an error if the legacy object notation is used', () => { const { createSlice } = require('../createSlice') let dummySlice = (createSlice as CreateSlice)({ @@ -393,32 +397,37 @@ describe('createSlice', () => { initialState: [], reducers: {}, extraReducers: { + // @ts-ignore a: () => [], }, }) + let reducer: any // Have to trigger the lazy creation - let { reducer } = dummySlice - reducer(undefined, { type: 'dummy' }) + const wrapper = () => { + reducer = dummySlice.reducer + reducer(undefined, { type: 'dummy' }) + } - expect(getLog().levels.warn).toMatch( - /The object notation for `createSlice.extraReducers` is deprecated/ + expect(wrapper).toThrowError( + /The object notation for `createSlice.extraReducers` has been removed/ ) - restore = mockConsole(createConsole()) dummySlice = (createSlice as CreateSlice)({ name: 'dummy', initialState: [], reducers: {}, extraReducers: { + // @ts-ignore a: () => [], }, }) - reducer = dummySlice.reducer - reducer(undefined, { type: 'dummy' }) - expect(getLog().levels.warn).toBe('') + expect(wrapper).toThrowError( + /The object notation for `createSlice.extraReducers` has been removed/ + ) }) - it('Does not warn in production', () => { + // TODO Determine final production behavior here + it.skip('Crashes in production', () => { process.env.NODE_ENV = 'production' const { createSlice } = require('../createSlice') @@ -426,9 +435,17 @@ describe('createSlice', () => { name: 'dummy', initialState: [], reducers: {}, + // @ts-ignore extraReducers: {}, }) - expect(getLog().levels.warn).toBe('') + const wrapper = () => { + let reducer = dummySlice.reducer + reducer(undefined, { type: 'dummy' }) + } + + expect(wrapper).toThrowError( + /The object notation for `createSlice.extraReducers` has been removed/ + ) }) }) })