diff --git a/src/index.js b/src/index.js index 242f413d..a9263c48 100644 --- a/src/index.js +++ b/src/index.js @@ -160,6 +160,7 @@ function ncc ( const externalMap = (() => { const regexps = []; const aliasMap = new Map(); + const regexCache = new Map(); function set(key, value) { if (key instanceof RegExp) @@ -169,9 +170,27 @@ function ncc ( function get(key) { if (aliasMap.has(key)) return aliasMap.get(key); - - const matchedRegex = regexps.find(regex => regex.test(key)); - return matchedRegex !== null ? aliasMap.get(matchedRegex) : null; + if (regexCache.has(key)) return regexCache.get(key); + + for (const regex of regexps) { + const matches = key.match(regex) + + if (matches) { + let result = aliasMap.get(regex) + + if (matches.length > 1) { + // allow using match from regex in result + // e.g. caniuse-lite(/.*) -> caniuse-lite$1 + result = result.replace(/(\$\d)/g, (match) => { + const index = parseInt(match.substr(1), 10) + return matches[index] || match + }) + } + regexCache.set(key, result) + return result + } + } + return null; } return { get, set }; diff --git a/test/unit.test.js b/test/unit.test.js index b2b4ca83..4e7f0d6a 100644 --- a/test/unit.test.js +++ b/test/unit.test.js @@ -44,6 +44,7 @@ for (const unitTest of fs.readdirSync(`${__dirname}/unit`)) { 'piscina': 'piscina', 'externaltest': 'externalmapped', '/\\w+-regex/': 'regexexternal', + '/external-replace(/.*)/': 'external-replace/replaced$1' } }, opts)).then( async ({ code, assets, map }) => { @@ -88,4 +89,3 @@ for (const unitTest of fs.readdirSync(`${__dirname}/unit`)) { ) }); } - diff --git a/test/unit/externals/input.js b/test/unit/externals/input.js index 22b98b25..2aa2b08f 100644 --- a/test/unit/externals/input.js +++ b/test/unit/externals/input.js @@ -1,6 +1,7 @@ const external = require('externaltest'); const regexpExternal = require('external-regex'); +const regexpExternalMatch = require('external-replace/some-file') console.log(external); console.log(regexpExternal); - +console.log(regexpExternalMatch); diff --git a/test/unit/externals/output.js b/test/unit/externals/output.js index 50eaa538..11bf2373 100644 --- a/test/unit/externals/output.js +++ b/test/unit/externals/output.js @@ -1,6 +1,14 @@ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ +/***/ 378: +/***/ ((module) => { + +"use strict"; +module.exports = require("external-replace/replaced/some-file"); + +/***/ }), + /***/ 830: /***/ ((module) => { @@ -60,10 +68,11 @@ var __webpack_exports__ = {}; (() => { const external = __nccwpck_require__(830); const regexpExternal = __nccwpck_require__(958); +const regexpExternalMatch = __nccwpck_require__(378) console.log(external); console.log(regexpExternal); - +console.log(regexpExternalMatch); })();