Skip to content

chore(types): improve type safety#20755

Merged
avivkeller merged 3 commits intomainfrom
chore/avivkeller/type-safety
Apr 2, 2026
Merged

chore(types): improve type safety#20755
avivkeller merged 3 commits intomainfrom
chore/avivkeller/type-safety

Conversation

@avivkeller
Copy link
Copy Markdown
Member

Pre-requisite of #20754.

This PR fixes the following types to be more robust:

  1. References directly pointing to types.d.ts have been replaced with references to the package itself. That way, should this file be changed, types will be resolved through the types exported by package.json
  2. While our custom-tooling supports it, TypeScript cannot emit declarations of unique symbols, so this PR casts unique symbols to the general symbol object.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 1, 2026

⚠️ No Changeset found

Latest commit: 375e111

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 1, 2026

This PR is packaged and the instant preview is available (315f8a2).

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@315f8a2
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@315f8a2
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@315f8a2

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 1, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.42%. Comparing base (87af6a1) to head (375e111).
⚠️ Report is 5 commits behind head on main.

❌ Your changes status has failed because you have indirect coverage changes. Learn more about Unexpected Coverage Changes and reasons for indirect coverage changes.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #20755      +/-   ##
==========================================
- Coverage   91.42%   91.42%   -0.01%     
==========================================
  Files         559      559              
  Lines       55103    55103              
  Branches    14529    14529              
==========================================
- Hits        50379    50376       -3     
- Misses       4724     4727       +3     
Flag Coverage Δ
integration 90.41% <100.00%> (-0.01%) ⬇️
test262 42.01% <100.00%> (+0.03%) ⬆️
unit 36.21% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@alexander-akait
Copy link
Copy Markdown
Member

@avivkeller let's fix lint

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 1, 2026

Merging this PR will improve performance by 27.53%

⚡ 1 improved benchmark
✅ 143 untouched benchmarks

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "css-modules", scenario '{"name":"mode-production","mode":"production"}' 9 MB 7 MB +27.53%

Comparing chore/avivkeller/type-safety (375e111) with main (87af6a1)

Open in CodSpeed

Comment thread tsconfig.types.benchmark.json
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 1, 2026

Types Coverage

Coverage after merging chore/avivkeller/type-safety into main will be
98.94%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.77%100%100%98.77%91
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js91.30%100%100%91.30%140, 142–143, 145, 147, 153–154, 161, 168, 90
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/typescript
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AbstractMethodError.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AsyncDependencyToInitialChunkError.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%87
   CacheFacade.js100%100%100%100%
   CaseSensitiveModulesWarning.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkRenderError.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%196, 216, 371
   CodeGenerationError.js100%100%100%100%
   CodeGenerationResults.js100%100%100%100%
   CommentCompilationWarning.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1511, 1800, 1807, 1815, 1837, 2713, 3131, 3779, 3808, 3860–3861, 3865, 3870, 3886–3887, 3901–3902, 3907–3908, 4370, 4396, 470, 475, 5091, 5171, 5186, 5211–5212, 5214, 5530, 5535, 5541, 5544, 5556, 5558, 5562, 5578, 5593, 5624, 5678, 5702, 5812, 681–682
   Compiler.js99.56%100%100%99.56%1091–1092, 1100
   ConcatenationScope.js98.59%100%100%98.59%166
   ConcurrentCompilationError.js100%100%100%100%
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js100%100%100%100%
   ContextModuleFactory.js97.75%100%100%97.75%253, 385, 410, 435, 439, 450
   ContextReplacementPlugin.js100%100%100%100%
   CssModule.js81.32%100%100%81.32%152, 157–172
   DefinePlugin.js98.92%100%100%98.92%153–154, 170, 189, 263
   DelegatedModule.js95.24%100%100%95.24%240–244
   DelegatedModuleFactoryPlugin.js98.15%100%100%98.15%103
   DelegatedPlugin.js100%100%100%100%
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.13%100%100%98.13%351, 381
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DllEntryPlugin.js100%100%100%100%
   DllModule.js100%100%100%100%
   DllModuleFactory.js100%100%100%100%
   DllPlugin.js100%100%100%100%
   DllReferencePlugin.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%235, 375, 388–389
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentNotSupportAsyncWarning.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%48
   ErrorHelpers.js100%100%100%100%
   EvalDevToolModulePlugin.js100%100%100%100%
   EvalSourceMapDevToolPlugin.js100%100%100%100%
   ExportsInfo.js100%100%100%100%
   ExportsInfoApiPlugin.js100%100%100%100%
   ExternalModule.js98.89%100%100%98.89%385–389, 526
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FalseIIFEUmdWarning.js100%100%100%100%
   FileSystemInfo.js99.49%100%100%99.49%168, 2142–2143, 2146, 2157, 2168, 2179, 261, 3497, 3512, 3536
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%396, 398, 402
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   GraphHelpers.js100%100%100%100%
   HarmonyLinkingError.js100%100%100%100%
   HookWebpackError.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnoreErrorModuleFactory.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   InvalidDependenciesModuleWarning.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LibManifestPlugin.js97.14%100%100%97.14%114, 117
   LibraryTemplatePlugin.js100%100%100%100%
   LoaderOptionsPlugin.js100%100%100%100%
   LoaderTargetPlugin.js100%100%100%100%
   MainTemplate.js100%100%100%100%
   ManifestPlugin.js100%100%100%100%
   Module.js98.50%100%100%98.50%1186, 1191, 1249, 1262, 1319, 1327
   ModuleBuildError.js100%100%100%100%
   ModuleDependencyError.js100%100%100%100%
   ModuleDependencyWarning.js100%100%100%100%
   ModuleError.js100%100%100%100%
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%105, 107
   ModuleGraph.js99.73%100%100%99.73%942
   ModuleGraphConnection.js100%100%100%100%
   ModuleHashingError.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleNotFoundError.js100%100%100%100%
   ModuleParseError.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleRestoreError.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleStoreError.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   ModuleWarning.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%619
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NoModeWarning.js100%100%100%100%
   NodeStuffInWebError.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1032, 1048, 1135, 1765, 1770–1780, 214, 722, 740, 757, 998
   NormalModuleFactory.js99.46%100%100%99.46%1032, 1337, 447, 459
   NormalModuleReplacementPlugin.js100%100%100%100%
   NullFactory.js100%100%100%100%
   OptimizationStages.js100%100%100%100%
   OptionsApply.js100%100%100%100%
   Parser.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   PrefetchPlugin.js100%100%100%100%
   ProgressPlugin.js98.75%100%100%98.75%431–432, 437, 439, 503
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   RequireJsStuffPlugin.js100%100%100%100%
   ResolverFactory.js100%100%100%100%
   RuntimeGlobals.js100%100%100%100%
   RuntimeModule.js100%100%100%100%
   RuntimePlugin.js100%100%100%100%
   RuntimeTemplate.js100%100%100%100%
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SizeFormatHelpers.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%265–266, 608
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.85%100%100%98.85%128–129
   UnhandledSchemeError.js100%100%100%100%
   UnsupportedFeatureWarning.js100%100%100%100%
   UseStrictPlugin.js100%100%100%100%
   WarnCaseSensitiveModulesPlugin.js100%100%100%100%
   WarnDeprecatedOptionPlugin.js100%100%100%100%
   WarnNoModeSetPlugin.js100%100%100%100%
   WatchIgnorePlugin.js100%100%100%100%
   Watching.js100%100%100%100%
   WebpackError.js96.97%100%100%96.97%43
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%317
   cli.js98.71%100%100%98.71%109, 453, 485, 527, 787
   formatLocation.js100%100%100%100%
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%86, 88, 97, 99
   webpack.js97.22%100%100%97.22%186, 208, 210
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%282, 306, 309, 361, 39
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%70, 82, 90
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%104, 111–112, 120, 87
   PackFileCacheStrategy.js96.40%100%100%96.40%1225,

