From ed8cc68040706f026a12f6e5e6a270324dd3d405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Thu, 8 Nov 2018 08:47:21 +0100 Subject: [PATCH 01/11] Profile webpack build --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 1623d8294a2f..eb9d0776d83f 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "build-ngeo-examples": "TARGET=ngeo-examples webpack --progress --debug", "build-gmf-examples": "TARGET=gmf-examples webpack --progress --debug", "build-gmf-apps": "TARGET=gmf-apps webpack --progress --debug", + "build-gmf-apps-profile": "TARGET=gmf-apps webpack --profile --json > profile.json", "serve-ngeo-examples": "DEV_SERVER=1 TARGET=ngeo-examples webpack-dev-server --port 3000 --progress --watch --bail --debug", "serve-gmf-examples": "DEV_SERVER=1 TARGET=gmf-examples webpack-dev-server --port 3000 --progress --watch --bail --debug", "serve-gmf-apps": "DEV_SERVER=1 TARGET=gmf-apps webpack-dev-server --port 3000 --progress --watch --bail --debug" From 9d31b27db5d96090ea9e4e69158ab56ff7d42f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Thu, 8 Nov 2018 10:00:02 +0100 Subject: [PATCH 02/11] Add HardSourceWebpackPlugin --- buildtools/webpack.commons.js | 98 ++++++++++++++++++----------------- karma-conf.js | 2 +- package.json | 1 + webpack.config.js | 2 +- 4 files changed, 54 insertions(+), 49 deletions(-) diff --git a/buildtools/webpack.commons.js b/buildtools/webpack.commons.js index b33b0683b053..e993e17d32e3 100644 --- a/buildtools/webpack.commons.js +++ b/buildtools/webpack.commons.js @@ -3,6 +3,7 @@ const webpack = require('webpack'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const LessPluginCleanCSS = require('less-plugin-clean-css'); const LessPluginAutoprefix = require('less-plugin-autoprefix'); +const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); const devMode = process.env.NODE_ENV !== 'production' @@ -157,54 +158,57 @@ const htmlRule = { }] }; -const config = { - context: path.resolve(__dirname, '../'), - devtool: 'source-map', - output: { - path: path.resolve(__dirname, '../dist/') - }, - module: { - rules: [ - olRule, - olcsRule, - angularRule, - typeaheadRule, - cssRule, - lessRule, - htmlRule, - ngeoRule, - ngeoExamplesRule, - gmfAppsRule, - gmfRule, - gmfExamplesRule, - ] - }, - plugins: [ - providePlugin, - new ExtractTextPlugin({ - ignoreOrder: true, - filename: devMode ? '[name].css' : '[name].[chunkhash:6].css' - }), - new webpack.IgnorePlugin(/^\.\/locale$/, /node_modules\/moment\/src\/lib\/locale$/), - ], - resolve: { - modules: [ - '../node_modules' +const config = function(hardSourceConfig) { + return { + context: path.resolve(__dirname, '../'), + devtool: 'source-map', + output: { + path: path.resolve(__dirname, '../dist/') + }, + module: { + rules: [ + olRule, + olcsRule, + angularRule, + typeaheadRule, + cssRule, + lessRule, + htmlRule, + ngeoRule, + ngeoExamplesRule, + gmfAppsRule, + gmfRule, + gmfExamplesRule, + ] + }, + plugins: [ + providePlugin, + new ExtractTextPlugin({ + ignoreOrder: true, + filename: devMode ? '[name].css' : '[name].[chunkhash:6].css' + }), + new webpack.IgnorePlugin(/^\.\/locale$/, /node_modules\/moment\/src\/lib\/locale$/), + new HardSourceWebpackPlugin(hardSourceConfig || {}), ], - mainFields: ['jsnext:main', 'main'], - alias: { - 'ngeo/test': path.resolve(__dirname, '../test/spec'), - 'gmf/test': path.resolve(__dirname, '../contribs/gmf/test/spec'), - 'ngeo': path.resolve(__dirname, '../src'), - 'gmf': path.resolve(__dirname, '../contribs/gmf/src'), - 'goog/asserts': path.resolve(__dirname, '../src/goog.asserts.js'), - 'goog/asserts.js': path.resolve(__dirname, '../src/goog.asserts.js'), - 'jsts': 'jsts/org/locationtech/jts', - 'ol/ol.css': 'openlayers/css/ol.css', - 'ol': 'openlayers/src/ol', - 'olcs': 'ol-cesium/src/olcs', - 'jquery-ui/datepicker': 'jquery-ui/ui/widgets/datepicker', // For angular-ui-date - 'proj4': 'proj4/lib', + resolve: { + modules: [ + '../node_modules' + ], + mainFields: ['jsnext:main', 'main'], + alias: { + 'ngeo/test': path.resolve(__dirname, '../test/spec'), + 'gmf/test': path.resolve(__dirname, '../contribs/gmf/test/spec'), + 'ngeo': path.resolve(__dirname, '../src'), + 'gmf': path.resolve(__dirname, '../contribs/gmf/src'), + 'goog/asserts': path.resolve(__dirname, '../src/goog.asserts.js'), + 'goog/asserts.js': path.resolve(__dirname, '../src/goog.asserts.js'), + 'jsts': 'jsts/org/locationtech/jts', + 'ol/ol.css': 'openlayers/css/ol.css', + 'ol': 'openlayers/src/ol', + 'olcs': 'ol-cesium/src/olcs', + 'jquery-ui/datepicker': 'jquery-ui/ui/widgets/datepicker', // For angular-ui-date + 'proj4': 'proj4/lib', + } } } }; diff --git a/karma-conf.js b/karma-conf.js index e4972dea4788..936abd25e961 100644 --- a/karma-conf.js +++ b/karma-conf.js @@ -6,7 +6,7 @@ var isDebug = process.argv.some(function(argument) { const webpackMerge = require('webpack-merge'); const commons = require('./buildtools/webpack.commons'); -let webpackConfig = commons.config; +let webpackConfig = commons.config(); webpackConfig = webpackMerge(webpackConfig, require('./buildtools/webpack.dev')); webpackConfig = webpackMerge(webpackConfig, { devtool: 'inline-source-map', diff --git a/package.json b/package.json index eb9d0776d83f..7db996d85600 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "floatthead": "2.1.2", "font-awesome": "4.7.0", "fs-extra": "6.0.1", + "hard-source-webpack-plugin": "0.6.12", "html-loader": "0.5.5", "html-webpack-plugin": "3.2.0", "istanbul-instrumenter-loader": "3.0.1", diff --git a/webpack.config.js b/webpack.config.js index c4d5ae77ece6..fe4b6f44873a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,7 @@ const webpackMerge = require('webpack-merge'); const commons = require('./buildtools/webpack.commons'); -let config = commons.config; +let config = commons.config(); const nodeEnv = process.env['NODE_ENV'] || 'development'; switch (nodeEnv) { From 455561150b44558d7d9bbbe1706756bd47043c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Thu, 8 Nov 2018 14:04:25 +0100 Subject: [PATCH 03/11] Be able to configure bable an uglify cache directory --- buildtools/webpack.commons.js | 125 +++++++++++++++++----------------- buildtools/webpack.prod.js | 68 +++++++++--------- webpack.config.js | 4 +- 3 files changed, 99 insertions(+), 98 deletions(-) diff --git a/buildtools/webpack.commons.js b/buildtools/webpack.commons.js index e993e17d32e3..1eefe3291aef 100644 --- a/buildtools/webpack.commons.js +++ b/buildtools/webpack.commons.js @@ -34,68 +34,6 @@ const babelPresets = [['env', { 'loose': true, }]]; -const babelAnnotateUse = { - loader: 'babel-loader', - options: { - comments: false, - cacheDirectory: true, - presets: babelPresets, - plugins: ['@camptocamp/babel-plugin-angularjs-annotate'], - } -}; - -const ngeoRule = { - test: /ngeo\/src\/.*\.js$/, - use: babelAnnotateUse, -}; - -const ngeoExamplesRule = { - test: /ngeo\/examples\/.*\.js$/, - use: babelAnnotateUse, -}; - -const gmfAppsRule = { - test: /ngeo\/contribs\/gmf\/apps\/.*\.js$/, - use: babelAnnotateUse, -}; - -const gmfRule = { - test: /ngeo\/contribs\/gmf\/src\/.*\.js$/, - use: babelAnnotateUse, -}; - -const gmfExamplesRule = { - test: /ngeo\/contribs\/gmf\/examples\/.*\.js$/, - use: babelAnnotateUse, -}; - -const olRule = { - test: /openlayers\/src\/.*\.js$/, - use: { - loader: 'babel-loader', - options: { - babelrc: false, - comments: false, - cacheDirectory: true, - presets: babelPresets, - } - } -}; - -const olcsRule = { - test: /olcs\/.*\.js$/, - use: { - loader: 'babel-loader', - options: { - babelrc: false, - comments: false, - cacheDirectory: true, - presets: babelPresets, - } - } -}; - - const angularRule = { test: require.resolve('angular'), use: { @@ -158,7 +96,68 @@ const htmlRule = { }] }; -const config = function(hardSourceConfig) { +const config = function(hardSourceConfig, babelLoaderCacheDirectory) { + const babelAnnotateUse = { + loader: 'babel-loader', + options: { + comments: false, + cacheDirectory: babelLoaderCacheDirectory, + presets: babelPresets, + plugins: ['@camptocamp/babel-plugin-angularjs-annotate'], + } + }; + + const ngeoRule = { + test: /ngeo\/src\/.*\.js$/, + use: babelAnnotateUse, + }; + + const ngeoExamplesRule = { + test: /ngeo\/examples\/.*\.js$/, + use: babelAnnotateUse, + }; + + const gmfAppsRule = { + test: /ngeo\/contribs\/gmf\/apps\/.*\.js$/, + use: babelAnnotateUse, + }; + + const gmfRule = { + test: /ngeo\/contribs\/gmf\/src\/.*\.js$/, + use: babelAnnotateUse, + }; + + const gmfExamplesRule = { + test: /ngeo\/contribs\/gmf\/examples\/.*\.js$/, + use: babelAnnotateUse, + }; + + const olRule = { + test: /openlayers\/src\/.*\.js$/, + use: { + loader: 'babel-loader', + options: { + babelrc: false, + comments: false, + cacheDirectory: babelLoaderCacheDirectory, + presets: babelPresets, + } + } + }; + + const olcsRule = { + test: /olcs\/.*\.js$/, + use: { + loader: 'babel-loader', + options: { + babelrc: false, + comments: false, + cacheDirectory: babelLoaderCacheDirectory, + presets: babelPresets, + } + } + }; + return { context: path.resolve(__dirname, '../'), devtool: 'source-map', diff --git a/buildtools/webpack.prod.js b/buildtools/webpack.prod.js index 0a31e6c301c5..d7abfa926e7d 100644 --- a/buildtools/webpack.prod.js +++ b/buildtools/webpack.prod.js @@ -24,36 +24,38 @@ const fontRule = { } }; -module.exports = { - mode: 'production', - output: { - filename: '[name].[chunkhash:6].js' - }, - plugins: [ - new webpack.optimize.ModuleConcatenationPlugin(), - ], - module: { - rules: [ - resourcesRule, - fontRule, - ] - }, - optimization: { - minimizer: [ - new UglifyJsPlugin({ - cache: true, - parallel: true, - sourceMap: true, - uglifyOptions: { - compress: false - } - }) - ] - }, - resolve: { - alias: { - 'goog/asserts': path.resolve(__dirname, '../src/goog.asserts.prod.js'), - 'goog/asserts.js': path.resolve(__dirname, '../src/goog.asserts.prod.js'), - } - }, -}; +module.exports = function(UglifyJsPluginCache) { + return { + mode: 'production', + output: { + filename: '[name].[chunkhash:6].js' + }, + plugins: [ + new webpack.optimize.ModuleConcatenationPlugin(), + ], + module: { + rules: [ + resourcesRule, + fontRule, + ] + }, + optimization: { + minimizer: [ + new UglifyJsPlugin({ + cache: UglifyJsPluginCache, + parallel: true, + sourceMap: true, + uglifyOptions: { + compress: false + } + }) + ] + }, + resolve: { + alias: { + 'goog/asserts': path.resolve(__dirname, '../src/goog.asserts.prod.js'), + 'goog/asserts.js': path.resolve(__dirname, '../src/goog.asserts.prod.js'), + } + }, + }; +} diff --git a/webpack.config.js b/webpack.config.js index fe4b6f44873a..bf6754387bac 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,7 @@ const webpackMerge = require('webpack-merge'); const commons = require('./buildtools/webpack.commons'); -let config = commons.config(); +let config = commons.config({}, true); const nodeEnv = process.env['NODE_ENV'] || 'development'; switch (nodeEnv) { @@ -9,7 +9,7 @@ switch (nodeEnv) { config = webpackMerge(config, require('./buildtools/webpack.dev')); break; case 'production': - config = webpackMerge(config, require('./buildtools/webpack.prod')); + config = webpackMerge(config, require('./buildtools/webpack.prod')(true)); break; default: console.log(`The 'NODE_ENV' environment variable is set to an invalid value: ${process.env.NODE_ENV}.` ) From d7484f09b8190bc3c4c2fc38baad93707f90d0bd Mon Sep 17 00:00:00 2001 From: "arnaud.morvan@camptocamp.com" Date: Thu, 8 Nov 2018 17:53:26 +0100 Subject: [PATCH 04/11] Emit authenticationrequired even when layertree is empty --- contribs/gmf/src/permalink/Permalink.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contribs/gmf/src/permalink/Permalink.js b/contribs/gmf/src/permalink/Permalink.js index 002c1b0cf972..f7e279e40374 100644 --- a/contribs/gmf/src/permalink/Permalink.js +++ b/contribs/gmf/src/permalink/Permalink.js @@ -978,6 +978,9 @@ exports.prototype.initLayers_ = function() { this.$timeout_(() => { if (!this.gmfTreeManager_ || !this.gmfTreeManager_.rootCtrl) { // we don't have any layertree + if (authenticationRequired && this.user_.role_id === null) { + this.rootScope_.$broadcast('authenticationrequired', {url: initialUri}); + } return; } // Enable the layers and set the opacity From 53529c2d755eb6007e58b8dbfba1b3c8ad43873a Mon Sep 17 00:00:00 2001 From: "arnaud.morvan@camptocamp.com" Date: Thu, 8 Nov 2018 18:21:52 +0100 Subject: [PATCH 05/11] Avoid empty string in groupLayersArray as it result in emitting authenticationRequired --- contribs/gmf/src/permalink/Permalink.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contribs/gmf/src/permalink/Permalink.js b/contribs/gmf/src/permalink/Permalink.js index f7e279e40374..20bbf237414d 100644 --- a/contribs/gmf/src/permalink/Permalink.js +++ b/contribs/gmf/src/permalink/Permalink.js @@ -1011,7 +1011,7 @@ exports.prototype.initLayers_ = function() { exports.ParamPrefix.TREE_GROUP_LAYERS + treeCtrl.node.name ); if (groupLayers !== undefined) { - const groupLayersArray = groupLayers.split(','); + const groupLayersArray = groupLayers == '' ? [] : groupLayers.split(','); treeCtrl.traverseDepthFirst((treeCtrl) => { if (treeCtrl.node.children === undefined) { const enable = olArray.includes(groupLayersArray, treeCtrl.node.name); From f693876d6eb9de84e9cc2916a6fd81956da96205 Mon Sep 17 00:00:00 2001 From: "arnaud.morvan@camptocamp.com" Date: Tue, 13 Nov 2018 11:20:28 +0100 Subject: [PATCH 06/11] Fix error message modal dialog in editFeatureComponent --- contribs/gmf/src/editing/editFeatureComponent.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contribs/gmf/src/editing/editFeatureComponent.html b/contribs/gmf/src/editing/editFeatureComponent.html index 28b07bae3cf7..561eaebda7c9 100644 --- a/contribs/gmf/src/editing/editFeatureComponent.html +++ b/contribs/gmf/src/editing/editFeatureComponent.html @@ -127,7 +127,7 @@