diff --git a/package.json b/package.json index 75ac203..f85a272 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@material-ui/core": "^4.12.4", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.56", + "core-js": "^3.35.1", "eslint-plugin-react": "^7.33.2", "formik": "^2.4.5", "js-cookie": "^2.2.1", @@ -36,6 +37,7 @@ "webpack": "^5.6.0", "webpack-cli": "^4.2.0", "webpack-dev-server": "^3.11.0", + "whatwg-fetch": "^3.6.20", "yup": "^1.3.3" }, "eslintConfig": { @@ -73,13 +75,13 @@ "css-loader": "^3.2.0", "date-fns": "^2.29.3", "enzyme": "^3.10.0", - "enzyme-adapter-react-16": "^1.15.7", + "enzyme-adapter-react-16": "^1.15.8", "eslint": "^7.0.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react-hooks": "^4.6.0", - "html-webpack-plugin": "^4.0.0", + "html-webpack-plugin": "^5.6.0", "husky": "^3.1.0", "jest": "^26.6.3", "mini-css-extract-plugin": "^2.8.0", diff --git a/src/coreform/baseform/GenerateDump.module.css b/src/coreform/baseform/GenerateDump.module.css new file mode 100644 index 0000000..b07e898 --- /dev/null +++ b/src/coreform/baseform/GenerateDump.module.css @@ -0,0 +1,3 @@ +.generateDump{ + width:200px !important; +} \ No newline at end of file diff --git a/src/coreform/baseform/GenerateDump.tsx b/src/coreform/baseform/GenerateDump.tsx index a04a3ba..adad58c 100644 --- a/src/coreform/baseform/GenerateDump.tsx +++ b/src/coreform/baseform/GenerateDump.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useState } from 'react' -import _ from 'lodash' +import React, { useEffect, useState } from "react"; +import _ from "lodash"; import { Button, Checkbox, @@ -12,253 +12,354 @@ import { IconButton, Tooltip, Typography, -} from '@material-ui/core' +} from "@material-ui/core"; import { AccountTree as AccountTreeIcon, Check as CheckIcon, Close as CloseIcon, Waves as WavesIcon, -} from '@material-ui/icons' -import { ErrorSnackBar } from '../../components/common/ErrorSnackBar' -import { post } from '../../helper/api-client' -import { MarginedFormControlLabel } from '../database/DatabaseForm' +} from "@material-ui/icons"; +import { ErrorSnackBar } from "../../components/common/ErrorSnackBar"; +import { post } from "../../helper/api-client"; +import { MarginedFormControlLabel } from "../database/DatabaseForm"; +import "./GenerateDump.module.css"; +import { Alert } from "@material-ui/lab"; -type DumpType = 'heap_dump' | 'thread_dump' +const enum DumpType { + HeapDump = "heap_dump", + ThreadDump = "thread_dump", +} +const buttons = [ + { + id: DumpType.HeapDump, + icon: , + label: "Heap Dump", + }, + { + id: DumpType.ThreadDump, + icon: , + label: "Thread Dump", + }, +]; type DumpRequest = { - manifestId: number, - dumpType: DumpType, - podNames: string[], - isLiveDump: boolean, -} + manifestId: number; + dumpType: DumpType; + podNames: string[]; + isLiveDump?: boolean; +}; -const getPodsEndpoint = (id) => `/api/kube/manifest/${id}/pods` -const createDumpEndpoint = `/api/dump` +const getPodsEndpoint = (id) => `/api/kube/manifest/${id}/pods`; +const createDumpEndpoint = `/api/dump`; const GenerateDumpComponent = (props) => { - const { language, manifestId, disabled, cluster } = props - const [openDialog, setOpenDialog] = useState(false) - const [step, setStep] = useState(0) - const [dumpType, setDumpType] = useState(null) + const { language, manifestId, disabled, cluster } = props; + const [openDialog, setOpenDialog] = useState(false); + const [step, setStep] = useState(0); + const [dumpType, setDumpType] = useState(null); const [isLiveDump, setIsLiveDump] = useState(true); - const [selectedPods, setSelectedPods] = useState([]) - const [allPods, setAllPods] = useState([]) - const [loadingPodList, setLoadingPodList] = useState(true) - const [validationError, setValidationError] = useState({}) - const [submitError, setSubmitError] = useState({}) - const [disabledTooltipText, setDisabledTooltipText] = useState('') + const [selectedPods, setSelectedPods] = useState([]); + const [allPods, setAllPods] = useState([]); + const [loadingPodList, setLoadingPodList] = useState(true); + const [validationError, setValidationError] = useState({}); + const [submitError, setSubmitError] = useState({}); + const [disabledTooltipText, setDisabledTooltipText] = useState(""); + const [steps, setSteps] = useState>([]); - const handleDumpChange=()=>{ - setIsLiveDump(!isLiveDump); + const handleDumpChange = (e) => { + if (e.target.name != "isLiveDump") setIsLiveDump(false); + else setIsLiveDump(true); + }; + const handleDumpSelection = (e, buttonId) => { + moveFromStep1ToStep2(e, buttonId); }; const handleButtonClick = () => { - setOpenDialog(true) - } + setSteps([ + { + step: 1, + title: "Select Dump Type", + content: ( + <> + + Please choose one of the following options: + + + {buttons.map((button) => ( + + handleDumpSelection(e, button.id)} + color="primary" + > + {button.icon} + {button.label} + + + ))} + + + ), + }, + ]); + setOpenDialog(true); + }; const resetAllStates = () => { - setOpenDialog(false) - setStep(0) - setDumpType(null) - setSelectedPods([]) - setValidationError({}) - setAllPods([]) - setSubmitError({}) - } + setOpenDialog(false); + setStep(0); + setDumpType(null); + setSelectedPods([]); + setValidationError({}); + setAllPods([]); + setSubmitError({}); + }; - const handleCloseDialog = () => resetAllStates() + const handleCloseDialog = () => resetAllStates(); const handleCheckboxChange = (event) => { - const { name, checked } = event.target + const { name, checked } = event.target; - const addToArray = (item: string, array: Array) => [...array, item] - const removeFromArray = (item: string, array: Array) => array.filter((pod) => pod !== item) + const addToArray = (item: string, array: Array) => [...array, item]; + const removeFromArray = (item: string, array: Array) => + array.filter((pod) => pod !== item); setSelectedPods((prevSelectedPods) => { - const updatedPods = checked ? addToArray(name, prevSelectedPods) : removeFromArray(name, prevSelectedPods) + const updatedPods = checked + ? addToArray(name, prevSelectedPods) + : removeFromArray(name, prevSelectedPods); - setValidationError(validate(updatedPods, dumpType)) - return updatedPods - }) - } + setValidationError(validate(updatedPods, dumpType)); + return updatedPods; + }); + }; const moveFromStep1ToStep2 = (event, dumpType: string) => { - setDumpType(dumpType as DumpType) - setStep(1) - } + setDumpType(dumpType as DumpType); + setStep((step) => step + 1); + }; useEffect(() => { if (openDialog) { - setLoadingPodList(true) + setLoadingPodList(true); fetch(getPodsEndpoint(manifestId)) .then((response) => response.json()) .then(setAllPods) - .catch((error) => console.log('Error:', error)) - .finally(() => setLoadingPodList(false)) + .catch((error) => console.log("Error:", error)) + .finally(() => setLoadingPodList(false)); } - }, [openDialog]) + }, [openDialog]); useEffect(() => { if (disabled) { - setDisabledTooltipText(`Not available for ${cluster}`) + setDisabledTooltipText(`Not available for ${cluster}`); } else { - setDisabledTooltipText('') + setDisabledTooltipText(""); } - }, [disabled]) + }, [disabled]); - const buttons = [ - { id: 'heap_dump', icon: , label: 'Heap Dump' }, - { id: 'thread_dump', icon: , label: 'Thread Dump' }, - ] + useEffect(() => { + const stepsToSet = [...steps]; + stepsToSet.splice(1); + if (dumpType === DumpType.HeapDump) { + stepsToSet.push({ + step: 2, + title: "Select Dump Type", + content: ( + <> + + Please select the type of dump you want to generate: + + + + } + label="Live Dump" + className="generateDump" + /> + + } + label="Full Dump" + className="generateDump" + /> + + {!isLiveDump && ( + + Performing a full dump may temporarily impact pod availability + and resource usage. Use this option judiciously to avoid + disruptions + + )} + + ), + }); + } + stepsToSet.push({ + step: dumpType === DumpType.HeapDump ? 3 : 2, + title: "Select Pods", + content: ( + <> + + Please select the pods you want to generate a dump for: + + + {renderPodList()} + + + ), + }); + setSteps(stepsToSet); + }, [dumpType, isLiveDump]); const renderPodList = () => { if (loadingPodList) { - return Loading pod list. Please wait... + return ( + Loading pod list. Please wait... + ); } else { return allPods.map((pod, idx) => ( } label={pod} - style={{ display: 'block' }} + style={{ display: "block" }} /> - )) + )); } - } - - const steps = [ - { - step: 1, - title: 'Select Dump Type', - content: ( - <> - - Please choose one of the following options: - - - {buttons.map((button) => ( - - moveFromStep1ToStep2(e, button.id)} color='primary'> - {button.icon} - {button.label} - - - ))} - - - Please select dump type: - - - } label="Live dump" /> - - } label="Full dump" /> - - ), - }, - { - step: 2, - title: 'Select pods', - content: ( - <> - - Select the pods for which you want to generate the dump. - -
- {renderPodList()} - - ), - }, - ] + }; const validate = (array: Array, dumpType: DumpType | null): {} => { - const errors = {} + const errors = {}; if (array.length === 0) { - errors['Pod list'] = 'Please select at least one pod.' + errors["Pod list"] = "Please select at least one pod."; } if (!dumpType) { - errors['Dump type'] = 'Please select a dump type.' + errors["Dump type"] = "Please select a dump type."; } - return errors - } + return errors; + }; const sendDumpRequest = (body: DumpRequest) => { - return post(body, createDumpEndpoint) - } + return post(body, createDumpEndpoint); + }; const handleSubmit = () => { - const validationErrors = validate(selectedPods, dumpType) - setValidationError(validationErrors) - if (!_.isEmpty(validationErrors)) return + const validationErrors = validate(selectedPods, dumpType); + setValidationError(validationErrors); + if (!_.isEmpty(validationErrors)) return; sendDumpRequest({ manifestId: manifestId, dumpType: dumpType!!, podNames: selectedPods, - isLiveDump: isLiveDump - }).then((response) => { - if (response.status !== 201) { - return response.json().then(({ status }) => { - throw new Error(status) - }) - } else { - resetAllStates() - } - }).catch((error) => { - setValidationError({ 'Error': `Something went wrong. Please try again later. ${error}` }) + ...(dumpType === DumpType.HeapDump ? { isLiveDump: isLiveDump } : {}), }) - - } + .then((response) => { + if (response.status !== 201) { + return response.json().then(({ status }) => { + throw new Error(status); + }); + } else { + resetAllStates(); + } + }) + .catch((error) => { + setValidationError({ + Error: `Something went wrong. Please try again later. ${error}`, + }); + }); + }; const handleBackButtonClick = () => { - setSelectedPods([]) - setStep(0) - setValidationError({}) - } + setSelectedPods([]); + setStep((step) => step - 1); + setValidationError({}); + }; - const languagesEnabled = ['Java', 'Kotlin'] + const handleNextButtonClick = () => { + setStep((step) => step + 1); + }; - if (!languagesEnabled.includes(language)) return null + const languagesEnabled = ["Java", "Kotlin"]; + + if (!languagesEnabled.includes(language)) return null; return ( <> + Generate Dump + - + -
- Step {steps[step]?.step}: {steps[step]?.title} - {step === 1 && ( - - )} +
+ + Step {steps[step]?.step}: {steps[step]?.title} + +
+ {step > 0 && step < steps.length - 1 && ( + + )} + {step != 0 && ( + + )} +
- - {steps[step]?.content} - + {steps[step]?.content} - {step === 1 && ( + {step>0 && step === steps.length - 1 && ( <> )} -
- ) -} + ); +}; -export default GenerateDumpComponent +export default GenerateDumpComponent; diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..f57bdae --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1 @@ +declare module "*.module.css"; \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index b45c975..ac4b308 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,8 +4,13 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const CopyPlugin = require('copy-webpack-plugin'); module.exports = { + target: 'web', entry: { - main: './src/index.tsx', + entry:[ + './src/index.tsx', + 'whatwg-fetch', + 'core-js/features/promise', + ], }, resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx', '.css', '.scss'], @@ -18,7 +23,7 @@ module.exports = { proxy: [{ context: ['/api', '/oauth2', '/login'], target: 'http://localhost:8080', - }] + }], }, output: { path: path.join(__dirname, '/dist'), @@ -41,12 +46,12 @@ module.exports = { }, }, { - test: /\.css$/i, + test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"], }, { - test: /\.scss$/i, - use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"], + test: /\.scss$/, + use: [MiniCssExtractPlugin.loader, "sass-loader"], }, ], }, diff --git a/yarn.lock b/yarn.lock index aa4d04e..52043e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1994,6 +1994,11 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" @@ -3806,7 +3811,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^4.1.1: +camel-case@^4.1.1, camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== @@ -3987,6 +3992,13 @@ clean-css@^4.2.3: dependencies: source-map "~0.6.0" +clean-css@^5.2.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -4118,6 +4130,11 @@ commander@^7.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-tags@^1.8.0: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" @@ -4291,7 +4308,7 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.6.5: +core-js@^3.35.1, core-js@^3.6.5: version "3.35.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.35.1.tgz#9c28f8b7ccee482796f8590cc8d15739eaaf980c" integrity sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw== @@ -5205,35 +5222,35 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== -enzyme-adapter-react-16@^1.15.7: - version "1.15.7" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.7.tgz#a737e6d8e2c147e9da5acf957755be7634f76201" - integrity sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw== +enzyme-adapter-react-16@^1.15.8: + version "1.15.8" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.8.tgz#1aecb5daadaae33d32c5b8b78566d7cf45dc49d8" + integrity sha512-uYGC31eGZBp5nGsr4nKhZKvxGQjyHGjS06BJsUlWgE29/hvnpgCsT1BJvnnyny7N3GIIVyxZ4O9GChr6hy2WQA== dependencies: - enzyme-adapter-utils "^1.14.1" - enzyme-shallow-equal "^1.0.5" - has "^1.0.3" - object.assign "^4.1.4" - object.values "^1.1.5" + enzyme-adapter-utils "^1.14.2" + enzyme-shallow-equal "^1.0.7" + hasown "^2.0.0" + object.assign "^4.1.5" + object.values "^1.1.7" prop-types "^15.8.1" react-is "^16.13.1" react-test-renderer "^16.0.0-0" - semver "^5.7.0" + semver "^5.7.2" -enzyme-adapter-utils@^1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz#f30db15dafc22e0ccd44f5acc8d93be29218cdcf" - integrity sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ== +enzyme-adapter-utils@^1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.2.tgz#1d012e6261accbe7d406db098bb4d8dfdce8c003" + integrity sha512-1ZC++RlsYRaiOWE5NRaF5OgsMt7F5rn/VuaJIgc7eW/fmgg8eS1/Ut7EugSPPi7VMdWMLcymRnMF+mJUJ4B8KA== dependencies: airbnb-prop-types "^2.16.0" - function.prototype.name "^1.1.5" - has "^1.0.3" - object.assign "^4.1.4" - object.fromentries "^2.0.5" + function.prototype.name "^1.1.6" + hasown "^2.0.0" + object.assign "^4.1.5" + object.fromentries "^2.0.7" prop-types "^15.8.1" - semver "^5.7.1" + semver "^6.3.1" -enzyme-shallow-equal@^1.0.1, enzyme-shallow-equal@^1.0.5: +enzyme-shallow-equal@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz#5528a897a6ad2bdc417c7221a7db682cd01711ba" integrity sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg== @@ -5241,6 +5258,14 @@ enzyme-shallow-equal@^1.0.1, enzyme-shallow-equal@^1.0.5: has "^1.0.3" object-is "^1.1.5" +enzyme-shallow-equal@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz#4e3aa678022387a68e6c47aff200587851885b5e" + integrity sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg== + dependencies: + hasown "^2.0.0" + object-is "^1.1.5" + enzyme@^3.10.0: version "3.11.0" resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28" @@ -6689,6 +6714,19 @@ html-minifier-terser@^5.0.1: relateurl "^0.2.7" terser "^4.6.3" +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + html-webpack-plugin@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" @@ -6704,20 +6742,16 @@ html-webpack-plugin@4.5.0: tapable "^1.1.3" util.promisify "1.0.0" -html-webpack-plugin@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" - integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== +html-webpack-plugin@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.20" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" htmlparser2@^6.1.0: version "6.1.0" @@ -9096,7 +9130,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.4: +object.assign@^4.1.0, object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== @@ -9115,7 +9149,7 @@ object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2, object.entr define-properties "^1.2.0" es-abstract "^1.22.1" -object.fromentries@^2.0.5, object.fromentries@^2.0.6, object.fromentries@^2.0.7: +object.fromentries@^2.0.6, object.fromentries@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== @@ -9161,7 +9195,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.5, object.values@^1.1.6, object.values@^1.1.7: +object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== @@ -9339,7 +9373,7 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" -param-case@^3.0.3: +param-case@^3.0.3, param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== @@ -10313,6 +10347,14 @@ pretty-error@^2.1.1: lodash "^4.17.20" renderkid "^2.0.4" +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + pretty-format@^24.0.0, pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" @@ -10975,6 +11017,17 @@ renderkid@^2.0.4: lodash "^4.17.21" strip-ansi "^3.0.1" +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" @@ -11374,7 +11427,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -12137,7 +12190,7 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -12226,7 +12279,7 @@ terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.26.0, terser@^5.3.4: +terser@^5.10.0, terser@^5.26.0, terser@^5.3.4: version "5.27.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== @@ -13146,7 +13199,7 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@^3.4.1: +whatwg-fetch@^3.4.1, whatwg-fetch@^3.6.20: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==