Resolve difference in frontend configuration/build related files

We have the following files frontend config files containing a diff between CE/EE:

  • config/jsdoc.config.js => not existent in EE
  • config/karma.config.js
  • config/webpack.config.js - I am especially concerned about the ee_else_ce switch
  • package.json (& yarn.lock) => two missing d3 dependencies in CE

The following files are the same in CE/EE:

  • babel.config.js
  • jest.config.js
  • scripts/frontend/
config/karma.config.js
--- config/karma.config.js	2019-01-24 10:45:05.731670883 +0100
+++ ee/gitlab/config/karma.config.js	2018-11-09 11:51:19.766426576 +0100
@@ -6,6 +6,7 @@
 const webpackConfig = require('./webpack.config.js');
 
 const ROOT_PATH = path.resolve(__dirname, '..');
+const SPECS_PATH = /^(?:\.[\\\/])?(ee[\\\/])?spec[\\\/]javascripts[\\\/]/;
 
 function fatalError(message) {
   console.error(chalk.red(`\nError: ${message}\n`));
@@ -41,9 +42,19 @@
   )
   .parse(process.argv).filterSpec;
 
-if (specFilters.length) {
-  const specsPath = /^(?:\.[\\\/])?spec[\\\/]javascripts[\\\/]/;
+const createContext = (specFiles, regex, suffix) => {
+  const newContext = specFiles.reduce((context, file) => {
+    const relativePath = file.replace(SPECS_PATH, '');
+    context[file] = `./${relativePath}`;
+    return context;
+  }, {});
+
+  webpackConfig.plugins.push(
+    new webpack.ContextReplacementPlugin(regex, path.join(ROOT_PATH, suffix), newContext)
+  );
+};
 
+if (specFilters.length) {
   // resolve filters
   let filteredSpecFiles = specFilters.map(filter =>
     glob
@@ -64,23 +75,15 @@
     fatalError('Your filter did not match any test files.');
   }
 
-  if (!filteredSpecFiles.every(file => specsPath.test(file))) {
+  if (!filteredSpecFiles.every(file => SPECS_PATH.test(file))) {
     fatalError('Test files must be located within /spec/javascripts.');
   }
 
-  const newContext = filteredSpecFiles.reduce((context, file) => {
-    const relativePath = file.replace(specsPath, '');
-    context[file] = `./${relativePath}`;
-    return context;
-  }, {});
+  const CE_FILES = filteredSpecFiles.filter(file => !file.startsWith('ee'));
+  createContext(CE_FILES, /[^e]{2}[\\\/]spec[\\\/]javascripts$/, 'spec/javascripts');
 
-  webpackConfig.plugins.push(
-    new webpack.ContextReplacementPlugin(
-      /spec[\\\/]javascripts$/,
-      path.join(ROOT_PATH, 'spec/javascripts'),
-      newContext
-    )
-  );
+  const EE_FILES = filteredSpecFiles.filter(file => file.startsWith('ee'));
+  createContext(EE_FILES, /ee[\\\/]spec[\\\/]javascripts$/, 'ee/spec/javascripts');
 }
 
 // Karma configuration
@@ -111,6 +114,7 @@
     ],
     preprocessors: {
       'spec/javascripts/**/*.js': ['webpack', 'sourcemap'],
+      'ee/spec/javascripts/**/*.js': ['webpack', 'sourcemap'],
     },
     reporters: ['progress'],
     webpack: webpackConfig,
config/webpack.config.js
--- config/webpack.config.js	2019-03-07 13:47:28.834027583 +0100
+++ ee/gitlab/config/webpack.config.js	2019-03-07 14:28:39.216840920 +0100
@@ -44,6 +44,13 @@
 
   pageEntries.forEach(path => generateAutoEntries(path));
 
+  // EE-specific auto entries
+  const eePageEntries = glob.sync('pages/**/index.js', {
+    cwd: path.join(ROOT_PATH, 'ee/app/assets/javascripts'),
+  });
+  eePageEntries.forEach(path => generateAutoEntries(path, 'ee'));
+  watchAutoEntries.push(path.join(ROOT_PATH, 'ee/app/assets/javascripts/pages/'));
+
   const autoEntryKeys = Object.keys(autoEntriesMap);
   autoEntriesCount = autoEntryKeys.length;
 
@@ -95,8 +102,16 @@
       vue$: 'vue/dist/vue.esm.js',
       spec: path.join(ROOT_PATH, 'spec/javascripts'),
 
+      // EE-only start
+      ee: path.join(ROOT_PATH, 'ee/app/assets/javascripts'),
+      ee_empty_states: path.join(ROOT_PATH, 'ee/app/views/shared/empty_states'),
+      ee_icons: path.join(ROOT_PATH, 'ee/app/views/shared/icons'),
+      ee_images: path.join(ROOT_PATH, 'ee/app/assets/images'),
+      ee_spec: path.join(ROOT_PATH, 'ee/spec/javascripts'),
+      // EE-only end
+
       // the following resolves files which are different between CE and EE
-      ee_else_ce: path.join(ROOT_PATH, 'app/assets/javascripts'),
+      ee_else_ce: path.join(ROOT_PATH, 'ee/app/assets/javascripts'),
     },
   },
package.json
--- package.json	2019-03-11 12:25:07.193930529 +0100
+++ ee/gitlab/package.json	2019-03-11 12:25:48.310440141 +0100
@@ -51,11 +51,13 @@
     "d3-array": "^1.2.1",
     "d3-axis": "^1.0.8",
     "d3-brush": "^1.0.4",
+    "d3-ease": "^1.0.3",
     "d3-scale": "^1.0.7",
     "d3-selection": "^1.2.0",
     "d3-shape": "^1.2.0",
     "d3-time": "^1.0.8",
     "d3-time-format": "^2.1.1",
+    "d3-transition": "^1.1.1",
     "dateformat": "^3.0.3",
     "deckar01-task_list": "^2.2.0",
     "diff": "^3.4.0",
Edited by Lukas Eipert