diff --git a/.babelrc.js b/.babelrc.js index c77ebd6..1977f41 100644 --- a/.babelrc.js +++ b/.babelrc.js @@ -7,13 +7,13 @@ export default { '@babel/preset-env', { targets: { - ie: 11 + ie: 11, }, loose: true, - modules: cjs ? 'cjs' : false - } + modules: cjs ? 'cjs' : false, + }, ], - '@babel/preset-typescript' + '@babel/preset-typescript', ], - plugins: [cjs && ['@babel/transform-modules-commonjs']].filter(Boolean) + plugins: [cjs && ['@babel/transform-modules-commonjs']].filter(Boolean), } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a09cd88..da41d4f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -145,7 +145,7 @@ jobs: 'node-standard', 'node-esm', 'react-native', - 'expo' + 'expo', ] steps: - name: Checkout repo diff --git a/.prettierrc.json b/.prettierrc.json index e7bcdcc..60cbbf2 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,6 +2,5 @@ "semi": false, "singleQuote": true, "tabWidth": 2, - "trailingComma": "none", "arrowParens": "avoid" } diff --git a/README.md b/README.md index e3c5a3b..c09e789 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ import filtersReducer from './features/filters/filtersSlice' const store = configureStore({ reducer: { todos: todosReducer, - filters: filtersReducer - } + filters: filtersReducer, + }, }) // The thunk middleware was automatically added @@ -86,9 +86,9 @@ const store = configureStore({ middleware: getDefaultMiddleware => getDefaultMiddleware({ thunk: { - extraArgument: myCustomApiService - } - }) + extraArgument: myCustomApiService, + }, + }), }) // later @@ -110,10 +110,10 @@ const store = configureStore({ thunk: { extraArgument: { api: myCustomApiService, - otherValue: 42 - } - } - }) + otherValue: 42, + }, + }, + }), }) // later @@ -188,7 +188,7 @@ const INCREMENT_COUNTER = 'INCREMENT_COUNTER' function increment() { return { - type: INCREMENT_COUNTER + type: INCREMENT_COUNTER, } } @@ -264,7 +264,7 @@ function makeASandwich(forPerson, secretSauce) { return { type: 'MAKE_SANDWICH', forPerson, - secretSauce + secretSauce, } } @@ -273,14 +273,14 @@ function apologize(fromPerson, toPerson, error) { type: 'APOLOGIZE', fromPerson, toPerson, - error + error, } } function withdrawMoney(amount) { return { type: 'WITHDRAW', - amount + amount, } } @@ -302,7 +302,7 @@ function makeASandwichWithSecretSauce(forPerson) { return function (dispatch) { return fetchSecretSauce().then( sauce => dispatch(makeASandwich(forPerson, sauce)), - error => dispatch(apologize('The Sandwich Shop', forPerson, error)) + error => dispatch(apologize('The Sandwich Shop', forPerson, error)), ) } } @@ -339,16 +339,16 @@ function makeSandwichesForEverybody() { .then(() => Promise.all([ dispatch(makeASandwichWithSecretSauce('Me')), - dispatch(makeASandwichWithSecretSauce('My wife')) - ]) + dispatch(makeASandwichWithSecretSauce('My wife')), + ]), ) .then(() => dispatch(makeASandwichWithSecretSauce('Our kids'))) .then(() => dispatch( getState().myMoney > 42 ? withdrawMoney(42) - : apologize('Me', 'The Sandwich Shop') - ) + : apologize('Me', 'The Sandwich Shop'), + ), ) } } @@ -359,7 +359,7 @@ function makeSandwichesForEverybody() { store .dispatch(makeSandwichesForEverybody()) .then(() => - response.send(ReactDOMServer.renderToString()) + response.send(ReactDOMServer.renderToString()), ) // I can also dispatch a thunk async action from a component @@ -385,7 +385,7 @@ class SandwichShop extends Component { } export default connect(state => ({ - sandwiches: state.sandwiches + sandwiches: state.sandwiches, }))(SandwichShop) ``` diff --git a/package.json b/package.json index 519af46..23f4c0d 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "cross-env": "^7.0.3", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", - "prettier": "^2.4.1", + "prettier": "^3.3.3", "redux": "^5", "rimraf": "^3.0.2", "tsup": "7.0.0", diff --git a/src/index.ts b/src/index.ts index 63baac1..9ba74ce 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,7 @@ export type { ThunkAction, ThunkActionDispatch, ThunkDispatch, - ThunkMiddleware + ThunkMiddleware, } from './types' /** A function that accepts a potential "extra argument" value to be injected later, @@ -14,7 +14,7 @@ export type { function createThunkMiddleware< State = any, BasicAction extends Action = AnyAction, - ExtraThunkArg = undefined + ExtraThunkArg = undefined, >(extraArgument?: ExtraThunkArg) { // Standard Redux middleware definition pattern: // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware diff --git a/src/types.ts b/src/types.ts index 973e4ac..41a01c7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -14,14 +14,14 @@ import type { Action, AnyAction, Middleware } from 'redux' export interface ThunkDispatch< State, ExtraThunkArg, - BasicAction extends Action + BasicAction extends Action, > { // When the thunk middleware is added, `store.dispatch` now has three overloads (NOTE: the order here matters for correct behavior and is very fragile - do not reorder these!): // 1) The specific thunk function overload /** Accepts a thunk function, runs it, and returns whatever the thunk itself returns */ ( - thunkAction: ThunkAction + thunkAction: ThunkAction, ): ReturnType // 2) The base overload. @@ -32,7 +32,7 @@ export interface ThunkDispatch< // with TS inference ( see https://github.com/microsoft/TypeScript/issues/14107 ) /** A union of the other two overloads for TS inference purposes */ ( - action: Action | ThunkAction + action: Action | ThunkAction, ): Action | ReturnType } @@ -53,11 +53,11 @@ export type ThunkAction< ReturnType, State, ExtraThunkArg, - BasicAction extends Action + BasicAction extends Action, > = ( dispatch: ThunkDispatch, getState: () => State, - extraArgument: ExtraThunkArg + extraArgument: ExtraThunkArg, ) => ReturnType /** @@ -69,7 +69,7 @@ export type ThunkAction< * @template ActionCreator Thunk action creator to be wrapped */ export type ThunkActionDispatch< - ActionCreator extends (...args: any[]) => ThunkAction + ActionCreator extends (...args: any[]) => ThunkAction, > = ( ...args: Parameters ) => ReturnType> @@ -83,7 +83,7 @@ export type ThunkActionDispatch< export type ThunkMiddleware< State = any, BasicAction extends Action = AnyAction, - ExtraThunkArg = undefined + ExtraThunkArg = undefined, > = Middleware< ThunkDispatch, State, diff --git a/test/index.test.ts b/test/index.test.ts index 15b403d..1c22a62 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -5,7 +5,7 @@ describe('thunk middleware', () => { const doGetState = () => 42 const nextHandler = thunkMiddleware({ dispatch: doDispatch, - getState: doGetState + getState: doGetState, }) it('must return a function to handle next', () => { @@ -90,7 +90,7 @@ describe('thunk middleware', () => { // @ts-ignore withExtraArgument(extraArg)({ dispatch: doDispatch, - getState: doGetState + getState: doGetState, })()((dispatch: any, getState: any, arg: any) => { expect(dispatch).toBe(doDispatch) expect(getState).toBe(doGetState) diff --git a/tsup.config.ts b/tsup.config.ts index dbdf49a..ab0cc83 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -4,10 +4,10 @@ import { defineConfig } from 'tsup' export default defineConfig(options => { const commonOptions: Partial = { entry: { - 'redux-thunk': 'src/index.ts' + 'redux-thunk': 'src/index.ts', }, tsconfig: 'tsconfig.build.json', - ...options + ...options, } return [ @@ -16,7 +16,7 @@ export default defineConfig(options => { format: ['esm'], outExtension: () => ({ js: '.mjs' }), dts: true, - clean: true + clean: true, }, // Support Webpack 4 by pointing `"module"` to a file with a `.js` extension { @@ -25,13 +25,13 @@ export default defineConfig(options => { target: 'es2017', dts: false, outExtension: () => ({ js: '.js' }), - entry: { 'redux-thunk.legacy-esm': 'src/index.ts' } + entry: { 'redux-thunk.legacy-esm': 'src/index.ts' }, }, { ...commonOptions, format: 'cjs', outDir: './dist/cjs/', - outExtension: () => ({ js: '.cjs' }) - } + outExtension: () => ({ js: '.cjs' }), + }, ] }) diff --git a/typescript_test/index.test-d.ts b/typescript_test/index.test-d.ts index 5a7b112..697bc48 100644 --- a/typescript_test/index.test-d.ts +++ b/typescript_test/index.test-d.ts @@ -5,7 +5,7 @@ import type { ThunkAction, ThunkActionDispatch, ThunkDispatch, - ThunkMiddleware + ThunkMiddleware, } from 'redux-thunk' import { thunk, withExtraArgument } from 'redux-thunk' @@ -19,7 +19,7 @@ describe('type tests', () => { type ThunkResult = ThunkAction const initialState: State = { - foo: 'foo' + foo: 'foo', } function fakeReducer(state: State = initialState): State { @@ -28,7 +28,7 @@ describe('type tests', () => { const store = createStore( fakeReducer, - applyMiddleware(thunk as ThunkMiddleware) + applyMiddleware(thunk as ThunkMiddleware), ) function anotherThunkAction(): ThunkResult { @@ -89,7 +89,7 @@ describe('type tests', () => { const dispatch: ThunkDispatch = undefined as any function dispatchWrap( - action: Action | ThunkAction + action: Action | ThunkAction, ) { // Should not have an error here thanks to the extra union overload expectTypeOf(dispatch).toBeCallableWith(action) @@ -100,8 +100,8 @@ describe('type tests', () => { const storeThunkArg = createStore( fakeReducer, applyMiddleware( - withExtraArgument('bar') as ThunkMiddleware - ) + withExtraArgument('bar') as ThunkMiddleware, + ), ) expectTypeOf(storeThunkArg.dispatch).toBeCallableWith({ type: 'FOO' }) @@ -123,20 +123,20 @@ describe('type tests', () => { test('call dispatch async with any action', () => {}) const callDispatchAsync_anyAction = ( - dispatch: ThunkDispatch + dispatch: ThunkDispatch, ) => { const asyncThunk = (): ThunkResult> => () => - ({} as Promise) + ({}) as Promise expectTypeOf(dispatch).toBeCallableWith(asyncThunk()) } test('call dispatch async with specific actions', () => { const callDispatchAsync_specificActions = ( - dispatch: ThunkDispatch + dispatch: ThunkDispatch, ) => { const asyncThunk = (): ThunkResult> => () => - ({} as Promise) + ({}) as Promise expectTypeOf(dispatch).toBeCallableWith(asyncThunk()) } @@ -144,9 +144,9 @@ describe('type tests', () => { test('call dispatch any', () => { const callDispatchAny = ( - dispatch: ThunkDispatch + dispatch: ThunkDispatch, ) => { - const asyncThunk = (): any => () => ({} as Promise) + const asyncThunk = (): any => () => ({}) as Promise dispatch(asyncThunk()) // result is any .then(() => console.log('done')) @@ -176,9 +176,9 @@ describe('type tests', () => { { anotherThunkAction, promiseThunkAction, - standardAction + standardAction, }, - store.dispatch + store.dispatch, ) expectTypeOf(actions.anotherThunkAction()).toBeString() diff --git a/vitest.config.mts b/vitest.config.mts index 43fbe0c..943f443 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -6,11 +6,11 @@ export default defineConfig({ alias: { 'redux-thunk': new URL( process.env.TEST_DIST ? 'node_modules/redux-thunk' : 'src/index.ts', - import.meta.url + import.meta.url, ).pathname, // this mapping is disabled as we want `dist` imports in the tests only to be used for "type-only" imports which don't play a role for jest - '@internal': new URL('src', import.meta.url).pathname - } - } + '@internal': new URL('src', import.meta.url).pathname, + }, + }, }) diff --git a/yarn.lock b/yarn.lock index 49838c8..4bd9605 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2842,12 +2842,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.4.1": - version: 2.8.7 - resolution: "prettier@npm:2.8.7" +"prettier@npm:^3.3.3": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" bin: - prettier: bin-prettier.js - checksum: 10/5d5acc2015dcd9ae4033c0ea3189820920149137100750c897d384bc9058c79c78af94ca892f3bc7c5b6da0661a50357e8eb9eb455c4c1da156b1d0757f54a8a + prettier: bin/prettier.cjs + checksum: 10/5beac1f30b5b40162532b8e2f7c3a4eb650910a2695e9c8512a62ffdc09dae93190c29db9107fa7f26d1b6c71aad3628ecb9b5de1ecb0911191099be109434d7 languageName: node linkType: hard @@ -2937,7 +2937,7 @@ __metadata: cross-env: "npm:^7.0.3" eslint: "npm:^7.32.0" eslint-config-prettier: "npm:^8.3.0" - prettier: "npm:^2.4.1" + prettier: "npm:^3.3.3" redux: "npm:^5" rimraf: "npm:^3.0.2" tsup: "npm:7.0.0"