diff --git a/src/index.js b/src/index.js index 8c22d820..25c285e6 100644 --- a/src/index.js +++ b/src/index.js @@ -146,12 +146,30 @@ function ncc ( } }); - const externalMap = new Map(); + const externalMap = (() => { + const regexps = []; + const aliasMap = new Map(); + + function set(key, value) { + if (key instanceof RegExp) + regexps.push(key); + aliasMap.set(key, value); + } + + 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; + } + + return { get, set }; + })(); if (Array.isArray(externals)) externals.forEach(external => externalMap.set(external, external)); else if (typeof externals === 'object') - Object.keys(externals).forEach(external => externalMap.set(external, externals[external])); + Object.keys(externals).forEach(external => externalMap.set(external[0] === '/' && external[external.length - 1] === '/' ? new RegExp(external.slice(1, -1)) : external, externals[external])); let watcher, watchHandler, rebuildHandler; @@ -260,8 +278,9 @@ function ncc ( }, // https://github.com/vercel/ncc/pull/29#pullrequestreview-177152175 node: false, - externals: ({ context, request }, callback) => { - if (externalMap.has(request)) return callback(null, `commonjs ${externalMap.get(request)}`); + externals ({ context, request }, callback) { + const external = externalMap.get(request); + if (external) return callback(null, `commonjs ${external}`); return callback(); }, module: { diff --git a/test/index.test.js b/test/index.test.js index 84d91716..ea31bd9f 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -42,7 +42,8 @@ for (const unitTest of fs.readdirSync(`${__dirname}/unit`)) { }, externals: { 'piscina': 'piscina', - 'externaltest': 'externalmapped' + 'externaltest': 'externalmapped', + '/\\w+-regex/': 'regexexternal', } }, opts)).then( async ({ code, assets, map }) => { diff --git a/test/unit/externals/input.js b/test/unit/externals/input.js index 794456be..22b98b25 100644 --- a/test/unit/externals/input.js +++ b/test/unit/externals/input.js @@ -1,3 +1,6 @@ const external = require('externaltest'); +const regexpExternal = require('external-regex'); console.log(external); +console.log(regexpExternal); + diff --git a/test/unit/externals/output-coverage.js b/test/unit/externals/output-coverage.js index 2d6a579b..a3d9ca2c 100644 --- a/test/unit/externals/output-coverage.js +++ b/test/unit/externals/output-coverage.js @@ -7,6 +7,14 @@ "use strict"; module.exports = require("externalmapped"); +/***/ }), + +/***/ 196: +/***/ ((module) => { + +"use strict"; +module.exports = require("regexexternal"); + /***/ }) /******/ }); @@ -49,8 +57,11 @@ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { const external = __nccwpck_require__(306); +const regexpExternal = __nccwpck_require__(196); console.log(external); +console.log(regexpExternal); + })(); diff --git a/test/unit/externals/output.js b/test/unit/externals/output.js index 2d6a579b..a3d9ca2c 100644 --- a/test/unit/externals/output.js +++ b/test/unit/externals/output.js @@ -7,6 +7,14 @@ "use strict"; module.exports = require("externalmapped"); +/***/ }), + +/***/ 196: +/***/ ((module) => { + +"use strict"; +module.exports = require("regexexternal"); + /***/ }) /******/ }); @@ -49,8 +57,11 @@ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { const external = __nccwpck_require__(306); +const regexpExternal = __nccwpck_require__(196); console.log(external); +console.log(regexpExternal); + })();