Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Syncing latest changes from master for odf-console #1572

Merged
merged 41 commits into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
851d37a
Adds optional chaining for label selector in topology view
bipuladh Sep 9, 2024
6b81dac
Security: fix webpack version
alfonsomthd Sep 9, 2024
00bf9fb
Merge pull request #1567 from bipuladh/fix-node-map
openshift-merge-bot[bot] Sep 10, 2024
1723e18
Merge pull request #1568 from alfonsomthd/fix-cve-webpack
openshift-merge-bot[bot] Sep 10, 2024
8f973cb
Add initial setup for AWS S3 SDK
SanjalKatiyar Sep 10, 2024
f142826
Merge pull request #1569 from SanjalKatiyar/initial_s3_setup
openshift-merge-bot[bot] Sep 17, 2024
465b880
Block creation of external mode when Provider mode is already present
bipuladh Sep 20, 2024
f42078a
Merge pull request #1590 from bipuladh/block-ext
openshift-merge-bot[bot] Sep 20, 2024
d093f16
Create Bucket page: display CreateOBC form.
alfonsomthd Sep 20, 2024
59dec8a
Merge pull request #1594 from alfonsomthd/bucket-create
openshift-merge-bot[bot] Sep 26, 2024
46125c9
Fix security issue: Backtracking regular expressions
alfonsomthd Sep 26, 2024
5474f0c
Fix flaky E2E test
alfonsomthd Sep 26, 2024
22b0c4a
Merge pull request #1597 from alfonsomthd/fix-flaky-e2e
openshift-merge-bot[bot] Sep 26, 2024
896224d
Sanity checks: ensure client plugin build is healthy
alfonsomthd Sep 27, 2024
6c7a90e
Merge pull request #1599 from alfonsomthd/client-build
openshift-merge-bot[bot] Sep 30, 2024
baab291
Add buckets overview page (header, details/objects list tabs, actions…
SanjalKatiyar Sep 20, 2024
eb8baf6
Merge pull request #1591 from SanjalKatiyar/s3_object_list
openshift-merge-bot[bot] Sep 30, 2024
1181a78
Merge pull request #1596 from alfonsomthd/update-path-to-regexp
openshift-merge-bot[bot] Oct 2, 2024
99b9bc0
Update OWNERS file
SanjalKatiyar Oct 3, 2024
79e751e
Merge pull request #1607 from SanjalKatiyar/update_owners
openshift-merge-bot[bot] Oct 3, 2024
9c221d5
Add 'Create Bucket' form (via S3-compat API)
alfonsomthd Oct 1, 2024
2c5dfc0
Merge pull request #1608 from alfonsomthd/bucket-create
openshift-merge-bot[bot] Oct 3, 2024
14b314a
Add object actions - presigned URL
SanjalKatiyar Oct 1, 2024
607cd34
Add object actions - download and preview
SanjalKatiyar Oct 3, 2024
e83bb50
Create S3 Bucket form cleanup
alfonsomthd Oct 4, 2024
abb8239
Merge pull request #1604 from SanjalKatiyar/actions_presigned_url
openshift-merge-bot[bot] Oct 4, 2024
c27a9c5
Reset radio button when Provider mode is selected from dropdown
bipuladh Oct 4, 2024
e0f7403
Merge pull request #1612 from alfonsomthd/bucket-details
openshift-merge-bot[bot] Oct 7, 2024
ac12683
Hide In-transit Encryption checkbox when MCG deployment mode is selected
malayparida2000 Oct 7, 2024
79087f7
Merge pull request #1617 from malayparida2000/hide_check_mcg
openshift-merge-bot[bot] Oct 8, 2024
43d1d39
Add object actions - create folder
SanjalKatiyar Oct 3, 2024
dd3dc11
Fetch external cluster python script from Rook CM
bipuladh Oct 8, 2024
6f69f2e
Merge pull request #1614 from bipuladh/fix-provider-mode
openshift-merge-bot[bot] Oct 8, 2024
abe297c
Merge pull request #1620 from bipuladh/ext-script
openshift-merge-bot[bot] Oct 8, 2024
53ea858
Fix bundle analyzer script
GowthamShanmugam Oct 8, 2024
74a0345
Adds support for new volume modes in IBM flashsystem
bipuladh Oct 8, 2024
a768cd0
Add object actions - delete objects
SanjalKatiyar Oct 7, 2024
5bdfa87
Merge pull request #1626 from GowthamShanmugam/fix_bundle_analyzer
openshift-merge-bot[bot] Oct 9, 2024
27fb46e
Merge pull request #1619 from bipuladh/ibm-flash
openshift-merge-bot[bot] Oct 9, 2024
cc59bbf
Merge pull request #1610 from SanjalKatiyar/object_actions_delete
openshift-merge-bot[bot] Oct 9, 2024
1760799
RHSTOR-6195: Bucket - list page
GowthamShanmugam Oct 8, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ module.exports = {
'**/*.spec.tsx',
'./jest/setup.ts',
'./cypress/**',
'./analyzeTest.ts',
],
optionalDependencies: false,
peerDependencies: false,
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/frontend-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ jobs:
- run: yarn install --prod --frozen-lockfile
- run: yarn build
- run: yarn build-mco
- run: yarn build-client
- run: yarn install # Install dev. deps.
- run: yarn lint
- run: yarn format-test
- run: yarn i18n-test
- run: yarn test-coverage
- run: yarn analyze-odf
- run: yarn analyze-mco
- run: yarn analyze-client
7 changes: 4 additions & 3 deletions OWNERS
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
reviewers:
- cloudbehl
- bipuladh
- SanjalKatiyar
- vbnrh
- rexagod
- GowthamShanmugam
- alfonsomthd
approvers:
- cloudbehl
- bipuladh
- SanjalKatiyar
- GowthamShanmugam
- alfonsomthd
component: ODF Console
15 changes: 8 additions & 7 deletions analyzeTest.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as fs from 'fs';
import { parseChunked } from '@discoveryjs/json-ext';

const pluginName = process.env.PLUGIN;
const MAX_ASSET_SIZE = 17; //17 MiB
Expand All @@ -12,17 +13,17 @@ const stringifyMiB = (value: ReturnType<typeof toMiB>): string =>

const getParsedStatFile = () => {
const filePath = getStatsFilePath();
const statsFile = fs.readFileSync(filePath, 'utf-8');
return JSON.parse(statsFile);

return parseChunked(fs.createReadStream(filePath, { encoding: 'utf8' }));
};

type BundleDataMap = Record<string, number>;

// [Valid Bundles, Violating Bunldes]
type GetBundleInformation = () => [BundleDataMap, BundleDataMap];
type GetBundleInformation = () => Promise<[BundleDataMap, BundleDataMap]>;

const getBundleInformation: GetBundleInformation = () => {
const statsData = getParsedStatFile();
const getBundleInformation: GetBundleInformation = async () => {
const statsData = await getParsedStatFile();
const validAssets = {};
const violatingAssets = {};

Expand All @@ -39,8 +40,8 @@ const getBundleInformation: GetBundleInformation = () => {
return [validAssets, violatingAssets];
};

const validateBuild = () => {
const [validAssets, violatingAssets] = getBundleInformation();
const validateBuild = async () => {
const [validAssets, violatingAssets] = await getBundleInformation();
if (Object.keys(violatingAssets).length > 0) {
// eslint-disable-next-line no-console
console.error('Assets are larger than expected', violatingAssets);
Expand Down
2 changes: 1 addition & 1 deletion cypress/views/storage-pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ export const deleteStoragePool = (poolName: string) => {
navigateToStoragePoolList();
openStoragePoolKebab(poolName);
cy.byTestActionID('Delete Pool').click();
cy.contains('Delete Storage Pool');
cy.contains('Delete Storage Pool', { timeout: 5 * 1000 });
triggerPoolFormFooterAction('delete');

cy.log('Verify that the pool is not found.');
Expand Down
106 changes: 97 additions & 9 deletions locales/en/plugin__odf-console.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@
"Status": "Status",
"Storage Client": "Storage Client",
"Overview": "Overview",
"Thick": "Thick",
"Thin": "Thin",
"Compressed": "Compressed",
"Deduplicated": "Deduplicated",
"Deduplicated thin": "Deduplicated thin",
"Deduplicated compressed": "Deduplicated compressed",
"IP address": "IP address",
"Rest API IP address of IBM FlashSystem.": "Rest API IP address of IBM FlashSystem.",
"Username": "Username",
Expand Down Expand Up @@ -144,10 +150,6 @@
"Clusters": "Clusters",
"Connected applications": "Connected applications",
"Cannot delete while connected to an application.": "Cannot delete while connected to an application.",
"Loading Empty Page": "Loading Empty Page",
"You are not authorized to complete this action. See your cluster administrator for role-based access control information.": "You are not authorized to complete this action. See your cluster administrator for role-based access control information.",
"Not Authorized": "Not Authorized",
"Empty Page": "Empty Page",
"Clean up application resources on current primary cluster {{ failoverCluster }} to start the relocation.": "Clean up application resources on current primary cluster {{ failoverCluster }} to start the relocation.",
"Cleanup Pending": "Cleanup Pending",
"Relocating to cluster {{ preferredCluster }}": "Relocating to cluster {{ preferredCluster }}",
Expand Down Expand Up @@ -1029,6 +1031,7 @@
"BucketClass": "BucketClass",
"Enable replication": "Enable replication",
"This option provides higher resiliency of objects stored in NooBaa buckets": "This option provides higher resiliency of objects stored in NooBaa buckets",
"A namespace controls access to the OBC and ties the buckets to a specific project.": "A namespace controls access to the OBC and ties the buckets to a specific project.",
"Create ObjectBucketClaim": "Create ObjectBucketClaim",
"Event log bucket": "Event log bucket",
"Enter a bucket name": "Enter a bucket name",
Expand Down Expand Up @@ -1096,6 +1099,60 @@
"NamespaceStore details": "NamespaceStore details",
"Target Blob Container": "Target Blob Container",
"Num Volumes": "Num Volumes",
"Empty bucket": "Empty bucket",
"Delete bucket": "Delete bucket",
"Edit labels": "Edit labels",
"Edit annotations": "Edit annotations",
"Edit bucket": "Edit bucket",
"Objects": "Objects",
"Refresh": "Refresh",
"Created via OBC": "Created via OBC",
"Created via S3": "Created via S3",
"MCG": "MCG",
"Object path: ": "Object path: ",
"Copy to share": "Copy to share",
"Erase the contents of your bucket": "Erase the contents of your bucket",
"Storage endpoint": "Storage endpoint",
"Create on": "Create on",
"Owner": "Owner",
"Create and manage your buckets": "Create and manage your buckets",
"Navigate through your buckets effortlessly. View the contents of your S3-managed and Openshift-managed buckets, making it easy to locate and inspect objects.": "Navigate through your buckets effortlessly. View the contents of your S3-managed and Openshift-managed buckets, making it easy to locate and inspect objects.",
"No buckets found": "No buckets found",
"Search a bucket by name": "Search a bucket by name",
"Create bucket": "Create bucket",
"Browse, upload, and manage objects in buckets.": "Browse, upload, and manage objects in buckets.",
"Create Bucket": "Create Bucket",
"An object bucket is a cloud storage container that organizes and manages files (objects), allowing users to store, retrieve and control access to data efficiently.": "An object bucket is a cloud storage container that organizes and manages files (objects), allowing users to store, retrieve and control access to data efficiently.",
"Select bucket creation method": "Select bucket creation method",
"Create via S3 API": "Create via S3 API",
"Ideal for applications and systems that need to interact directly with S3-compatible storage.": "Ideal for applications and systems that need to interact directly with S3-compatible storage.",
"Create via Object Bucket Claim": "Create via Object Bucket Claim",
"Ideal for Kubernetes environments providing a more abstracted approach to managing storage resources and leveraging dynamic provisioning.": "Ideal for Kubernetes environments providing a more abstracted approach to managing storage resources and leveraging dynamic provisioning.",
"OBC references a StorageClass that uses a provisioner to interact with the S3 API and create the bucket. Kubernetes binds the OBC to the bucket, making it accessible to applications.": "OBC references a StorageClass that uses a provisioner to interact with the S3 API and create the bucket. Kubernetes binds the OBC to the bucket, making it accessible to applications.",
"Bucket Name": "Bucket Name",
"my-bucket": "my-bucket",
"A unique name for your bucket.": "A unique name for your bucket.",
"Tags": "Tags",
"Use different criteria for tagging your bucket.": "Use different criteria for tagging your bucket.",
"No tags are attached to this bucket.": "No tags are attached to this bucket.",
"Add tag": "Add tag",
"Value (optional)": "Value (optional)",
"Delete objects": "Delete objects",
"Actions": "Actions",
"Create folder": "Create folder",
"Failed to delete {{ errorCount }} object from the bucket. View deletion summary for details.": "Failed to delete {{ errorCount }} object from the bucket. View deletion summary for details.",
"Failed to delete {{ errorCount }} objects from the bucket. View deletion summary for details.": "Failed to delete {{ errorCount }} objects from the bucket. View deletion summary for details.",
"View failed objects": "View failed objects",
"Successfully deleted {{ successCount }} object from the bucket.": "Successfully deleted {{ successCount }} object from the bucket.",
"Successfully deleted {{ successCount }} objects from the bucket.": "Successfully deleted {{ successCount }} objects from the bucket.",
"Objects are the fundamental entities stored in buckets.": "Objects are the fundamental entities stored in buckets.",
"Size": "Size",
"Last modified": "Last modified",
"Download": "Download",
"Preview": "Preview",
"Share with presigned URL": "Share with presigned URL",
"No objects found": "No objects found",
"You do not have any objects in the bucket": "You do not have any objects in the bucket",
"<0>The amount of storage allocated to the client cluster for usage.</0><1>Due to simultaneous usage by multiple client clusters, actual available storage may vary affecting your allocated storage quota.</1>": "<0>The amount of storage allocated to the client cluster for usage.</0><1>Due to simultaneous usage by multiple client clusters, actual available storage may vary affecting your allocated storage quota.</1>",
"No storage clients found.": "No storage clients found.",
"You do not have any storage clients connected to this Data Foundation provider cluster.": "You do not have any storage clients connected to this Data Foundation provider cluster.",
Expand Down Expand Up @@ -1258,6 +1315,36 @@
"and": "and",
"GiB RAM": "GiB RAM",
"Configure Performance": "Configure Performance",
"This name is already in use. Try using a different name for your folder.": "This name is already in use. Try using a different name for your folder.",
"The forward slash (\"/\") cannot be used.": "The forward slash (\"/\") cannot be used.",
"All characters are allowed except for the forward slash (\"/\").": "All characters are allowed except for the forward slash (\"/\").",
"A unique folder name is required. All characters are allowed except for the forward slash (\"/\").": "A unique folder name is required. All characters are allowed except for the forward slash (\"/\").",
"Organize objects within a bucket by creating virtual folders for easier management and navigation of objects.": "Organize objects within a bucket by creating virtual folders for easier management and navigation of objects.",
"Folders structure and group objects logically by using prefixes in object keys, without enforcing any physical hierarchy.": "Folders structure and group objects logically by using prefixes in object keys, without enforcing any physical hierarchy.",
"Folder name": "Folder name",
"<0>To confirm deletion, type <1>{{delete}}</1> in the text input field.</0>": "<0>To confirm deletion, type <1>{{delete}}</1> in the text input field.</0>",
"Object name": "Object name",
"Delete object?": "Delete object?",
"Deleted objects will no longer be visible in the bucket. If versioning is enabled a delete marker is created, you can recover object from previous versions. For unversioned objects, deletion is final and cannot be undone.": "Deleted objects will no longer be visible in the bucket. If versioning is enabled a delete marker is created, you can recover object from previous versions. For unversioned objects, deletion is final and cannot be undone.",
"Delete object": "Delete object",
"Delete status": "Delete status",
"Failed": "Failed",
"Object delete summary": "Object delete summary",
"Expires after": "Expires after",
"minus": "minus",
"plus": "plus",
"Validity period of the presigned URL.": "Validity period of the presigned URL.",
"Share link": "Share link",
"Valid until: ": "Valid until: ",
"Copy": "Copy",
"Copied": "Copied",
"This URL will automatically expire based on your configured time or when your current session expires.": "This URL will automatically expire based on your configured time or when your current session expires.",
"Share object with a presigned URL": "Share object with a presigned URL",
"Grant third-party access to an object for a limited time.": "Grant third-party access to an object for a limited time.",
"Copy presigned URL to clipboard": "Copy presigned URL to clipboard",
"Create presigned URL": "Create presigned URL",
"Object: ": "Object: ",
"A third-party entity can access the object using this presigned URL, which allows sharing without requiring a login, until the URL expires.": "A third-party entity can access the object using this presigned URL, which allows sharing without requiring a login, until the URL expires.",
"hr": "hr",
"min": "min",
"Select at least 2 Backing Store resources": "Select at least 2 Backing Store resources",
Expand Down Expand Up @@ -1313,7 +1400,6 @@
"{{count}} annotation_one": "{{count}} annotation",
"{{count}} annotation_other": "{{count}} annotation",
"Created at": "Created at",
"Owner": "Owner",
"No labels": "No labels",
"No owner": "No owner",
"Select input": "Select input",
Expand All @@ -1322,6 +1408,10 @@
"No resources available": "No resources available",
"Select {{resourceLabel}}": "Select {{resourceLabel}}",
"Error Loading": "Error Loading",
"Loading empty page": "Loading empty page",
"You are not authorized to complete this action. See your cluster administrator for role-based access control information.": "You are not authorized to complete this action. See your cluster administrator for role-based access control information.",
"Not Authorized": "Not Authorized",
"Empty Page": "Empty Page",
"Reset": "Reset",
"An error occurred. Please try again.": "An error occurred. Please try again.",
"Error Loading {{label}}: {{message}}": "Error Loading {{label}}: {{message}}",
Expand All @@ -1336,12 +1426,9 @@
"{{labels}} content is not available in the catalog at this time due to loading failures.": "{{labels}} content is not available in the catalog at this time due to loading failures.",
"Timed out fetching new data. The data below is stale.": "Timed out fetching new data. The data below is stale.",
"Getting started resources": "Getting started resources",
"Edit labels": "Edit labels",
"Edit annotations": "Edit annotations",
"Edit {{resourceLabel}}": "Edit {{resourceLabel}}",
"Delete {{resourceLabel}}": "Delete {{resourceLabel}}",
"You do not have permission to perform this action": "You do not have permission to perform this action",
"Actions": "Actions",
"Expand to fix validation errors": "Expand to fix validation errors",
"unknown": "unknown",
"equals any of": "equals any of",
Expand All @@ -1357,6 +1444,7 @@
"Values": "Values",
"Select the values": "Select the values",
"Add label expression": "Add label expression",
"Search by name...": "Search by name...",
"Delete {{kind}}?": "Delete {{kind}}?",
"Are you sure you want to delete <2>{{resourceName}}</2> in namespace <6>{{namespace}}</6>?": "Are you sure you want to delete <2>{{resourceName}}</2> in namespace <6>{{namespace}}</6>?",
"Are you sure you want to delete <2>{{resourceName}}</2>?": "Are you sure you want to delete <2>{{resourceName}}</2>?",
Expand All @@ -1383,6 +1471,7 @@
"Infrastructures": "Infrastructures",
"Subscriptions": "Subscriptions",
"Project": "Project",
"Composable table": "Composable table",
"Show password": "Show password",
"Enter node": "Enter node",
"Deployment details": "Deployment details",
Expand Down Expand Up @@ -1413,7 +1502,6 @@
"Reason": "Reason",
"Message": "Message",
"No conditions found": "No conditions found",
"Copied": "Copied",
"View documentation": "View documentation",
"Oh no! Something went wrong.": "Oh no! Something went wrong.",
"Copied to clipboard": "Copied to clipboard",
Expand Down
14 changes: 11 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"analyze-common": "yarn build:generate && NODE_ENV=production I8N_NS=${I8N_NS} ANALYZE_BUNDLE=true yarn ts-node ./node_modules/.bin/webpack -c ./webpack.config.ts",
"analyze-odf": "PLUGIN=odf yarn analyze-common && PLUGIN=odf yarn ts-node ./analyzeTest.ts",
"analyze-mco": "PLUGIN=mco yarn analyze-common && PLUGIN=mco yarn ts-node ./analyzeTest.ts",
"analyze-client": "PLUGIN=client yarn analyze-common && PLUGIN=client yarn ts-node ./analyzeTest.ts",
"dev": "PLUGIN=odf I8N_NS=plugin__odf-console yarn server:plugin",
"dev:no-type-check": "DEV_NO_TYPE_CHECK=true yarn dev",
"dev-mco": "PLUGIN=mco I8N_NS=plugin__odf-multicluster-console yarn server:plugin",
Expand Down Expand Up @@ -58,9 +59,11 @@
"dev:c": "yarn ocp-console & PLUGIN=${PLUGIN} I8N_NS=${I8N_NS} yarn server:plugin & wait"
},
"dependencies": {
"@aws-sdk/client-s3": "3.667.0",
"@aws-sdk/s3-request-presigner": "3.614.0",
"@openshift-console/dynamic-plugin-sdk": "1.3.0",
"@openshift-console/dynamic-plugin-sdk-internal": "1.0.0",
"@openshift-console/dynamic-plugin-sdk-webpack": "1.1.0",
"@openshift-console/dynamic-plugin-sdk-webpack": "1.1.1",
"@openshift-console/plugin-shared": "^0.0.1",
"@patternfly/patternfly": "5.0.2",
"@patternfly/react-charts": "7.1.0",
Expand Down Expand Up @@ -89,6 +92,7 @@
"js-base64": "^2.1.9",
"js-yaml": "^3.13.1",
"lodash-es": "^4.17.21",
"luxon": "^3.3.0",
"murmurhash-js": "^1.0.0",
"react": "^17.0.1",
"react-copy-to-clipboard": "5.x",
Expand All @@ -100,7 +104,6 @@
"react-i18next": "^11.11.4",
"react-linkify": "^0.2.2",
"react-redux": "7.2.2",
"react-router": "5.3.x",
"react-router-dom": "5.3.x",
"react-router-dom-v5-compat": "^6.11.2",
"react-tagsinput": "^3.19.0",
Expand All @@ -110,27 +113,30 @@
"sass-loader": "^13.0.2",
"semver": "6.x",
"style-loader": "^0.23.1",
"swr": "2.2.5",
"thread-loader": "3.0.4",
"ts-loader": "^9.4.1",
"ts-node": "5.0.1",
"tsm": "^2.3.0",
"typesafe-actions": "^4.2.1",
"typescript": "^4.8",
"victory-core": "^35.4.4",
"webpack": "5.75.0",
"webpack": "5.94.0",
"webpack-bundle-analyzer": "^4.10.2",
"webpack-cli": "4.5.x",
"yup": "^0.32.11"
},
"devDependencies": {
"@cypress/webpack-preprocessor": "^5.9.1",
"@discoveryjs/json-ext": "0.6.1",
"@swc/core": "1.3.19",
"@swc/jest": "^0.2.23",
"@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^12",
"@testing-library/react-hooks": "^8.0.1",
"@testing-library/user-event": "^14.5.1",
"@types/jest": "29.2.2",
"@types/luxon": "^3.3.1",
"@types/node": "^14.14.34",
"@types/react": "16.8.13",
"@types/react-helmet": "^6.1.1",
Expand Down Expand Up @@ -174,7 +180,9 @@
},
"resolutions": {
"jest-environment-jsdom/jsdom": "^20.0.3",
"webpack": "5.94.0",
"webpack-bundle-analyzer/ws": "^7.5.10",
"webpack-dev-server/express": "^4.21.0",
"webpack-dev-server/ws": "^8.18.0",
"tough-cookie": "^4.1.3"
},
Expand Down
Loading
Loading