diff --git a/.eslintrc.yml b/.eslintrc.yml
index 678750c085b296aba8ef72cdf88ac10e4b7da8cd..f1292aa27939f82a8777fe807ff25337d62466e9 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -43,6 +43,17 @@ rules:
   promise/always-return: off
   promise/no-callback-in-promise: off
   '@gitlab/no-global-event-off': error
+  no-param-reassign:
+    - error
+    - props: true
+      ignorePropertyModificationsFor:
+        - acc
+        - accumulator
+        - el
+        - element
+        - state
+      ignorePropertyModificationsForRegex:
+        - '^draft'
   import/order:
     - error
     - groups:
diff --git a/app/assets/javascripts/access_tokens/components/projects_token_selector.vue b/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
index cc5532696c78c889d11ddc99cdc13d70d0564183..a746f62b3a1666597b8afd701a3000cac0b06e3f 100644
--- a/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
+++ b/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
@@ -104,10 +104,8 @@ export default {
           const { projects: previousProjects } = previousResult;
 
           return produce(previousResult, (draftData) => {
-            /* eslint-disable no-param-reassign */
             draftData.projects.nodes = [...previousProjects.nodes, ...newProjects.nodes];
             draftData.projects.pageInfo = newProjects.pageInfo;
-            /* eslint-enable no-param-reassign */
           });
         },
       });
