Skip to content

Commit 81e1c40

Browse files
author
Val
committed
fixes for a last PR. multiple search-replace pairs support. version 1.0.0
1 parent 7cbf85d commit 81e1c40

File tree

4 files changed

+108
-57
lines changed

4 files changed

+108
-57
lines changed

README.md

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ In your `webpack.config.js`:
1616

1717
```javascript
1818
module.exports = {
19-
// ...
20-
module: {
21-
loaders: [
22-
{
23-
test: /fileInWhichJQueryIsUndefined\.js$/,
24-
loader: 'string-replace',
25-
query: {
26-
search: 'jQuery',
27-
replace: 'window.$'
28-
}
19+
// ...
20+
module: {
21+
loaders: [
22+
{
23+
test: /fileInWhichJQueryIsUndefined\.js$/,
24+
loader: 'string-replace',
25+
query: {
26+
search: 'jQuery',
27+
replace: 'window.$'
2928
}
30-
]
31-
}
29+
}
30+
]
31+
}
3232
}
3333
```
3434

35-
### Regex replacement:
35+
### RegEx replacement:
3636

3737
To achieve regular expression replacement you should specify the `flags` query param
3838
(as an empty string if you do not want any flags). In this case, `search` and `flags` are being
@@ -42,43 +42,46 @@ In your `webpack.config.js`:
4242

4343
```javascript
4444
module.exports = {
45-
// ...
46-
module: {
47-
loaders: [
48-
{
49-
test: /fileInWhichJQueryIsUndefined\.js$/,
50-
loader: 'string-replace',
51-
query: {
52-
search: /jquery/i,
53-
replace: 'window.$'
54-
}
45+
// ...
46+
module: {
47+
loaders: [
48+
{
49+
test: /fileInWhichJQueryIsUndefined\.js$/,
50+
loader: 'string-replace',
51+
query: {
52+
search: 'jquery',
53+
replace: 'window.$',
54+
flags: 'i'
5555
}
56-
]
57-
}
56+
}
57+
]
58+
}
5859
}
5960
```
6061

61-
### Array replacement:
62+
### Multiple replacement:
63+
64+
Also, you can pass an array of search-replace pairs this way:
6265

6366
In your `webpack.config.js`:
6467

6568
```javascript
6669
module.exports = {
67-
// ...
68-
module: {
69-
loaders: [
70-
{
71-
test: /\.js$/,
72-
loader: 'string-replace',
73-
query: {
74-
multiple: [
75-
{search: 'framework', replace: 'flamewar'},
76-
{search: 'ants', replace: 'super ants'},
77-
]
78-
}
70+
// ...
71+
module: {
72+
loaders: [
73+
{
74+
test: /\.js$/,
75+
loader: 'string-replace',
76+
query: {
77+
multiple: [
78+
{ search: 'jQuery', replace: 'window.$' },
79+
{ search: '_', replace: 'window.lodash' }
80+
]
7981
}
80-
]
81-
}
82+
}
83+
]
84+
}
8285
}
8386
```
8487

index.js

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
1+
var _ = require('lodash');
12
var utils = require('loader-utils');
23

3-
function processQuery(source, option) {
4-
if (typeof option.search !== 'undefined' && typeof option.replace !== 'undefined') {
5-
return source.split(option.search).join(option.replace);
4+
function processQuery(source, query) {
5+
if (!_.isUndefined(query.search) && !_.isUndefined(query.replace)) {
6+
if (!_.isUndefined(query.flags)) {
7+
query.search = new RegExp(query.search, query.flags);
8+
}
9+
10+
return source.replace(query.search, query.replace);
611
}
712

813
return source;
914
}
1015

11-
module.exports = function(source) {
16+
module.exports = function (source) {
1217
this.cacheable();
1318

1419
var query = utils.parseQuery(this.query);
1520

16-
if (Array.isArray(query.multiple)) {
17-
var length = query.multiple.length;
18-
19-
for (var i = 0; i < length; i++) {
20-
var option = query.multiple[i];
21-
source = processQuery(source, option);
22-
}
23-
24-
return source;
21+
if (_.isArray(query.multiple)) {
22+
query.multiple.forEach(function (subquery) {
23+
source = processQuery(source, subquery);
24+
});
25+
} else {
26+
source = processQuery(source, query);
2527
}
2628

27-
return processQuery(source, query);
29+
return source;
2830
};

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "string-replace-loader",
3-
"version": "0.1.1",
3+
"version": "1.0.0",
44
"description": "Replace loader for Webpack",
55
"keywords": [
66
"webpack",
@@ -15,7 +15,8 @@
1515
},
1616
"main": "index.js",
1717
"dependencies": {
18-
"loader-utils": "^0.2.11"
18+
"loader-utils": "^0.2.11",
19+
"lodash": "^3.10.1"
1920
},
2021
"devDependencies": {
2122
"chai": "^3.2.0",

test/index.test.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,52 @@ describe('Webpack replace loader ...', function () {
124124
);
125125
});
126126

127-
it('should replace using string query', function (done) {
127+
it('should replace using multiple queries', function (done) {
128+
webpack(
129+
{
130+
entry: entryFilePath,
131+
output: {
132+
path: outputDirPath,
133+
filename: outputFileName
134+
},
135+
module: {
136+
loaders: [
137+
{
138+
test: /\.js$/,
139+
loader: '__this',
140+
query: {
141+
multiple: [
142+
{
143+
search: 'var value',
144+
replace: 'var a'
145+
},
146+
{
147+
search: 'module.exports = value',
148+
replace: 'module.exports = a'
149+
}
150+
]
151+
}
152+
}
153+
]
154+
}
155+
},
156+
function (error, stats) {
157+
expect(error).to.equal(null);
158+
159+
fs.readFile(outputFilePath, 'utf8', function (error, contents) {
160+
expect(error).to.equal(null);
161+
expect(contents).to.be.a('string');
162+
expect(contents.indexOf('var value')).to.equal(-1);
163+
expect(contents.indexOf('var a')).to.not.equal(-1);
164+
expect(contents.indexOf('module.exports = value')).to.equal(-1);
165+
expect(contents.indexOf('module.exports = a')).to.not.equal(-1);
166+
done();
167+
});
168+
}
169+
);
170+
});
171+
172+
it('should replace using multiple queries as strings', function (done) {
128173
webpack(
129174
{
130175
entry: entryFilePath,

0 commit comments

Comments
 (0)