blob: 8729baf27066a39b71f0268bdeb6ff836d1db39e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
// Note: this is based on https://github.com/plasticine/inject-loader,
// patched to make istanbul work properly
const loaderUtils = require("loader-utils");
const QUOTE_REGEX_STRING = "['|\"]{1}";
const hasOnlyExcludeFlags = query =>
Object.keys(query).filter(key => query[key] === true).length === 0;
const escapePath = path => path.replace("/", "\\/");
function createRequireStringRegex(query) {
const regexArray = [];
// if there is no query then replace everything
if (Object.keys(query).length === 0) {
regexArray.push("([^\\)]+)");
} else if (hasOnlyExcludeFlags(query)) {
// if there are only negation matches in the query then replace everything
// except them
Object.keys(query).forEach(key =>
regexArray.push(`(?!${QUOTE_REGEX_STRING}${escapePath(key)})`)
);
regexArray.push("([^\\)]+)");
} else {
regexArray.push(`(${QUOTE_REGEX_STRING}(`);
regexArray.push(
Object.keys(query)
.map(key => escapePath(key))
.join("|")
);
regexArray.push(`)${QUOTE_REGEX_STRING})`);
}
// Wrap the regex to match `require()`
regexArray.unshift("require\\(");
regexArray.push("\\)");
return new RegExp(regexArray.join(""), "g");
}
module.exports = function inject(src) {
if (this.cacheable) {
this.cacheable();
}
const regex = createRequireStringRegex(
loaderUtils.urlToRequest(this.resourcePath) || {}
);
return `module.exports = function inject(injections) {
var module = {exports: {}};
var exports = module.exports;
${src.replace(regex, "(injections[$1] || /* istanbul ignore next */ $&)")}
return module.exports;
}\n`;
};
|