From a91fe1db91b76ae260d430e3df0027663ffa3354 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 14 Mar 2022 13:43:18 -0500 Subject: [PATCH 1/8] configureStore: typescript conversion --- app/soapbox/store/configureStore.js | 14 -------------- app/soapbox/store/configureStore.ts | 20 ++++++++++++++++++++ package.json | 2 ++ yarn.lock | 24 +++++++++++++++++++++++- 4 files changed, 45 insertions(+), 15 deletions(-) delete mode 100644 app/soapbox/store/configureStore.js create mode 100644 app/soapbox/store/configureStore.ts diff --git a/app/soapbox/store/configureStore.js b/app/soapbox/store/configureStore.js deleted file mode 100644 index 2c094c4a4..000000000 --- a/app/soapbox/store/configureStore.js +++ /dev/null @@ -1,14 +0,0 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; - -import errorsMiddleware from '../middleware/errors'; -import soundsMiddleware from '../middleware/sounds'; -import appReducer from '../reducers'; - -export default function configureStore() { - return createStore(appReducer, compose(applyMiddleware( - thunk, - errorsMiddleware(), - soundsMiddleware(), - ), window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__() : f => f)); -} diff --git a/app/soapbox/store/configureStore.ts b/app/soapbox/store/configureStore.ts new file mode 100644 index 000000000..aee34e919 --- /dev/null +++ b/app/soapbox/store/configureStore.ts @@ -0,0 +1,20 @@ +import { composeWithDevTools } from '@redux-devtools/extension'; +import { createStore, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; + +import errorsMiddleware from '../middleware/errors'; +import soundsMiddleware from '../middleware/sounds'; +import appReducer from '../reducers'; + +export default function configureStore() { + return createStore( + appReducer, + composeWithDevTools( + applyMiddleware( + thunk, + errorsMiddleware(), + soundsMiddleware(), + ), + ), + ); +} diff --git a/package.json b/package.json index 2608b779a..fda7716ca 100644 --- a/package.json +++ b/package.json @@ -54,11 +54,13 @@ "@gamestdio/websocket": "^0.3.2", "@lcdp/offline-plugin": "^5.1.0", "@popperjs/core": "^2.4.4", + "@redux-devtools/extension": "^3.2.2", "@sentry/browser": "^6.12.0", "@sentry/react": "^6.12.0", "@sentry/tracing": "^6.12.0", "@tabler/icons": "^1.53.0", "@types/escape-html": "^1.0.1", + "@types/redux-immutable": "^4.0.2", "array-includes": "^3.0.3", "autoprefixer": "^10.0.0", "axios": "^0.21.4", diff --git a/yarn.lock b/yarn.lock index 2127e09ab..5bc0a3e5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1141,6 +1141,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.17.0": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.7.tgz#a5f3328dc41ff39d803f311cfe17703418cf9825" + integrity sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@7", "@babel/template@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" @@ -1600,6 +1607,13 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.1.tgz#728ecd95ab207aab8a9a4e421f0422db329232be" integrity sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw== +"@redux-devtools/extension@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@redux-devtools/extension/-/extension-3.2.2.tgz#2d6da4df2c4d32a0aac54d824e46f52b1fd9fc4d" + integrity sha512-fKA2TWNzJF7wXSDwBemwcagBFudaejXCzH5hRszN3Z6B7XEJtEmGD77AjV0wliZpIZjA/fs3U7CejFMQ+ipS7A== + dependencies: + "@babel/runtime" "^7.17.0" + "@sentry/browser@6.12.0", "@sentry/browser@^6.12.0": version "6.12.0" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.12.0.tgz#970cd68fa117a1e1336fdb373e3b1fa76cd63e2d" @@ -1897,6 +1911,14 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/redux-immutable@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/redux-immutable/-/redux-immutable-4.0.2.tgz#8c3c666c33130c6794280bc3dc7726bfa0cfacc7" + integrity sha512-nlnhJn9B+NtIemWnnNWO9arUioeHLNvYCADSSa+48c81y8VwutgHH3WHobX711KKrfhlMlEz3+Q9SYX3sxrYPg== + dependencies: + immutable "^4.0.0-rc.1" + redux "^4.0.0" + "@types/retry@^0.12.0": version "0.12.1" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" @@ -5141,7 +5163,7 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immutable@^4.0.0: +immutable@^4.0.0, immutable@^4.0.0-rc.1: version "4.0.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== From a801a8a7c82ddb7ad60ce2956cab95e1e0d1493e Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 14 Mar 2022 18:01:09 -0500 Subject: [PATCH 2/8] soapbox/store/configureStore --> soapbox/store, add custom Hooks --- app/soapbox/containers/soapbox.js | 4 +--- app/soapbox/hooks/index.ts | 1 + app/soapbox/hooks/useAppSelector.ts | 5 +++++ app/soapbox/store.ts | 23 +++++++++++++++++++++++ app/soapbox/store/configureStore.ts | 20 -------------------- 5 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 app/soapbox/hooks/index.ts create mode 100644 app/soapbox/hooks/useAppSelector.ts create mode 100644 app/soapbox/store.ts delete mode 100644 app/soapbox/store/configureStore.ts diff --git a/app/soapbox/containers/soapbox.js b/app/soapbox/containers/soapbox.js index 7f18e8b61..b3b07b9be 100644 --- a/app/soapbox/containers/soapbox.js +++ b/app/soapbox/containers/soapbox.js @@ -27,7 +27,7 @@ import { INTRODUCTION_VERSION } from '../actions/onboarding'; import { preload } from '../actions/preload'; import ErrorBoundary from '../components/error_boundary'; import UI from '../features/ui'; -import configureStore from '../store/configureStore'; +import { store } from '../store'; const validLocale = locale => Object.keys(messages).includes(locale); @@ -39,8 +39,6 @@ const isInstanceLoaded = state => { return v !== '0.0.0' || fetchFailed; }; -export const store = configureStore(); - // Configure global functions for developers createGlobals(store); diff --git a/app/soapbox/hooks/index.ts b/app/soapbox/hooks/index.ts new file mode 100644 index 000000000..88f47b434 --- /dev/null +++ b/app/soapbox/hooks/index.ts @@ -0,0 +1 @@ +export { useAppSelector } from './useAppSelector'; diff --git a/app/soapbox/hooks/useAppSelector.ts b/app/soapbox/hooks/useAppSelector.ts new file mode 100644 index 000000000..576990079 --- /dev/null +++ b/app/soapbox/hooks/useAppSelector.ts @@ -0,0 +1,5 @@ +import { TypedUseSelectorHook, useSelector } from 'react-redux'; + +import { RootState } from 'soapbox/store'; + +export const useAppSelector: TypedUseSelectorHook = useSelector; diff --git a/app/soapbox/store.ts b/app/soapbox/store.ts new file mode 100644 index 000000000..4b34e45e2 --- /dev/null +++ b/app/soapbox/store.ts @@ -0,0 +1,23 @@ +import { composeWithDevTools } from '@redux-devtools/extension'; +import { createStore, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; + +import errorsMiddleware from './middleware/errors'; +import soundsMiddleware from './middleware/sounds'; +import appReducer from './reducers'; + +export const store = createStore( + appReducer, + composeWithDevTools( + applyMiddleware( + thunk, + errorsMiddleware(), + soundsMiddleware(), + ), + ), +); + +// Infer the `RootState` and `AppDispatch` types from the store itself +// https://redux.js.org/usage/usage-with-typescript +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; diff --git a/app/soapbox/store/configureStore.ts b/app/soapbox/store/configureStore.ts deleted file mode 100644 index aee34e919..000000000 --- a/app/soapbox/store/configureStore.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { composeWithDevTools } from '@redux-devtools/extension'; -import { createStore, applyMiddleware } from 'redux'; -import thunk from 'redux-thunk'; - -import errorsMiddleware from '../middleware/errors'; -import soundsMiddleware from '../middleware/sounds'; -import appReducer from '../reducers'; - -export default function configureStore() { - return createStore( - appReducer, - composeWithDevTools( - applyMiddleware( - thunk, - errorsMiddleware(), - soundsMiddleware(), - ), - ), - ); -} From b2a8f3c1bc5189f12956c3fe4f282ae71c2043d4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 14 Mar 2022 18:06:42 -0500 Subject: [PATCH 3/8] api: convert to typescript --- app/soapbox/{api.js => api.ts} | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) rename app/soapbox/{api.js => api.ts} (68%) diff --git a/app/soapbox/api.js b/app/soapbox/api.ts similarity index 68% rename from app/soapbox/api.js rename to app/soapbox/api.ts index 13ee07186..6de6462bc 100644 --- a/app/soapbox/api.js +++ b/app/soapbox/api.ts @@ -5,11 +5,12 @@ */ 'use strict'; -import axios from 'axios'; +import axios, { AxiosInstance, AxiosResponse } from 'axios'; import LinkHeader from 'http-link-header'; import { createSelector } from 'reselect'; -import { BACKEND_URL, FE_SUBDIRECTORY } from 'soapbox/build_config'; +import * as BuildConfig from 'soapbox/build_config'; +import { RootState } from 'soapbox/store'; import { getAccessToken, getAppToken, parseBaseURL } from 'soapbox/utils/auth'; import { isURL } from 'soapbox/utils/auth'; @@ -19,17 +20,15 @@ import { isURL } from 'soapbox/utils/auth'; @param {object} response - Axios response object @returns {object} Link object */ -export const getLinks = response => { - const value = response.headers.link; - if (!value) return { refs: [] }; - return LinkHeader.parse(value); +export const getLinks = (response: AxiosResponse): LinkHeader => { + return new LinkHeader(response.headers?.link); }; -const getToken = (state, authType) => { +const getToken = (state: RootState, authType: string) => { return authType === 'app' ? getAppToken(state) : getAccessToken(state); }; -const maybeParseJSON = data => { +const maybeParseJSON = (data: string) => { try { return JSON.parse(data); } catch(Exception) { @@ -38,8 +37,8 @@ const maybeParseJSON = data => { }; const getAuthBaseURL = createSelector([ - (state, me) => state.getIn(['accounts', me, 'url']), - (state, me) => state.getIn(['auth', 'me']), + (state: RootState, me: string | false | null) => state.accounts.getIn([me, 'url']), + (state: RootState, _me: string | false | null) => state.auth.get('me'), ], (accountUrl, authUserUrl) => { const baseURL = parseBaseURL(accountUrl) || parseBaseURL(authUserUrl); return baseURL !== window.location.origin ? baseURL : ''; @@ -51,10 +50,10 @@ const getAuthBaseURL = createSelector([ * @param {string} baseURL * @returns {object} Axios instance */ -export const baseClient = (accessToken, baseURL = '') => { +export const baseClient = (accessToken: string, baseURL: string = ''): AxiosInstance => { return axios.create({ // When BACKEND_URL is set, always use it. - baseURL: isURL(BACKEND_URL) ? BACKEND_URL : baseURL, + baseURL: isURL(BuildConfig.BACKEND_URL) ? BuildConfig.BACKEND_URL : baseURL, headers: Object.assign(accessToken ? { 'Authorization': `Bearer ${accessToken}`, } : {}), @@ -69,7 +68,7 @@ export const baseClient = (accessToken, baseURL = '') => { * No authorization is needed. */ export const staticClient = axios.create({ - baseURL: FE_SUBDIRECTORY, + baseURL: BuildConfig.FE_SUBDIRECTORY, transformResponse: [maybeParseJSON], }); @@ -80,10 +79,10 @@ export const staticClient = axios.create({ * @param {string} authType - Either 'user' or 'app' * @returns {object} Axios instance */ -export default (getState, authType = 'user') => { +export default (getState: () => RootState, authType: string = 'user'): AxiosInstance => { const state = getState(); const accessToken = getToken(state, authType); - const me = state.get('me'); + const me = state.me; const baseURL = getAuthBaseURL(state, me); return baseClient(accessToken, baseURL); From 16266f7cb43d6f9ebb328673836328f474e3ca0f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 14 Mar 2022 18:28:13 -0500 Subject: [PATCH 4/8] reducers/instance: typescript conversion --- app/soapbox/reducers/instance.ts | 133 +++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 app/soapbox/reducers/instance.ts diff --git a/app/soapbox/reducers/instance.ts b/app/soapbox/reducers/instance.ts new file mode 100644 index 000000000..9092e685b --- /dev/null +++ b/app/soapbox/reducers/instance.ts @@ -0,0 +1,133 @@ +import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; +import { AnyAction } from 'redux'; + +import { ADMIN_CONFIG_UPDATE_REQUEST, ADMIN_CONFIG_UPDATE_SUCCESS } from 'soapbox/actions/admin'; +import { PLEROMA_PRELOAD_IMPORT } from 'soapbox/actions/preload'; +import { normalizeInstance } from 'soapbox/normalizers/instance'; +import KVStore from 'soapbox/storage/kv_store'; +import { ConfigDB } from 'soapbox/utils/config_db'; + +import { + INSTANCE_REMEMBER_SUCCESS, + INSTANCE_FETCH_SUCCESS, + INSTANCE_FETCH_FAIL, + NODEINFO_FETCH_SUCCESS, +} from '../actions/instance'; + +const initialState = normalizeInstance(ImmutableMap()); + +const nodeinfoToInstance = (nodeinfo: ImmutableMap) => { + // Match Pleroma's develop branch + return normalizeInstance(ImmutableMap({ + pleroma: ImmutableMap({ + metadata: ImmutableMap({ + account_activation_required: nodeinfo.getIn(['metadata', 'accountActivationRequired']), + features: nodeinfo.getIn(['metadata', 'features']), + federation: nodeinfo.getIn(['metadata', 'federation']), + fields_limits: ImmutableMap({ + max_fields: nodeinfo.getIn(['metadata', 'fieldsLimits', 'maxFields']), + }), + }), + }), + })); +}; + +const importInstance = (_state: typeof initialState, instance: ImmutableMap) => { + return normalizeInstance(instance); +}; + +const importNodeinfo = (state: typeof initialState, nodeinfo: ImmutableMap) => { + return nodeinfoToInstance(nodeinfo).mergeDeep(state); +}; + +const preloadImport = (state: typeof initialState, action: Record, path: string) => { + const instance = action.data[path]; + return instance ? importInstance(state, ImmutableMap(fromJS(instance))) : state; +}; + +const getConfigValue = (instanceConfig: ImmutableMap, key: string) => { + const v = instanceConfig + .find(value => value.getIn(['tuple', 0]) === key); + + return v ? v.getIn(['tuple', 1]) : undefined; +}; + +const importConfigs = (state: typeof initialState, configs: ImmutableMap) => { + // FIXME: This is pretty hacked together. Need to make a cleaner map. + const config = ConfigDB.find(configs, ':pleroma', ':instance'); + const simplePolicy = ConfigDB.toSimplePolicy(configs); + + if (!config && !simplePolicy) return state; + + return state.withMutations(state => { + if (config) { + const value = config.get('value', ImmutableList()); + const registrationsOpen = getConfigValue(value, ':registrations_open'); + const approvalRequired = getConfigValue(value, ':account_approval_required'); + + state.update('registrations', c => typeof registrationsOpen === 'boolean' ? registrationsOpen : c); + state.update('approval_required', c => typeof approvalRequired === 'boolean' ? approvalRequired : c); + } + + if (simplePolicy) { + state.setIn(['pleroma', 'metadata', 'federation', 'mrf_simple'], simplePolicy); + } + }); +}; + +const handleAuthFetch = (state: typeof initialState) => { + // Authenticated fetch is enabled, so make the instance appear censored + return state.mergeWith((o, n) => o || n, { + title: '██████', + description: '████████████', + }); +}; + +const getHost = (instance: { uri: string }) => { + try { + return new URL(instance.uri).host; + } catch { + try { + return new URL(`https://${instance.uri}`).host; + } catch { + return null; + } + } +}; + +const persistInstance = (instance: { uri: string }) => { + const host = getHost(instance); + + if (host) { + KVStore.setItem(`instance:${host}`, instance).catch(console.error); + } +}; + +const handleInstanceFetchFail = (state: typeof initialState, error: Record) => { + if (error.response?.status === 401) { + return handleAuthFetch(state); + } else { + return state; + } +}; + +export default function instance(state = initialState, action: AnyAction) { + switch(action.type) { + case PLEROMA_PRELOAD_IMPORT: + return preloadImport(state, action, '/api/v1/instance'); + case INSTANCE_REMEMBER_SUCCESS: + return importInstance(state, ImmutableMap(fromJS(action.instance))); + case INSTANCE_FETCH_SUCCESS: + persistInstance(action.instance); + return importInstance(state, ImmutableMap(fromJS(action.instance))); + case INSTANCE_FETCH_FAIL: + return handleInstanceFetchFail(state, action.error); + case NODEINFO_FETCH_SUCCESS: + return importNodeinfo(state, ImmutableMap(fromJS(action.nodeinfo))); + case ADMIN_CONFIG_UPDATE_REQUEST: + case ADMIN_CONFIG_UPDATE_SUCCESS: + return importConfigs(state, ImmutableMap(fromJS(action.configs))); + default: + return state; + } +} From 608958f1e821d079e7655a318059f5da426af651 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 18 Mar 2022 11:32:05 -0500 Subject: [PATCH 5/8] Add @types/http-link-header --- package.json | 1 + yarn.lock | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/package.json b/package.json index fda7716ca..e58c8643f 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "@sentry/tracing": "^6.12.0", "@tabler/icons": "^1.53.0", "@types/escape-html": "^1.0.1", + "@types/http-link-header": "^1.0.3", "@types/redux-immutable": "^4.0.2", "array-includes": "^3.0.3", "autoprefixer": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 5bc0a3e5a..ac74e6ea9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1814,6 +1814,13 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== +"@types/http-link-header@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/http-link-header/-/http-link-header-1.0.3.tgz#899adf1d8d2036074514f3dbd148fb901ceff920" + integrity sha512-y8HkoD/vyid+5MrJ3aas0FvU3/BVBGcyG9kgxL0Zn4JwstA8CglFPnrR0RuzOjRCXwqzL5uxWC2IO7Ub0rMU2A== + dependencies: + "@types/node" "*" + "@types/http-proxy@^1.17.5": version "1.17.7" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" From 1fe7a72790a22290ce0c6e6a48a5c93df6bdacbd Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 18 Mar 2022 12:20:03 -0500 Subject: [PATCH 6/8] Fix API mock --- app/soapbox/__mocks__/api.js | 26 ----------------- app/soapbox/__mocks__/api.ts | 28 +++++++++++++++++++ .../actions/__tests__/statuses-test.js | 6 ++-- app/soapbox/test_helpers.js | 5 +++- 4 files changed, 34 insertions(+), 31 deletions(-) delete mode 100644 app/soapbox/__mocks__/api.js create mode 100644 app/soapbox/__mocks__/api.ts diff --git a/app/soapbox/__mocks__/api.js b/app/soapbox/__mocks__/api.js deleted file mode 100644 index fcb3a3253..000000000 --- a/app/soapbox/__mocks__/api.js +++ /dev/null @@ -1,26 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; - -const api = jest.requireActual('../api'); -let mocks = []; - -export const __stub = func => mocks.push(func); -export const __clear = () => mocks = []; - -const setupMock = axios => { - const mock = new MockAdapter(axios); - mocks.map(func => func(mock)); -}; - -export const staticClient = api.staticClient; - -export const baseClient = (...params) => { - const axios = api.baseClient(...params); - setupMock(axios); - return axios; -}; - -export default (...params) => { - const axios = api.default(...params); - setupMock(axios); - return axios; -}; diff --git a/app/soapbox/__mocks__/api.ts b/app/soapbox/__mocks__/api.ts new file mode 100644 index 000000000..a0b91a967 --- /dev/null +++ b/app/soapbox/__mocks__/api.ts @@ -0,0 +1,28 @@ +import MockAdapter from 'axios-mock-adapter'; +import { AxiosInstance } from 'axios'; +import { jest } from '@jest/globals'; + +const api = jest.requireActual('../api') as Record; +let mocks: Array = []; + +export const __stub = (func: Function) => mocks.push(func); +export const __clear = (): Function[] => mocks = []; + +const setupMock = (axios: AxiosInstance) => { + const mock = new MockAdapter(axios); + mocks.map(func => func(mock)); +}; + +export const staticClient = api.staticClient; + +export const baseClient = (...params: any[]) => { + const axios = api.baseClient(...params); + setupMock(axios); + return axios; +}; + +export default (...params: any[]) => { + const axios = api.default(...params); + setupMock(axios); + return axios; +}; diff --git a/app/soapbox/actions/__tests__/statuses-test.js b/app/soapbox/actions/__tests__/statuses-test.js index 71a0596a4..aa1ac9f3d 100644 --- a/app/soapbox/actions/__tests__/statuses-test.js +++ b/app/soapbox/actions/__tests__/statuses-test.js @@ -1,8 +1,6 @@ -import { Map as ImmutableMap } from 'immutable'; - import { STATUSES_IMPORT } from 'soapbox/actions/importer'; import { __stub } from 'soapbox/api'; -import { mockStore } from 'soapbox/test_helpers'; +import { mockStore, rootState } from 'soapbox/test_helpers'; import { fetchContext } from '../statuses'; @@ -15,7 +13,7 @@ describe('fetchContext()', () => { .reply(200, statuses); }); - const store = mockStore(ImmutableMap()); + const store = mockStore(rootState); store.dispatch(fetchContext('017ed505-5926-392f-256a-f86d5075df70')).then(context => { const actions = store.getActions(); diff --git a/app/soapbox/test_helpers.js b/app/soapbox/test_helpers.js index c9de38dc4..90f41119e 100644 --- a/app/soapbox/test_helpers.js +++ b/app/soapbox/test_helpers.js @@ -11,6 +11,9 @@ import thunk from 'redux-thunk'; import rootReducer from 'soapbox/reducers'; +export const rootState = rootReducer(undefined, {}); +export const getState = () => rootState; + // Mock Redux // https://redux.js.org/recipes/writing-tests/ const middlewares = [thunk]; @@ -20,7 +23,7 @@ export const mockStore = configureMockStore(middlewares); export const createComponent = (children, props = {}) => { props = ImmutableMap({ locale: 'en', - store: mockStore(rootReducer(ImmutableMap(), {})), + store: mockStore(rootState), }).merge(props); return renderer.create( From 0daa53c03c56be2e5ee1f92151af18fd4dcb70c3 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 18 Mar 2022 13:16:59 -0500 Subject: [PATCH 7/8] Fix Typescript eslint --- .eslintrc.js | 12 +- app/soapbox/__mocks__/api.ts | 4 +- package.json | 5 +- yarn.lock | 290 ++++++++++++++++++++++++++++++++++- 4 files changed, 295 insertions(+), 16 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index f4b59595a..193d390bd 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -254,18 +254,12 @@ module.exports = { }, overrides: [ { - files: ['**/*.tsx'], + files: ['**/*.ts', '**/*.tsx'], rules: { + 'no-undef': 'off', // https://stackoverflow.com/a/69155899 'react/prop-types': 'off', }, - }, - // Disable no-undef in TypeScript - // https://stackoverflow.com/a/69155899 - { - files: ['*.ts', '*.tsx'], - rules: { - 'no-undef': 'off', - }, + parser: '@typescript-eslint/parser', }, ], }; diff --git a/app/soapbox/__mocks__/api.ts b/app/soapbox/__mocks__/api.ts index a0b91a967..2f3a0d7b8 100644 --- a/app/soapbox/__mocks__/api.ts +++ b/app/soapbox/__mocks__/api.ts @@ -1,6 +1,6 @@ -import MockAdapter from 'axios-mock-adapter'; -import { AxiosInstance } from 'axios'; import { jest } from '@jest/globals'; +import { AxiosInstance } from 'axios'; +import MockAdapter from 'axios-mock-adapter'; const api = jest.requireActual('../api') as Record; let mocks: Array = []; diff --git a/package.json b/package.json index e58c8643f..efb580854 100644 --- a/package.json +++ b/package.json @@ -158,7 +158,6 @@ "substring-trie": "^1.0.2", "terser-webpack-plugin": "^5.2.3", "tiny-queue": "^0.2.1", - "ts-jest": "^27.0.5", "ts-loader": "^9.2.6", "tslib": "^2.3.1", "twemoji": "https://github.com/twitter/twemoji#v13.0.2", @@ -173,6 +172,9 @@ "wicg-inert": "^3.1.1" }, "devDependencies": { + "@jest/globals": "^27.5.1", + "@typescript-eslint/eslint-plugin": "^5.15.0", + "@typescript-eslint/parser": "^5.15.0", "axios-mock-adapter": "^1.18.1", "babel-eslint": "^10.1.0", "babel-jest": "^27.1.0", @@ -194,6 +196,7 @@ "stylelint": "^13.7.2", "stylelint-config-standard": "^22.0.0", "stylelint-scss": "^3.18.0", + "ts-jest": "^27.0.5", "webpack-dev-server": "^4.1.0", "yargs": "^16.0.3" } diff --git a/yarn.lock b/yarn.lock index ac74e6ea9..78299464e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1453,6 +1453,16 @@ "@types/node" "*" jest-mock "^27.1.1" +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + "@jest/fake-timers@^27.2.0": version "27.2.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.2.0.tgz#560841bc21ae7fbeff0cbff8de8f5cf43ad3561d" @@ -1465,6 +1475,18 @@ jest-mock "^27.1.1" jest-util "^27.2.0" +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + "@jest/globals@^27.2.0": version "27.2.0" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.2.0.tgz#4d7085f51df5ac70c8240eb3501289676503933d" @@ -1474,6 +1496,15 @@ "@jest/types" "^27.1.1" expect "^27.2.0" +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + "@jest/reporters@^27.2.0": version "27.2.0" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.2.0.tgz#629886d9a42218e504a424889a293abb27919e25" @@ -1565,6 +1596,17 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@lcdp/offline-plugin@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@lcdp/offline-plugin/-/offline-plugin-5.1.0.tgz#826f3e10d618711bd002afd674edb36dc1d9a792" @@ -1703,6 +1745,13 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@stylelint/postcss-css-in-js@^0.37.2": version "0.37.2" resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" @@ -1852,6 +1901,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@^7.0.9": + version "7.0.10" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.10.tgz#9b05b7896166cd00e9cbd59864853abf65d9ac23" + integrity sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -1965,6 +2019,86 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz#c28ef7f2e688066db0b6a9d95fb74185c114fb9a" + integrity sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA== + dependencies: + "@typescript-eslint/scope-manager" "5.15.0" + "@typescript-eslint/type-utils" "5.15.0" + "@typescript-eslint/utils" "5.15.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" + +"@typescript-eslint/parser@^5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.15.0.tgz#95f603f8fe6eca7952a99bfeef9b85992972e728" + integrity sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ== + dependencies: + "@typescript-eslint/scope-manager" "5.15.0" + "@typescript-eslint/types" "5.15.0" + "@typescript-eslint/typescript-estree" "5.15.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz#d97afab5e0abf4018d1289bd711be21676cdd0ee" + integrity sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg== + dependencies: + "@typescript-eslint/types" "5.15.0" + "@typescript-eslint/visitor-keys" "5.15.0" + +"@typescript-eslint/type-utils@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz#d2c02eb2bdf54d0a645ba3a173ceda78346cf248" + integrity sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA== + dependencies: + "@typescript-eslint/utils" "5.15.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.15.0.tgz#c7bdd103843b1abae97b5518219d3e2a0d79a501" + integrity sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA== + +"@typescript-eslint/typescript-estree@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz#81513a742a9c657587ad1ddbca88e76c6efb0aac" + integrity sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA== + dependencies: + "@typescript-eslint/types" "5.15.0" + "@typescript-eslint/visitor-keys" "5.15.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.15.0.tgz#468510a0974d3ced8342f37e6c662778c277f136" + integrity sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.15.0" + "@typescript-eslint/types" "5.15.0" + "@typescript-eslint/typescript-estree" "5.15.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.15.0": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz#5669739fbf516df060f978be6a6dce75855a8027" + integrity sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ== + dependencies: + "@typescript-eslint/types" "5.15.0" + eslint-visitor-keys "^3.0.0" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -2246,7 +2380,7 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -ansi-regex@^5.0.0: +ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -2992,6 +3126,11 @@ ci-info@^3.1.1: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" @@ -3559,6 +3698,13 @@ debug@^3.1.1, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -3684,6 +3830,11 @@ diff-sequences@^27.0.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4240,6 +4391,13 @@ eslint-utils@^2.1.0: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" @@ -4250,6 +4408,11 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + eslint@^7.0.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -4408,6 +4571,16 @@ expect@^27.2.0: jest-message-util "^27.2.0" jest-regex-util "^27.0.6" +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -4472,6 +4645,17 @@ fast-glob@^3.1.1, fast-glob@^3.2.5: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -4822,6 +5006,18 @@ globby@^11.0.1, globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -4839,6 +5035,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -5165,6 +5366,11 @@ ignore@^5.1.4, ignore@^5.1.8: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -5835,6 +6041,16 @@ jest-diff@^27.2.0: jest-get-type "^27.0.6" pretty-format "^27.2.0" +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-docblock@^27.0.6: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" @@ -5883,6 +6099,11 @@ jest-get-type@^27.0.6: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + jest-haste-map@^27.2.0: version "27.2.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.2.0.tgz#703b3a473e3f2e27d75ab07864ffd7bbaad0d75e" @@ -5945,6 +6166,16 @@ jest-matcher-utils@^27.2.0: jest-get-type "^27.0.6" pretty-format "^27.2.0" +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-message-util@^27.2.0: version "27.2.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.2.0.tgz#2f65c71df55267208686b1d7514e18106c91ceaf" @@ -5960,6 +6191,21 @@ jest-message-util@^27.2.0: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.1.1: version "27.1.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.1.1.tgz#c7a2e81301fdcf3dab114931d23d89ec9d0c3a82" @@ -5968,6 +6214,14 @@ jest-mock@^27.1.1: "@jest/types" "^27.1.1" "@types/node" "*" +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" @@ -6119,6 +6373,18 @@ jest-util@^27.0.0, jest-util@^27.2.0: is-ci "^3.0.0" picomatch "^2.2.3" +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.2.0: version "27.2.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.2.0.tgz#b7535f12d95dd3b4382831f4047384ca098642ab" @@ -6807,7 +7073,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -7936,6 +8202,15 @@ pretty-format@^27.2.0: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -8556,7 +8831,7 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: +regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -9717,7 +9992,7 @@ tsconfig-paths@^3.12.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -9727,6 +10002,13 @@ tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + twemoji-parser@13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/twemoji-parser/-/twemoji-parser-13.0.0.tgz#bd9d1b98474f1651dc174696b45cabefdfa405af" From e3c60647dcd18ca476a6ad189413cb832a237910 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 18 Mar 2022 15:17:32 -0500 Subject: [PATCH 8/8] tsconfig: exclude Jest files --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index cead8687c..20d08e4b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,5 +10,6 @@ "moduleResolution": "node", "experimentalDecorators": true, "allowSyntheticDefaultImports": true - } + }, + "exclude": ["**/*.test.*", "**/__mocks__/*", "**/__tests__/*"] }