diff --git a/package.json b/package.json
index 5ee8dde2e045e44f941d2baf5286a5e411ece994..0dd587d6cebf14d8f13c83e58caf9f0424e18185 100644
--- a/package.json
+++ b/package.json
@@ -86,7 +86,9 @@
     "@babel/preset-env": "^7.10.3",
     "@babel/preset-react": "^7.10.1",
     "@pmmmwh/react-refresh-webpack-plugin": "^0.3.3",
-    "babel-eslint": "10.1.0",
+    "@typescript-eslint/eslint-plugin": "^4.21.0",
+    "@typescript-eslint/parser": "^4.21.0",
+    "babel-eslint": "^10.1.0",
     "babel-jest": "^26.0.1",
     "babel-loader": "^8.0.6",
     "babel-plugin-lodash": "^3.3.4",
@@ -98,15 +100,16 @@
     "core-js": "^3.4.8",
     "enzyme": "^3.10.0",
     "enzyme-adapter-react-16": "^1.15.0",
-    "eslint": "^7.0.0",
+    "eslint": "^7.23.0",
     "eslint-config-airbnb": "^18.2.0",
     "eslint-config-react-app": "^6.0.0",
     "eslint-loader": "^4.0.2",
-    "eslint-plugin-flowtype": "^5.2.0",
-    "eslint-plugin-import": "^2.18.0",
+    "eslint-plugin-flowtype": "^5.6.0",
+    "eslint-plugin-import": "^2.22.1",
     "eslint-plugin-jest": "^24.0.0",
-    "eslint-plugin-jsx-a11y": "^6.2.3",
-    "eslint-plugin-react": "^7.21.0",
+    "eslint-plugin-jsx-a11y": "^6.4.1",
+    "eslint-plugin-react": "^7.23.2",
+    "eslint-plugin-react-hooks": "^4.2.0",
     "glob": "^7.1.4",
     "http-server": "^0.12.3",
     "jest": "^26.0.1",
@@ -115,7 +118,6 @@
     "jsdom": "15.1.1",
     "puppeteer": "^4.0.0",
     "react": "^16.8.6",
-    "react-dev-utils": "^11.0.2",
     "react-dom": "^16.8.6",
     "react-refresh": "^0.8.3",
     "redux-mock-store": "^1.5.1",
diff --git a/src/extend/PluginProvider.js b/src/extend/PluginProvider.js
index ee9269e58f462c7a7500be9c946bd698d2604e0b..784191184315d514b59b25a64e23bd1897bc9f1b 100644
--- a/src/extend/PluginProvider.js
+++ b/src/extend/PluginProvider.js
@@ -16,7 +16,7 @@ export default function PluginProvider(props) {
     const connectedPlugins = connectPluginsToStore(plugins);
     addPluginsToCompanionWindowsRegistry(connectedPlugins);
     setPluginMap(createTargetToPluginMapping(connectedPlugins));
-  }, []);
+  }, [plugins]);
 
   return (
     <PluginContext.Provider value={pluginMap}>
diff --git a/src/i18n.js b/src/i18n.js
index 5742a271d834641d659091427d21f1a002e2fbb5..168dcb81f9af01140164293376c5fb7dfdd4c9a0 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -14,8 +14,10 @@ import sr from './locales/sr/translation.json';
 import lt from './locales/lt/translation.json';
 import vi from './locales/vi/translation.json';
 
-export default () => {
-  // Load translations for each language
+/**
+ * Load translations for each language
+ */
+function createI18nInstance() {
   const resources = {
     ar,
     de,
@@ -43,4 +45,6 @@ export default () => {
   });
 
   return instance;
-};
+}
+
+export default createI18nInstance;
diff --git a/src/lib/htmlRules.js b/src/lib/htmlRules.js
index 43fd823275b1bf50c98b29f68b4f8ef34353c09a..f50c3ae246f8b1219a2fe40af0a7947e8c798be9 100644
--- a/src/lib/htmlRules.js
+++ b/src/lib/htmlRules.js
@@ -18,9 +18,11 @@ const mirador2 = {
   ALLOWED_TAGS: ['a', 'b', 'br', 'i', 'img', 'p', 'span', 'strong', 'em', 'ul', 'ol', 'li'],
 };
 
-export default {
+const htmlRules = {
   iiif,
   liberal,
   mirador2,
   noHtml,
 };
+
+export default htmlRules;
diff --git a/src/state/createStore.js b/src/state/createStore.js
index 4797c59ebfe99ea942b02576f4e16bee8db49222..717b0b8915cc9dd00df4b0652a56a4d291b80c65 100644
--- a/src/state/createStore.js
+++ b/src/state/createStore.js
@@ -14,7 +14,7 @@ import settings from '../config/settings';
 /**
  * Configure Store
  */
-export default function (pluginReducers, pluginSagas = []) {
+function configureStore(pluginReducers, pluginSagas = []) {
   const miradorReducer = createRootReducer(pluginReducers);
 
   const rootReducer = settings.state.slice
@@ -38,3 +38,5 @@ export default function (pluginReducers, pluginSagas = []) {
 
   return store;
 }
+
+export default configureStore;