@avivkeller avivkeller marked this pull request as ready for review April 1, 2026 21:09
Copilot AI review requested due to automatic review settings April 1, 2026 21:09
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves TypeScript type robustness in preparation for generating declarations via tsc, by avoiding direct references to types.d.ts and by generalizing unique symbol-typed internals to symbol where declaration emission would otherwise be problematic.

Changes:

  • Replace JSDoc type imports that pointed directly at types.d.ts with imports targeting the package root.
  • Generalize several internal unique symbol typings to symbol in both runtime JSDoc and the shipped types.d.ts.
  • Update the benchmark TS config to use bundler-style resolution suitable for these package-root type imports.

Reviewed changes

Copilot reviewed 31 out of 32 changed files in this pull request and generated no comments.

Show a summary per file
File Description
types.d.ts Replaces several typeof <unique symbol>-based typings with symbol and simplifies Meta symbol-key typing to avoid referencing internal symbol declarations.
tsconfig.types.benchmark.json Switches benchmark typechecking to module: es2022 + moduleResolution: bundler to support package-root type imports.
test/BenchmarkTestCases.benchmark.mjs Updates JSDoc typedef imports to reference the package root (..) instead of types.d.ts.
test/benchmarkCases/wasm-modules-sync/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/wasm-modules-async/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/typescript-long-on-schedule/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/three-long/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/side-effects-reexport/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/react/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/many-modules-esm/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/many-modules-commonjs/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/many-chunks-esm/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/many-chunks-commonjs/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/lodash/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/json-modules/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/future-defaults/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/devtool-source-map/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/devtool-eval/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/devtool-eval-source-map/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/css-modules/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/context-esm/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/context-commonjs/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/concatenate-modules/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/cache-filesystem/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/asset-modules-source/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/asset-modules-resource/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/asset-modules-inline/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
test/benchmarkCases/asset-modules-bytes/webpack.config.mjs Updates config JSDoc type import to use package root (../../..).
lib/Dependency.js Casts TRANSITIVE symbol to symbol (vs inferred unique symbol) for declaration emission compatibility.
lib/dependencies/HarmonyImportSpecifierDependency.js Casts internal idsSymbol to symbol to avoid emitting unique symbol declarations.
lib/dependencies/HarmonyExportImportedSpecifierDependency.js Casts internal idsSymbol to symbol to avoid emitting unique symbol declarations.
lib/dependencies/CommonJsExportRequireDependency.js Casts internal idsSymbol to symbol to avoid emitting unique symbol declarations.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@avivkeller avivkeller merged commit 315f8a2 into main Apr 2, 2026
59 of 60 checks passed
@avivkeller avivkeller deleted the chore/avivkeller/type-safety branch April 2, 2026 13:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants