diff --git a/package.json b/package.json index 5b28d349a..910b95576 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,17 @@ { "name": "pterodactyl-panel", "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.19", + "@fortawesome/fontawesome-svg-core": "1.2.19", "@fortawesome/free-solid-svg-icons": "^5.9.0", - "@fortawesome/react-fontawesome": "^0.1.4", + "@fortawesome/react-fontawesome": "0.1.4", "@types/react-google-recaptcha": "^1.1.1", "axios": "^0.19.2", "ayu-ace": "^2.0.4", "brace": "^0.11.1", "chart.js": "^2.8.0", "date-fns": "^2.14.0", + "debounce": "^1.2.0", + "deepmerge": "^4.2.2", "easy-peasy": "^3.3.1", "events": "^3.0.0", "formik": "^2.1.4", @@ -18,11 +20,11 @@ "i18next-localstorage-backend": "^3.0.0", "i18next-xhr-backend": "^3.2.2", "jquery": "^3.3.1", - "lodash-es": "^4.17.15", "path": "^0.12.7", "query-string": "^6.7.0", "react": "^16.13.1", "react-dom": "npm:@hot-loader/react-dom", + "react-fast-compare": "^3.2.0", "react-google-recaptcha": "^2.0.1", "react-hot-loader": "^4.12.21", "react-i18next": "^11.2.1", @@ -52,10 +54,8 @@ "@babel/preset-typescript": "^7.7.4", "@babel/runtime": "^7.7.5", "@types/chart.js": "^2.8.5", + "@types/debounce": "^1.2.0", "@types/events": "^3.0.0", - "@types/feather-icons": "^4.7.0", - "@types/lodash": "^4.14.119", - "@types/lodash-es": "^4.17.3", "@types/node": "^12.6.9", "@types/query-string": "^6.3.0", "@types/react": "^16.9.41", diff --git a/resources/scripts/components/dashboard/search/SearchModal.tsx b/resources/scripts/components/dashboard/search/SearchModal.tsx index ac4c2b1bd..e58900694 100644 --- a/resources/scripts/components/dashboard/search/SearchModal.tsx +++ b/resources/scripts/components/dashboard/search/SearchModal.tsx @@ -3,7 +3,7 @@ import Modal, { RequiredModalProps } from '@/components/elements/Modal'; import { Field, Form, Formik, FormikHelpers, useFormikContext } from 'formik'; import { Actions, useStoreActions, useStoreState } from 'easy-peasy'; import { object, string } from 'yup'; -import { debounce } from 'lodash-es'; +import debounce from 'debounce'; import FormikFieldWrapper from '@/components/elements/FormikFieldWrapper'; import InputSpinner from '@/components/elements/InputSpinner'; import getServers from '@/api/getServers'; @@ -57,6 +57,7 @@ export default ({ ...props }: Props) => { setLoading(true); setSubmitting(false); clearFlashes('search'); + getServers(term) .then(servers => setServers(servers.items.filter((_, index) => index < 5))) .catch(error => { diff --git a/resources/scripts/components/elements/InputError.tsx b/resources/scripts/components/elements/InputError.tsx index 02758350e..3b810454b 100644 --- a/resources/scripts/components/elements/InputError.tsx +++ b/resources/scripts/components/elements/InputError.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import capitalize from 'lodash-es/capitalize'; import { FormikErrors, FormikTouched } from 'formik'; import tw from 'twin.macro'; +import { capitalize } from '@/helpers'; interface Props { errors: FormikErrors; diff --git a/resources/scripts/components/server/StatGraphs.tsx b/resources/scripts/components/server/StatGraphs.tsx index 6a162ee05..eea25d7f5 100644 --- a/resources/scripts/components/server/StatGraphs.tsx +++ b/resources/scripts/components/server/StatGraphs.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import Chart, { ChartConfiguration } from 'chart.js'; import { ServerContext } from '@/state/server'; import { bytesToMegabytes } from '@/helpers'; -import merge from 'lodash-es/merge'; +import merge from 'deepmerge'; import TitledGreyBox from '@/components/elements/TitledGreyBox'; import { faMemory, faMicrochip } from '@fortawesome/free-solid-svg-icons'; import tw from 'twin.macro'; @@ -59,7 +59,7 @@ const chartDefaults: ChartConfiguration = { }; const createDefaultChart = (ctx: CanvasRenderingContext2D, options?: ChartConfiguration): Chart => new Chart(ctx, { - ...merge({}, chartDefaults, options), + ...merge(chartDefaults, options || {}), data: { labels: Array(20).fill(''), datasets: [ diff --git a/resources/scripts/helpers.ts b/resources/scripts/helpers.ts index f8cf94848..d6d4712b0 100644 --- a/resources/scripts/helpers.ts +++ b/resources/scripts/helpers.ts @@ -13,3 +13,5 @@ export const bytesToMegabytes = (bytes: number) => Math.floor(bytes / 1000 / 100 export const randomInt = (low: number, high: number) => Math.floor(Math.random() * (high - low) + low); export const cleanDirectoryPath = (path: string) => path.replace(/(^#\/*)|(\/(\/*))|(^$)/g, '/'); + +export const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); diff --git a/resources/scripts/plugins/useDeepMemo.ts b/resources/scripts/plugins/useDeepMemo.ts index 0ad6bb7df..ccf602853 100644 --- a/resources/scripts/plugins/useDeepMemo.ts +++ b/resources/scripts/plugins/useDeepMemo.ts @@ -1,5 +1,5 @@ import { useRef } from 'react'; -import isEqual from 'lodash-es/isEqual'; +import isEqual from 'react-fast-compare'; export const useDeepMemo = (fn: () => T, key: K): T => { const ref = useRef<{ key: K, value: T }>(); diff --git a/webpack.config.js b/webpack.config.js index 2efa27154..0b2bd5037 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -73,7 +73,10 @@ module.exports = { files: `${path.join(__dirname, '/resources/scripts')}/**/*.{ts,tsx}`, }, }) : null, - process.env.ANALYZE_BUNDLE ? new BundleAnalyzerPlugin() : null + process.env.ANALYZE_BUNDLE ? new BundleAnalyzerPlugin({ + analyzerHost: '0.0.0.0', + analyzerPort: 8081, + }) : null ].filter(p => p), optimization: { usedExports: true, diff --git a/yarn.lock b/yarn.lock index 272d5b83f..3baad2306 100644 --- a/yarn.lock +++ b/yarn.lock @@ -892,9 +892,10 @@ version "0.2.19" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.19.tgz#754a0f85e1290858152e1c05700ab502b11197f1" -"@fortawesome/fontawesome-svg-core@^1.2.19": +"@fortawesome/fontawesome-svg-core@1.2.19": version "1.2.19" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.19.tgz#0eca1ce9285c3d99e6e340633ee8f615f9d1a2e0" + integrity sha512-D4ICXg9oU08eF9o7Or392gPpjmwwgJu8ecCFusthbID95CLVXOgIyd4mOKD9Nud5Ckz+Ty59pqkNtThDKR0erA== dependencies: "@fortawesome/fontawesome-common-types" "^0.2.19" @@ -904,9 +905,10 @@ dependencies: "@fortawesome/fontawesome-common-types" "^0.2.19" -"@fortawesome/react-fontawesome@^0.1.4": +"@fortawesome/react-fontawesome@0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.4.tgz#18d61d9b583ca289a61aa7dccc05bd164d6bc9ad" + integrity sha512-GwmxQ+TK7PEdfSwvxtGnMCqrfEm0/HbRHArbUudsYiy9KzVCwndxa2KMcfyTQ8El0vROrq8gOOff09RF1oQe8g== dependencies: humps "^2.0.1" prop-types "^15.5.10" @@ -935,6 +937,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/debounce@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/debounce/-/debounce-1.2.0.tgz#9ee99259f41018c640b3929e1bb32c3dcecdb192" + integrity sha512-bWG5wapaWgbss9E238T0R6bfo5Fh3OkeoSt245CM7JJwVwpw6MEBCbIxLq5z8KzsE3uJhzcIuQkyiZmzV3M/Dw== + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -943,10 +950,6 @@ version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" -"@types/feather-icons@^4.7.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@types/feather-icons/-/feather-icons-4.7.0.tgz#ec66bc046bcd1513835f87541ecef54b50c57ec9" - "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -980,16 +983,6 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/lodash-es@^4.17.3": - version "4.17.3" - resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.3.tgz#87eb0b3673b076b8ee655f1890260a136af09a2d" - dependencies: - "@types/lodash" "*" - -"@types/lodash@*", "@types/lodash@^4.14.119": - version "4.14.141" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.141.tgz#d81f4d0c562abe28713406b571ffb27692a82ae6" - "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2411,6 +2404,7 @@ date-now@^0.1.4: debounce@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" + integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" @@ -3759,6 +3753,7 @@ https-browserify@^1.0.0: humps@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" + integrity sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao= i18next-chained-backend@^2.0.0: version "2.0.0" @@ -4355,7 +4350,7 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash-es@^4.17.11, lodash-es@^4.17.14, lodash-es@^4.17.15: +lodash-es@^4.17.11, lodash-es@^4.17.14: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" @@ -5407,6 +5402,7 @@ promise-inflight@^1.0.1: prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" @@ -5568,6 +5564,11 @@ react-fast-compare@^2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" +react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + react-google-recaptcha@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/react-google-recaptcha/-/react-google-recaptcha-2.0.1.tgz#3276b29659493f7ca2a5b7739f6c239293cdf1d8"