angular/packages/compiler-cli/src/ngtsc/annotations
Paul Gschwendtner 6338cb7b3b fix(compiler-cli): do not fail fatal when references to non-existent module are discovered (#58515)
Currently when application source code references e.g. an NgModule that
points to references that aren't available, the compiler will break at
runtime without any actionable/reasonable error.

This could happen for example when a library is referenced in code, but
the library is simply not available in the `node_modules`. Clearly,
TypeScript would issue import diagnostics here, but the Angular compiler
shouldn't break fatally. This is useful for migrations which may run
against projects which aren't fully compilable. The compiler handles
this fine in all cases, except when processing `.d.ts` currently... and
the runtime exception invalides all other information of the program
etc.

This commit fixes this by degrading such unexpected cases for `.d.ts`
metadata reading to be handled gracefully. This matches existing logic
where the `.d.ts` doesn't necessarily match the "expecation"/"expected
format".

The worst case is that the Angular compiler will not have type
information for some directives of e.g. a library that just isn't
installed in local `node_modules`; compared to magical errors and
unexpected runtime behavior.

PR Close #58515
2024-11-06 13:04:22 +01:00
..
common fix(compiler-cli): disable standalone by default on older versions of Angular (#58405) 2024-10-30 09:23:12 -07:00
component fix(compiler-cli): disable standalone by default on older versions of Angular (#58405) 2024-10-30 09:23:12 -07:00
directive fix(compiler-cli): disable standalone by default on older versions of Angular (#58405) 2024-10-30 09:23:12 -07:00
ng_module fix(compiler-cli): do not fail fatal when references to non-existent module are discovered (#58515) 2024-11-06 13:04:22 +01:00
src fix(compiler-cli): disable standalone by default on older versions of Angular (#58405) 2024-10-30 09:23:12 -07:00
test refactor: update license text to point to angular.dev (#57901) 2024-09-24 15:33:00 +02:00
BUILD.bazel refactor(compiler-cli): split the 'annotations' package into sub-packages (#44812) 2022-02-03 08:55:25 -08:00
index.ts refactor: update license text to point to angular.dev (#57901) 2024-09-24 15:33:00 +02:00
README.md refactor(compiler-cli): split the 'annotations' package into sub-packages (#44812) 2022-02-03 08:55:25 -08:00

What is the 'annotations' package?

This package implements compilation of Angular-annotated classes - those with @Component, @NgModule, etc. decorators. (Note that the compiler uses 'decorator' and 'annotation' interchangeably, despite them having slightly different semantics).

The 'transform' package of the compiler provides an abstraction for a DecoratorHandler, which defines how to compile a class decorated with a particular Angular decorator. This package implements a DecoratorHandler for each Angular type. The methods of these DecoratorHandlers then allow the rest of the compiler to process each decorated class through the phases of compilation.

Anatomy of DecoratorHandlers

Each handler implemented here performs some similar operations:

  • It uses the PartialEvaluator to resolve expressions within the decorator metadata or other decorated fields that need to be understood statically.
  • It extracts information from constructors of decorated classes which is required to generate dependency injection instructions.
  • It reports errors when developers have misused or misconfigured the decorators.
  • It populates registries that describe decorated classes to the rest of the compiler.
  • It uses those same registries to understand decorated classes within the context of the compilation (for example, to understand which dependencies are used in a given template).
  • It creates SemanticSymbols which allow for accurate incremental compilation when reacting to input changes.
  • It builds metadata objects for @angular/compiler which describe the decorated classes, which can then perform the actual code generation.

Since there is significant overlap between DecoratorHandler implementations, much of this functionality is implemented in a shared 'common' sub-package.