diff --git a/lib/CompatibilityPlugin.js b/lib/CompatibilityPlugin.js index 54b04bfcad4..012d88a7cd2 100644 --- a/lib/CompatibilityPlugin.js +++ b/lib/CompatibilityPlugin.js @@ -10,7 +10,7 @@ const ConstDependency = require("./dependencies/ConstDependency"); /** @typedef {import("./Compiler")} Compiler */ /** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */ -const nestedWebpackRequireTag = Symbol("nested __webpack_require__"); +const nestedWebpackIdentifierTag = Symbol("nested webpack identifier"); class CompatibilityPlugin { /** @@ -78,14 +78,18 @@ class CompatibilityPlugin { statement.id.name === "__webpack_require__" ) { const newName = `__nested_webpack_require_${statement.range[0]}__`; - parser.tagVariable(statement.id.name, nestedWebpackRequireTag, { - name: newName, - declaration: { - updated: false, - loc: statement.id.loc, - range: statement.id.range + parser.tagVariable( + statement.id.name, + nestedWebpackIdentifierTag, + { + name: newName, + declaration: { + updated: false, + loc: statement.id.loc, + range: statement.id.range + } } - }); + ); return true; } }); @@ -93,7 +97,21 @@ class CompatibilityPlugin { .for("__webpack_require__") .tap("CompatibilityPlugin", pattern => { const newName = `__nested_webpack_require_${pattern.range[0]}__`; - parser.tagVariable(pattern.name, nestedWebpackRequireTag, { + parser.tagVariable(pattern.name, nestedWebpackIdentifierTag, { + name: newName, + declaration: { + updated: false, + loc: pattern.loc, + range: pattern.range + } + }); + return true; + }); + parser.hooks.pattern + .for("__webpack_exports__") + .tap("CompatibilityPlugin", pattern => { + const newName = "__nested_webpack_exports__"; + parser.tagVariable(pattern.name, nestedWebpackIdentifierTag, { name: newName, declaration: { updated: false, @@ -104,7 +122,7 @@ class CompatibilityPlugin { return true; }); parser.hooks.expression - .for(nestedWebpackRequireTag) + .for(nestedWebpackIdentifierTag) .tap("CompatibilityPlugin", expr => { const { name, declaration } = parser.currentTagData; if (!declaration.updated) { diff --git a/test/configCases/output-module/reuse-webpack-esm-library/index.js b/test/configCases/output-module/reuse-webpack-esm-library/index.js new file mode 100644 index 00000000000..d62ae0367e2 --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/index.js @@ -0,0 +1,5 @@ +import { useCall } from "./lib"; + +it("should compile and run", () => { + expect(useCall()).toBe(1); +}); diff --git a/test/configCases/output-module/reuse-webpack-esm-library/lib.js b/test/configCases/output-module/reuse-webpack-esm-library/lib.js new file mode 100644 index 00000000000..abd78cc6d93 --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/lib.js @@ -0,0 +1,95 @@ +import * as __WEBPACK_EXTERNAL_MODULE_react__ from "react"; +/******/ var __webpack_modules__ = ({ + + /***/ "react": + /*!************************!*\ + !*** external "react" ***! + \************************/ + /***/ ((module) => { + + var x = y => { var x = {}; __webpack_require__.d(x, y); return x; } + var y = x => () => x + module.exports = __WEBPACK_EXTERNAL_MODULE_react__; + + /***/ }) + + /******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + /******/ // Check if module is in cache + /******/ var cachedModule = __webpack_module_cache__[moduleId]; + /******/ if (cachedModule !== undefined) { + /******/ return cachedModule.exports; + /******/ } + /******/ // Create a new module (and put it into the cache) + /******/ var module = __webpack_module_cache__[moduleId] = { + /******/ // no module.id needed + /******/ // no module.loaded needed + /******/ exports: {} + /******/ }; + /******/ + /******/ // Execute the module function + /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); + /******/ + /******/ // Return the exports of the module + /******/ return module.exports; + /******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { + /******/ // define getter functions for harmony exports + /******/ __webpack_require__.d = (exports, definition) => { + /******/ for(var key in definition) { + /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { + /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); + /******/ } + /******/ } + /******/ }; + /******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { + /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) + /******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { + /******/ // define __esModule on exports + /******/ __webpack_require__.r = (exports) => { + /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { + /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); + /******/ } + /******/ Object.defineProperty(exports, '__esModule', { value: true }); + /******/ }; + /******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { + /*!***************************!*\ + !*** ./src/store/call.ts ***! + \***************************/ + __webpack_require__.r(__webpack_exports__); + /* harmony export */ __webpack_require__.d(__webpack_exports__, { + /* harmony export */ "useCall": () => (/* binding */ useCall), + /* harmony export */ "withCallManager": () => (/* binding */ withCallManager) + /* harmony export */ }); + /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); + + function withCallManager() { + return react__WEBPACK_IMPORTED_MODULE_0__.createElement(1); + } + function useCall() { + return withCallManager(); + } +})(); + +var __webpack_exports__useCall = __webpack_exports__.useCall; +var __webpack_exports__withCallManager = __webpack_exports__.withCallManager; +export { __webpack_exports__useCall as useCall, __webpack_exports__withCallManager as withCallManager }; diff --git a/test/configCases/output-module/reuse-webpack-esm-library/react.js b/test/configCases/output-module/reuse-webpack-esm-library/react.js new file mode 100644 index 00000000000..10a7ad78896 --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/react.js @@ -0,0 +1 @@ +export function createElement(a) { return a; } diff --git a/test/configCases/output-module/reuse-webpack-esm-library/webpack.config.js b/test/configCases/output-module/reuse-webpack-esm-library/webpack.config.js new file mode 100644 index 00000000000..8d969d27bc5 --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/webpack.config.js @@ -0,0 +1,14 @@ +const path = require("path"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: "eval", + optimization: { + concatenateModules: false + }, + resolve: { + alias: { + react: path.resolve(__dirname, "react") + } + } +};