Sep 21

Wrap Tom Select in an Angular signal form without the change-event loop

Angular 22 asks a custom form control for one thing, a value model signal. Wrapping Tom Select in that contract takes about twenty lines, and then the widget starts answering the writes your own code makes. The change event fires for programmatic writes and user picks alike, silent suppresses it, and item_add is not covered by silent at all.

angular · patterns · 7 min
→
Sep 20

Angular 22 made OnPush the default, and the migration wrote Eager

Angular 22 made OnPush the default strategy and renamed the old default to Eager, and the update migration writes Eager into the components you already had, so for every component it reaches the upgrade itself changes nothing. What changes is the first component you generate afterwards: it is OnPush, and an Eager component underneath it stops updating for exactly one class of change.

angular · architecture · 6 min
→
Sep 17

Why your API still redirects to login in .NET 10

In .NET 10 a cookie-authenticated app answers an anonymous API request with 401 instead of redirecting to the login page — but only for the endpoints ASP.NET Core recognises as API endpoints, and that recognition comes from metadata it adds automatically for some shapes and not others. TypedResults.Ok answers 401. Results.Ok, behind the same policy with the same JSON body, still answers 302.

dotnet · security · 7 min
→
Sep 16

TypeScript 6 stops loading @types globally: what breaks on upgrade

Up to TypeScript 5.9 a tsconfig with no types entry loaded every package under node_modules/@types as globals. TypeScript 6.0 made the default an empty array, so process and describe stop resolving on upgrade. The option controls automatic inclusion (and which packages editors offer as auto-imports), not imports, which is why an imported package still brings its types along and a dependency's own reference can quietly put the globals back.

typescript · tooling · 7 min
→
Sep 15

Why your @defer block still shipped in the main bundle

An @defer block only moves a component into a lazy chunk when the deferred dependency is standalone and nothing else in the same file refers to it. When something does, Angular falls back to loading it eagerly with no warning: the placeholder still renders and the content still arrives on the trigger, while the code sits in the initial bundle. Seven builds of the same block, measured, plus the one-line check that tells you which case you are in.

angular · performance · 7 min
→
Sep 14

Name your HasQueryFilter calls, or the second silently replaces the first

An unnamed HasQueryFilter call sets the filter for an entity type rather than adding to it, so a soft-delete filter written after a tenant filter leaves the tenant condition out of the SQL entirely, with no log line that mentions it. EF Core 10's named filters keep both and let one query drop the soft-delete filter by name while staying inside its own tenant.

dotnet · architecture · 8 min
→
Sep 13

linkedSignal: a derived value you can also write to

A computed signal is read-only, so a derived value the user can also change gets copied into a plain signal with an effect to reset it. linkedSignal is the writable one, and the rule for when your write survives is worth knowing exactly: it stands until something the computation reads changes, and it is dropped the moment that happens, which you observe on the next read.

angular · patterns · 6 min
→
Sep 10

IOptions, IOptionsSnapshot, IOptionsMonitor: which one sees a config reload

IOptions, IOptionsSnapshot and IOptionsMonitor look interchangeable in a constructor and land in three different places when the settings change under a running process. The part worth knowing is what happens when a singleton asks for the scoped one: scope validation is on by default in Development and off everywhere else, so the same code is a startup crash on your machine and a silently frozen value on the server.

dotnet · architecture · 7 min
→
Sep 08

erasableSyntaxOnly catches the TypeScript that Node cannot strip

Node runs a .ts file by deleting the type syntax and handing the rest to V8, so the constructs that turn into runtime code have nothing to delete and fail at process start. erasableSyntaxOnly turns exactly those into editor errors, and Node 26 removed the escape hatch that used to compile them for you.

typescript · tooling · 6 min
→
Sep 06

httpResource aborts the request in flight and kills the search-as-you-type race

httpResource re-runs its request when a signal it reads changes, and it aborts the request still in flight instead of racing it. That removes the classic search-as-you-type bug, where a slow first answer lands after a fast second one and overwrites it. It became public API in Angular 22.0, and it still has no debounce of its own, which is worth knowing before you reach for it.

angular · development · 7 min
→