Branch feature/release-0.0.23/version-16-17

Angular 16 to 17 upgrade

The official 16 → 17 code work is in. What is left is proving the runtime checklist in a running app, plus deciding which build system that proof runs against.

Decisions that stayed locked

What landed

Commit e9051eab15 is the upgrade. Later commits on the same branch changed the client builder. Treat those as follow-on, not as part of the official 16 → 17 guide.

Toolchain

Angular-bound libraries

SSR

Compile fixes Angular 17 forced

Same-branch follow-on, not the 16 → 17 guide

Official checklist

Item Status Note
Node 18.13+, TypeScript 5.2+, Zone 0.14 Done Node 20.19.6, TypeScript 5.4.5, Zone 0.14.10
ng update core, CLI, Material 17 Done Peers forced only for IVS. Workspace / SSR schematics were applied by hand so they would not overwrite server.ts
Router options on forRoot Done Already had paramsInheritanceStrategy: 'always' and urlUpdateStrategy: 'deferred'. No old Router setters to move
Handle bad URLs in UrlSerializer.parse Done Try/catch in trailing-slash-url.serializer.ts
Zone deep imports, AnimationDriver.NOOP, Signals .mutate() N/A Already on zone.js/node and zone.js/testing. The other APIs are unused
Disable hydration / loadComponent param inheritance N/A Hydration was never on. No loadComponent routes
NgSwitch now uses === Verify Compiler will not catch "1" vs 1. About 21 templates
Absolute redirect loops Verify Wallet bank-details redirect and marketing slug /music → /music-artists
Destroyed-component styles Verify Default is now strip styles on destroy. Only set REMOVE_STYLES_ON_COMPONENT_DESTROY if a modal or overlay goes blank
ngDoCheck on factory-created components Likely N/A Custom multiselect has ngDoCheck but is not created through a component factory

Verification already done

These passed after the upgrade, on Node 20.19.6, against the webpack browser + separate server targets:

If you are verifying committed browser-esbuild or the uncommitted application builder, rerun those builds. Do not treat the original webpack pass as proof of the current tree.

Verification still required

This is the remaining 16 → 17 work. None of it needs more ng update.

1. NgSwitch strict equality

Open the console and look for Angular NgSwitch warnings. Then click through screens that switch on mixed types:

2. Absolute redirects

3. Styles after a component is destroyed

Open and close stacked modals, toasts, and overlays (PrimeNG 17 and Material 17 both changed). If a later dialog looks unstyled, that is this flag. Do not flip REMOVE_STYLES_ON_COMPONENT_DESTROY until you see it.

4. Live SSR smoke

Serve the SSR bundle and check the responses, not just the HTML:

5. Builds the upgrade did not run

6. Visual and product smoke

ng lint OOMs on this repo. ng test was not run. Neither is a 17-specific blocker, but do not claim they passed.

npm run build-dev fails because src/environments/environment.dev.ts is gone. Use --configuration=development (uses environment.ts) or qa / staging / prod.

Commands

Put nvm Node 20 first. Cursor’s helper Node 22 will otherwise win on PATH.

export PATH="$HOME/.nvm/versions/node/v20.19.6/bin:$PATH"
nvm use
node --max_old_space_size=10048 ./node_modules/@angular/cli/bin/ng build --configuration=development
node --max_old_space_size=10048 ./node_modules/@angular/cli/bin/ng run TopFans:server:development
node --max_old_space_size=10048 ./node_modules/@angular/cli/bin/ng run TopFans:serverless:production

For a production-shaped pass against committed HEAD:

node --max_old_space_size=10048 ./node_modules/@angular/cli/bin/ng build --configuration=production
node --max_old_space_size=10048 ./node_modules/@angular/cli/bin/ng run TopFans:prerender:qa

If the uncommitted application builder is what you are shipping, those ng run TopFans:server / prerender targets are gone. ng build --configuration=qa then builds client, server, and prerender together. Confirm that before QA copies the old scripts.

Out of scope

Open questions