From aab745ccf7f756a63eeb14198c9cd1a3a95a6ef9 Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Fri, 23 Jun 2023 22:58:38 +0530 Subject: [PATCH 01/15] docs: add example for stats detailed output --- examples/stats-detailed/README.md | 83 +++++++++++++++++++++++ examples/stats-detailed/build.js | 4 ++ examples/stats-detailed/example.js | 1 + examples/stats-detailed/template.md | 29 ++++++++ examples/stats-detailed/webpack.config.js | 9 +++ 5 files changed, 126 insertions(+) create mode 100644 examples/stats-detailed/README.md create mode 100644 examples/stats-detailed/build.js create mode 100644 examples/stats-detailed/example.js create mode 100644 examples/stats-detailed/template.md create mode 100644 examples/stats-detailed/webpack.config.js diff --git a/examples/stats-detailed/README.md b/examples/stats-detailed/README.md new file mode 100644 index 00000000000..18e05d2780f --- /dev/null +++ b/examples/stats-detailed/README.md @@ -0,0 +1,83 @@ +This configuration will enable the detailed output for the stats report. + +You see that everything is working nicely together. + +# example.js + +```javascript +console.log("Hello World!"); +``` + +# webpack.config.js + +```javascript +const path = require("path"); + +module.exports = { + output: { + path: path.join(__dirname, "dist"), + filename: "output.js" + }, + stats: "detailed" +}; +``` + +# dist/output.js + +```javascript +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +console.log("Hello World!"); + +/******/ })() +; +``` + +# Info + +## Production mode + +``` +PublicPath: dist/ +asset output.js 28 bytes {179} [emitted] [minimized] (name: main) +Entrypoint main 28 bytes = output.js +chunk {179} (runtime: main) output.js (main) 29 bytes [entry] [rendered] + > ./example.js main +./example.js [144] 29 bytes {179} [depth 0] [built] [code generated] + [no exports used] + Statement (ExpressionStatement) with side effects in source code at 1:0-28 + ModuleConcatenation bailout: Module is not an ECMAScript module + +LOG from webpack.Compilation + 1 modules hashed, 0 from cache (1 variants per module in average) + 100% code generated (1 generated, 0 from cache) ++ 24 hidden lines + +LOG from webpack.FlagDependencyExportsPlugin + 0% of exports of modules have been determined (1 no declared exports, 0 not cached, 0 flagged uncacheable, 0 from cache, 0 from mem cache, 0 additional calculations due to dependencies) ++ 3 hidden lines + +LOG from webpack.buildChunkGraph + 2 queue items processed (1 blocks) + 0 chunk groups connected + 0 chunk groups processed for merging (0 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) + 0 chunk group info updated (0 already connected chunk groups reconnected) ++ 5 hidden lines + +LOG from webpack.FileSystemInfo + 1 new snapshots created + 0% root snapshot uncached (0 / 0) + 0% children snapshot uncached (0 / 0) + 0 entries tested + File info in cache: 1 timestamps 1 hashes 1 timestamp hash combinations + File timestamp hash combination snapshot optimization: 0% (0/1) entries shared via 0 shared snapshots (0 times referenced) + Directory info in cache: 0 timestamps 0 hashes 0 timestamp hash combinations + Managed items info in cache: 0 items + +2023-06-23 22:57:08: webpack 5.88.0 compiled successfully (208f5e6e78a48d3e157f) +``` diff --git a/examples/stats-detailed/build.js b/examples/stats-detailed/build.js new file mode 100644 index 00000000000..6da1216015d --- /dev/null +++ b/examples/stats-detailed/build.js @@ -0,0 +1,4 @@ +global.NO_REASONS = true; +global.NO_STATS_OPTIONS = true; +global.STATS_COLORS = true; +require("../build-common"); diff --git a/examples/stats-detailed/example.js b/examples/stats-detailed/example.js new file mode 100644 index 00000000000..019c0f4bc8e --- /dev/null +++ b/examples/stats-detailed/example.js @@ -0,0 +1 @@ +console.log("Hello World!"); diff --git a/examples/stats-detailed/template.md b/examples/stats-detailed/template.md new file mode 100644 index 00000000000..d475f06a46f --- /dev/null +++ b/examples/stats-detailed/template.md @@ -0,0 +1,29 @@ +This configuration will enable the detailed output for the stats report. + +You see that everything is working nicely together. + +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# dist/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# Info + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/stats-detailed/webpack.config.js b/examples/stats-detailed/webpack.config.js new file mode 100644 index 00000000000..a237a81fc37 --- /dev/null +++ b/examples/stats-detailed/webpack.config.js @@ -0,0 +1,9 @@ +const path = require("path"); + +module.exports = { + output: { + path: path.join(__dirname, "dist"), + filename: "output.js" + }, + stats: "detailed" +}; From 9c419c24ba08d77e63770e2e3bf2c9e71a60a740 Mon Sep 17 00:00:00 2001 From: Sachin Kumar Date: Tue, 27 Jun 2023 06:29:16 +0530 Subject: [PATCH 02/15] docs: add example for stats normal output --- examples/stats-normal/README.md | 49 +++++++++++++++++++++++++ examples/stats-normal/build.js | 4 ++ examples/stats-normal/example.js | 1 + examples/stats-normal/template.md | 29 +++++++++++++++ examples/stats-normal/webpack.config.js | 9 +++++ 5 files changed, 92 insertions(+) create mode 100644 examples/stats-normal/README.md create mode 100644 examples/stats-normal/build.js create mode 100644 examples/stats-normal/example.js create mode 100644 examples/stats-normal/template.md create mode 100644 examples/stats-normal/webpack.config.js diff --git a/examples/stats-normal/README.md b/examples/stats-normal/README.md new file mode 100644 index 00000000000..becfd3e06c1 --- /dev/null +++ b/examples/stats-normal/README.md @@ -0,0 +1,49 @@ +This configuration will enable the normal output for the stats report. + +You see that everything is working nicely together. + +# example.js + +```javascript +console.log("Hello World!"); +``` + +# webpack.config.js + +```javascript +const path = require("path"); + +module.exports = { + output: { + path: path.join(__dirname, "dist"), + filename: "output.js" + }, + stats: "normal" +}; +``` + +# dist/output.js + +```javascript +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +console.log("Hello World!"); + +/******/ })() +; +``` + +# Info + +## Production mode + +``` +asset output.js 28 bytes [emitted] [minimized] (name: main) +./example.js 29 bytes [built] [code generated] +webpack 5.88.0 compiled successfully +``` \ No newline at end of file diff --git a/examples/stats-normal/build.js b/examples/stats-normal/build.js new file mode 100644 index 00000000000..6da1216015d --- /dev/null +++ b/examples/stats-normal/build.js @@ -0,0 +1,4 @@ +global.NO_REASONS = true; +global.NO_STATS_OPTIONS = true; +global.STATS_COLORS = true; +require("../build-common"); diff --git a/examples/stats-normal/example.js b/examples/stats-normal/example.js new file mode 100644 index 00000000000..019c0f4bc8e --- /dev/null +++ b/examples/stats-normal/example.js @@ -0,0 +1 @@ +console.log("Hello World!"); diff --git a/examples/stats-normal/template.md b/examples/stats-normal/template.md new file mode 100644 index 00000000000..ed4c81681b5 --- /dev/null +++ b/examples/stats-normal/template.md @@ -0,0 +1,29 @@ +This configuration will enable the normal output for the stats report. + +You see that everything is working nicely together. + +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# dist/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# Info + +## Production mode + +``` +_{{production:stdout}}_ +``` \ No newline at end of file diff --git a/examples/stats-normal/webpack.config.js b/examples/stats-normal/webpack.config.js new file mode 100644 index 00000000000..e741993c8d9 --- /dev/null +++ b/examples/stats-normal/webpack.config.js @@ -0,0 +1,9 @@ +const path = require("path"); + +module.exports = { + output: { + path: path.join(__dirname, "dist"), + filename: "output.js" + }, + stats: "normal" +}; From 579adc87c19c9bef80b4a266efdb1c90e67fa0af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 02:56:58 +0000 Subject: [PATCH 03/15] chore(deps-dev): bump simple-git from 3.19.0 to 3.19.1 Bumps [simple-git](https://github.com/steveukx/git-js/tree/HEAD/simple-git) from 3.19.0 to 3.19.1. - [Release notes](https://github.com/steveukx/git-js/releases) - [Changelog](https://github.com/steveukx/git-js/blob/main/simple-git/CHANGELOG.md) - [Commits](https://github.com/steveukx/git-js/commits/simple-git@3.19.1/simple-git) --- updated-dependencies: - dependency-name: simple-git dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f4985dc8403..0f0f9689226 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5629,9 +5629,9 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-git@^3.17.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.19.0.tgz#fe8d0cd86a0e68372b75c0c44a0cb887201c3f7d" - integrity sha512-hyH2p9Ptxjf/xPuL7HfXbpYt9gKhC1yWDh3KYIAYJJePAKV7AEjLN4xhp7lozOdNiaJ9jlVvAbBymVlcS2jRiA== + version "3.19.1" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.19.1.tgz#ff9c021961a3d876a1b115b1893bed9a28855d30" + integrity sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" From c66824b9351e63f3816a9f8c3f0229b7cbf6d907 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 10:55:42 +0000 Subject: [PATCH 04/15] chore(deps): bump semver from 5.7.1 to 5.7.2 Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index f4985dc8403..2ade9601657 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5576,19 +5576,19 @@ script-loader@^0.7.2: raw-loader "~0.5.1" semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" From ac53f1b643cfb2f0d715e8084a5b2c42ca37e410 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 03:02:27 +0000 Subject: [PATCH 05/15] chore(deps-dev): bump pretty-format from 29.5.0 to 29.6.2 Bumps [pretty-format](https://github.com/facebook/jest/tree/HEAD/packages/pretty-format) from 29.5.0 to 29.6.2. - [Release notes](https://github.com/facebook/jest/releases) - [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/jest/commits/v29.6.2/packages/pretty-format) --- updated-dependencies: - dependency-name: pretty-format dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index f4985dc8403..d4a0c88b827 100644 --- a/yarn.lock +++ b/yarn.lock @@ -881,12 +881,12 @@ strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== +"@jest/schemas@^29.4.3", "@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== dependencies: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.4.3": version "29.4.3" @@ -1033,10 +1033,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^2.0.0": version "2.0.0" @@ -5097,11 +5097,11 @@ prettier@^2.0.5, prettier@^2.7.1: integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + version "29.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.2.tgz#3d5829261a8a4d89d8b9769064b29c50ed486a47" + integrity sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.0" ansi-styles "^5.0.0" react-is "^18.0.0" From 7ad5456b1e0b44732cff3f2cfe091c014ccc87f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 03:04:52 +0000 Subject: [PATCH 06/15] chore(deps-dev): bump core-js from 3.31.0 to 3.32.0 Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.31.0 to 3.32.0. - [Release notes](https://github.com/zloirock/core-js/releases) - [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md) - [Commits](https://github.com/zloirock/core-js/commits/v3.32.0/packages/core-js) --- updated-dependencies: - dependency-name: core-js dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f4985dc8403..8c5773ecad8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2140,9 +2140,9 @@ copy-anything@^2.0.1: is-what "^3.14.1" core-js@^3.6.5: - version "3.31.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.31.0.tgz#4471dd33e366c79d8c0977ed2d940821719db344" - integrity sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ== + version "3.32.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.0.tgz#7643d353d899747ab1f8b03d2803b0312a0fb3b6" + integrity sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww== core-util-is@1.0.2: version "1.0.2" From 8eae585a88a93ec509236440c5f8974fd536bc08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 02:29:36 +0000 Subject: [PATCH 07/15] chore(deps-dev): bump @types/node from 20.3.1 to 20.4.8 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.3.1 to 20.4.8. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f4985dc8403..1b3d68be83d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1161,9 +1161,9 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*", "@types/node@^20.1.7": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== + version "20.4.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.8.tgz#b5dda19adaa473a9bf0ab5cbd8f30ec7d43f5c85" + integrity sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg== "@types/normalize-package-data@^2.4.1": version "2.4.1" From 70ec865b413e2113aa4007902540b27d2f8956cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 02:28:31 +0000 Subject: [PATCH 08/15] chore(deps-dev): bump less from 4.1.3 to 4.2.0 Bumps [less](https://github.com/less/less.js) from 4.1.3 to 4.2.0. - [Release notes](https://github.com/less/less.js/releases) - [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/less/less.js/commits) --- updated-dependencies: - dependency-name: less dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 494ab247264..f25f28ac0bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4240,9 +4240,9 @@ less-loader@^8.0.0: klona "^2.0.4" less@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" - integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" From c628be0d3d6a1d6fa0cd1047cb1f893bf3ca1936 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 02:29:26 +0000 Subject: [PATCH 09/15] chore(deps-dev): bump @types/node from 20.4.8 to 20.4.9 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.4.8 to 20.4.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 494ab247264..8f059200b9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1161,9 +1161,9 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*", "@types/node@^20.1.7": - version "20.4.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.8.tgz#b5dda19adaa473a9bf0ab5cbd8f30ec7d43f5c85" - integrity sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg== + version "20.4.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" + integrity sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ== "@types/normalize-package-data@^2.4.1": version "2.4.1" From f00e6e2e01f95bb249136d4027936661beca8ea5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 02:55:04 +0000 Subject: [PATCH 10/15] chore(deps-dev): bump @types/node from 20.4.9 to 20.6.0 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.4.9 to 20.6.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0aa5391abe9..d343b1437d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1161,9 +1161,9 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*", "@types/node@^20.1.7": - version "20.4.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" - integrity sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ== + version "20.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.0.tgz#9d7daa855d33d4efec8aea88cd66db1c2f0ebe16" + integrity sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg== "@types/normalize-package-data@^2.4.1": version "2.4.1" From d4e8485462144d9949d60d511654bd7f60f033db Mon Sep 17 00:00:00 2001 From: Ben Worline Date: Sat, 30 Sep 2023 22:13:01 -0700 Subject: [PATCH 11/15] initial --- .../CommonJsFullRequireDependency.js | 82 +++++++++++++++++-- .../CommonJsImportsParserPlugin.js | 24 +++++- lib/javascript/JavascriptParser.js | 16 ++-- .../re-export-namespace-concat/index.js | 42 ++++++---- .../re-export-namespace/index.js | 8 ++ types.d.ts | 4 +- 6 files changed, 141 insertions(+), 35 deletions(-) diff --git a/lib/dependencies/CommonJsFullRequireDependency.js b/lib/dependencies/CommonJsFullRequireDependency.js index f8ceb13a46a..46345596f80 100644 --- a/lib/dependencies/CommonJsFullRequireDependency.js +++ b/lib/dependencies/CommonJsFullRequireDependency.js @@ -26,11 +26,18 @@ class CommonJsFullRequireDependency extends ModuleDependency { * @param {string} request the request string * @param {Range} range location in source code * @param {string[]} names accessed properties on module + * @param {Range[]=} idRanges ranges for members of ids; the two arrays are right-aligned */ - constructor(request, range, names) { + constructor( + request, + range, + names, + idRanges /* TODO webpack 6 make this non-optional. It must always be set to properly trim ids. */ + ) { super(request); this.range = range; this.names = names; + this.idRanges = idRanges; this.call = false; this.asiSafe = undefined; } @@ -60,6 +67,7 @@ class CommonJsFullRequireDependency extends ModuleDependency { serialize(context) { const { write } = context; write(this.names); + write(this.idRanges); write(this.call); write(this.asiSafe); super.serialize(context); @@ -71,6 +79,7 @@ class CommonJsFullRequireDependency extends ModuleDependency { deserialize(context) { const { read } = context; this.names = read(); + this.idRanges = read(); this.call = read(); this.asiSafe = read(); super.deserialize(context); @@ -117,15 +126,40 @@ CommonJsFullRequireDependency.Template = class CommonJsFullRequireDependencyTemp weak: dep.weak, runtimeRequirements }); + + const ids = dep.names; + let trimmedIds = this._trimIdsToThoseImported(ids, moduleGraph, dep); + + let [rangeStart, rangeEnd] = dep.range; + if (trimmedIds.length !== ids.length) { + // The array returned from dep.idRanges is right-aligned with the array returned from dep.names. + // Meaning, the two arrays may not always have the same number of elements, but the last element of + // dep.idRanges corresponds to [the expression fragment to the left of] the last element of dep.names. + // Use this to find the correct replacement range based on the number of ids that were trimmed. + const idx = + dep.idRanges === undefined + ? -1 /* trigger failure case below */ + : dep.idRanges.length + (trimmedIds.length - ids.length); + if (idx < 0 || idx >= dep.idRanges.length) { + // cspell:ignore minifiers + // Should not happen but we can't throw an error here because of backward compatibility with + // external plugins in wp5. Instead, we just disable trimming for now. This may break some minifiers. + trimmedIds = ids; + // TODO webpack 6 remove the "trimmedIds = ids" above and uncomment the following line instead. + // throw new Error("Missing range starts data for id replacement trimming."); + } else { + [rangeStart, rangeEnd] = dep.idRanges[idx]; + } + } + if (importedModule) { - const ids = dep.names; const usedImported = moduleGraph .getExportsInfo(importedModule) - .getUsedName(ids, runtime); + .getUsedName(trimmedIds, runtime); if (usedImported) { - const comment = equals(usedImported, ids) + const comment = equals(usedImported, trimmedIds) ? "" - : Template.toNormalComment(propertyAccess(ids)) + " "; + : Template.toNormalComment(propertyAccess(trimmedIds)) + " "; const access = `${comment}${propertyAccess(usedImported)}`; requireExpr = dep.asiSafe === true @@ -133,7 +167,43 @@ CommonJsFullRequireDependency.Template = class CommonJsFullRequireDependencyTemp : `${requireExpr}${access}`; } } - source.replace(dep.range[0], dep.range[1] - 1, requireExpr); + source.replace(rangeStart, rangeEnd - 1, requireExpr); + } + + /** + * @summary Determine which IDs in the id chain are actually referring to namespaces or imports, + * and which are deeper member accessors on the imported object. Only the former should be re-rendered. + * @param {string[]} ids ids + * @param {ModuleGraph} moduleGraph moduleGraph + * @param {CommonJsFullRequireDependency} dependency dependency + * @returns {string[]} generated code + */ + _trimIdsToThoseImported(ids, moduleGraph, dependency) { + let trimmedIds = []; + const exportsInfo = moduleGraph.getExportsInfo( + moduleGraph.getModule(dependency) + ); + let currentExportsInfo = /** @type {ExportsInfo=} */ exportsInfo; + for (let i = 0; i < ids.length; i++) { + if (i === 0 && ids[i] === "default") { + continue; // ExportInfo for the next level under default is still at the root ExportsInfo, so don't advance currentExportsInfo + } + const exportInfo = currentExportsInfo.getExportInfo(ids[i]); + if (exportInfo.provided === false) { + // json imports have nested ExportInfo for elements that things that are not actually exported, so check .provided + trimmedIds = ids.slice(0, i); + break; + } + const nestedInfo = exportInfo.getNestedExportsInfo(); + if (!nestedInfo) { + // once all nested exports are traversed, the next item is the actual import so stop there + trimmedIds = ids.slice(0, i + 1); + break; + } + currentExportsInfo = nestedInfo; + } + // Never trim to nothing. This can happen for invalid imports (e.g. import { notThere } from "./module", or import { anything } from "./missingModule") + return trimmedIds.length ? trimmedIds : ids; } }; diff --git a/lib/dependencies/CommonJsImportsParserPlugin.js b/lib/dependencies/CommonJsImportsParserPlugin.js index 93a6d2642a3..0e64ef173a0 100644 --- a/lib/dependencies/CommonJsImportsParserPlugin.js +++ b/lib/dependencies/CommonJsImportsParserPlugin.js @@ -379,9 +379,16 @@ class CommonJsImportsParserPlugin { * @param {string[]} calleeMembers callee members * @param {CallExpression} callExpr call expression * @param {string[]} members members + * @param {Range[]} memberRanges member ranges * @returns {boolean | void} true when handled */ - const chainHandler = (expr, calleeMembers, callExpr, members) => { + const chainHandler = ( + expr, + calleeMembers, + callExpr, + members, + memberRanges + ) => { if (callExpr.arguments.length !== 1) return; const param = parser.evaluateExpression(callExpr.arguments[0]); if ( @@ -391,7 +398,8 @@ class CommonJsImportsParserPlugin { const dep = new CommonJsFullRequireDependency( /** @type {string} */ (param.string), /** @type {Range} */ (expr.range), - members + members, + /** @type {Range[]} */ memberRanges ); dep.asiSafe = !parser.isAsiPosition( /** @type {Range} */ (expr.range)[0] @@ -407,9 +415,16 @@ class CommonJsImportsParserPlugin { * @param {string[]} calleeMembers callee members * @param {CallExpression} callExpr call expression * @param {string[]} members members + * @param {Range[]} memberRanges member ranges * @returns {boolean | void} true when handled */ - const callChainHandler = (expr, calleeMembers, callExpr, members) => { + const callChainHandler = ( + expr, + calleeMembers, + callExpr, + members, + memberRanges + ) => { if (callExpr.arguments.length !== 1) return; const param = parser.evaluateExpression(callExpr.arguments[0]); if ( @@ -419,7 +434,8 @@ class CommonJsImportsParserPlugin { const dep = new CommonJsFullRequireDependency( /** @type {string} */ (param.string), /** @type {Range} */ (expr.callee.range), - members + members, + /** @type {Range[]} */ memberRanges ); dep.call = true; dep.asiSafe = !parser.isAsiPosition( diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index 443547bfac7..827e9bd4d97 100644 --- a/lib/javascript/JavascriptParser.js +++ b/lib/javascript/JavascriptParser.js @@ -363,25 +363,27 @@ class JavascriptParser extends Parser { ]) ), /** Something like "a.b().c.d" */ - /** @type {HookMap>} */ + /** @type {HookMap>} */ memberChainOfCallMemberChain: new HookMap( () => new SyncBailHook([ "expression", "calleeMembers", "callExpression", - "members" + "members", + "memberRanges" ]) ), /** Something like "a.b().c.d()"" */ - /** @type {HookMap>} */ + /** @type {HookMap>} */ callMemberChainOfCallMemberChain: new HookMap( () => new SyncBailHook([ "expression", "calleeMembers", "innerCallExpression", - "members" + "members", + "memberRanges" ]) ), /** @type {SyncBailHook<[ChainExpression], boolean | void>} */ @@ -3274,7 +3276,8 @@ class JavascriptParser extends Parser { expression, exprInfo.getCalleeMembers(), exprInfo.call, - exprInfo.getMembers() + exprInfo.getMembers(), + exprInfo.getMemberRanges() ); if (result === true) return; } @@ -3365,7 +3368,8 @@ class JavascriptParser extends Parser { expression, exprInfo.getCalleeMembers(), exprInfo.call, - exprInfo.getMembers() + exprInfo.getMembers(), + exprInfo.getMemberRanges() ); if (result === true) return; // Fast skip over the member chain as we already called memberChainOfCallMemberChain diff --git a/test/configCases/code-generation/re-export-namespace-concat/index.js b/test/configCases/code-generation/re-export-namespace-concat/index.js index aa2dbb6b823..be618494856 100644 --- a/test/configCases/code-generation/re-export-namespace-concat/index.js +++ b/test/configCases/code-generation/re-export-namespace-concat/index.js @@ -34,6 +34,10 @@ it("should use/preserve accessor form for import object and namespaces", functio const bb = obj1.up.down?.left.right; + const ww = require('./module1').obj1["bing"]?.bang; + const xx = require('./module1').obj1["pip"].pop(); + const yy = require('./module3')["m_2"]["m_1"]["obj1"]["tip"].top(); + data.nested.object3["unknownProperty"].depth = "deep"; (obj1)["aaa"].bbb; @@ -48,28 +52,32 @@ it("should use/preserve accessor form for import object and namespaces", functio // Imported objects and import namespaces should use dot notation. Any references to the properties of exports // should be preserved as either quotes or dot notation, depending on the original source. - expectSourceToContain(source, 'const x1 = module1_namespaceObject;'); - expectSourceToContain(source, 'const x2 = obj1;'); + expectSourceToContain(source, 'const x1 = module1;'); + expectSourceToContain(source, 'const x2 = module1.obj1;'); + + expectSourceToContain(source, 'const z1 = module1.obj1["plants"];'); + expectSourceToContain(source, 'const z2 = module1.obj1["funcs"]();'); + expectSourceToContain(source, 'const z3 = module1.obj1["pots"];'); + expectSourceToContain(source, 'const z4 = module1.obj1["subs"]();'); - expectSourceToContain(source, 'const z1 = obj1["plants"];'); - expectSourceToContain(source, 'const z2 = obj1["funcs"]();'); - expectSourceToContain(source, 'const z3 = obj1["pots"];'); - expectSourceToContain(source, 'const z4 = obj1["subs"]();'); + expectSourceToContain(source, 'const a = module2/* m_1.obj1 */.a.obj1["flip"].flap;'); + expectSourceToContain(source, 'const b = module2/* m_1.obj1 */.a.obj1.zip["zap"];'); + expectSourceToContain(source, 'const c = module2/* m_1.obj1 */.a.obj1["ding"].dong();'); + expectSourceToContain(source, 'const d = module2/* m_1.obj1 */.a.obj1.sing["song"]();'); - expectSourceToContain(source, 'const a = obj1["flip"].flap;'); - expectSourceToContain(source, 'const b = obj1.zip["zap"];'); - expectSourceToContain(source, 'const c = obj1["ding"].dong();'); - expectSourceToContain(source, 'const d = obj1.sing["song"]();'); + expectSourceToContain(source, 'const aa = module3/* m_2.m_1.obj1 */.a.a.obj1["zoom"];'); - expectSourceToContain(source, 'const aa = obj1["zoom"];'); + expectSourceToContain(source, 'const bb = module1.obj1.up.down?.left.right;'); - expectSourceToContain(source, 'const bb = obj1.up.down?.left.right;'); + expectSourceToContain(source, 'const ww = (__webpack_require__(/*! ./module1 */ 960).obj1)["bing"]?.bang;'); + expectSourceToContain(source, 'const xx = (__webpack_require__(/*! ./module1 */ 960).obj1)["pip"].pop();'); + expectSourceToContain(source, 'const yy = (__webpack_require__(/*! ./module3 */ 834)/* .m_2.m_1.obj1 */ .a.a.obj1)["tip"].top();'); expectSourceToContain(source, 'data_namespaceObject.a.a["unknownProperty"].depth = "deep";'); - expectSourceToContain(source, '(obj1)["aaa"].bbb;'); - expectSourceToContain(source, '(obj1)["ccc"].ddd;'); - expectSourceToContain(source, '(obj1["eee"]).fff;'); - expectSourceToContain(source, '(obj1["ggg"]).hhh;'); - expectSourceToContain(source, '((obj1)["iii"]).jjj;'); + expectSourceToContain(source, '(module1.obj1)["aaa"].bbb;'); + expectSourceToContain(source, '(module1.obj1)["ccc"].ddd;'); + expectSourceToContain(source, '(module1.obj1["eee"]).fff;'); + expectSourceToContain(source, '(module1.obj1["ggg"]).hhh;'); + expectSourceToContain(source, '((module1.obj1)["iii"]).jjj;'); }); diff --git a/test/configCases/code-generation/re-export-namespace/index.js b/test/configCases/code-generation/re-export-namespace/index.js index d41eb1f4d32..cd685ea75f8 100644 --- a/test/configCases/code-generation/re-export-namespace/index.js +++ b/test/configCases/code-generation/re-export-namespace/index.js @@ -34,6 +34,10 @@ it("should use/preserve accessor form for import object and namespaces", functio const bb = obj1.up.down?.left.right; + const ww = require('./module1').obj1["bing"]?.bang; + const xx = require('./module1').obj1["pip"].pop(); + const yy = require('./module3')["m_2"]["m_1"]["obj1"]["tip"].top(); + data.nested.object3["unknownProperty"].depth = "deep"; (obj1)["aaa"].bbb; @@ -65,6 +69,10 @@ it("should use/preserve accessor form for import object and namespaces", functio expectSourceToContain(source, 'const bb = _module1__WEBPACK_IMPORTED_MODULE_0__.obj1.up.down?.left.right;'); + expectSourceToContain(source, 'const ww = (__webpack_require__(/*! ./module1 */ 960).obj1)["bing"]?.bang;'); + expectSourceToContain(source, 'const xx = (__webpack_require__(/*! ./module1 */ 960).obj1)["pip"].pop();'); + expectSourceToContain(source, 'const yy = (__webpack_require__(/*! ./module3 */ 834).m_2.m_1.obj1)["tip"].top();'); + expectSourceToContain(source, '_data__WEBPACK_IMPORTED_MODULE_3__.nested.object3["unknownProperty"].depth = "deep";'); expectSourceToContain(source, '(_module1__WEBPACK_IMPORTED_MODULE_0__.obj1)["aaa"].bbb;'); diff --git a/types.d.ts b/types.d.ts index 1c7e8fd30dd..00cdcf8d7dc 100644 --- a/types.d.ts +++ b/types.d.ts @@ -5521,13 +5521,13 @@ declare class JavascriptParser extends Parser { >; memberChainOfCallMemberChain: HookMap< SyncBailHook< - [Expression, string[], CallExpression, string[]], + [Expression, string[], CallExpression, string[], [number, number][]], boolean | void > >; callMemberChainOfCallMemberChain: HookMap< SyncBailHook< - [CallExpression, string[], CallExpression, string[]], + [CallExpression, string[], CallExpression, string[], [number, number][]], boolean | void > >; From d36804ef31492255cf10c03e88d63631be4fa833 Mon Sep 17 00:00:00 2001 From: Ben Worline Date: Sat, 30 Sep 2023 22:22:23 -0700 Subject: [PATCH 12/15] update types --- types.d.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/types.d.ts b/types.d.ts index 00cdcf8d7dc..d44fd10b0bb 100644 --- a/types.d.ts +++ b/types.d.ts @@ -5527,7 +5527,13 @@ declare class JavascriptParser extends Parser { >; callMemberChainOfCallMemberChain: HookMap< SyncBailHook< - [CallExpression, string[], CallExpression, string[], [number, number][]], + [ + CallExpression, + string[], + CallExpression, + string[], + [number, number][] + ], boolean | void > >; @@ -7276,6 +7282,7 @@ declare interface LoaderRunnerLoaderContext { /** * An array of all the loaders. It is writeable in the pitch phase. * loaders = [{request: string, path: string, query: string, module: function}] + * * In the example: * [ * { request: "/abc/loader1.js?xyz", From dc665724ecf3d1148b649a348e50fa9633a76fbc Mon Sep 17 00:00:00 2001 From: Ben Worline Date: Sun, 1 Oct 2023 12:09:11 -0700 Subject: [PATCH 13/15] update types --- types.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/types.d.ts b/types.d.ts index d44fd10b0bb..e6b7e186900 100644 --- a/types.d.ts +++ b/types.d.ts @@ -7282,7 +7282,6 @@ declare interface LoaderRunnerLoaderContext { /** * An array of all the loaders. It is writeable in the pitch phase. * loaders = [{request: string, path: string, query: string, module: function}] - * * In the example: * [ * { request: "/abc/loader1.js?xyz", From b14922c5bed9e46b9f0e510b7f1ef2238d2572cb Mon Sep 17 00:00:00 2001 From: Ben Worline Date: Mon, 2 Oct 2023 10:28:43 -0700 Subject: [PATCH 14/15] Refactor shared code --- .../CommonJsFullRequireDependency.js | 73 +++----------- .../HarmonyImportSpecifierDependency.js | 76 +++------------ lib/util/chainedImports.js | 96 +++++++++++++++++++ 3 files changed, 121 insertions(+), 124 deletions(-) create mode 100644 lib/util/chainedImports.js diff --git a/lib/dependencies/CommonJsFullRequireDependency.js b/lib/dependencies/CommonJsFullRequireDependency.js index 46345596f80..74f6c42de3b 100644 --- a/lib/dependencies/CommonJsFullRequireDependency.js +++ b/lib/dependencies/CommonJsFullRequireDependency.js @@ -7,6 +7,7 @@ const Template = require("../Template"); const { equals } = require("../util/ArrayHelpers"); +const { getTrimmedIdsAndRange } = require("../util/chainedImports"); const makeSerializable = require("../util/makeSerializable"); const propertyAccess = require("../util/propertyAccess"); const ModuleDependency = require("./ModuleDependency"); @@ -127,30 +128,16 @@ CommonJsFullRequireDependency.Template = class CommonJsFullRequireDependencyTemp runtimeRequirements }); - const ids = dep.names; - let trimmedIds = this._trimIdsToThoseImported(ids, moduleGraph, dep); - - let [rangeStart, rangeEnd] = dep.range; - if (trimmedIds.length !== ids.length) { - // The array returned from dep.idRanges is right-aligned with the array returned from dep.names. - // Meaning, the two arrays may not always have the same number of elements, but the last element of - // dep.idRanges corresponds to [the expression fragment to the left of] the last element of dep.names. - // Use this to find the correct replacement range based on the number of ids that were trimmed. - const idx = - dep.idRanges === undefined - ? -1 /* trigger failure case below */ - : dep.idRanges.length + (trimmedIds.length - ids.length); - if (idx < 0 || idx >= dep.idRanges.length) { - // cspell:ignore minifiers - // Should not happen but we can't throw an error here because of backward compatibility with - // external plugins in wp5. Instead, we just disable trimming for now. This may break some minifiers. - trimmedIds = ids; - // TODO webpack 6 remove the "trimmedIds = ids" above and uncomment the following line instead. - // throw new Error("Missing range starts data for id replacement trimming."); - } else { - [rangeStart, rangeEnd] = dep.idRanges[idx]; - } - } + const { + trimmedRange: [trimmedRangeStart, trimmedRangeEnd], + trimmedIds + } = getTrimmedIdsAndRange( + dep.names, + dep.range, + dep.idRanges, + moduleGraph, + dep + ); if (importedModule) { const usedImported = moduleGraph @@ -167,43 +154,7 @@ CommonJsFullRequireDependency.Template = class CommonJsFullRequireDependencyTemp : `${requireExpr}${access}`; } } - source.replace(rangeStart, rangeEnd - 1, requireExpr); - } - - /** - * @summary Determine which IDs in the id chain are actually referring to namespaces or imports, - * and which are deeper member accessors on the imported object. Only the former should be re-rendered. - * @param {string[]} ids ids - * @param {ModuleGraph} moduleGraph moduleGraph - * @param {CommonJsFullRequireDependency} dependency dependency - * @returns {string[]} generated code - */ - _trimIdsToThoseImported(ids, moduleGraph, dependency) { - let trimmedIds = []; - const exportsInfo = moduleGraph.getExportsInfo( - moduleGraph.getModule(dependency) - ); - let currentExportsInfo = /** @type {ExportsInfo=} */ exportsInfo; - for (let i = 0; i < ids.length; i++) { - if (i === 0 && ids[i] === "default") { - continue; // ExportInfo for the next level under default is still at the root ExportsInfo, so don't advance currentExportsInfo - } - const exportInfo = currentExportsInfo.getExportInfo(ids[i]); - if (exportInfo.provided === false) { - // json imports have nested ExportInfo for elements that things that are not actually exported, so check .provided - trimmedIds = ids.slice(0, i); - break; - } - const nestedInfo = exportInfo.getNestedExportsInfo(); - if (!nestedInfo) { - // once all nested exports are traversed, the next item is the actual import so stop there - trimmedIds = ids.slice(0, i + 1); - break; - } - currentExportsInfo = nestedInfo; - } - // Never trim to nothing. This can happen for invalid imports (e.g. import { notThere } from "./module", or import { anything } from "./missingModule") - return trimmedIds.length ? trimmedIds : ids; + source.replace(trimmedRangeStart, trimmedRangeEnd - 1, requireExpr); } }; diff --git a/lib/dependencies/HarmonyImportSpecifierDependency.js b/lib/dependencies/HarmonyImportSpecifierDependency.js index 9de0f23bf86..ef922417b63 100644 --- a/lib/dependencies/HarmonyImportSpecifierDependency.js +++ b/lib/dependencies/HarmonyImportSpecifierDependency.js @@ -9,6 +9,7 @@ const Dependency = require("../Dependency"); const { getDependencyUsedByExportsCondition } = require("../optimize/InnerGraph"); +const { getTrimmedIdsAndRange } = require("../util/chainedImports"); const makeSerializable = require("../util/makeSerializable"); const propertyAccess = require("../util/propertyAccess"); const HarmonyImportDependency = require("./HarmonyImportDependency"); @@ -324,30 +325,16 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen // Skip rendering depending when dependency is conditional if (connection && !connection.isTargetActive(runtime)) return; - const ids = dep.getIds(moduleGraph); // determine minimal set of IDs. - let trimmedIds = this._trimIdsToThoseImported(ids, moduleGraph, dep); - - let [rangeStart, rangeEnd] = dep.range; - if (trimmedIds.length !== ids.length) { - // The array returned from dep.idRanges is right-aligned with the array returned from dep.getIds. - // Meaning, the two arrays may not always have the same number of elements, but the last element of - // dep.idRanges corresponds to [the expression fragment to the left of] the last element of dep.getIds. - // Use this to find the correct replacement range based on the number of ids that were trimmed. - const idx = - dep.idRanges === undefined - ? -1 /* trigger failure case below */ - : dep.idRanges.length + (trimmedIds.length - ids.length); - if (idx < 0 || idx >= dep.idRanges.length) { - // cspell:ignore minifiers - // Should not happen but we can't throw an error here because of backward compatibility with - // external plugins in wp5. Instead, we just disable trimming for now. This may break some minifiers. - trimmedIds = ids; - // TODO webpack 6 remove the "trimmedIds = ids" above and uncomment the following line instead. - // throw new Error("Missing range starts data for id replacement trimming."); - } else { - [rangeStart, rangeEnd] = dep.idRanges[idx]; - } - } + const { + trimmedRange: [trimmedRangeStart, trimmedRangeEnd], + trimmedIds + } = getTrimmedIdsAndRange( + dep.getIds(moduleGraph), + dep.range, + dep.idRanges, + moduleGraph, + dep + ); const exportExpr = this._getCodeForIds( dep, @@ -356,47 +343,10 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen trimmedIds ); if (dep.shorthand) { - source.insert(rangeEnd, `: ${exportExpr}`); + source.insert(trimmedRangeEnd, `: ${exportExpr}`); } else { - source.replace(rangeStart, rangeEnd - 1, exportExpr); - } - } - - /** - * @summary Determine which IDs in the id chain are actually referring to namespaces or imports, - * and which are deeper member accessors on the imported object. Only the former should be re-rendered. - * @param {string[]} ids ids - * @param {ModuleGraph} moduleGraph moduleGraph - * @param {HarmonyImportSpecifierDependency} dependency dependency - * @returns {string[]} generated code - */ - _trimIdsToThoseImported(ids, moduleGraph, dependency) { - /** @type {string[]} */ - let trimmedIds = []; - const exportsInfo = moduleGraph.getExportsInfo( - /** @type {Module} */ (moduleGraph.getModule(dependency)) - ); - let currentExportsInfo = /** @type {ExportsInfo=} */ exportsInfo; - for (let i = 0; i < ids.length; i++) { - if (i === 0 && ids[i] === "default") { - continue; // ExportInfo for the next level under default is still at the root ExportsInfo, so don't advance currentExportsInfo - } - const exportInfo = currentExportsInfo.getExportInfo(ids[i]); - if (exportInfo.provided === false) { - // json imports have nested ExportInfo for elements that things that are not actually exported, so check .provided - trimmedIds = ids.slice(0, i); - break; - } - const nestedInfo = exportInfo.getNestedExportsInfo(); - if (!nestedInfo) { - // once all nested exports are traversed, the next item is the actual import so stop there - trimmedIds = ids.slice(0, i + 1); - break; - } - currentExportsInfo = nestedInfo; + source.replace(trimmedRangeStart, trimmedRangeEnd - 1, exportExpr); } - // Never trim to nothing. This can happen for invalid imports (e.g. import { notThere } from "./module", or import { anything } from "./missingModule") - return trimmedIds.length ? trimmedIds : ids; } /** diff --git a/lib/util/chainedImports.js b/lib/util/chainedImports.js new file mode 100644 index 00000000000..2463cc020e5 --- /dev/null +++ b/lib/util/chainedImports.js @@ -0,0 +1,96 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @typedef {import("../Dependency")} Dependency */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ +/** @typedef {import("../javascript/JavascriptParser").Range} Range */ + +/** + * @summary Get the subset of ids and their corresponding range in an id chain that should be re-rendered by webpack. + * Only those in the chain that are actually referring to namespaces or imports should be re-rendered. + * Deeper member accessors on the imported object should not be re-rendered. If deeper member accessors are re-rendered, + * there is a potential loss of meaning with rendering a quoted accessor as an unquoted accessor, or vice versa, + * because minifiers treat quoted accessors differently. e.g. import { a } from "./module"; a["b"] vs a.b + * @param {string[]} untrimmedIds chained ids + * @param {Range} untrimmedRange range encompassing allIds + * @param {Range[]} ranges cumulative range of ids for each of allIds + * @param {ModuleGraph} moduleGraph moduleGraph + * @param {Dependency} dependency dependency + * @returns {{trimmedIds: string[], trimmedRange: Range}} computed trimmed ids and cumulative range of those ids + */ +exports.getTrimmedIdsAndRange = ( + untrimmedIds, + untrimmedRange, + ranges, + moduleGraph, + dependency +) => { + let trimmedIds = trimIdsToThoseImported( + untrimmedIds, + moduleGraph, + dependency + ); + let trimmedRange = untrimmedRange; + if (trimmedIds.length !== untrimmedIds.length) { + // The array returned from dep.idRanges is right-aligned with the array returned from dep.names. + // Meaning, the two arrays may not always have the same number of elements, but the last element of + // dep.idRanges corresponds to [the expression fragment to the left of] the last element of dep.names. + // Use this to find the correct replacement range based on the number of ids that were trimmed. + const idx = + ranges === undefined + ? -1 /* trigger failure case below */ + : ranges.length + (trimmedIds.length - untrimmedIds.length); + if (idx < 0 || idx >= ranges.length) { + // cspell:ignore minifiers + // Should not happen but we can't throw an error here because of backward compatibility with + // external plugins in wp5. Instead, we just disable trimming for now. This may break some minifiers. + trimmedIds = untrimmedIds; + // TODO webpack 6 remove the "trimmedIds = ids" above and uncomment the following line instead. + // throw new Error("Missing range starts data for id replacement trimming."); + } else { + trimmedRange = ranges[idx]; + } + } + + return { trimmedIds, trimmedRange }; +}; + +/** + * @summary Determine which IDs in the id chain are actually referring to namespaces or imports, + * and which are deeper member accessors on the imported object. + * @param {string[]} ids untrimmed ids + * @param {ModuleGraph} moduleGraph moduleGraph + * @param {Dependency} dependency dependency + * @returns {string[]} trimmed ids + */ +function trimIdsToThoseImported(ids, moduleGraph, dependency) { + let trimmedIds = []; + const exportsInfo = moduleGraph.getExportsInfo( + moduleGraph.getModule(dependency) + ); + let currentExportsInfo = /** @type {ExportsInfo=} */ exportsInfo; + for (let i = 0; i < ids.length; i++) { + if (i === 0 && ids[i] === "default") { + continue; // ExportInfo for the next level under default is still at the root ExportsInfo, so don't advance currentExportsInfo + } + const exportInfo = currentExportsInfo.getExportInfo(ids[i]); + if (exportInfo.provided === false) { + // json imports have nested ExportInfo for elements that things that are not actually exported, so check .provided + trimmedIds = ids.slice(0, i); + break; + } + const nestedInfo = exportInfo.getNestedExportsInfo(); + if (!nestedInfo) { + // once all nested exports are traversed, the next item is the actual import so stop there + trimmedIds = ids.slice(0, i + 1); + break; + } + currentExportsInfo = nestedInfo; + } + // Never trim to nothing. This can happen for invalid imports (e.g. import { notThere } from "./module", or import { anything } from "./missingModule") + return trimmedIds.length ? trimmedIds : ids; +} From 87660921808566ef3b8796f8df61bd79fc026108 Mon Sep 17 00:00:00 2001 From: Sean Larkin Date: Fri, 13 Oct 2023 22:27:32 +0000 Subject: [PATCH 15/15] 5.89.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10b9bc53257..bd5adefeb99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webpack", - "version": "5.88.2", + "version": "5.89.0", "author": "Tobias Koppers @sokra", "description": "Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.", "license": "MIT",