What changed
Angular's official combined schematic, one pass over src with a 10 GB heap. It finished in about two minutes.
NODE_OPTIONS=--max_old_space_size=10048 npx ng generate @angular/core:signals --path=src --analysis-dir=src --defaults --interactive=false
| API | Schematic | In the tree now |
|---|---|---|
input() | 1108 / 1399 | 1089 input() fields. 313 @Input left. |
output() | 383 / 389 | 379 output() fields. 10 @Output left. |
viewChild() / viewChildren() | 562 / 603 | 409 + 15 signal queries. 46 @ViewChild and 2 @ViewChildren left. |
I did not turn on bestEffortMode. The leftovers are ones the schematic refused because converting them would break the build or the runtime.
Fixes after the schematic
The first QA build had about 500 errors. Most of that was the schematic being sloppy with types and with this., not a surprise on a repo this size. The ones that actually mattered:
| What broke | What I did |
|---|---|
viewChild('foo') with no type |
Hundreds of originals had no annotation, so the signal came back as unknown and openModal() failed. Restored types from git, or any when there was nothing to restore. |
ngx-bootstrap initialState on AlertModal |
Object.assign would have overwritten the signal functions with strings. I put those inputs and the EventEmitter outputs back. This modal is opened that way from a lot of places. |
| Portfolio song / podcast / video parents | this.step3Component.postPriceComponent.ppForm became a mess of locals pointing at the wrong object. Wired them back through step3Component()?.postPriceComponent(). |
private readonly screenClick = output() |
Angular rejects a private output. Dropped private on video-player-v2. That one took the whole player out of every standalone import list until it compiled. |
header-layout brandClick.observed |
output() has no .observed. Kept the EventEmitter so a logo click still goes home when the parent is not listening. |
What stayed on decorators
@Input() set …setters, and fields written from TypeScript orngOnChanges.- Required inputs the schematic could not type.
@ViewChildsetters such asreplyCommentInputon post detail, home, forum, and profile.- Queries initialized with
= null. The signal API does not allow that write. - The 10 leftover outputs. Alert modal and a couple of others still get
.subscribe()or.pipe()on the EventEmitter.
Do not force those. The next person who wants 100% coverage needs to change the call sites first.
How I checked it
| Check | Result |
|---|---|
| Main QA build | Pass. About 57s. --prerender=false. |
| Perfect Crew QA build | Not run. This branch's angular.json only lists TopFans. Same src as a generated white-label would compile. |
| SSR | 200 on home, login, pricing, about, creators (curl). No Angular compile errors in the HTML. |
| Logged-out browser | Home hydrates. Login form takes an email and the password toggle works. Pricing renders. Creators 504'd through the preview tunnel. Curl still got 200. That tunnel has been flaky before. |
| Logged-in product | Not run. |
Verification checklist
Creator account on a white-label site for logged-in checks. Private window for logged-out. Console open. Grouped by the modules in the 703-file diff. Shared and the primitives folder are the biggest chunks. If a modal opens through AlertModal, you are testing the leftover decorators on purpose.