Commit 24736f6e5f plus final checklist cleanup ยท 11 September 2026

Angular 16 upgrade explained

The application moved from Angular 15.2 to 16.2 as a controlled first step. Framework packages, build tools, SSR, and Angular-dependent UI libraries now agree on one compatible version set. The final Angular update-guide cleanup is also applied.

16.2.12Angular framework
16.2.16Angular CLI
18.20.8Node.js baseline
0 legacy refsFinal 15 to 16 API scan

1. What the upgrade does

The change keeps the existing NgModule application and Universal SSR architecture. It updates the version contract around them and applies the compatibility edits required by Angular 16.

RuntimePin Angular, RxJS, TypeScript, Zone.js, and Node.js.
LibrariesAlign Material, NgRx, PrimeNG, Bootstrap, forms, media, and Stripe packages.
MigrationsApply Angular's router, CLI, and module cleanup migrations.
CompatibilityUpdate SSR imports and APIs changed by newer UI libraries.
ProofCompile development, optimized production, and SSR bundles.

No product feature or route was intentionally redesigned. The work changes framework contracts and build behavior while preserving the application's current structure.

2. Version changes and why they moved together

Package groupBeforeAfterReason
Angular framework15.2.1016.2.12Moves core, compiler, forms, router, browser, server, service worker, and related packages as one synchronized set.
CLI and build tools15.2.1116.2.16Keeps workspace builders and migrations compatible with Angular 16.
Material and CDK15.2.916.2.14Matches Angular 16 and supplies the current component and drag-drop APIs.
TypeScript4.9.55.1.6Uses the newest TypeScript line accepted by Angular 16.2.
RxJS7.5.77.8.xSatisfies upgraded library peers, including the Angular 16 audio player.
Zone.js0.11.x0.13.3Matches Angular 16 and changes the supported Node entry point used by SSR.
Node.js20 in Docker18.20.8Angular 16 officially supports Node 18, while Node 20 is outside its documented build range. The same version is recorded in .nvmrc.

Angular-dependent packages

Material alone was not enough. Packages with Angular peer dependencies also had to move to compatible releases.

AreaAligned packages
State and UI@ngrx/store 16.3, primeng 16.9, ngx-bootstrap 11, @ng-bootstrap/ng-bootstrap 15, @ng-select/ng-select 11
Forms and inputngx-mask 16, ngx-intl-tel-input 15, ng-multiselect-dropdown 1.0, ngx-material-timepicker 13
Media and displayngx-audio-player 16, ngx-owl-carousel-o 16, ngx-infinite-scroll 16, ngx-device-detector 6
Payments and iconsngx-stripe 16, @stripe/stripe-js 3, @fortawesome/angular-fontawesome 0.13
New explicit runtime dependenciesdomino 2.1.8 for SSR and luxon 3.7 for the upgraded time picker

3. Source changes required by Angular 16

Router guard interfaces removed

Angular 15.2 deprecated class interfaces such as CanActivate and CanDeactivate. The migration removes those imports and implements clauses. Existing canActivate and canDeactivate methods remain, so route behavior stays structurally compatible.

Obsolete entry component metadata removed

entryComponents was deleted from SharedModule. Ivy discovers dynamically created components without that NgModule list.

SSR Zone.js import updated

zone.js/dist/zone-node became zone.js/node in both server.ts and serverless.ts. The old deep import is not exported by Zone.js 0.13.

PrimeNG removal API updated

The custom multiselect calls removeOption(item, event) instead of the removed removeChip(item, event) method.

ngx-mask registration updated

The wallet module imports standalone mask directive and pipe classes, then registers provideNgxMask(). This replaces the older NgxMaskModule.forRoot() pattern.

Unused View Engine package removed

ngx-drag-and-drop-lists and its module import were removed. Messages already uses Angular CDK drag-drop, and Angular 16 no longer runs the old compatibility compiler.

Transfer state imports moved

TransferState and makeStateKey now come from @angular/core in the platform service and both cache services. Angular 16 moved these public APIs out of @angular/platform-browser.

Server transition wrapper removed

BrowserModule.withServerTransition({ appId: 'serverApp' }) became BrowserModule. Each white-label site is a separate build, so this application does not need an APP_ID to distinguish multiple Angular applications on one page.

Last guard interface removed

WhitelabelSiteOnlyGuard no longer imports or implements the deprecated CanActivate interface. Its canActivate() method and routing behavior are unchanged.

The two white-label generated constant files only received new generation timestamps. Their exported data did not change.

4. Build and developer tooling changes

Developer setup

nvm use
npm install
npm run build-dev

npm run build-dev still depends on a local src/environments/environment.dev.ts. That file was absent during validation, so the checked-in development and production configurations were used directly.

5. What passed, and what remains visible

CheckResultWhat it proves
Dependency treePassednpm ls --depth=0 found no missing or invalid root packages.
Development browser buildPassedRe-run on 11 September after the final import, BrowserModule, and route-guard cleanup.
Production browser buildPassedOptimization, index generation, hashing, and service-worker generation complete after the final cleanup.
Development SSR buildPassedUniversal, Zone.js, Domino, server entry points, and server-side lazy chunks compile after the final cleanup.
Changed TypeScript filesPassedThe files touched by the migration pass ESLint with the repository's required 10 GB heap.
Whole-project lintBacklogLint now runs and reports 92 existing template errors, mainly loose equality and negated async-pipe expressions.
White-label buildsUnavailableThe project list contained only TopFans; no generated white-label project existed to compile.

The latest optimized initial bundle is 10.62 MB, which is 635.06 kB above the configured 10 MB warning threshold. The build still succeeds. CommonJS dependency, unused Stripe source, and one CSS compatibility warning also remain.

6. Recommended follow-up

  1. Smoke-test login, route guards, wallet input masks, custom multiselect chip removal, Stripe checkout, audio playback, and SSR page loads in a deployed environment.
  2. Generate one representative white-label project and run its browser and SSR builds before release.
  3. Resolve the 92 template lint errors as a separate cleanup change so behavior edits stay reviewable.
  4. Measure the production initial bundle and remove or lazy-load enough code to return below the 10 MB warning budget.
  5. Plan the next one-major-at-a-time migration. Angular 16 is an intermediate compatibility stop rather than a currently supported destination.