From 19f484eedaa0df2a71df95936f1b00869b86b8bd Mon Sep 17 00:00:00 2001 From: Shawn Erquhart Date: Mon, 23 Jul 2018 21:25:49 -0400 Subject: [PATCH] improve interpackage config sharing --- babel.config.js | 17 ----- .../webpack.config.js | 4 +- .../webpack.config.js | 4 +- .../webpack.config.js | 4 +- .../webpack.config.js | 4 +- packages/netlify-cms-core/babel.config.js | 23 +++++++ packages/netlify-cms-core/src/actions/auth.js | 2 +- .../src/actions/editorialWorkflow.js | 2 +- .../netlify-cms-core/src/actions/entries.js | 2 +- .../src/actions/mediaLibrary.js | 2 +- .../netlify-cms-core/src/actions/search.js | 2 +- .../src/components/App/App.js | 2 +- .../src/valueObjects/AssetProxy.js | 2 +- packages/netlify-cms-core/webpack.config.js | 36 +++++++---- .../webpack.config.js | 4 +- .../netlify-cms-lib-auth/webpack.config.js | 4 +- .../netlify-cms-lib-util/webpack.config.js | 4 +- .../netlify-cms-ui-default/webpack.config.js | 4 +- webpack.config.js => scripts/webpack.js | 64 +++++++++++-------- 19 files changed, 115 insertions(+), 71 deletions(-) create mode 100644 packages/netlify-cms-core/babel.config.js rename webpack.config.js => scripts/webpack.js (66%) diff --git a/babel.config.js b/babel.config.js index 7fa1e140..e3dd6d22 100644 --- a/babel.config.js +++ b/babel.config.js @@ -10,23 +10,6 @@ module.exports = { ['babel-plugin-transform-builtin-extend', { globals: ['Error'] }], - ['module-resolver', { - root: [ - './src/components' - ], - alias: { - Actions: './src/actions/', - Backends: './src/backends/', - Constants: './src/constants/', - Formats: './src/formats/', - Integrations: './src/integrations/', - Lib: './src/lib/', - Reducers: './src/reducers/', - Redux: './src/redux/', - Routing: './src/routing/', - ValueObjects: './src/valueObjects/', - } - }], 'transform-export-extensions', '@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-object-rest-spread', diff --git a/packages/netlify-cms-backend-git-gateway/webpack.config.js b/packages/netlify-cms-backend-git-gateway/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-backend-git-gateway/webpack.config.js +++ b/packages/netlify-cms-backend-git-gateway/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/packages/netlify-cms-backend-github/webpack.config.js b/packages/netlify-cms-backend-github/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-backend-github/webpack.config.js +++ b/packages/netlify-cms-backend-github/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/packages/netlify-cms-backend-gitlab/webpack.config.js b/packages/netlify-cms-backend-gitlab/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-backend-gitlab/webpack.config.js +++ b/packages/netlify-cms-backend-gitlab/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/packages/netlify-cms-backend-test/webpack.config.js b/packages/netlify-cms-backend-test/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-backend-test/webpack.config.js +++ b/packages/netlify-cms-backend-test/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/packages/netlify-cms-core/babel.config.js b/packages/netlify-cms-core/babel.config.js new file mode 100644 index 00000000..f53b7c19 --- /dev/null +++ b/packages/netlify-cms-core/babel.config.js @@ -0,0 +1,23 @@ +const babelConfig = require('../../babel.config.js'); + +module.exports = { + ...babelConfig, + plugins: [ + ...babelConfig.plugins, + ['module-resolver', { + root: './src/components', + alias: { + src: './src', + Actions: './src/actions/', + Constants: './src/constants/', + Formats: './src/formats/', + Integrations: './src/integrations/', + Lib: './src/lib/', + Reducers: './src/reducers/', + Redux: './src/redux/', + Routing: './src/routing/', + ValueObjects: './src/valueObjects/', + } + }], + ], +}; diff --git a/packages/netlify-cms-core/src/actions/auth.js b/packages/netlify-cms-core/src/actions/auth.js index 8b19aa9b..62bd8d11 100644 --- a/packages/netlify-cms-core/src/actions/auth.js +++ b/packages/netlify-cms-core/src/actions/auth.js @@ -1,5 +1,5 @@ import { actions as notifActions } from 'redux-notifications'; -import { currentBackend } from 'Backends/backend'; +import { currentBackend } from 'src/backend'; const { notifSend } = notifActions; diff --git a/packages/netlify-cms-core/src/actions/editorialWorkflow.js b/packages/netlify-cms-core/src/actions/editorialWorkflow.js index f2dc3053..e7eb38e9 100644 --- a/packages/netlify-cms-core/src/actions/editorialWorkflow.js +++ b/packages/netlify-cms-core/src/actions/editorialWorkflow.js @@ -2,7 +2,7 @@ import uuid from 'uuid/v4'; import { actions as notifActions } from 'redux-notifications'; import { BEGIN, COMMIT, REVERT } from 'redux-optimist'; import { serializeValues } from 'Lib/serializeEntryValues'; -import { currentBackend } from 'Backends/backend'; +import { currentBackend } from 'src/backend'; import { getAsset } from 'Reducers'; import { selectFields } from 'Reducers/collections'; import { status, EDITORIAL_WORKFLOW } from 'Constants/publishModes'; diff --git a/packages/netlify-cms-core/src/actions/entries.js b/packages/netlify-cms-core/src/actions/entries.js index 70908a00..a3db6d15 100644 --- a/packages/netlify-cms-core/src/actions/entries.js +++ b/packages/netlify-cms-core/src/actions/entries.js @@ -1,7 +1,7 @@ import { fromJS, List, Set } from 'immutable'; import { actions as notifActions } from 'redux-notifications'; import { serializeValues } from 'Lib/serializeEntryValues'; -import { currentBackend } from 'Backends/backend'; +import { currentBackend } from 'src/backend'; import { getIntegrationProvider } from 'Integrations'; import { getAsset, selectIntegration } from 'Reducers'; import { selectFields } from 'Reducers/collections'; diff --git a/packages/netlify-cms-core/src/actions/mediaLibrary.js b/packages/netlify-cms-core/src/actions/mediaLibrary.js index 64acfdfd..750888af 100644 --- a/packages/netlify-cms-core/src/actions/mediaLibrary.js +++ b/packages/netlify-cms-core/src/actions/mediaLibrary.js @@ -1,5 +1,5 @@ import { actions as notifActions } from 'redux-notifications'; -import { currentBackend } from 'Backends/backend'; +import { currentBackend } from 'src/backend'; import { createAssetProxy } from 'ValueObjects/AssetProxy'; import { getAsset, selectIntegration } from 'Reducers'; import { getIntegrationProvider } from 'Integrations'; diff --git a/packages/netlify-cms-core/src/actions/search.js b/packages/netlify-cms-core/src/actions/search.js index 6f086080..f57cd746 100644 --- a/packages/netlify-cms-core/src/actions/search.js +++ b/packages/netlify-cms-core/src/actions/search.js @@ -1,5 +1,5 @@ import fuzzy from 'fuzzy'; -import { currentBackend } from 'Backends/backend'; +import { currentBackend } from 'src/backend'; import { getIntegrationProvider } from 'Integrations'; import { selectIntegration, selectEntries } from 'Reducers'; import { selectInferedField } from 'Reducers/collections'; diff --git a/packages/netlify-cms-core/src/components/App/App.js b/packages/netlify-cms-core/src/components/App/App.js index b51dcdf0..dbda03d9 100644 --- a/packages/netlify-cms-core/src/components/App/App.js +++ b/packages/netlify-cms-core/src/components/App/App.js @@ -9,7 +9,7 @@ import { Notifs } from 'redux-notifications'; import TopBarProgress from 'react-topbar-progress-indicator'; import { loadConfig as actionLoadConfig } from 'Actions/config'; import { loginUser as actionLoginUser, logoutUser as actionLogoutUser } from 'Actions/auth'; -import { currentBackend } from 'Backends/backend'; +import { currentBackend } from 'src/backend'; import { showCollection, createNewEntry } from 'Actions/collections'; import { openMediaLibrary as actionOpenMediaLibrary } from 'Actions/mediaLibrary'; import MediaLibrary from 'MediaLibrary/MediaLibrary'; diff --git a/packages/netlify-cms-core/src/valueObjects/AssetProxy.js b/packages/netlify-cms-core/src/valueObjects/AssetProxy.js index a551d728..487e6624 100644 --- a/packages/netlify-cms-core/src/valueObjects/AssetProxy.js +++ b/packages/netlify-cms-core/src/valueObjects/AssetProxy.js @@ -1,5 +1,5 @@ import { resolvePath } from 'netlify-cms-lib-util'; -import { currentBackend } from 'Backends/backend'; +import { currentBackend } from 'src/backend'; import { getIntegrationProvider } from 'Integrations'; import { selectIntegration } from 'Reducers'; diff --git a/packages/netlify-cms-core/webpack.config.js b/packages/netlify-cms-core/webpack.config.js index e47b8988..c47451f2 100644 --- a/packages/netlify-cms-core/webpack.config.js +++ b/packages/netlify-cms-core/webpack.config.js @@ -1,14 +1,26 @@ const path = require('path'); const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); -const baseConfig = require('../../webpack.config.js'); +const { getConfig, rules, plugins } = require('../../scripts/webpack.js'); module.exports = { - ...baseConfig, + ...getConfig(), context: path.join(__dirname, 'src'), entry: './index.js', module: { rules: [ - ...baseConfig.module.rules, + ...Object.entries(rules) + .filter(([ key ]) => key !== 'js') + .map(([ _, rule ]) => rule()), + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + configFile: path.join(__dirname, 'babel.config.js'), + }, + }, + }, { test: /\.css$/, include: [/redux-notifications/], @@ -16,6 +28,16 @@ module.exports = { }, ], }, + plugins: [ + ...Object.entries(plugins) + .filter(([ key ]) => key !== 'friendlyErrors') + .map(([ _, plugin ]) => plugin()), + new FriendlyErrorsWebpackPlugin({ + compilationSuccessInfo: { + messages: ['Netlify CMS is now running at http://localhost:8080'], + }, + }), + ], devServer: { contentBase: './example', watchContentBase: true, @@ -23,12 +45,4 @@ module.exports = { host: 'localhost', port: 8080, }, - plugins: [ - ...baseConfig.plugins.filter(plugin => !plugin instanceof FriendlyErrorsWebpackPlugin), - new FriendlyErrorsWebpackPlugin({ - compilationSuccessInfo: { - messages: ['Netlify CMS is now running at http://localhost:8080'], - }, - }), - ], }; diff --git a/packages/netlify-cms-editor-component-image/webpack.config.js b/packages/netlify-cms-editor-component-image/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-editor-component-image/webpack.config.js +++ b/packages/netlify-cms-editor-component-image/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/packages/netlify-cms-lib-auth/webpack.config.js b/packages/netlify-cms-lib-auth/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-lib-auth/webpack.config.js +++ b/packages/netlify-cms-lib-auth/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/packages/netlify-cms-lib-util/webpack.config.js b/packages/netlify-cms-lib-util/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-lib-util/webpack.config.js +++ b/packages/netlify-cms-lib-util/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/packages/netlify-cms-ui-default/webpack.config.js b/packages/netlify-cms-ui-default/webpack.config.js index 52d79f92..42edd361 100644 --- a/packages/netlify-cms-ui-default/webpack.config.js +++ b/packages/netlify-cms-ui-default/webpack.config.js @@ -1 +1,3 @@ -module.exports = require('../../webpack.config.js'); +const { getConfig } = require('../../scripts/webpack.js'); + +module.exports = getConfig(); diff --git a/webpack.config.js b/scripts/webpack.js similarity index 66% rename from webpack.config.js rename to scripts/webpack.js index 47e43c6d..2182499d 100644 --- a/webpack.config.js +++ b/scripts/webpack.js @@ -1,4 +1,3 @@ -const fs = require('fs'); const path = require('path'); const webpack = require('webpack'); const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); @@ -6,25 +5,43 @@ const pkg = require(path.join(process.cwd(), 'package.json')); const isProduction = process.env.NODE_ENV === 'production'; +const rules = () => ({ + js: () => ({ + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + configFile: path.resolve(`${__dirname}/../babel.config.js`), + }, + }, + }), + svg: () => ({ + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + exclude: [/node_modules/], + use: 'svg-inline-loader', + }), +}); + const plugins = () => { - const defaultPlugins = [ - new FriendlyErrorsWebpackPlugin(), - ]; + const defaultPlugins = { + friendlyErrors: () => new FriendlyErrorsWebpackPlugin() + }; if (isProduction) { - return [ + return { ...defaultPlugins, - new webpack.SourceMapDevToolPlugin({ + sourcemap: (config = {}) => new webpack.SourceMapDevToolPlugin({ filename: '[file].map', moduleFilenameTemplate: info => path.posix.normalize(`../src/${info.resourcePath}`), noSources: true, }), - ]; + }; } - return [ + return { ...defaultPlugins, - ]; + } }; const stats = () => { @@ -44,7 +61,7 @@ const stats = () => { }; }; -module.exports = { +const getConfig = () => ({ mode: isProduction ? 'production' : 'development', entry: './src/index.js', output: { @@ -55,27 +72,12 @@ module.exports = { umdNamedDefine: true, }, module: { - rules: [ - { - test: /\.js$/, - use: { - loader: 'babel-loader', - options: { - configFile: path.join(__dirname, 'babel.config.js'), - }, - }, - exclude: /node_modules/, - }, - { - test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, - exclude: [/node_modules/], - loader: 'svg-inline-loader', - }, - ], + rules: Object.values(rules()).map(rule => rule()), }, - plugins: plugins(), + plugins: Object.values(plugins()).map(plugin => plugin), devtool: !isProduction && 'source-map', target: 'web', + /** * Exclude peer dependencies from package bundles. */ @@ -85,4 +87,10 @@ module.exports = { return peerDeps.some(isPeerDep) ? cb(null, request) : cb(); }, stats: stats(), +}); + +module.exports = { + getConfig, + rules: rules(), + plugins: plugins(), };