From 402004377b16bea7611bbfc979431aa3df851753 Mon Sep 17 00:00:00 2001 From: Pavithra Kodmad Date: Wed, 1 Mar 2017 12:32:05 +0530 Subject: [PATCH] fix: add safe traverse to loaderoptionsplugin (#77) * fix: add safe traverse to loaderoptionsplugin * test: write a failing test case --- .../loaderOptionsPlugin.test.js.snap | 21 +++++++++++++++++++ .../loaderOptionsPlugin-3.input.js | 17 +++++++++++++++ .../loaderOptionsPlugin.js | 3 ++- .../loaderOptionsPlugin.test.js | 1 + 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 lib/transformations/loaderOptionsPlugin/__testfixtures__/loaderOptionsPlugin-3.input.js diff --git a/lib/transformations/loaderOptionsPlugin/__snapshots__/loaderOptionsPlugin.test.js.snap b/lib/transformations/loaderOptionsPlugin/__snapshots__/loaderOptionsPlugin.test.js.snap index 3f133fde498..7dfde2ced53 100644 --- a/lib/transformations/loaderOptionsPlugin/__snapshots__/loaderOptionsPlugin.test.js.snap +++ b/lib/transformations/loaderOptionsPlugin/__snapshots__/loaderOptionsPlugin.test.js.snap @@ -37,3 +37,24 @@ module.exports = { } " `; + +exports[`loaderOptionsPlugin transforms correctly using "loaderOptionsPlugin-3" data 1`] = ` +"// Don't modify LoaderOptionsPlugin + +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +module.exports = { + entry: ['./index.js'], + output: { + filename: 'bundle.js' + }, + module: { + rules: [{ + test: /\\\\.css$/, + use: ExtractTextPlugin.extract([ + 'css-loader' + ]) + }] + }, +} +" +`; diff --git a/lib/transformations/loaderOptionsPlugin/__testfixtures__/loaderOptionsPlugin-3.input.js b/lib/transformations/loaderOptionsPlugin/__testfixtures__/loaderOptionsPlugin-3.input.js new file mode 100644 index 00000000000..2a3baa56d23 --- /dev/null +++ b/lib/transformations/loaderOptionsPlugin/__testfixtures__/loaderOptionsPlugin-3.input.js @@ -0,0 +1,17 @@ +// Don't modify LoaderOptionsPlugin + +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +module.exports = { + entry: ['./index.js'], + output: { + filename: 'bundle.js' + }, + module: { + rules: [{ + test: /\.css$/, + use: ExtractTextPlugin.extract([ + 'css-loader' + ]) + }] + }, +} diff --git a/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.js b/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.js index 8e9835fe451..d959c4f56e0 100644 --- a/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.js +++ b/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.js @@ -1,6 +1,7 @@ const isEmpty = require('lodash/isEmpty'); const findPluginsByName = require('../utils').findPluginsByName; const createOrUpdatePluginByName = require('../utils').createOrUpdatePluginByName; +const safeTraverse = require('../utils').safeTraverse; module.exports = function(j, ast) { const loaderOptions = {}; @@ -19,7 +20,7 @@ module.exports = function(j, ast) { return ast .find(j.ArrayExpression) - .filter(path => path.parent.value.key.name === 'plugins') + .filter(path => safeTraverse(path, ['parent', 'value', 'key', 'name']) === 'plugins') .forEach(path => { !isEmpty(loaderOptions) && createOrUpdatePluginByName(j, path, 'webpack.optimize.LoaderOptionsPlugin', loaderOptions); diff --git a/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.test.js b/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.test.js index a69f6871fd5..1339fc4bf35 100644 --- a/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.test.js +++ b/lib/transformations/loaderOptionsPlugin/loaderOptionsPlugin.test.js @@ -3,3 +3,4 @@ const defineTest = require('../defineTest'); defineTest(__dirname, 'loaderOptionsPlugin', 'loaderOptionsPlugin-0'); defineTest(__dirname, 'loaderOptionsPlugin', 'loaderOptionsPlugin-1'); defineTest(__dirname, 'loaderOptionsPlugin', 'loaderOptionsPlugin-2'); +defineTest(__dirname, 'loaderOptionsPlugin', 'loaderOptionsPlugin-3');