Skip to content

feat(types): use tsc to generate types#20754

Closed
avivkeller wants to merge 3 commits intomainfrom
avivkeller/feat/tsc-types
Closed

feat(types): use tsc to generate types#20754
avivkeller wants to merge 3 commits intomainfrom
avivkeller/feat/tsc-types

Conversation

@avivkeller
Copy link
Copy Markdown
Member

Ref: https://discord.com/channels/1180618526436888586/1371080839341019237/1486887261902602452


This PR replaces the usage of webpack/tooling to generate types to using the start TSC. It's a draft while I investigate to ensure there are no regressions.

@avivkeller avivkeller force-pushed the avivkeller/feat/tsc-types branch from c719cf6 to 105b86c Compare April 1, 2026 17:23
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 1, 2026

⚠️ No Changeset found

Latest commit: cf5944a

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 (cf5944a).

Install it locally:

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

@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 (cf5944a).
⚠️ Report is 87 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #20754   +/-   ##
=======================================
  Coverage   91.42%   91.42%           
=======================================
  Files         559      559           
  Lines       55103    55103           
  Branches    14529    14529           
=======================================
+ Hits        50379    50380    +1     
+ Misses       4724     4723    -1     
Flag Coverage Δ
integration 90.41% <100.00%> (+<0.01%) ⬆️
test262 41.97% <100.00%> (ø)
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.

@avivkeller avivkeller force-pushed the avivkeller/feat/tsc-types branch from bc893e8 to e6e5ea6 Compare April 1, 2026 17:32
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 1, 2026

Merging this PR will improve performance by 30.07%

⚡ 1 improved benchmark
✅ 143 untouched benchmarks

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "lodash", scenario '{"name":"mode-development","mode":"development"}' 5.3 MB 4.1 MB +30.07%

Comparing avivkeller/feat/tsc-types (cf5944a) with main (87af6a1)

Open in CodSpeed

@avivkeller avivkeller marked this pull request as ready for review April 1, 2026 17:32
Copilot AI review requested due to automatic review settings April 1, 2026 17:32
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

This PR aims to switch the project’s type declaration generation from webpack/tooling to using TypeScript (tsc), updating references and docs to align with a types/ output directory rather than a single types.d.ts file.

Changes:

  • Updated package metadata and scripts to point TypeScript declarations to types/index.d.ts and add a build:types/publish-time generation step.
  • Rewired JSDoc type imports in benchmark code/configs to import types from the package root instead of types.d.ts.
  • Adjusted configs/ignores/docs to treat types/ as generated output (gitignored, prettier/cspell ignored, docs updated).

Reviewed changes

Copilot reviewed 37 out of 39 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
tsconfig.validation.json Validates generated declarations via types/index.d.ts
tsconfig.types.json Introduces a dedicated tsconfig intended for emitting type declarations
package.json Points types to types/index.d.ts, updates published files/scripts for type generation
test/BenchmarkTestCases.benchmark.mjs Switches type imports to package-root module typings
test/benchmarkCases/**/webpack.config.mjs Updates config typing to use package-root Configuration type
lib/Dependency.js Adds explicit symbol JSDoc casting for better TS inference/emit
lib/dependencies/HarmonyImportSpecifierDependency.js Adds explicit symbol JSDoc casting
lib/dependencies/HarmonyExportImportedSpecifierDependency.js Adds explicit symbol JSDoc casting
lib/dependencies/CommonJsExportRequireDependency.js Adds explicit symbol JSDoc casting
cspell.json Updates ignore from types.d.ts to types/**
CONTRIBUTING.md Updates contributor guidance to reference types/ output
AGENTS.md Updates repo structure/workflow docs to reference types/
.prettierignore Ignores generated types output
.gitignore Ignores generated /types output

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

Comment thread tsconfig.types.json Outdated
Comment on lines 2 to 6
"extends": "./tsconfig",
"compilerOptions": {
"rootDir": "lib"
},
"include": ["declarations.d.ts", "declarations/*.d.ts", "lib/**/*.js"]
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

