Every change lands as its own merge request, behind your CI, small enough to review in one sitting.
AngularJS to Angular
AngularJS has had no security fixes since January 2022. I move it to Angular without a rewrite and without a freeze: controllers turned into components while the app still runs on AngularJS, then both frameworks side by side with ngUpgrade, services and components moved bottom up, and AngularJS removed at the end. New features can be written in Angular from the second step on.
ng-checkup counts what is left at every step, and a CI gate keeps the AngularJS part from growing back.
Primo VE to NDE
For libraries on Ex Libris Primo: the AngularJS customization package rebuilt as an Angular module for the New Discovery Experience, view by view, before VE goes away.
Version upgrades
One major at a time with ng update, the follow-up migrations reviewed by hand, and the build green after every step.
Zoneless change detection
OnPush everywhere first, then zone.js out of the bundle and out of the tests.
Signals and NgRx
Classic NgRx and BehaviorSubject services moved to signals or the NgRx signal store, with RxJS bridges for legacy consumers.
Standalone and control flow
NgModules removed, @if and @for instead of *ngIf, signal inputs and outputs.
Karma to Vitest
Deprecated Karma and Jasmine replaced, specs kept green, zone-based test helpers rewritten.
Strict typing
strictNullChecks, strictTemplates and noImplicitAny switched on, staged folder by folder.
Circular dependencies and bundle size
Import cycles cut, eager code made lazy, and the initial bundle measured so it stays small.
CI quality gates
Ratchets that let a count go down but never up, so the codebase does not slide back after I leave.