From 7fa4a4382a9cbd7c3e91f7658d5b9bcb9c0f55d7 Mon Sep 17 00:00:00 2001
From: Yoan VALLET <ext.sopra.yvallet@grandlyon.com>
Date: Fri, 31 Jul 2020 09:43:25 +0200
Subject: [PATCH] feat : Override the services config

---
 app.config.js          |  3 +-
 app.config.services.js | 96 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 98 insertions(+), 1 deletion(-)
 create mode 100644 app.config.services.js

diff --git a/app.config.js b/app.config.js
index e358ccca9..965cbbb9f 100644
--- a/app.config.js
+++ b/app.config.js
@@ -28,7 +28,8 @@ const configs = [
   require('cozy-scripts/config/webpack.config.manifest'),
   require('cozy-scripts/config/webpack.config.progress'),
   addAnalyzer ? require('cozy-scripts/config/webpack.config.analyzer') : null,
-  require('cozy-scripts/config/webpack.config.services'),
+  // require('cozy-scripts/config/webpack.config.services'),
+  require('./app.config.services'), // Override the services config
   require(`cozy-scripts/config/webpack.target.${target}`),
 ]
 
diff --git a/app.config.services.js b/app.config.services.js
new file mode 100644
index 000000000..eee12069b
--- /dev/null
+++ b/app.config.services.js
@@ -0,0 +1,96 @@
+'use strict'
+
+'use strict'
+
+/**
+ * This file overrides the default react webpack config.
+ * This react config enables the use of TypeScript.
+ *
+ * @override node_modules/cozy-scripts/config/webpack.config.react.js
+ */
+
+const webpack = require('webpack')
+const path = require('path')
+const fs = require('fs-extra')
+const paths = require('cozy-scripts/utils/paths')
+const {
+  eslintFix,
+  getFilename,
+  target,
+} = require('cozy-scripts/config/webpack.vars')
+const CTS = require('cozy-scripts/utils/constants.js')
+const babelConf = require('./babel.config')
+
+process.env[CTS.ENTRY_EXT] = '.tsx' // Replaces .jsx
+
+const servicesFolder = paths.appServicesFolder()
+const servicesPaths = fs.existsSync(servicesFolder)
+  ? fs.readdirSync(servicesFolder)
+  : []
+
+const servicesEntries = {}
+servicesPaths.forEach(file => {
+  if (!file.match(/^[^.]*.ts$/)) return
+  const filename = file.match(/^([^.]*).ts$/)[1]
+  servicesEntries[filename] = path.resolve(path.join(servicesFolder, file))
+})
+
+const config = {
+  __mergeStrategy: {
+    smart: false,
+    strategy: {
+      plugins: 'replace',
+      output: 'replace',
+      entry: 'replace',
+      optimization: 'replace',
+      module: 'replace',
+      externals: 'replace',
+    },
+  },
+  entry: servicesEntries,
+  output: {
+    path: paths.appServicesBuild(),
+    filename: `${getFilename(false)}.js`,
+  },
+  target: 'node',
+  optimization: {}, // reset optimization property
+  devtool: false,
+  externals: [], // reset externals property
+  module: {
+    rules: [
+      {
+        enforce: 'pre',
+        test: /\.ts$/,
+        loader: require.resolve('cozy-scripts/node_modules/eslint-loader'),
+        exclude: /node_modules/,
+        options: {
+          extends: ['cozy-app'],
+          fix: eslintFix,
+          emitWarning: true,
+        },
+      },
+      {
+        test: /\.ts$/,
+        exclude: /(node_modules|cozy-(bar|client-js))/,
+        loader: require.resolve('cozy-scripts/node_modules/babel-loader'),
+        options: {
+          cacheDirectory: 'cozy-scripts/node_modules/.cache/babel-loader/node',
+          babelrc: false,
+          presets: [['cozy-app', { node: true, react: false }]],
+        },
+      },
+    ],
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      __TARGET__: JSON.stringify('services'),
+    }),
+  ],
+}
+
+/* We don't build services if no services and if on mobile build */
+const addServicesConfig =
+  target === 'browser' && Object.keys(servicesEntries).length
+
+// only for browser target (services are usable only on cozy-stack)
+module.exports = addServicesConfig ? { multiple: { services: config } } : {}
-- 
GitLab