tsconfig.types.json extends tsconfig.json, which sets noEmit: true (tsconfig.json:8). As a result, yarn build:types (tsc -p tsconfig.types.json) will not emit any .d.ts files, so types/index.d.ts won’t be produced. Additionally, rootDir: "lib" conflicts with the included declarations.d.ts / declarations/*.d.ts (outside lib/), which can trigger TS6059. Consider overriding noEmit, enabling declaration emit (e.g., declaration + emitDeclarationOnly), configuring an explicit output dir (e.g., declarationDir/outDir to types/), and adjusting/removing rootDir so included declaration files are compatible.

Copilot uses AI. Check for mistakes.
Comment thread package.json
Comment on lines 17 to 30
@@ -26,29 +26,31 @@
"schemas/",
"SECURITY.md",
"module.d.ts",
"types.d.ts"
"types/"
],
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

package.json now points types to types/index.d.ts, but the repo doesn’t contain types/ (it’s gitignored) and the current build:types config (see tsconfig.types.json + base noEmit) won’t generate it. Also, emitted .d.ts files from lib/** are very likely to retain type references like import("../declarations/WebpackOptions") (e.g., lib/index.js), but declarations/ and declarations.d.ts are not included in the published files list—this would make the published type declarations resolve to missing paths. Ensure the build generates types/index.d.ts and either bundles/copies the declarations* typings into types/ or includes declarations/ + declarations.d.ts in the published package.

Copilot uses AI. Check for mistakes.
Comment thread package.json
"types/"
],
"scripts": {
"prepare": "husky",
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

Generating types/ only in prepublishOnly won’t cover workflows that rely on npm pack/packing (which runs prepack, not prepublishOnly). Since types/ is now ignored and expected to be generated, consider moving this to prepack (or adding prepack as well) so packed artifacts consistently include generated declarations.

Suggested change
"prepare": "husky",
"prepare": "husky",
"prepack": "yarn build:types",

Copilot uses AI. Check for mistakes.
Comment thread .prettierignore
*.check.js
*.check.d.ts
types.d.ts
types
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

In .prettierignore, the pattern types will match any path segment named types, not just the intended root types/ output directory. To avoid accidentally skipping formatting in unrelated nested types/ folders (if they ever appear), prefer a more specific ignore like /types/ or types/.

Suggested change
types
/types/

Copilot uses AI. Check for mistakes.
Comment thread CONTRIBUTING.md
```

Then, automatically generate the type declarations by running `yarn fix` locally, and the changes you have made will be reflected in `types.d.ts`.
Then, automatically generate the type declarations by running `yarn fix` locally, and the changes you have made will be reflected in the `types/` directory.
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

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

CONTRIBUTING.md now says running yarn fix will regenerate type declarations into types/, but yarn fix currently runs fix:code && fix:special && fmt and does not call build:types. Given types/ is gitignored and AGENTS.md says it’s generated at publish time, this instruction looks incorrect/out-of-date. Update the doc to reference the actual command developers should run locally to generate/validate types (e.g., yarn build:types or yarn validate:types), or adjust scripts so yarn fix produces types/ as stated.

Suggested change
Then, automatically generate the type declarations by running `yarn fix` locally, and the changes you have made will be reflected in the `types/` directory.
Then, automatically generate the type declarations by running `yarn build:types` locally, and the changes you have made will be reflected in the `types/` directory.

Copilot uses AI. Check for mistakes.
@avivkeller avivkeller marked this pull request as draft April 1, 2026 17:39
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 1, 2026

Types Coverage

Coverage after merging avivkeller/feat/tsc-types 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.mjs89.29%100%100%89.29%14, 21–22
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%</

@alexander-akait
Copy link
Copy Markdown
Member

Let's close right now, we will revisit it later

@alexander-akait alexander-akait deleted the avivkeller/feat/tsc-types branch May 4, 2026 16:42
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