diff --git a/.babelrc b/.babelrc index dfa296894..cb0fc209a 100644 --- a/.babelrc +++ b/.babelrc @@ -7,9 +7,16 @@ "loose": true } ], - ["@babel/preset-stage-2", { "decoratorsLegacy": true }], "@babel/react" ], + "plugins": [ + "@babel/plugin-proposal-class-properties", + ["@babel/plugin-proposal-decorators", { "legacy": true }], + "@babel/plugin-proposal-function-sent", + "@babel/plugin-proposal-export-namespace-from", + "@babel/plugin-proposal-numeric-separator", + "@babel/plugin-proposal-throw-expressions" + ], "env": { "production": { "plugins": [ diff --git a/package.json b/package.json index e82ccd5c3..94d2a9166 100644 --- a/package.json +++ b/package.json @@ -15,78 +15,83 @@ "author": "Markus Englund ", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.0.0-beta.53", - "classnames": "^2.2.5", - "compression": "^1.7.2", - "connect-mongo": "^2.0.1", - "date-fns": "^1.29.0", - "dotenv": "^5.0.1", - "express": "^4.16.3", + "@babel/runtime": "^7.2.0", + "classnames": "^2.2.6", + "compression": "^1.7.3", + "connect-mongo": "^2.0.3", + "date-fns": "^1.30.1", + "dotenv": "^6.2.0", + "express": "^4.16.4", "express-session": "^1.15.6", - "express-static-gzip": "^0.3.2", - "helmet": "^3.12.1", - "marked": "^0.3.19", - "mini-css-extract-plugin": "^0.4.0", - "mongodb": "^3.1.0-beta4", - "morgan": "^1.9.0", - "normalizr": "^3.2.4", + "express-static-gzip": "^1.1.3", + "helmet": "^3.15.0", + "marked": "^0.6.0", + "mini-css-extract-plugin": "^0.5.0", + "mongodb": "^3.1.10", + "morgan": "^1.9.1", + "normalizr": "^3.3.0", "passport": "^0.4.0", "passport-google-oauth20": "^1.0.0", "passport-twitter": "^1.0.4", - "prop-types": "^15.6.1", - "react": "^16.2.0", - "react-aria-menubutton": "^5.1.1", + "prop-types": "^15.6.2", + "react": "^16.7.0", + "react-aria-menubutton": "^6.1.0", "react-beautiful-dnd": "github:yogaboll/react-beautiful-dnd#include-generated", - "react-day-picker": "^7.1.9", - "react-dom": "^16.2.0", - "react-head": "^2.1.0", - "react-icons": "^2.2.7", - "react-modal": "^3.4.4", + "react-day-picker": "^7.2.4", + "react-dom": "^16.7.0", + "react-head": "^3.0.2", + "react-icons": "^3.3.0", + "react-modal": "^3.8.1", "react-onclickoutside": "^6.7.1", - "react-redux": "^5.0.7", - "react-router": "^4.2.0", - "react-router-dom": "^4.2.2", - "react-textarea-autosize": "^6.1.0", - "redux": "^3.7.2", - "redux-devtools-extension": "^2.13.2", + "react-redux": "^6.0.0", + "react-router": "^4.3.1", + "react-router-dom": "^4.3.1", + "react-textarea-autosize": "^7.1.0", + "redux": "^4.0.1", + "redux-devtools-extension": "^2.13.7", "serve-favicon": "^2.5.0", - "shortid": "^2.2.8", - "slugify": "^1.3.0" + "shortid": "^2.2.14", + "slugify": "^1.3.4" }, "devDependencies": { - "@babel/core": "^7.0.0-beta.47", - "@babel/plugin-transform-runtime": "^7.0.0-beta.53", - "@babel/preset-env": "^7.0.0-beta.47", - "@babel/preset-react": "^7.0.0-beta.47", - "@babel/preset-stage-2": "^7.0.0-beta.47", - "autoprefixer": "^8.5.0", - "babel-eslint": "^8.2.3", - "babel-loader": "^8.0.0-beta.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.13", - "clean-webpack-plugin": "^0.1.19", + "@babel/core": "^7.2.2", + "@babel/plugin-proposal-class-properties": "^7.2.3", + "@babel/plugin-proposal-decorators": "^7.2.3", + "@babel/plugin-proposal-export-namespace-from": "^7.2.0", + "@babel/plugin-proposal-function-sent": "^7.2.0", + "@babel/plugin-proposal-numeric-separator": "^7.2.0", + "@babel/plugin-proposal-throw-expressions": "^7.2.0", + "@babel/plugin-transform-runtime": "^7.2.0", + "@babel/preset-env": "^7.2.3", + "@babel/preset-react": "^7.0.0", + "autoprefixer": "^9.4.5", + "babel-eslint": "^10.0.1", + "babel-loader": "^8.0.5", + "babel-plugin-transform-react-remove-prop-types": "^0.4.21", + "clean-webpack-plugin": "^1.0.0", "compression-webpack-plugin": "^2.0.0", - "copy-webpack-plugin": "^4.5.1", - "css-loader": "^0.28.11", - "eslint": "^4.19.1", - "eslint-config-airbnb": "^16.1.0", - "eslint-config-prettier": "^2.9.0", - "eslint-plugin-import": "^2.12.0", - "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-react": "^7.8.2", - "file-loader": "^1.1.11", + "copy-webpack-plugin": "^4.6.0", + "css-loader": "^2.1.0", + "eslint": "^5.12.0", + "eslint-config-airbnb": "^17.1.0", + "eslint-config-prettier": "^3.3.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-jsx-a11y": "^6.1.2", + "eslint-plugin-react": "^7.12.3", + "file-loader": "^3.0.1", "ignore-loader": "^0.1.2", "node-sass": "^4.11.0", - "nodemon": "^1.17.4", - "postcss-loader": "^2.1.6", - "prettier": "^1.12.1", - "sass-loader": "^7.0.3", + "nodemon": "^1.18.9", + "postcss-loader": "^3.0.0", + "prettier": "^1.15.3", + "sass-loader": "^7.1.0", "svg-url-loader": "^2.3.2", - "uglifyjs-webpack-plugin": "^1.2.5", - "url-loader": "^1.0.1", - "webpack": "^4.8.3", - "webpack-bundle-analyzer": "^2.12.0", - "webpack-cli": "^2.1.3", - "webpack-manifest-plugin": "^2.0.2", + "uglifyjs-webpack-plugin": "^2.1.1", + "url-loader": "^1.1.2", + "webpack": "^4.28.4", + "webpack-bundle-analyzer": "^3.0.3", + "webpack-cli": "^3.2.1", + "webpack-manifest-plugin": "^2.0.4", "webpack-node-externals": "^1.7.2" } } diff --git a/src/app/components/BoardHeader/BoardDeleter.jsx b/src/app/components/BoardHeader/BoardDeleter.jsx index 9378c6808..1ecb26b12 100644 --- a/src/app/components/BoardHeader/BoardDeleter.jsx +++ b/src/app/components/BoardHeader/BoardDeleter.jsx @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import { withRouter } from "react-router-dom"; import { connect } from "react-redux"; import { Button, Wrapper, Menu, MenuItem } from "react-aria-menubutton"; -import FaTrash from "react-icons/lib/fa/trash"; +import { FaTrash } from "react-icons/fa"; import "./BoardDeleter.scss"; class BoardDeleter extends Component { diff --git a/src/app/components/BoardHeader/ColorPicker.jsx b/src/app/components/BoardHeader/ColorPicker.jsx index d83f56f3c..ae1c748b9 100644 --- a/src/app/components/BoardHeader/ColorPicker.jsx +++ b/src/app/components/BoardHeader/ColorPicker.jsx @@ -4,7 +4,7 @@ import { connect } from "react-redux"; import { withRouter } from "react-router-dom"; import { Button, Wrapper, Menu, MenuItem } from "react-aria-menubutton"; import classnames from "classnames"; -import FaCheck from "react-icons/lib/fa/check"; +import { FaCheck } from "react-icons/fa"; import colorIcon from "../../../assets/images/color-icon.png"; import "./ColorPicker.scss"; diff --git a/src/app/components/CardBadges/CardBadges.jsx b/src/app/components/CardBadges/CardBadges.jsx index 1a2f21c33..0adeeaf05 100644 --- a/src/app/components/CardBadges/CardBadges.jsx +++ b/src/app/components/CardBadges/CardBadges.jsx @@ -2,8 +2,8 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import format from "date-fns/format"; import differenceInCalendarDays from "date-fns/difference_in_calendar_days"; -import MdAlarm from "react-icons/lib/md/access-alarm"; -import MdDoneAll from "react-icons/lib/fa/check-square-o"; +import { MdAlarm } from "react-icons/md"; +import { FaCheckSquare as MdDoneAll } from "react-icons/fa"; import "./CardBadges.scss"; class CardBadges extends Component { diff --git a/src/app/components/CardModal/CardOptions.jsx b/src/app/components/CardModal/CardOptions.jsx index af2af227b..2854bd24d 100644 --- a/src/app/components/CardModal/CardOptions.jsx +++ b/src/app/components/CardModal/CardOptions.jsx @@ -2,8 +2,8 @@ import React, { Component } from "react"; import { connect } from "react-redux"; import PropTypes from "prop-types"; import Modal from "react-modal"; -import FaTrash from "react-icons/lib/fa/trash"; -import MdAlarm from "react-icons/lib/md/access-alarm"; +import { FaTrash } from "react-icons/fa"; +import { MdAlarm } from "react-icons/md"; import Calendar from "./Calendar"; import ClickOutside from "../ClickOutside/ClickOutside"; import colorIcon from "../../../assets/images/color-icon.png"; diff --git a/src/app/components/Header/Header.jsx b/src/app/components/Header/Header.jsx index e253bba0b..8a501b507 100644 --- a/src/app/components/Header/Header.jsx +++ b/src/app/components/Header/Header.jsx @@ -2,9 +2,9 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; import { Link } from "react-router-dom"; -import FaUserSecret from "react-icons/lib/fa/user-secret"; -import FaSignOut from "react-icons/lib/fa/sign-out"; -import FaSignIn from "react-icons/lib/fa/sign-in"; +import { FaUserSecret } from "react-icons/fa"; +import { FaSignOutAlt as FaSignOut } from "react-icons/fa"; +import { FaSignInAlt as FaSignIn } from "react-icons/fa"; import kanbanLogo from "../../../assets/images/kanban-logo.svg"; import "./Header.scss"; diff --git a/src/app/components/LandingPage/LandingPage.jsx b/src/app/components/LandingPage/LandingPage.jsx index 58cd4d361..f0b96b6b5 100644 --- a/src/app/components/LandingPage/LandingPage.jsx +++ b/src/app/components/LandingPage/LandingPage.jsx @@ -2,8 +2,8 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; import { Title } from "react-head"; -import FaTwitter from "react-icons/lib/fa/twitter"; -import FaUserSecret from "react-icons/lib/fa/user-secret"; +import { FaTwitter } from "react-icons/fa"; +import { FaUserSecret } from "react-icons/fa"; import googleLogo from "../../../assets/images/google-logo.svg"; import kanbanLogo from "../../../assets/images/kanban-logo.svg"; import background1920 from "../../../assets/images/postits-1920.jpg"; diff --git a/src/app/components/List/ListHeader.jsx b/src/app/components/List/ListHeader.jsx index dff967445..94b0fdbd0 100644 --- a/src/app/components/List/ListHeader.jsx +++ b/src/app/components/List/ListHeader.jsx @@ -3,7 +3,7 @@ import PropTypes from "prop-types"; import { connect } from "react-redux"; import Textarea from "react-textarea-autosize"; import { Button, Wrapper, Menu, MenuItem } from "react-aria-menubutton"; -import FaTrash from "react-icons/lib/fa/trash"; +import { FaTrash } from "react-icons/fa"; import "./ListHeader.scss"; class ListTitle extends Component { diff --git a/src/client.jsx b/src/client.jsx index ae9dfb7f9..b5893ecde 100644 --- a/src/client.jsx +++ b/src/client.jsx @@ -4,6 +4,7 @@ import { createStore, applyMiddleware } from "redux"; import { Provider } from "react-redux"; import { composeWithDevTools } from "redux-devtools-extension"; import { BrowserRouter } from "react-router-dom"; +import { HeadProvider } from "react-head"; import rootReducer from "./app/reducers"; import persistMiddleware from "./app/middleware/persistMiddleware"; import App from "./app/components/App"; @@ -21,7 +22,9 @@ const store = createStore( ReactDOM.hydrate( - + + + , document.getElementById("app") diff --git a/src/server/renderPage.jsx b/src/server/renderPage.jsx index 8bd5fc95d..6186e232b 100644 --- a/src/server/renderPage.jsx +++ b/src/server/renderPage.jsx @@ -4,7 +4,7 @@ import { renderToString } from "react-dom/server"; import { createStore } from "redux"; import { Provider } from "react-redux"; import { StaticRouter } from "react-router"; -import { HeadCollector } from "react-head"; +import { HeadProvider } from "react-head"; import { resetContext } from "react-beautiful-dnd"; import App from "../app/components/App"; import rootReducer from "../app/reducers"; @@ -28,13 +28,13 @@ const renderPage = (req, res) => { // This is where the magic happens const appString = renderToString( - - + + + - ); const preloadedState = store.getState();