From 14b2f48c1cfe6d51185e594462054ce4d938fe72 Mon Sep 17 00:00:00 2001
From: Lukas Eipert <leipert@gitlab.com>
Date: Thu, 4 Jul 2019 13:36:49 +0200
Subject: [PATCH] Replace runtime isEE check with compile time one

This has the benefit that CE bundles will remove dead code in CE only
builds.

We have a follow-up issue to get rid of this completely:

https://gitlab.com/gitlab-org/gitlab-ce/issues/64173
---
 .eslintrc.yml                                         |  1 +
 .../javascripts/boards/filtered_search_boards.js      |  3 +--
 app/assets/javascripts/boards/models/issue.js         |  6 +++---
 app/assets/javascripts/boards/models/list.js          |  8 ++++----
 app/assets/javascripts/boards/models/milestone.js     |  4 +---
 app/assets/javascripts/event_tracking/notes.js        |  1 +
 app/assets/javascripts/labels_select.js               |  4 ++--
 app/assets/javascripts/lib/utils/common_utils.js      |  8 --------
 .../javascripts/monitoring/components/dashboard.vue   | 11 ++++++++---
 app/assets/javascripts/notes/index.js                 |  5 +----
 app/assets/javascripts/vue_shared/mixins/is_ee.js     | 10 ----------
 config/webpack.config.js                              |  3 +++
 spec/javascripts/test_bundle.js                       |  2 --
 13 files changed, 25 insertions(+), 41 deletions(-)
 delete mode 100644 app/assets/javascripts/vue_shared/mixins/is_ee.js

diff --git a/.eslintrc.yml b/.eslintrc.yml
index 2b881d5f201c3..2612fd3371d45 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -5,6 +5,7 @@ globals:
   gl: false
   gon: false
   localStorage: false
+  IS_EE: false
 plugins:
   - import
   - html
diff --git a/app/assets/javascripts/boards/filtered_search_boards.js b/app/assets/javascripts/boards/filtered_search_boards.js
index 6b54e8baefb11..b1b4b1c55084c 100644
--- a/app/assets/javascripts/boards/filtered_search_boards.js
+++ b/app/assets/javascripts/boards/filtered_search_boards.js
@@ -2,7 +2,6 @@ import IssuableFilteredSearchTokenKeys from 'ee_else_ce/filtered_search/issuable
 import FilteredSearchContainer from '../filtered_search/container';
 import FilteredSearchManager from '../filtered_search/filtered_search_manager';
 import boardsStore from './stores/boards_store';
