diff options
Diffstat (limited to 'browser/components/newtab/loaders/inject-loader.js')
-rw-r--r-- | browser/components/newtab/loaders/inject-loader.js | 59 |
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`; +}; |