From e42b09d9cf13ecde2fc7449cb7ec76fc1968cddb Mon Sep 17 00:00:00 2001 From: Lars Kappert Date: Sun, 23 Feb 2025 10:37:49 +0100 Subject: [PATCH] Defer resolve entry points in webpack plugin (resolves #949) --- .../plugins/webpack/src/{app.ts => app.tsx} | 0 .../webpack/src/{vendor.ts => vendor.js} | 0 .../fixtures/plugins/webpack/webpack.dev.js | 4 +-- .../fixtures/plugins/webpack2/entry.dev.js | 0 .../fixtures/plugins/webpack2/entry.prod.js | 0 .../node_modules/webpack-cli/index.js | 0 .../node_modules/webpack-cli/package.json | 4 +++ .../webpack2/node_modules/webpack/index.js | 6 ++++ .../node_modules/webpack/package.json | 9 +++++ .../fixtures/plugins/webpack2/package.json | 12 +++++++ .../fixtures/plugins/webpack2/webpack.dev.js | 8 +++++ .../fixtures/plugins/webpack2/webpack.prod.js | 8 +++++ packages/knip/src/plugins/webpack/index.ts | 9 ++--- packages/knip/test/plugins/webpack2.test.ts | 35 +++++++++++++++++++ 14 files changed, 89 insertions(+), 6 deletions(-) rename packages/knip/fixtures/plugins/webpack/src/{app.ts => app.tsx} (100%) rename packages/knip/fixtures/plugins/webpack/src/{vendor.ts => vendor.js} (100%) create mode 100644 packages/knip/fixtures/plugins/webpack2/entry.dev.js create mode 100644 packages/knip/fixtures/plugins/webpack2/entry.prod.js create mode 100644 packages/knip/fixtures/plugins/webpack2/node_modules/webpack-cli/index.js create mode 100644 packages/knip/fixtures/plugins/webpack2/node_modules/webpack-cli/package.json create mode 100644 packages/knip/fixtures/plugins/webpack2/node_modules/webpack/index.js create mode 100644 packages/knip/fixtures/plugins/webpack2/node_modules/webpack/package.json create mode 100644 packages/knip/fixtures/plugins/webpack2/package.json create mode 100644 packages/knip/fixtures/plugins/webpack2/webpack.dev.js create mode 100644 packages/knip/fixtures/plugins/webpack2/webpack.prod.js create mode 100644 packages/knip/test/plugins/webpack2.test.ts diff --git a/packages/knip/fixtures/plugins/webpack/src/app.ts b/packages/knip/fixtures/plugins/webpack/src/app.tsx similarity index 100% rename from packages/knip/fixtures/plugins/webpack/src/app.ts rename to packages/knip/fixtures/plugins/webpack/src/app.tsx diff --git a/packages/knip/fixtures/plugins/webpack/src/vendor.ts b/packages/knip/fixtures/plugins/webpack/src/vendor.js similarity index 100% rename from packages/knip/fixtures/plugins/webpack/src/vendor.ts rename to packages/knip/fixtures/plugins/webpack/src/vendor.js diff --git a/packages/knip/fixtures/plugins/webpack/webpack.dev.js b/packages/knip/fixtures/plugins/webpack/webpack.dev.js index 38a32b296..25c536a58 100644 --- a/packages/knip/fixtures/plugins/webpack/webpack.dev.js +++ b/packages/knip/fixtures/plugins/webpack/webpack.dev.js @@ -6,8 +6,8 @@ module.exports = env => merge(common(), { mode: env.production ? 'production' : 'development', entry: { - main: './src/app.ts', - vendor: './src/vendor.ts', + main: './src/app', + vendor: './src/vendor', }, module: { rules: [ diff --git a/packages/knip/fixtures/plugins/webpack2/entry.dev.js b/packages/knip/fixtures/plugins/webpack2/entry.dev.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/knip/fixtures/plugins/webpack2/entry.prod.js b/packages/knip/fixtures/plugins/webpack2/entry.prod.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/knip/fixtures/plugins/webpack2/node_modules/webpack-cli/index.js b/packages/knip/fixtures/plugins/webpack2/node_modules/webpack-cli/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/knip/fixtures/plugins/webpack2/node_modules/webpack-cli/package.json b/packages/knip/fixtures/plugins/webpack2/node_modules/webpack-cli/package.json new file mode 100644 index 000000000..4d09795ef --- /dev/null +++ b/packages/knip/fixtures/plugins/webpack2/node_modules/webpack-cli/package.json @@ -0,0 +1,4 @@ +{ + "name": "webpack-cli", + "bin": "index.js" +} diff --git a/packages/knip/fixtures/plugins/webpack2/node_modules/webpack/index.js b/packages/knip/fixtures/plugins/webpack2/node_modules/webpack/index.js new file mode 100644 index 000000000..41eaf00bf --- /dev/null +++ b/packages/knip/fixtures/plugins/webpack2/node_modules/webpack/index.js @@ -0,0 +1,6 @@ +const webpack = { + DefinePlugin: class DefinePlugin {}, + ProvidePlugin: class ProvidePlugin {}, +}; + +module.exports = webpack; diff --git a/packages/knip/fixtures/plugins/webpack2/node_modules/webpack/package.json b/packages/knip/fixtures/plugins/webpack2/node_modules/webpack/package.json new file mode 100644 index 000000000..094967d4c --- /dev/null +++ b/packages/knip/fixtures/plugins/webpack2/node_modules/webpack/package.json @@ -0,0 +1,9 @@ +{ + "name": "webpack", + "bin": "index.js", + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } +} diff --git a/packages/knip/fixtures/plugins/webpack2/package.json b/packages/knip/fixtures/plugins/webpack2/package.json new file mode 100644 index 000000000..4f6268657 --- /dev/null +++ b/packages/knip/fixtures/plugins/webpack2/package.json @@ -0,0 +1,12 @@ +{ + "name": "@fixtures/webpack2", + "scripts": { + "dev": "webpack --config webpack.dev.js", + "prod": "webpack --config webpack.prod.js" + }, + "dependencies": {}, + "devDependencies": { + "webpack": "*", + "webpack-cli": "*" + } +} diff --git a/packages/knip/fixtures/plugins/webpack2/webpack.dev.js b/packages/knip/fixtures/plugins/webpack2/webpack.dev.js new file mode 100644 index 000000000..974ec9d08 --- /dev/null +++ b/packages/knip/fixtures/plugins/webpack2/webpack.dev.js @@ -0,0 +1,8 @@ +import 'webpack'; + +export default () => { + return { + mode: 'development', + entry: './entry.dev.js', + }; +}; diff --git a/packages/knip/fixtures/plugins/webpack2/webpack.prod.js b/packages/knip/fixtures/plugins/webpack2/webpack.prod.js new file mode 100644 index 000000000..3d57b25e7 --- /dev/null +++ b/packages/knip/fixtures/plugins/webpack2/webpack.prod.js @@ -0,0 +1,8 @@ +import 'webpack'; + +export default () => { + return { + mode: 'production', + entry: './entry.prod.js', + }; +}; diff --git a/packages/knip/src/plugins/webpack/index.ts b/packages/knip/src/plugins/webpack/index.ts index d3fc96a79..a76cb87ac 100644 --- a/packages/knip/src/plugins/webpack/index.ts +++ b/packages/knip/src/plugins/webpack/index.ts @@ -4,10 +4,10 @@ import { compact } from '../../util/array.js'; import { type Input, toDeferResolve, + toDeferResolveEntry, + toDeferResolveProductionEntry, toDependency, toDevDependency, - toEntry, - toProductionEntry, } from '../../util/input.js'; import { isAbsolute, isInternal, join, relative } from '../../util/path.js'; import { hasDependency } from '../../util/plugin.js'; @@ -99,8 +99,9 @@ export const findWebpackDependenciesFromConfig = async ({ config, cwd }: { confi } else { const absoluteEntry = isAbsolute(entry) ? entry : join(options.context ? options.context : cwd, entry); const item = relative(cwd, absoluteEntry); - const value = options.mode === 'development' ? toEntry(item) : toProductionEntry(item); - inputs.add(value); + const input = + options.mode === 'development' ? toDeferResolveEntry(item) : toDeferResolveProductionEntry(item); + inputs.add(input); } } } diff --git a/packages/knip/test/plugins/webpack2.test.ts b/packages/knip/test/plugins/webpack2.test.ts new file mode 100644 index 000000000..ba50b9bf0 --- /dev/null +++ b/packages/knip/test/plugins/webpack2.test.ts @@ -0,0 +1,35 @@ +import { test } from 'bun:test'; +import assert from 'node:assert/strict'; +import { main } from '../../src/index.js'; +import { resolve } from '../../src/util/path.js'; +import baseArguments from '../helpers/baseArguments.js'; +import baseCounters from '../helpers/baseCounters.js'; + +const cwd = resolve('fixtures/plugins/webpack2'); + +test('Find dependencies with Webpack plugin (2)', async () => { + const { counters } = await main({ + ...baseArguments, + cwd, + }); + + assert.deepEqual(counters, { + ...baseCounters, + processed: 4, + total: 4, + }); +}); + +test('Find dependencies with Webpack plugin (2) (production)', async () => { + const { counters } = await main({ + ...baseArguments, + cwd, + isProduction: true, + }); + + assert.deepEqual(counters, { + ...baseCounters, + processed: 1, + total: 1, + }); +});