When an Angular directive test no longer needs a host component
Angular 22.2 added TestBed.createDirective, so a directive test no longer needs a component written just to hold the directive. I tested a copy-to-clipboard directive both ways. The files came out the same length, the input names lost their build-time check, and a directive that works with a parent still needed a host component.
A friendly “email already taken” error with .NET 11's async validation
.NET 11 lets a validation attribute on a minimal API ask the database whether an email is taken, and answer with a normal 400. That's the friendly message. Two sign-ups at the same moment both pass it, so a unique index is still the guarantee, and its violation should come back as the same 400. Two async checks on one model also run at the same time, so each needs its own DbContext.
Why a .NET long ID loses its last digits in Angular, and how to keep them
System.Text.Json writes a C# long as a JSON number, and JavaScript reads every JSON number as a double. An ID above 2^53 - 1 can reach Angular with different last digits, and sending it back may find nothing. Make such IDs strings with JsonNumberHandling on the property; for an API you can't change, read the digits with JSON.parse's source text.
Before you upgrade to .NET 11, check that your API clients can read OpenAPI 3.2
In .NET 11, AddOpenApi writes an OpenAPI 3.2 document where .NET 10 wrote 3.1. On a small API that version line is the only change, and four of five client generators don't mind. ng-openapi-gen refuses it. The documented one-line pin fixes the running app but not the document written at build time, which needs its own option.
How to load parent and child route data at the same time with Angular's router resources
A resolver on a parent route and one on its child run one after the other, so a nested tab waits for both requests in a row. Angular 22.2's router resources start them together. On a 400 ms parent and a 600 ms child, the tab showed up after about 620 ms instead of 1,020 ms. Block only on the data the page can't draw without.
Contain a failing Angular component with @boundary so the rest of the page still works
Angular 22.2 added @boundary, a template block that shows a fallback when a component inside it throws. Without one, a single failing tile can blank a whole dashboard. Wrap each widget, give the fallback a Retry, and keep the ErrorHandler for the clicks and timers the boundary doesn't catch.
Use C# 14 extension properties only where your own code reads them
C# 14 lets you add a property to a type you don't own, and at the call site it looks like a real one. It compiles to a static method, so EF Core can't use it in a query (the compiler refuses it with CS9296), System.Text.Json doesn't write it, and reflection on the type doesn't list it. Keep them for reads in your own code, and give queries an expression instead.
Make “same time tomorrow” survive a daylight-saving change with Temporal
On 25 October 2026 London's clocks go back an hour, and “9:00 tomorrow” computed with Date on a UTC server lands at 08:00. Temporal's ZonedDateTime carries the time zone and makes you pick: one calendar day keeps 09:00, 24 hours gives 08:00.
Keep an Excel export library out of Angular's first download with injectAsync
In a small Angular 22 app, exceljs was 945 kB of a 1,057 kB first download, all for one Export button. Moving that one service behind injectAsync cut the first download to 112 kB. Keep every other import of the library type-only, and check ng build's initial total before and after.
What to do when .NET 10 warns about packages you never installed
On net10.0, NuGet Audit checks the packages your packages pulled in, so a build that was clean on net9.0 can warn about Newtonsoft.Json 12.0.1 you never added. Find the parent with dotnet nuget why and update it, or pin a fixed version directly. dotnet package update --vulnerable does the pin, not the parent bump. Delete the references NU1510 points at, and fail CI on high and critical advisories.