Skip to content

fix(compiler): run tsconfig paths plugin before user plugins in tsc compiler#3326

Open
yogeshwaran-c wants to merge 2 commits intonestjs:masterfrom
yogeshwaran-c:fix/compiler-tsconfig-paths-plugin-order
Open

fix(compiler): run tsconfig paths plugin before user plugins in tsc compiler#3326
yogeshwaran-c wants to merge 2 commits intonestjs:masterfrom
yogeshwaran-c:fix/compiler-tsconfig-paths-plugin-order

Conversation

@yogeshwaran-c
Copy link
Copy Markdown

What kind of change does this PR introduce?

Bug fix

What is the current behavior?

In the non-watch tsc compiler (Compiler class in lib/compiler/compiler.ts), the tsconfigPathsPlugin is appended after user-defined before hooks:

before: tsconfigPathsPlugin
  ? before.concat(tsconfigPathsPlugin)
  : before,

This means user plugins process imports with unresolved path aliases, which could lead to incorrect transformations when plugins depend on seeing resolved import paths.

In contrast, the watch compiler (WatchCompiler in lib/compiler/watch-compiler.ts) correctly prepends the tsconfig paths plugin before user hooks using unshift():

if (tsconfigPathsPlugin) {
  before.unshift(tsconfigPathsPlugin);
}

This inconsistency means nest build (non-watch) and nest build --watch apply TypeScript transformer plugins in a different order, which can cause subtle differences in build output when custom compiler plugins are used.

What is the new behavior?

The tsconfig paths plugin now runs before user-defined plugins in the non-watch tsc compiler, matching the watch compiler behavior:

before: tsconfigPathsPlugin
  ? [tsconfigPathsPlugin, ...before]
  : before,

This ensures path aliases are resolved before any user plugins process imports, consistent across both watch and non-watch compilation modes.

Additional context

  • One-line change, zero risk of regression for projects without custom compiler plugins
  • For projects with custom plugins, this fix ensures they receive resolved paths (consistent with watch mode)
  • All existing tests pass

When a non-default project is selected during `nest generate`, the
`getSpecFileSuffix` call was incorrectly using `appName` (the original
CLI input) instead of `selectedProjectName` (the user's interactive
selection). This caused per-project `specFileSuffix` configuration to
be ignored, falling back to global config instead.

The adjacent `shouldGenerateSpec` and `shouldGenerateFlat` calls both
correctly use `selectedProjectName` -- this aligns `getSpecFileSuffix`
with the same pattern.
…ompiler

The tsc watch compiler (WatchCompiler) correctly prepends the tsconfig
paths plugin before user-defined before hooks using unshift(), ensuring
path aliases are resolved before other transformations process imports.

However, the non-watch tsc compiler (Compiler) was appending the tsconfig
paths plugin after user plugins via before.concat(tsconfigPathsPlugin).
This inconsistency could cause user plugins to receive unresolved path
aliases, leading to incorrect transformations.

Align the non-watch compiler with the watch compiler by placing the
tsconfig paths plugin first in the before hooks array.
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.

1 participant