summaryrefslogtreecommitdiffstats
path: root/browser/components/newtab/loaders/inject-loader.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/newtab/loaders/inject-loader.js')
-rw-r--r--browser/components/newtab/loaders/inject-loader.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/browser/components/newtab/loaders/inject-loader.js b/browser/components/newtab/loaders/inject-loader.js
new file mode 100644
index 0000000000..8729baf270
--- /dev/null
+++ b/browser/components/newtab/loaders/inject-loader.js
@@ -0,0 +1,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`;
+};