chore(workspace): update sample app to Angular 20 - #3671
Conversation
There was a problem hiding this comment.
new file courtesy of grok-code-fast-1, we're doing something similar in other sample apps in the project, but if there's something here we don't need, let's call that out
|
|
||
| if (isMainModule(import.meta.url)) { | ||
| // eslint-disable-next-line @typescript-eslint/dot-notation | ||
| const port = process.env['PORT'] || 4000; |
There was a problem hiding this comment.
both process.env.PORT (trying to access a property on an index type) and process.env['PORT'] (please use dot notation) have some sort of error associated with it, I went with this option
we may want to take a look at lint rules in the future
| @defer (hydrate on idle) { <app-database /> } @placeholder { Database! | ||
| … } @defer (hydrate on idle) { <app-firestore /> } @placeholder { | ||
| Firestore! … } @defer (hydrate on idle) { <app-functions /> } | ||
| @placeholder { Functions! … } @defer (hydrate on idle) { | ||
| <app-messaging /> } @placeholder { Messaging! … } @defer (hydrate on | ||
| idle) { <app-remote-config /> } @placeholder { Remote Config! … } | ||
| @defer (hydrate never) { <app-storage /> } @placeholder { Storage! … | ||
| } @defer (hydrate on idle) { <app-upboats /> } @placeholder { … } |
There was a problem hiding this comment.
I'd recommend we start using prettier for formatting (something to think about)
| "scripts": { | ||
| "ng": "ng", | ||
| "start": "firebase emulators:exec --import seed \"ng serve\"", | ||
| "start": "npx --yes firebase-tools@latest emulators:exec --import seed \"ng serve\"", |
There was a problem hiding this comment.
maybe someone had firebase-tools installed globally, but I don't and I'd prefer to follow the pattern I see in the root package.json of installing this on demand
alternatively, we could install the package in the devDependencies and keep it up to date
|
@jamesdaniels any feedback for this PR? |
|
@jamesdaniels should we try to get this in before v21 comes along? 🤓 |
Continues the Angular 19 to 20 update in this PR up to Angular 21, so the sample matches the workspace library (which is on Angular 21). - bump all @angular/* to ^21.0.0 and @angular/fire to the Angular 21 build; drop the unused, deprecated @angular/animations and the deprecated @angular/platform-browser-dynamic; bump @types/node to ^22 for the Node 22 runtime. - main.server.ts: pass the BootstrapContext that Angular 21 requires for the server bootstrap. Without it, build-time route extraction fails with NG0401. - test.ts: reconcile the test setup with the app's zoneless mode. Drop the zone.js imports, switch to @angular/platform-browser/testing, and provide zoneless change detection so fixture.detectChanges works. - rename the project ng20-test to ng21-test throughout: package.json name and serve:ssr script, angular.json project key/outputPath/buildTargets, the index.html and README titles, and AppComponent.title with its spec. Builds and unit tests pass against the Angular 21 library.
|
Thanks for this, @markgoho, and for opening #3669 to track it. I picked this up to get it into the Angular 21 release, and I pushed a few commits to your branch to carry it the rest of the way. Rather than land it at Angular 20, I took it straight to Angular 21 so the sample matches the library (the workspace is on 21 now). The sample pins On top of your 19 to 20 work, the 20 to 21 commit:
|
tyler-reitz
left a comment
There was a problem hiding this comment.
The Angular migration itself is correct and I have no objections to any of it: provideExperimentalZonelessChangeDetection → provideZonelessChangeDetection, provideServerRoutesConfig → provideServerRendering(withRoutes(...)) from @angular/ssr, the BootstrapContext threading in main.server.ts, @angular-devkit/build-angular:* → @angular/build:*, and dropping zone.js / platform-browser-dynamic / animations.
Main ask: strip the formatting churn
The sample isn't covered by the repo's lint — angular.json lints src/**/*.ts and src/**/*.html only — so none of the reformatting is required by project tooling. It looks like an editor's Prettier config, and it buries the real changes.
It also actively hurts readability in the templates. app.component.ts turns seven aligned one-line @defer blocks into eight lines of wrapped prose:
@defer (hydrate on idle) { <app-database /> } @placeholder { Database!
… } @defer (hydrate on idle) { <app-firestore /> } @placeholder {
and auth.component.ts collapses } @if (...) { onto shared lines.
If reformatting the sample is wanted, it'd be better as its own PR with a checked-in config so it doesn't drift again. Relatedly, the // eslint-disable-next-line @typescript-eslint/dot-notation added to server.ts is dead weight — nothing lints that file.
Metadata is stale
Title and description say Angular 20, but the head commit is chore(sample): carry the sample app to Angular 21 and sample/package.json now pins ^21.0.0. The author's notes (Angular 20, ~350 lint errors, --no-verify) describe an earlier state of the branch. Worth rewriting the title/body and re-verifying the checklist against what's actually here now.
Smaller points
"start": "npx --yes firebase-tools@latest emulators:exec ..."fetches an unpinned firebase-tools on every run, requires network, and can drift from the version the library peers (^14.0.0 || ^15.0.0). Prefer the workspace binary or a pinned version."@angular/fire": "file:../angular-fire-21.0.0-rc.0.tgz"now encodes an RC in the filename, so it needs a bump every release, and nothing insample/README.mdsays how to produce that tarball. Same pattern as before (19.0.0.tgz) so not a regression — but since it's being touched anyway, pointing atdist/packages-dist/would stop the churn.src/test.tsplus"main": "src/test.ts": hand-rollinginitTestEnvironmentis the pre-v20 shape.@angular/build:karmahas aprovidersFileoption meant for exactly this zoneless case — worth checking whether it works here, since it would also remove the Firebase providers now duplicated betweentest.tsandapp.component.spec.ts. And on the Vitest note: Angular 21's default for new projects is@angular/build:unit-test, so that instinct is right, just not this PR's job.app.component.spec.tschangingquerySelector('h1')?.textContent→compiled.textContentis a real fix (the template has noh1, so the old assertion was failing), but asserting'Hello World!'against the whole rendered tree is a weak check. Fine as-is — flagging so it's a deliberate choice rather than a side effect.
Checklist
yarn install,yarn testrun successfully? yes, for thesampledirectoryDescription
Updating sample app to Angular 20
Author's Notes
test.tsfile -- it kept complaining about needing Zone.js even though this is a zoneless app, since there's only 3 tests, we may want to explore Vitest as an alternative--no-verifywhen committing this, there are ~350 lint errors in the repo and I didn't want to include those fixes in this change