-import { isEE } from '~/lib/utils/common_utils';
 
 export default class FilteredSearchBoards extends FilteredSearchManager {
   constructor(store, updateUrl = false, cantEdit = []) {
@@ -10,7 +9,7 @@ export default class FilteredSearchBoards extends FilteredSearchManager {
       page: 'boards',
       isGroupDecendent: true,
       stateFiltersSelector: '.issues-state-filters',
-      isGroup: isEE(),
+      isGroup: IS_EE,
       filteredSearchTokenKeys: IssuableFilteredSearchTokenKeys,
     });
 
diff --git a/app/assets/javascripts/boards/models/issue.js b/app/assets/javascripts/boards/models/issue.js
index f858b162c6bf4..9069b35db9abc 100644
--- a/app/assets/javascripts/boards/models/issue.js
+++ b/app/assets/javascripts/boards/models/issue.js
@@ -5,7 +5,7 @@
 
 import Vue from 'vue';
 import './label';
-import { isEE, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
 import IssueProject from './project';
 import boardsStore from '../stores/boards_store';
 
@@ -91,13 +91,13 @@ class ListIssue {
 
   addMilestone(milestone) {
     const miletoneId = this.milestone ? this.milestone.id : null;
-    if (isEE && milestone.id !== miletoneId) {
+    if (IS_EE && milestone.id !== miletoneId) {
       this.milestone = new ListMilestone(milestone);
     }
   }
 
   removeMilestone(removeMilestone) {
-    if (isEE && removeMilestone && removeMilestone.id === this.milestone.id) {
+    if (IS_EE && removeMilestone && removeMilestone.id === this.milestone.id) {
       this.milestone = {};
     }
   }
diff --git a/app/assets/javascripts/boards/models/list.js b/app/assets/javascripts/boards/models/list.js
index cd553d0c4afba..7e0ccb9bd2a99 100644
--- a/app/assets/javascripts/boards/models/list.js
+++ b/app/assets/javascripts/boards/models/list.js
@@ -4,7 +4,7 @@
 import { __ } from '~/locale';
 import ListLabel from './label';
 import ListAssignee from './assignee';
-import { isEE, urlParamsToObject } from '~/lib/utils/common_utils';
+import { urlParamsToObject } from '~/lib/utils/common_utils';
 import boardsStore from '../stores/boards_store';
 import ListMilestone from './milestone';
 
@@ -58,7 +58,7 @@ class List {
     } else if (obj.user) {
       this.assignee = new ListAssignee(obj.user);
       this.title = this.assignee.name;
-    } else if (isEE && obj.milestone) {
+    } else if (IS_EE && obj.milestone) {
       this.milestone = new ListMilestone(obj.milestone);
       this.title = this.milestone.title;
     }
@@ -85,7 +85,7 @@ class List {
       entityType = 'label_id';
     } else if (this.assignee) {
       entityType = 'assignee_id';
-    } else if (isEE && this.milestone) {
+    } else if (IS_EE && this.milestone) {
       entityType = 'milestone_id';
     }
 
@@ -205,7 +205,7 @@ class List {
         issue.addAssignee(this.assignee);
       }
 
-      if (isEE && this.milestone) {
+      if (IS_EE && this.milestone) {
         if (listFrom && listFrom.type === 'milestone') {
           issue.removeMilestone(listFrom.milestone);
         }
diff --git a/app/assets/javascripts/boards/models/milestone.js b/app/assets/javascripts/boards/models/milestone.js
index 6f81d6bc6f8c2..7201b6e91f556 100644
--- a/app/assets/javascripts/boards/models/milestone.js
+++ b/app/assets/javascripts/boards/models/milestone.js
@@ -1,11 +1,9 @@
-import { isEE } from '~/lib/utils/common_utils';
-
 export default class ListMilestone {
   constructor(obj) {
     this.id = obj.id;
     this.title = obj.title;
 
-    if (isEE) {
+    if (IS_EE) {
       this.path = obj.path;
       this.state = obj.state;
       this.webUrl = obj.web_url || obj.webUrl;
diff --git a/app/assets/javascripts/event_tracking/notes.js b/app/assets/javascripts/event_tracking/notes.js
index 2d1ec238274a0..1f70290c3975e 100644
--- a/app/assets/javascripts/event_tracking/notes.js
+++ b/app/assets/javascripts/event_tracking/notes.js
@@ -1 +1,2 @@
+// Noop function which has a EE counter-part
 export default () => {};
diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js
index 3f954b43ee3c5..bea43430edc50 100644
--- a/app/assets/javascripts/labels_select.js
+++ b/app/assets/javascripts/labels_select.js
@@ -11,7 +11,7 @@ import CreateLabelDropdown from './create_label';
 import flash from './flash';
 import ModalStore from './boards/stores/modal_store';
 import boardsStore from './boards/stores/boards_store';
-import { isEE, isScopedLabel } from '~/lib/utils/common_utils';
+import { isScopedLabel } from '~/lib/utils/common_utils';
 
 export default class LabelsSelect {
   constructor(els, options = {}) {
@@ -140,7 +140,7 @@ export default class LabelsSelect {
               labelCount = data.labels.length;
 
               // EE Specific
-              if (isEE) {
+              if (IS_EE) {
                 /**
                  * For Scoped labels, the last label selected with the
                  * same key will be applied to the current issueable.
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index cc5e12aa4672f..5e90893b6847d 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -726,14 +726,6 @@ export const NavigationType = {
   TYPE_RESERVED: 255,
 };
 
-/**
- * Returns the value of `gon.ee`
- * Used to check if it's the EE codebase or the CE one.
- *
- * @returns Boolean
- */
-export const isEE = () => window.gon && window.gon.ee;
-
 /**
  * Checks if the given Label has a special syntax `::` in
  * it's title.
diff --git a/app/assets/javascripts/monitoring/components/dashboard.vue b/app/assets/javascripts/monitoring/components/dashboard.vue
index ed25a6e3684e9..ba79a697df2a7 100644
--- a/app/assets/javascripts/monitoring/components/dashboard.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard.vue
@@ -4,7 +4,6 @@ import _ from 'underscore';
 import { mapActions, mapState } from 'vuex';
 import { s__ } from '~/locale';
 import Icon from '~/vue_shared/components/icon.vue';
-import '~/vue_shared/mixins/is_ee';
 import { getParameterValues } from '~/lib/utils/url_utility';
 import invalidUrl from '~/lib/utils/invalid_url';
 import MonitorAreaChart from './charts/area.vue';
@@ -160,6 +159,12 @@ export default {
     selectedDashboardText() {
       return this.currentDashboard || (this.allDashboards[0] && this.allDashboards[0].display_name);
     },
+    addingMetricsAvailable() {
+      return IS_EE && this.canAddMetrics && !this.showEmptyState;
+    },
+    alertWidgetAvailable() {
+      return IS_EE && this.prometheusAlertsAvailable && this.alertsEndpoint;
+    },
   },
   created() {
     this.setEndpoints({
@@ -313,7 +318,7 @@ export default {
         </div>
       </div>
       <div class="d-flex">
-        <div v-if="isEE && canAddMetrics && !showEmptyState">
+        <div v-if="addingMetricsAvailable">
           <gl-button
             v-gl-modal-directive="$options.addMetric.modalId"
             class="js-add-metric-button text-success border-success"
@@ -372,7 +377,7 @@ export default {
           group-id="monitor-area-chart"
         >
           <alert-widget
-            v-if="isEE && prometheusAlertsAvailable && alertsEndpoint && graphData"
+            v-if="alertWidgetAvailable && graphData"
             :alerts-endpoint="alertsEndpoint"
             :relevant-queries="graphData.queries"
             :alerts-to-manage="getGraphAlerts(graphData.queries)"
diff --git a/app/assets/javascripts/notes/index.js b/app/assets/javascripts/notes/index.js
index 57dd1c5cab23a..c70c0e4095c47 100644
--- a/app/assets/javascripts/notes/index.js
+++ b/app/assets/javascripts/notes/index.js
@@ -1,5 +1,4 @@
 import Vue from 'vue';
-import { isEE } from '~/lib/utils/common_utils';
 import initNoteStats from 'ee_else_ce/event_tracking/notes';
 import notesApp from './components/notes_app.vue';
 import initDiscussionFilters from './discussion_filters';
@@ -41,9 +40,7 @@ document.addEventListener('DOMContentLoaded', () => {
       };
     },
     mounted() {
-      if (isEE) {
-        initNoteStats();
-      }
+      initNoteStats();
     },
     render(createElement) {
       return createElement('notes-app', {
diff --git a/app/assets/javascripts/vue_shared/mixins/is_ee.js b/app/assets/javascripts/vue_shared/mixins/is_ee.js
deleted file mode 100644
index 8e00d93ef1870..0000000000000
--- a/app/assets/javascripts/vue_shared/mixins/is_ee.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import Vue from 'vue';
-import { isEE } from '~/lib/utils/common_utils';
-
-Vue.mixin({
-  computed: {
-    isEE() {
-      return isEE();
-    },
-  },
-});
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 19b488453057f..a81590e8b8edd 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -322,7 +322,10 @@ module.exports = {
       }),
 
     new webpack.DefinePlugin({
+      // This one is used to define window.gon.ee and other things properly in tests:
       'process.env.IS_GITLAB_EE': JSON.stringify(IS_EE),
+      // This one is used to check against "EE" properly in application code
+      IS_EE: IS_EE ? 'window.gon && window.gon.ee' : JSON.stringify(false),
     }),
   ].filter(Boolean),
 
diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js
index 2cc476ed52a3b..50741e249ca3c 100644
--- a/spec/javascripts/test_bundle.js
+++ b/spec/javascripts/test_bundle.js
@@ -8,7 +8,6 @@ import '~/commons';
 import Vue from 'vue';
 import VueResource from 'vue-resource';
 import Translate from '~/vue_shared/translate';
-import CheckEE from '~/vue_shared/mixins/is_ee';
 import jasmineDiff from 'jasmine-diff';
 import { config as testUtilsConfig } from '@vue/test-utils';
 
@@ -48,7 +47,6 @@ Vue.config.errorHandler = function(err) {
 
 Vue.use(VueResource);
 Vue.use(Translate);
-Vue.use(CheckEE);
 
 // enable test fixtures
 jasmine.getFixtures().fixturesPath = FIXTURES_PATH;
-- 
GitLab