diff --git a/app/assets/javascripts/alerts_settings/graphql.js b/app/assets/javascripts/alerts_settings/graphql.js
index c6c19d26adb1dc21f3337478780b3495fb9ad6bc..72817f636ff7c2e0269854026a4bc01539e5b142 100644
--- a/app/assets/javascripts/alerts_settings/graphql.js
+++ b/app/assets/javascripts/alerts_settings/graphql.js
@@ -27,10 +27,8 @@ const resolvers = {
       const sourceData = cache.readQuery({ query: getCurrentIntegrationQuery });
       const data = produce(sourceData, (draftData) => {
         if (id === null) {
-          // eslint-disable-next-line no-param-reassign
           draftData.currentIntegration = null;
         } else {
-          // eslint-disable-next-line no-param-reassign
           draftData.currentIntegration = {
             id,
             name,
diff --git a/app/assets/javascripts/alerts_settings/utils/cache_updates.js b/app/assets/javascripts/alerts_settings/utils/cache_updates.js
index c29160c1e396471fe3461870cc9dbaa361788aa0..716c709a93153c31803a53d96d8aa1f683a7a3db 100644
--- a/app/assets/javascripts/alerts_settings/utils/cache_updates.js
+++ b/app/assets/javascripts/alerts_settings/utils/cache_updates.js
@@ -15,7 +15,6 @@ const deleteIntegrationFromStore = (store, query, { httpIntegrationDestroy }, va
   });
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.project.alertManagementIntegrations.nodes = draftData.project.alertManagementIntegrations.nodes.filter(
       ({ id }) => id !== integration.id,
     );
@@ -46,7 +45,6 @@ const addIntegrationToStore = (
   });
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.project.alertManagementIntegrations.nodes = [
       integration,
       ...draftData.project.alertManagementIntegrations.nodes,
@@ -72,7 +70,6 @@ const addHttpIntegrationToStore = (store, query, { httpIntegrationCreate }, vari
   });
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.project.alertManagementHttpIntegrations.nodes = [
       integration,
       ...draftData.project.alertManagementHttpIntegrations.nodes,
diff --git a/app/assets/javascripts/design_management/graphql.js b/app/assets/javascripts/design_management/graphql.js
index c6c3e66a01f513556832f16330d03f25243e1402..9a0547ee9db15a25000efc5fb39386065309dbd8 100644
--- a/app/assets/javascripts/design_management/graphql.js
+++ b/app/assets/javascripts/design_management/graphql.js
@@ -20,7 +20,6 @@ const resolvers = {
       const sourceData = cache.readQuery({ query: activeDiscussionQuery });
 
       const data = produce(sourceData, (draftData) => {
-        // eslint-disable-next-line no-param-reassign
         draftData.activeDiscussion = {
           __typename: 'ActiveDiscussion',
           id,
diff --git a/app/assets/javascripts/design_management/utils/cache_update.js b/app/assets/javascripts/design_management/utils/cache_update.js
index c561eda12edf7409a9083c7eaef21926b3138c4c..33c4fd5a7d9013d8f4e2bb941f04b0f3919a030e 100644
--- a/app/assets/javascripts/design_management/utils/cache_update.js
+++ b/app/assets/javascripts/design_management/utils/cache_update.js
@@ -41,7 +41,6 @@ const addNewVersionToStore = (store, query, version) => {
   const sourceData = store.readQuery(query);
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.project.issue.designCollection.versions.nodes = [
       version,
       ...draftData.project.issue.designCollection.versions.nodes,
@@ -168,7 +167,6 @@ const addNewDesignToStore = (store, designManagementUpload, query) => {
         nodes: newVersions,
       },
     };
-    // eslint-disable-next-line no-param-reassign
     draftData.project.issue.designCollection = updatedDesigns;
   });
 
@@ -182,7 +180,6 @@ const moveDesignInStore = (store, designManagementMove, query) => {
   const sourceData = store.readQuery(query);
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.project.issue.designCollection.designs =
       designManagementMove.designCollection.designs;
   });
diff --git a/app/assets/javascripts/jira_import/utils/cache_update.js b/app/assets/javascripts/jira_import/utils/cache_update.js
index db7dbb7353f2503a27689787efbdbdd9565b7884..aa6c6a3ca233cbabfabe66f2cd5efd8332c56541 100644
--- a/app/assets/javascripts/jira_import/utils/cache_update.js
+++ b/app/assets/javascripts/jira_import/utils/cache_update.js
@@ -21,8 +21,7 @@ export const addInProgressImportToStore = (store, jiraImportStart, fullPath) =>
   store.writeQuery({
     ...queryDetails,
     data: produce(sourceData, (draftData) => {
-      draftData.project.jiraImportStatus = IMPORT_STATE.SCHEDULED; // eslint-disable-line no-param-reassign
-      // eslint-disable-next-line no-param-reassign
+      draftData.project.jiraImportStatus = IMPORT_STATE.SCHEDULED;
       draftData.project.jiraImports.nodes = [
         ...sourceData.project.jiraImports.nodes,
         jiraImportStart.jiraImport,
diff --git a/app/assets/javascripts/monitoring/components/charts/anomaly.vue b/app/assets/javascripts/monitoring/components/charts/anomaly.vue
index 8569a67da346874238fce214a03d04b091066902..a995497ab9c7e393e0fab3abcac667540308e6e4 100644
--- a/app/assets/javascripts/monitoring/components/charts/anomaly.vue
+++ b/app/assets/javascripts/monitoring/components/charts/anomaly.vue
@@ -86,7 +86,6 @@ export default {
       const originalMetricQuery = this.graphData.metrics[0];
 
       const metricQuery = produce(originalMetricQuery, (draftQuery) => {
-        // eslint-disable-next-line no-param-reassign
         draftQuery.result[0].values = draftQuery.result[0].values.map(([x, y]) => [
           x,
           y + this.yOffset,
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js b/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js
index 06b57fe013ff3fcd825ac75db57ce7be808defb5..fb06f557d66343891ebc938089168152a2c8a6b0 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js
@@ -9,7 +9,6 @@ export const updateGroupPackageSettings = (fullPath) => (client, { data: updated
   const sourceData = client.readQuery(queryAndParams);
 
   const data = produce(sourceData, (draftState) => {
-    // eslint-disable-next-line no-param-reassign
     draftState.group.packageSettings = {
       ...updatedData.updateNamespacePackageSettings.packageSettings,
     };
diff --git a/app/assets/javascripts/registry/explorer/components/delete_image.vue b/app/assets/javascripts/registry/explorer/components/delete_image.vue
index 22fe9fc1da6fe4988ff4dbb3a414a59a667d78fa..a313854f5e4f311f9d5567590bf442b96c294513 100644
--- a/app/assets/javascripts/registry/explorer/components/delete_image.vue
+++ b/app/assets/javascripts/registry/explorer/components/delete_image.vue
@@ -29,7 +29,6 @@ export default {
       });
 
       const data = produce(sourceData, (draftState) => {
-        // eslint-disable-next-line no-param-reassign
         draftState.containerRepository.status =
           destroyContainerRepository.containerRepository.status;
       });
diff --git a/app/assets/javascripts/registry/settings/graphql/utils/cache_update.js b/app/assets/javascripts/registry/settings/graphql/utils/cache_update.js
index 6becaa38c7e4ac4e99721e3bb10b2e4a79638959..c4b2af13862ec78cec43492974d92e29c47f74a7 100644
--- a/app/assets/javascripts/registry/settings/graphql/utils/cache_update.js
+++ b/app/assets/javascripts/registry/settings/graphql/utils/cache_update.js
@@ -9,7 +9,6 @@ export const updateContainerExpirationPolicy = (projectPath) => (client, { data:
   const sourceData = client.readQuery(queryAndParams);
 
   const data = produce(sourceData, (draftState) => {
-    // eslint-disable-next-line no-param-reassign
     draftState.project.containerExpirationPolicy = {
       ...updatedData.updateContainerExpirationPolicy.containerExpirationPolicy,
     };
diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
index 1db68d3d5b1e786cef7524cb5e2cf6e3e6445b94..ec5f07f9785f75136b715f51590768f6504df0a2 100644
--- a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
+++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
@@ -95,7 +95,6 @@ export default {
       });
 
       const data = produce(sourceData, (draftData) => {
-        // eslint-disable-next-line no-param-reassign
         draftData.workspace.issuable.confidential = !this.confidential;
       });
 
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
index 1a549d5ee6fffeb32025565f6972c57f3f3bb167..f0c624c5d8de27d9c36849cc52f95bedb99c2727 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue
@@ -87,11 +87,8 @@ export default {
             });
 
             const data = produce(sourceData, (draftState) => {
-              // eslint-disable-next-line no-param-reassign
               draftState.project.mergeRequest.mergeableDiscussionsState = mergeableDiscussionsState;
-              // eslint-disable-next-line no-param-reassign
               draftState.project.mergeRequest.workInProgress = workInProgress;
-              // eslint-disable-next-line no-param-reassign
               draftState.project.mergeRequest.title = title;
             });
 
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue
index 39ac6c7fecabac48b7016736b1e4e52bb8005f4a..271f0b4e4bb87cd12a70131e7ad2d4e670017e5f 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_todo.vue
@@ -116,7 +116,6 @@ export default {
       });
 
       const data = produce(sourceData, (draftData) => {
-        // eslint-disable-next-line no-param-reassign
         draftData.project.alertManagementAlerts.nodes[0].todos.nodes = [];
       });
 
diff --git a/app/assets/javascripts/vue_shared/alert_details/index.js b/app/assets/javascripts/vue_shared/alert_details/index.js
index 3ea43d7a843d196b8c7af1fc86e42715a37553bd..50f2e63702bee096c6392d36cb327e0b22c3bffc 100644
--- a/app/assets/javascripts/vue_shared/alert_details/index.js
+++ b/app/assets/javascripts/vue_shared/alert_details/index.js
@@ -20,7 +20,6 @@ export default (selector) => {
       toggleSidebarStatus: (_, __, { cache }) => {
         const sourceData = cache.readQuery({ query: sidebarStatusQuery });
         const data = produce(sourceData, (draftData) => {
-          // eslint-disable-next-line no-param-reassign
           draftData.sidebarStatus = !draftData.sidebarStatus;
         });
         cache.writeQuery({ query: sidebarStatusQuery, data });
diff --git a/ee/app/assets/javascripts/analytics/devops_report/devops_adoption/utils/cache_updates.js b/ee/app/assets/javascripts/analytics/devops_report/devops_adoption/utils/cache_updates.js
index d715ac502acc796096c853c300b3acad0808a84f..54397efa589bc8f2a8f4540c932d2b1b536df0da 100644
--- a/ee/app/assets/javascripts/analytics/devops_report/devops_adoption/utils/cache_updates.js
+++ b/ee/app/assets/javascripts/analytics/devops_report/devops_adoption/utils/cache_updates.js
@@ -7,7 +7,6 @@ export const addSegmentToCache = (store, segment) => {
   });
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.devopsAdoptionSegments.nodes = [...draftData.devopsAdoptionSegments.nodes, segment];
   });
 
@@ -23,7 +22,6 @@ export const deleteSegmentFromCache = (store, segmentId) => {
   });
 
   const updatedData = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.devopsAdoptionSegments.nodes = draftData.devopsAdoptionSegments.nodes.filter(
       ({ id }) => id !== segmentId,
     );
diff --git a/ee/app/assets/javascripts/analytics/repository_analytics/components/select_projects_dropdown.vue b/ee/app/assets/javascripts/analytics/repository_analytics/components/select_projects_dropdown.vue
index fb741e7553e0ec4bbdbcaac9fcf967bbb3c3704f..77f19af76670d30482dd4f988ac7c0d613023c00 100644
--- a/ee/app/assets/javascripts/analytics/repository_analytics/components/select_projects_dropdown.vue
+++ b/ee/app/assets/javascripts/analytics/repository_analytics/components/select_projects_dropdown.vue
@@ -112,7 +112,6 @@ export default {
           },
           updateQuery(previousResult, { fetchMoreResult }) {
             const results = produce(fetchMoreResult, (draftData) => {
-              // eslint-disable-next-line no-param-reassign
               draftData.group.projects.nodes = [
                 ...previousResult.group.projects.nodes,
                 ...draftData.group.projects.nodes,
diff --git a/ee/app/assets/javascripts/oncall_schedules/graphql.js b/ee/app/assets/javascripts/oncall_schedules/graphql.js
index 12049713bda935a5a2e34eb4b0f44042f6f6aef1..11bff93a36d80cab0152aef431999dbba5c967af 100644
--- a/ee/app/assets/javascripts/oncall_schedules/graphql.js
+++ b/ee/app/assets/javascripts/oncall_schedules/graphql.js
@@ -11,7 +11,6 @@ const resolvers = {
     updateShiftTimeUnitWidth: (_, { shiftTimeUnitWidth = 0 }, { cache }) => {
       const sourceData = cache.readQuery({ query: getShiftTimeUnitWidthQuery });
       const data = produce(sourceData, (draftData) => {
-        // eslint-disable-next-line no-param-reassign
         draftData.shiftTimeUnitWidth = shiftTimeUnitWidth;
       });
       cache.writeQuery({ query: getShiftTimeUnitWidthQuery, data });
diff --git a/ee/app/assets/javascripts/oncall_schedules/utils/cache_updates.js b/ee/app/assets/javascripts/oncall_schedules/utils/cache_updates.js
index 302afc8dbe42d6a92faf211dfaa386c4bc1e4d41..5abb65faf7f7f1d51ee228436471d0b015d7fdd4 100644
--- a/ee/app/assets/javascripts/oncall_schedules/utils/cache_updates.js
+++ b/ee/app/assets/javascripts/oncall_schedules/utils/cache_updates.js
@@ -47,7 +47,6 @@ const deleteScheduleFromStore = (store, query, { oncallScheduleDestroy }, variab
   });
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.project.incidentManagementOncallSchedules.nodes = draftData.project.incidentManagementOncallSchedules.nodes.filter(
       ({ id }) => id !== schedule.id,
     );
@@ -72,7 +71,6 @@ const updateScheduleFromStore = (store, query, { oncallScheduleUpdate }, variabl
   });
 
   const data = produce(sourceData, (draftData) => {
-    // eslint-disable-next-line no-param-reassign
     draftData.project.incidentManagementOncallSchedules.nodes = draftData.project.incidentManagementOncallSchedules.nodes.map(
       (scheduleToUpdate) => {
         return scheduleToUpdate.iid === schedule.iid ? schedule : scheduleToUpdate;
diff --git a/ee/app/assets/javascripts/security_configuration/dast_profiles/graphql/cache_utils.js b/ee/app/assets/javascripts/security_configuration/dast_profiles/graphql/cache_utils.js
index 287abb1a3480cf45f73988da3fd11ea893353ba5..2b0fb50dc525c25c2baf1eab1bb30211ebe6df35 100644
--- a/ee/app/assets/javascripts/security_configuration/dast_profiles/graphql/cache_utils.js
+++ b/ee/app/assets/javascripts/security_configuration/dast_profiles/graphql/cache_utils.js
@@ -31,7 +31,6 @@ export const removeProfile = ({ profileId, profileType, store, queryBody }) => {
   const sourceData = store.readQuery(queryBody);
 
   const data = produce(sourceData, (draftState) => {
-    // eslint-disable-next-line no-param-reassign
     draftState.project[profileType].edges = draftState.project[profileType].edges.filter(
       ({ node }) => {
         return node.id !== profileId;
diff --git a/ee/app/assets/javascripts/security_dashboard/components/first_class_group_security_dashboard_vulnerabilities.vue b/ee/app/assets/javascripts/security_dashboard/components/first_class_group_security_dashboard_vulnerabilities.vue
index 1f0dd9e007c288b477694c90dde06af3e6b0d9f0..b4e30f9d623cefd8bb5d450b0564e1c141db1d9d 100644
--- a/ee/app/assets/javascripts/security_dashboard/components/first_class_group_security_dashboard_vulnerabilities.vue
+++ b/ee/app/assets/javascripts/security_dashboard/components/first_class_group_security_dashboard_vulnerabilities.vue
@@ -84,7 +84,6 @@ export default {
           variables: { after: this.pageInfo.endCursor },
           updateQuery: (previousResult, { fetchMoreResult }) => {
             return produce(fetchMoreResult, (draftData) => {
-              // eslint-disable-next-line no-param-reassign
               draftData.group.vulnerabilities.nodes = [
                 ...previousResult.group.vulnerabilities.nodes,
                 ...draftData.group.vulnerabilities.nodes,
diff --git a/ee/app/assets/javascripts/security_dashboard/components/first_class_instance_security_dashboard_vulnerabilities.vue b/ee/app/assets/javascripts/security_dashboard/components/first_class_instance_security_dashboard_vulnerabilities.vue
index b4f44e1828f1adbe1da7da97482fb317cfeaa239..6258aacc80552507f7dfa307ae40a29d21ffba96 100644
--- a/ee/app/assets/javascripts/security_dashboard/components/first_class_instance_security_dashboard_vulnerabilities.vue
+++ b/ee/app/assets/javascripts/security_dashboard/components/first_class_instance_security_dashboard_vulnerabilities.vue
@@ -82,7 +82,6 @@ export default {
           variables: { after: this.pageInfo.endCursor },
           updateQuery: (previousResult, { fetchMoreResult }) => {
             return produce(fetchMoreResult, (draftData) => {
-              // eslint-disable-next-line no-param-reassign
               draftData.vulnerabilities.nodes = [
                 ...previousResult.vulnerabilities.nodes,
                 ...draftData.vulnerabilities.nodes,
diff --git a/ee/app/assets/javascripts/security_dashboard/components/first_class_project_manager/project_manager.vue b/ee/app/assets/javascripts/security_dashboard/components/first_class_project_manager/project_manager.vue
index 94ae03f9d04cd1a1256c100df56c660ac57d0566..6f441c77f19233e37ffd06bd14f0b10c5fd950ef 100644
--- a/ee/app/assets/javascripts/security_dashboard/components/first_class_project_manager/project_manager.vue
+++ b/ee/app/assets/javascripts/security_dashboard/components/first_class_project_manager/project_manager.vue
@@ -82,7 +82,6 @@ export default {
               const newProject = results.addProjectToSecurityDashboard.project;
 
               const data = produce(sourceData, (draftData) => {
-                // eslint-disable-next-line no-param-reassign
                 draftData.instanceSecurityDashboard.projects.nodes = [
                   ...draftData.instanceSecurityDashboard.projects.nodes,
                   {
@@ -157,7 +156,6 @@ export default {
             const sourceData = store.readQuery({ query: projectsQuery });
 
             const data = produce(sourceData, (draftData) => {
-              // eslint-disable-next-line no-param-reassign
               draftData.instanceSecurityDashboard.projects.nodes = draftData.instanceSecurityDashboard.projects.nodes.filter(
                 (curr) => curr.id !== id,
               );
diff --git a/ee/app/assets/javascripts/security_dashboard/components/project_vulnerabilities.vue b/ee/app/assets/javascripts/security_dashboard/components/project_vulnerabilities.vue
index 860ba8910db2aa8b40e54aec299eaad9c8c1fbb8..676703407916d5cd8279c555d75c4a8ad7b76e5a 100644
--- a/ee/app/assets/javascripts/security_dashboard/components/project_vulnerabilities.vue
+++ b/ee/app/assets/javascripts/security_dashboard/components/project_vulnerabilities.vue
@@ -112,7 +112,6 @@ export default {
           variables: { after: this.pageInfo.endCursor },
           updateQuery: (previousResult, { fetchMoreResult }) => {
             return produce(fetchMoreResult, (draftData) => {
-              // eslint-disable-next-line no-param-reassign
               draftData.project.vulnerabilities.nodes = [
                 ...previousResult.project.vulnerabilities.nodes,
                 ...draftData.project.vulnerabilities.nodes,
diff --git a/ee/app/assets/javascripts/threat_monitoring/components/alerts/alerts_list.vue b/ee/app/assets/javascripts/threat_monitoring/components/alerts/alerts_list.vue
index a499f7dc3ab7a01f21daccaa99a4870a2693739b..1fb0bcce007639fae91e4507fe8fab1df82195f8 100644
--- a/ee/app/assets/javascripts/threat_monitoring/components/alerts/alerts_list.vue
+++ b/ee/app/assets/javascripts/threat_monitoring/components/alerts/alerts_list.vue
@@ -103,7 +103,6 @@ export default {
           variables: { nextPageCursor: this.pageInfo.endCursor },
           updateQuery: (previousResult, { fetchMoreResult }) => {
             const results = produce(fetchMoreResult, (draftData) => {
-              // eslint-disable-next-line no-param-reassign
               draftData.project.alertManagementAlerts.nodes = [
                 ...previousResult.project.alertManagementAlerts.nodes,
                 ...draftData.project.alertManagementAlerts.nodes,