# Tim Deschryver > Technical writing by Tim Deschryver, a Belgian software engineer and Microsoft MVP specializing in .NET, Angular, testing, AI-assisted development, and developer tooling. The articles contain practical explanations, runnable examples, and lessons learned from building software. Every article is available as plain Markdown by appending `.md` to its URL; the links below point to the Markdown versions. Prefer a page's canonical URL (the same link without the `.md` suffix) when citing it. ## Main sections - [Home](https://timdeschryver.dev): Author profile, credentials, and areas of expertise - [Blog](https://timdeschryver.dev/blog): Long-form technical articles - [Developer Bits](https://timdeschryver.dev/bits): Concise technical notes and examples ## Blog posts - [Testing AI prompts and comparing models with promptfoo](https://timdeschryver.dev/blog/testing-ai-prompts-and-comparing-models-with-promptfoo.md) (2026-07-29; topics: AI, Testing, Prompt Engineering, Promptfoo): Just like other software components, prompts benefit from tests that provide representative inputs to verify that the outputs meet the requirements. With promptfoo, you can test prompt behavior, compare models, and track output quality and keep runtime costs in check. - [Your first MCP server with ASP.NET](https://timdeschryver.dev/blog/your-first-mcp-server-with-aspnet.md) (2026-06-25; topics: .NET, ASP.NET, AI, MCP): Learn how to query your application's data using natural language by building an ASP.NET MCP server. - [Using Agentic AI to create your own component library](https://timdeschryver.dev/blog/using-agentic-ai-to-create-your-own-component-library.md) (2026-06-09; topics: Angular, AI): Agentic AI changes the trade-off between using an existing component library and building your own. This post explores how AI agents can help teams create, maintain, and evolve a custom Angular component library without taking on the full cost. - [Running a production-like local environment with Aspire](https://timdeschryver.dev/blog/running-a-production-like-local-environment-with-aspire.md) (2026-05-20; topics: .NET, Aspire, Azure): Prevent integration surprises in production by using Aspire to run local dependencies in a consistent, production-like setup, with Azure Blob Storage and Azurite as a practical example. - [Improve your AI coding agent with runtime context from Aspire MCP](https://timdeschryver.dev/blog/improve-your-ai-coding-agent-with-runtime-context-from-aspire-mcp.md) (2026-05-07; topics: .NET, AI, Aspire): The power of giving an AI agent access to OpenTelemetry data through Aspire MCP is simple: it gives the agent better input to analyze. Instead of reasoning only from source code, the agent can inspect the actual behavior of the running system. That makes its insights more reliable, resulting in more relevant and correct suggestions. - [Keep Agentic AI Simple: A Practical Workflow for Software Development](https://timdeschryver.dev/blog/keep-agentic-ai-simple-a-practical-workflow-for-software-development.md) (2026-04-23; topics: AI, .NET, Angular): You don’t need a complex setup or endless prompt tricks to get value from AI in software development. I've experienced that a few practices like an AGENTS.md file, Agent Skills, and specifications can dramatically improve the speed, quality, and consistency of agents. - [Containerize an ASP.NET Core BFF and Angular frontend using Aspire](https://timdeschryver.dev/blog/containerize-an-aspnet-core-bff-and-angular-frontend-using-aspire.md) (2026-04-07; topics: .NET, Angular, Aspire, Docker, BFF): Using Damien Bowden's secure ASP.NET Core and Angular BFF template as a starting point, this post shows how to integrate Aspire to improve local development and prepare the application for containerized deployment. - [Introducing Angular Testing Library Zoneless](https://timdeschryver.dev/blog/introducing-angular-testing-library-zoneless.md) (2026-03-19; topics: Angular Testing Library, Angular, Testing): To keep up with modern Angular, there's a new zoneless subpackage that helps you write component tests. - [Angular Signal Forms Keeps Improving (v21.2)](https://timdeschryver.dev/blog/angular-signal-forms-keeps-improving.md) (2026-03-12; topics: Angular): Taking a quick glance at the new features shipped in Angular Signal Forms. We'll cover provideSignalFormsConfig, focusBoundControl, the Submission API, and the formRoot directive, and why they are useful. - [A minimal way to integrate Aspire into your existing project](https://timdeschryver.dev/blog/a-minimal-way-to-integrate-aspire-into-your-existing-project.md) (2026-02-26; topics: Aspire, .NET): Did you know that you don't need to rebuild your solution to adopt Aspire? Instead, start small and improve over time. Let's take a look at how to integrate Aspire into your existing project with minimal changes, allowing for a gradual adoption of Aspire's features. - [Improve the quality of your Angular component snapshots with Vitest](https://timdeschryver.dev/blog/improve-the-quality-of-your-angular-component-snapshots-with-vitest.md) (2026-02-12; topics: Angular, Testing, Vitest): Snapshot testing Angular components in Vitest can be noisy. Learn how to clean up your snapshots with Angular-aware serializers to get reviewable DOM snapshots. This practice can also be applied to projects migrating from Jest to Vitest, ensuring consistent snapshots across test runners. - [Changing how ASP.NET generates OpenAPI schema names](https://timdeschryver.dev/blog/changing-how-aspnet-generates-openapi-schema-names.md) (2026-01-29; topics: .NET, OpenAPI): Preventing any naming conflicts in the OpenAPI documentation by ensuring that each schema name is uniquely identified by its full name. - [Using FusionCache's Backplane to synchronize HybridCache instances across multiple instances](https://timdeschryver.dev/blog/hybridcache-sync-with-fusioncache-backplane.md) (2026-01-16; topics: .NET, Caching, HybridCache, FusionCache, Redis): HybridCache is a great caching solution but it doesn't sync in-memory caches across instances. Discover how FusionCache can help you achieve this (and much more) with its Backplane feature. - [Named global query filters in Entity Framework Core 10](https://timdeschryver.dev/blog/named-global-query-filters-in-entity-framework-core-10.md) (2025-12-04; topics: .NET, Entity Framework): Entity Framework Core 10 enhances the global query filters feature, allowing you to define multiple filters per entity and selectively disable them by name. This powerful enhancement gives you fine-grained control over query filtering, perfect for implementing soft deletes. - [Using cookies for authentication in an Angular application](https://timdeschryver.dev/blog/using-cookies-for-authentication-in-an-angular-application.md) (2025-11-13; topics: Angular, BFF, Aspire, .NET): Learn how to simplify authentication in Angular applications by leveraging secure, cookie-based authentication through a Backend for Frontend (BFF) pattern. This approach eliminates the complexity of client-side token management while improving the security of your client-side code. - [Write strongly typed Web API integration tests using Kiota and OpenAPI](https://timdeschryver.dev/blog/write-strongly-typed-web-api-integration-tests-using-kiota-and-openapi.md) (2025-10-30; topics: .NET, ASP.NET, Testing, Kiota, OpenAPI): Recently, I discovered Kiota, a tool that generates API clients from OpenAPI specifications, and it has significantly simplified my testing process. In this blog post, I'll share how I use Kiota to create type-safe HTTP clients that are consumed within the integration tests for my ASP.NET Web API endpoints. - [Refactoring a form to a Signal Form](https://timdeschryver.dev/blog/refactoring-a-form-to-a-signal-form.md) (2025-10-16; topics: Angular, Signal Form): I jotted down some notes of my experiences and thoughts while refactoring an existing Angular form to use the new Signal Forms (experimental feature). - [Using the new bindings API to test Angular components with Angular Testing Library](https://timdeschryver.dev/blog/using-the-new-bindings-api-to-test-angular-components-with-angular-testing-library.md) (2025-10-02; topics: Angular Testing Library, Angular, Testing): Learn how to make use of the new binding methods inputBinding, outputBinding, and twoWayBinding to set component properties in your Angular tests. This native integration provides better signal support and eliminates type assertions for output events. - [Forwarding authenticated calls to a downstream API using YARP](https://timdeschryver.dev/blog/forwarding-authenticated-calls-to-a-downstream-api-using-yarp.md) (2025-09-25; topics: .NET, YARP, BFF, Security, Aspire): A Backend for Frontend (BFF) typically communicates with downstream APIs on behalf of the user. In this post, we'll explore how to forward authenticated calls to a downstream API using YARP. - [Secure your Yarp BFF with cookie-based authentication](https://timdeschryver.dev/blog/secure-your-yarp-bff-with-cookie-based-authentication.md) (2025-09-11; topics: .NET, YARP, BFF, Security, Aspire): Learn how to implement a secure cookie-based authentication in a YARP (Yet Another Reverse Proxy) Project that acts as the Backend for Frontend (BFF) architecture within a .NET Aspire solution. We also cover why we should prefer cookies over tokens for authentication (spoiler, it's security related). - [Writing isolated (integration)tests with TestContainers](https://timdeschryver.dev/blog/writing-isolated-integrationtests-with-testcontainers.md) (2025-08-28; topics: .NET, Testing, TestContainers, TUnit): If you're having troubles with setting up or running your test environment, then this blog post is for you. We will explore what TestContainers is, what problem it solves, and why you should consider using it within your testing strategy. - [VS Code as a modern Full‑Stack workspace, Powered by Copilot](https://timdeschryver.dev/blog/vs-code-as-a-modern-full-stack-workspace-powered-by-copilot.md) (2025-08-15; topics: .NET, Angular, VS Code, GitHub Copilot, Productivity, Developer Experience): Why VS Code transitioned into my primary development environment. The combination of its extensibility, the different integrations, and GitHub Copilot's capabilities makes it an ideal choice for my modern full-stack development needs. - [Fire your Playwright tests on demand from the .NET Aspire dashboard](https://timdeschryver.dev/blog/fire-your-playwright-tests-on-demand-from-the-net-aspire-dashboard.md) (2025-07-31; topics: .NET, Aspire, Playwright): Let's see how to use WithExplicitStart to integrate (TypeScript) Playwright tests within Aspire's dashboard. - [ASP.NET 10: Validating incoming models in Minimal APIs](https://timdeschryver.dev/blog/aspnet-10-validating-incoming-models-in-minimal-apis.md) (2025-05-14; topics: .NET, ASP.NET, Minimal APIs, Validation): Using data annotations to validate incoming models in ASP.NET 10 Minimal APIs makes it easy to ensure that the model is valid before processing the request. - [Vibe testing with Playwright](https://timdeschryver.dev/blog/vibe-testing-with-playwright.md) (2025-04-30; topics: Playwright, AI, GitHub Copilot): Playwright 🎭 has some AI sprinkles on top of it, and I wanted to explore them. This blog post uses the Playwright MCP server to help us write tests and uses the "copy as prompt" feature to help us solve failing tests. - [Using YARP as BFF within .NET Aspire: Integrating YARP into .NET Aspire](https://timdeschryver.dev/blog/integrating-yarp-within-dotnet-aspire.md) (2025-04-17; topics: .NET, YARP, BFF, Aspire): This blog post is the first in a series of posts in which a YARP project is integrated within a .NET Aspire project, acting as a secure Backend for Frontend (BFF) for an Angular application. - [Writing resilient Angular Component tests (that use HttpResource) with HttpTestingController](https://timdeschryver.dev/blog/writing-resilient-angular-component-tests-that-use-httpresource-with-httptestingcontroller.md) (2025-03-31; topics: Angular, Angular Testing Library): What if I told you that after all this time, we've been writing Angular Component tests wrong? In this post I will show you the benefit of HttpTestingController to test Angular components that consume a backend API. - [Some observations while writing my first Azure Function](https://timdeschryver.dev/blog/some-observations-while-writing-my-first-azure-function.md) (2025-03-06; topics: .NET, Azure, Azure Functions): A detailed exploration of the process and insights gained while creating my first Azure function. - [Gain control over commit messages generated by GitHub Copilot](https://timdeschryver.dev/blog/gain-control-over-commit-messages-generated-by-github-copilot.md) (2025-02-04; topics: GitHub Copilot, VSCode, Git, AI): Use the github.copilot.chat.codeGeneration.useInstructionFiles setting in Visual Studio Code to automatically add instructions to the commit messages generated by GitHub Copilot. - [Automatically select the right Microsoft Entra tenant](https://timdeschryver.dev/blog/automatically-select-the-right-microsoft-entra-tenant.md) (2025-01-23; topics: Azure, Angular, Entra ID): Skip the Microsoft tenant selection screen during the sign-in process by setting the domain_hint query parameter. - [Improve the user experience of your application using (rx)resource](https://timdeschryver.dev/blog/improve-the-user-experience-of-your-application-using-rxresource.md) (2025-01-14; topics: Angular): Don't just replace observable streams with the `value()` signal of a resource, but also take advantage of its built-in additional properties to improve the user experience of your application. - [ESLint flat config with EcmaScript modules (mjs) in an NX workspace](https://timdeschryver.dev/blog/eslint-flat-config-with-ecmascript-modules-mjs-in-an-nx-workspace.md) (2025-01-07; topics: NX, TypeScript, Eslint, Angular): Lessons learned from migrating Angular Testing Library to ESLint's flat config format in an NX workspace. - [Sending (browser) OpenTelemetry traces from an Angular Application to .NET Aspire](https://timdeschryver.dev/blog/sending-browser-opentelemetry-traces-from-an-angular-application-to-net-aspire.md) (2024-12-17; topics: .NET, Angular, OpenTelemetry): How to configure .NET Aspire to enable browser OpenTelemetry data from an Angular application. - [Creating an Angular application that's used by different user groups](https://timdeschryver.dev/blog/creating-an-angular-application-thats-used-by-different-user-groups.md) (2024-12-05; topics: Angular, Security): Some guidelines on how to structure and secure your Angular application when it needs to be consumed by different user groups, e.g. by a public and a private portal. You have multiple options to choose from, but my favorite is using an Angular (or NX) workspace, in this blog post I'll explain why. - [Resolving a failing NX post-install](https://timdeschryver.dev/blog/resolving-a-failing-nx-post-install.md) (2024-11-19; topics: NX): Help! My build randomly fails during the post install step of NX with exit code 135. In this post I'll show you how I solved this issue. - [Obfuscating data in SQL Server](https://timdeschryver.dev/blog/obfuscating-data-in-sql-server.md) (2024-11-12; topics: Sqlserver, Dotnet): Obfuscating data is a common practice to protect sensitive information, such as Personally identifiable information (PII). In this post, I will go over some techniques on how to obfuscate data in SQL Server. - [What about my API documentation now that Swashbuckle (Swagger) is no longer a dependency in ASP.NET 9](https://timdeschryver.dev/blog/what-about-my-api-documentation-now-that-swashbuckle-is-no-longer-a-dependency-in-aspnet-9.md) (2024-10-29; topics: ASP.NET, .NET, C#): As you will see in this blog post, the "baked-in" Swashbuckle package is no longer a dependency in the ASP.NET 9 project template. Let's take a look at what this means for your API documentation and go through some options to render the OpenAPI document. - [New LINQ methods in C# 13: Index, CountBy, AggregateBy](https://timdeschryver.dev/blog/new-linq-methods-in-c-13-index-countby-aggregateby.md) (2024-10-23; topics: .NET, C#, LINQ): Taking a look (including examples) at the new LINQ methods that will be introduced in C# 13, as part of the .NET 9 release. - [Create a custom SQL expression with Entity Framework, or how to make EF interpret your Value Types](https://timdeschryver.dev/blog/create-a-custom-sql-expression-with-entity-framework-or-how-to-make-ef-interpret-your-value-types.md) (2024-10-10; topics: .NET, SQL, Entity Framework): A deep-dive at the internals of Entity Framework to come up with a solution to make EF interpret your value types, in this particular case a strongly-typed ID (of the StronglyTypedId NuGet Package). - [Taking a look at the Problem Details enhancements in ASP.NET 9](https://timdeschryver.dev/blog/taking-a-look-at-the-problem-details-enhancements-in-aspnet-9.md) (2024-09-26; topics: .NET, ASP.NET, Problem Details): How to make use of the new StatusCodeSelector property to change the default HTTP response status code (500) of a Problem Details response, based on the thrown exception. - [My recommendations to configure Visual Studio Code for Angular Development](https://timdeschryver.dev/blog/my-recommendations-to-configure-visual-studio-code-for-angular-development.md) (2024-09-12; topics: Angular, VSCode, Developer-experience): Enhance your Angular development experience by installing the extensions mentioned in this article. We'll also modify a couple of settings in Visual Studio Code to make it easier to work with. - [Nice to knows when implementing policy-based authorization in .NET](https://timdeschryver.dev/blog/nice-to-knows-when-implementing-policy-based-authorization-in-net.md) (2024-08-29; topics: .NET, Security, Authorization): I assumed to know how policy-based authorization works in .NET, but I was wrong. Let's cover the basics to get a better understanding of how to implement a policy, and what to look out for. I also share some tips and tricks that improve your authorization layer. - [Angular Testing Library with Vitest](https://timdeschryver.dev/blog/angular-testing-library-with-vitest.md) (2024-07-30; topics: Angular, Angular Testing Library, Testing): Because of the Vitest plugin provided by Analog it just takes a few steps and minutes to test your Angular components with Angular Testing Library. - [The new on property improves output testing in Angular Testing Library](https://timdeschryver.dev/blog/the-new-on-property-improves-output-testing-in-angular-testing-library.md) (2024-07-25; topics: Angular Testing Library, Angular, Testing): A quick look at the new `on` API to write output tests more intuitively and without workarounds. - [Integrating Tailwind CSS in Blazor](https://timdeschryver.dev/blog/integrating-tailwind-css-in-blazor.md) (2024-06-27; topics: .NET, Blazor, Tailwind CSS): In this post, you learn how to set up Tailwind CSS in a Blazor application, how to optimize the development experience, and how to minify the CSS file in a production environment. - [The different ways to load your OpenID configuration for Angular Auth OIDC Client](https://timdeschryver.dev/blog/the-different-ways-to-load-your-openid-configuration-for-angular-auth-oidc-client.md) (2024-06-24; topics: Angular, Angular Auth OIDC Client, Authentication): How to configure the provideAuth function from the Angular Auth OIDC Client library to load your OpenID configuration synchronously or asynchronously. - [Signals in Angular Auth OIDC Client](https://timdeschryver.dev/blog/signals-in-angular-auth-oidc-client.md) (2024-06-13; topics: Angular, Angular Auth OIDC Client, Authentication): Version 18 of the angular-auth-oidc-client library adds Signal support to access the authenticated state and user data. - [Consuming .NET Feature Flags within an Angular Application](https://timdeschryver.dev/blog/consuming-net-feature-flags-within-an-angular-application.md) (2024-05-30; topics: Angular, .NET): Learn how to consume feature flags from a .NET API (using Microsoft.FeatureManagement.AspNetCore) within an Angular application. - [Adding .NET Code Coverage to your Azure DevOps pipeline](https://timdeschryver.dev/blog/adding-net-code-coverage-to-your-azure-devops-pipeline.md) (2024-05-02; topics: .NET, Testing, Ci/cd, Azure DevOps): A step-by-step guide on how to add code coverage to your .NET project in Azure DevOps. - [Testing Signals with Angular Testing Library](https://timdeschryver.dev/blog/testing-signals-with-angular-testing-library.md) (2024-04-11; topics: Angular Testing Library, Angular, Testing): TLDR: If you're already using Angular Testing Library, you're in luck, because it's already prepared to handle the Signal properties. - [Angular has your back when it comes to XSS](https://timdeschryver.dev/blog/angular-has-your-back-when-it-comes-to-xss.md) (2024-03-07; topics: Angular, Security): Angular provides XSS security without an effort to your development process. - [Bringing the power of Signals to Angular Forms with Signal Forms](https://timdeschryver.dev/blog/bringing-the-power-of-signals-to-angular-forms-with-signal-forms.md) (2024-02-08; topics: Angular, Signals, Forms): Signal Forms is a new way to create forms in Angular. It's built on top of the existing `NgModel` with a similar API to `ReactiveForms`, and uses signals to create a reactive and flexible form. The main goal is to make complex forms manageable. - [Using Zod's schema to render a reusable and dynamic Angular table component](https://timdeschryver.dev/blog/using-zods-schema-to-render-a-reusable-and-dynamic-angular-table-component.md) (2024-01-25; topics: Zod, Angular, TypeScript): When you think of Zod, you think of parsing and validation. But by leveraging some of Zod's lesser-known functionality we can do more than simply use it to parse objects, for example, to generate a dynamic and reusable table component. - [Multiple releases using the same, but configurable, Angular Standalone Application build](https://timdeschryver.dev/blog/multiple-releases-using-the-same-but-configurable-angular-standalone-application-build.md) (2024-01-11; topics: Angular, DevOps, CI/CD): Configuring an Angular standalone application to be flexible enough to be released in different environments. - [The decorator pattern using .NET's dependency injection](https://timdeschryver.dev/blog/the-decorator-pattern-using-nets-dependency-injection.md) (2023-12-22; topics: .net): Taking leverage of the decorator pattern to add extra behavior to existing an implementation. We first see how to do this manually, before taking a look at Scrutor to simplify this task. - [Intercepting HTTP requests with a DelegatingHandler](https://timdeschryver.dev/blog/intercepting-http-requests-with-a-delegatinghandler.md) (2023-11-30; topics: .NET): How and why you should use a DelegatingHandler to extract common HTTP request behavior. - [How to include an Angular Project within .NET Aspire](https://timdeschryver.dev/blog/how-to-include-an-angular-project-within-net-aspire.md) (2023-11-23; topics: .NET, Angular, Aspire): Learn how to add and configure your Angular application in a .NET Aspire Application Host. - [Testing Deferrable Views with Angular Testing Library](https://timdeschryver.dev/blog/testing-deferrable-views-with-angular-testing-library.md) (2023-11-16; topics: Angular Testing Library, Angular, Testing): Let's expore the new API's of Angular Testing Library (v14.5.0) to see how we can easily test deferrable views. - [Wolverine embraces Observability](https://timdeschryver.dev/blog/wolverine-embraces-observability.md) (2023-11-08; topics: Dotnet, Wolverine, OpenTelemetry): In this post, I'm showing how easy it is to enable the Observability features of Wolverine. This matters (a lot) because it gives us insights into the core of the application and its overall state. - [How to fully leverage Wolverine with its HTTP package](https://timdeschryver.dev/blog/how-to-fully-leverage-wolverine-with-its-http-package.md) (2023-10-26; topics: Dotnet, Wolverine, CQRS): Taking the next step to keep the architecture and the codebase simple with Wolverine. In this blog post, we'll take a look at the WolverineFx.HTTP package to make the interaction with HTTP requests easier. - [Wolverine is for the developers](https://timdeschryver.dev/blog/wolverine-is-for-the-developers.md) (2023-10-05; topics: .NET, CQRS, Wolverine): Keep your codebase simple by introducing Wolverine. As you'll notice in this blog post, Wolverine helps to reduce complexity and brings a lot of functionality without the hassle and the noise. - [Merging your Playwright sharded reports into a single HTML report](https://timdeschryver.dev/blog/merging-your-playwright-sharded-reports-into-a-single-html-report.md) (2023-09-18; topics: Playwright, Testing, CI/CD): Playwright v1.37 introduces a new `merge-reports` command. In this blog post we'll see how leverage this command to create a single test report from different sharded test reports. The result is one page containing all of your test results. - [Implementing a Feature Flag-based Endpoint Filter](https://timdeschryver.dev/blog/implementing-a-feature-flag-based-endpoint-filter.md) (2023-08-24; topics: Dotnet): Keep your Minimal API route handlers clean and compact by implementing a reusable feature flag-based endpoint filter. - [A cheat sheet to migrate from Moq to NSubstitute](https://timdeschryver.dev/blog/a-cheat-sheet-to-migrate-from-moq-to-nsubstitute.md) (2023-08-14; topics: DotNET, NSubstitute, Moq, Testing): A quick reference to help the migration from Moq to NSubstitute. - [How to globally register Injection Tokens within the Angular TestBed](https://timdeschryver.dev/blog/how-to-globally-register-injection-tokens-within-the-angular-testbed.md) (2023-08-07; topics: Angular, Jest, Testing): Provide global Injection Tokens within the Angular TestBed once to keep your test setups simple and DRY. - [Translating Exceptions into Problem Details Responses](https://timdeschryver.dev/blog/translating-exceptions-into-problem-details-responses.md) (2023-07-24; topics: .NET, ASP.NET, Problem Details): In this post, we'll take a look at the newly introduced IExceptionHandler in ASP.NET Core 8. We'll implement an exception handler that translates exceptions into Problem Details using the Problem Details Service. The result is a standardized and better experience for your API consumers. - [Entity framework features I wish I knew earlier](https://timdeschryver.dev/blog/entity-framework-features-i-wish-i-knew-earlier.md) (2023-07-12; topics: .NET, Entity Framework): Some useful built-in Entity Framework features that I discovered along the way. - [Configuring angular-auth-oidc-client with the new functional APIs](https://timdeschryver.dev/blog/configuring-angular-auth-oidc-client-with-the-new-functional-apis.md) (2023-07-03; topics: Angular, Security): Recently the angular-auth-oidc-client library (v16) introduced new APIs to configure the library in a functional way. In this blog post, I'll show you how to use them. - [Playwright API testing with zod](https://timdeschryver.dev/blog/playwright-api-testing-with-zod.md) (2023-06-26; topics: Playwright, Zod, Testing): In this post we'll create a custom Playwright matcher to validate the shape of the response body using the zod library. This way, we make sure that the contract between the front-end application and the API is valid. - [Treat your .NET Minimal API Endpoint as the application layer](https://timdeschryver.dev/blog/treat-your-net-minimal-api-endpoint-as-the-application-layer.md) (2023-06-14; topics: .NET, Architecture): Leverage the power of Minimal APIs to treat your endpoint as the application layer. This has several benefits, but I find the biggest one being the simplicity of it. - [How the new UI mode improves the Playwright experience](https://timdeschryver.dev/blog/how-the-new-ui-mode-improves-the-playwright-experience.md) (2023-05-30; topics: Playwright, Testing): I find that Playwright offers a great testing experience, and the new UI mode makes it even better. In this blog post, we'll take a look at the UI mode and see how it improves the overall experience. - [Refactor your .NET HTTP Clients to Typed HTTP Clients](https://timdeschryver.dev/blog/refactor-your-net-http-clients-to-typed-http-clients.md) (2023-05-23; topics: .NET, Refactor): A summary of why and how you should refactor your HTTP clients to the typed HTTP client version in .NET. - [Fixing Angular Standalone Components that have a circular dependency](https://timdeschryver.dev/blog/fixing-angular-standalone-components-that-have-a-circular-dependency.md) (2023-05-15; topics: Angular, Standalone Components): Luckily there's a function called `forwardRef` to solve a circular dependency between two Angular Standalone Components. A use case for this is a recursive component that renders its parent component. - [Prevent a Hangfire job from running when it is already active](https://timdeschryver.dev/blog/prevent-a-hangfire-job-from-running-when-it-is-already-active.md) (2023-05-03; topics: .NET, Hangfire): Concurrency in recurrent jobs can cause race condition issues. However, we can prevent such problems by queuing new jobs when the same job is still pending. This approach helps to manage the job execution and avoids issues that may arise when multiple instances of the same job are active at the same time. In this post we'll see how we can ensure that only one instance of the job is running at any given time, thus preventing conflicts and ensuring a reliable job execution. - [Let's make our SPA more secure by consuming a Duende BFF with Angular](https://timdeschryver.dev/blog/lets-make-our-spa-more-secure-by-consuming-a-duende-bff-with-angular.md) (2023-04-24; topics: Angular, BFF, Architecture, Auth0, Duende): Let's take a look at how shifting the auth responsibility from a front-end application to a Backend For Frontend (BFF) affects our Angular applications. - [The different retry APIs from Playwright](https://timdeschryver.dev/blog/the-different-retry-apis-from-playwright.md) (2023-04-17; topics: Testing, Playwright): You probably already know the built-in retry mechanism for locators and matchers, but are you already familiar with the retry and polling APIs? Let's take a look at the different retry APIs that Playwright has to offer, and when to use them. - [Let's make our SPA more secure by setting up a .NET BFF with Duende and Auth0](https://timdeschryver.dev/blog/lets-make-our-spa-more-secure-by-setting-up-a-net-bff-with-duende-and-auth0.md) (2023-04-11; topics: .NET, BFF, Architecture, Auth0, Duende): To improve the security of our Single Page Applications, let's ditch the access tokens in the browser and make the Backend for Frontend (BFF) responsible for the authentication process using the Authorization Code flow with PKCE. To achieve this, we'll use the Duende.BFF NuGet package and let it communicate with Auth0. - [Include attachments to your Playwright report](https://timdeschryver.dev/blog/include-attachments-to-your-playwright-report.md) (2023-03-28; topics: Playwright, Testing): To save us some time in the process to verify that a file is correct, let's automate the actions to download a file and add it to the Playwright test report for easy access. - [You can now return unmapped types from raw SQL select statements with Entity Framework 8](https://timdeschryver.dev/blog/you-can-now-return-unmapped-types-from-raw-sql-select-statements-with-entity-framework-8.md) (2023-03-21; topics: .NET, Entity Framework, SQL): Entity Framework 8 brings a new feature allowing us to execute and return unmapped types from SQL select statements. In this blog post we'll take a quick look at how we can accomplish this, and why this is an important tool to have in your toolkit. - [Create and run Playwright test sets using tags and grep](https://timdeschryver.dev/blog/create-and-run-playwright-test-sets-using-tags-and-grep.md) (2023-03-13; topics: Testing, Playwright, CI/CD): At some point in time you'll want to run a subset of your tests. Organizing your tests with Playwright test tags helps you to do this in a clean way. Using tags allows you to target specific tests in specific scenarios, and can help to scale your pipeline(s). - [Revamped: Authentication with Playwright](https://timdeschryver.dev/blog/revamped-authentication-with-playwright.md) (2023-03-06; topics: Playwright, Testing): Playwright (v1.31) introduces a new feature to make the authentication process easier. This approach unifies the authentication flow with the rest of the test cases, and more importantly makes it possible to test with different user roles. - [Angular standalone components and Angular Testing Library make component tests easier](https://timdeschryver.dev/blog/angular-standalone-components-and-angular-testing-library-make-component-tests-easier.md) (2023-02-27; topics: Angular Testing Library, Angular, Testing): Standalone components give you a better foundation to build on, as your Angular component becomes less affected by its internals. It doesn't matter if the component has its own template, or if it's using child components. This makes your test cases less brittle than before with Angular Modules. To interact with the component we're still using the Angular Testing Library because it provides useful utilities to interact and query the component. - [Invoke the Azure DevOps API from within your Azure DevOps pipeline](https://timdeschryver.dev/blog/invoke-the-azure-devops-api-from-within-your-azure-devops-pipeline.md) (2023-02-20; topics: Azure DevOps): Using the Azure DevOps API to automatically add reviewers to an Azure DevOp Pull Request from within the CI pipeline. - [Get easy access to Angular route and query parameters with zod](https://timdeschryver.dev/blog/get-easy-access-to-angular-route-and-query-parameters-with-zod.md) (2023-02-13; topics: Angular, Zod): Using zod's coerse method to easily access route and query parameters in Angular. - [I tried the Angular Standalone migration, and here is the result](https://timdeschryver.dev/blog/i-tried-the-angular-standalone-migration-and-here-is-the-result.md) (2023-02-06; topics: Angular): Let's migrate an Angular application using @NgModules to the standalone API. For this task, we use the automatic schematic that's available in Angular v15.2.0-next.2. We also take a look at the manual steps that are required to fully migrate the application to use the new functional APIs. - [Improve your test experience with Playwright Soft Assertions](https://timdeschryver.dev/blog/improve-your-test-experience-with-playwright-soft-assertions.md) (2023-01-30; topics: Playwright, Testing): Take advantage of soft assertions in Playwright to improve your test experience and reduce the amount of time spent on fixing bugs. Soft assertions allow that multiple assertions can fail in a single test, rather than stopping the test execution after the first failure. - [Adding OpenTelemetry to an Angular Application](https://timdeschryver.dev/blog/adding-opentelemetry-to-an-angular-application.md) (2023-01-23; topics: Angular, OpenTelemetry, DevOps): How to register the OpenTelemetry web packages to automatically create traces and send them to a backend. The result is a helpful dashboard containing insights about the Angular application. - [Consuming SQL Functions with Entity Framework](https://timdeschryver.dev/blog/consuming-sql-functions-with-entity-framework.md) (2023-01-09; topics: .NET, SQL, Entity Framework): Using DbFunctions is a method to use database-specific functions in your Entity Framework queries. They allow you to take advantage of features that are specific to a particular database provider, such as SQL Server and use them in your Entity Framework queries in a provider-agnostic way. As an example, let's use the SOUNDEX SQL function. - [Using Angular Testing Library with Test Harnesses](https://timdeschryver.dev/blog/using-angular-testing-library-with-test-harnesses.md) (2022-12-19; topics: Angular, Testing, Angular Testing Library): In most cases, I write tests for Angular components without using Test Harnesses, but finding the correct element(s) is not always straightforward. Here, Test Harnesses play a part in easily finding and interacting with those components that can't be queried. Using Test Harnesses is also a good practice into keeping your tests readable and resilient to changes. - [Intercepting HTTP Requests with Playwright](https://timdeschryver.dev/blog/intercepting-http-requests-with-playwright.md) (2022-11-29; topics: Playwright, Testing): Intercepting HTTP requests is a useful feature, let's take a look at how you can intercept an HTTP request with Playwright and discuss some of the possibilities. - [Assertion Scopes, the one FluentAssertions feature you didn't know you needed](https://timdeschryver.dev/blog/assertion-scopes-the-one-fluentassertions-feature-you-didnt-know-you-needed.md) (2022-11-15; topics: .NET, Testing): A simple trick to increase your productivity and testing experience. - [You should take advantage of the improved NgRx APIs](https://timdeschryver.dev/blog/you-should-take-advantage-of-the-improved-ngrx-apis.md) (2022-11-09; topics: NgRx, Angular, State): NgRx isn't what it used to be. Take advantage of the updated APIs to improve your code base. The result is a more maintainable code base that is easier to read and navigate. - [Playwright in an Azure DevOps Pipeline](https://timdeschryver.dev/blog/playwright-in-an-azure-devops-pipeline.md) (2022-11-01; topics: Azure DevOps, Playwright, DevOps, Testing): Creating a pipeline to run TypeScript Playwright tests in Azure DevOps. - [Testing localization with Playwright](https://timdeschryver.dev/blog/testing-localization-with-playwright.md) (2022-10-24; topics: Playwright, Testing): Testing your translation logic and localization with Playwright - [How to disable githooks in an Azure DevOps YAML Pipeline](https://timdeschryver.dev/blog/how-to-disable-githooks-in-an-azure-devops-yaml-pipeline.md) (2022-10-07; topics: Azure DevOps, Git): How to disable githooks in an Azure DevOps YAML Pipeline - [Watch out what you expose with Angular Interceptors](https://timdeschryver.dev/blog/watch-out-what-you-expose-with-angular-interceptors.md) (2022-09-28; topics: Angular, Security): Your Angular Interceptor might leak sensitive data to the outside world. Here's how to prevent that. - [Using Geolocation in Playwright tests](https://timdeschryver.dev/blog/using-geolocation-in-playwright-tests.md) (2022-09-26; topics: Playwright, Testing, TypeScript): Before the application gets access to the location of the user, the user receives a prompt asking for permission to share their location. This is not different in Playwright tests. In this blog post, we see how to handle this prompt for your Playwright tests. - [Using zod-fixture with MSW to generate mocked API responses](https://timdeschryver.dev/blog/using-zod-fixture-with-msw-to-generate-mocked-api-responses.md) (2022-09-13; topics: Zod, MSW, TypeScript, Testing): Did you know that you could quickly set up a mocked API with the use of zod-fixture and MSW? - [How zod-fixture can help with your test setups](https://timdeschryver.dev/blog/how-zod-fixture-can-help-with-your-test-setups.md) (2022-09-05; topics: Zod, Testing, TypeScript): Don't waste your energy and time by manually creating test fixtures, use zod-fixture to make this process a breeze. - [Keep your Playwright tests structured with steps](https://timdeschryver.dev/blog/keep-your-playwright-tests-structured-with-steps.md) (2022-08-22; topics: Playwright, Testing): Leverage the Playwright test.step function to divide your tests into logical steps. These steps create a well-organized summary in the Playwright report and have the benefit that tests become more readable and easier to maintain, especially when a failed test is displayed in the Playwright report. - [New in Entity Framework 7: Bulk Operations with ExecuteDelete and ExecuteUpdate](https://timdeschryver.dev/blog/new-in-entity-framework-7-bulk-operations-with-executedelete-and-executeupdate.md) (2022-08-16; topics: .NET, Entity framework, Sql): Exploring the new `ExecuteDelete` and `ExecuteUpdate` methods that were introduced in Entity Framework. - [Using an Azure DevOps Pull Request Template to remind your team about the Definition of Done](https://timdeschryver.dev/blog/using-an-azure-devops-pull-request-template-to-remind-your-team-about-the-definition-of-done.md) (2022-08-12; topics: Azure DevOps, Team): Making the team aware of the Definition of Done each time a Pull Request is created. - [How to upload files with Playwright](https://timdeschryver.dev/blog/how-to-upload-files-with-playwright.md) (2022-08-02; topics: Testing, Playwright): Uploading files with Playwright is easy! - [Get access to the deployed Azure Static Webb App URL within your GitHub Workflow](https://timdeschryver.dev/blog/get-access-to-the-deployed-azure-static-web-app-url-within-your-github-workflow.md) (2022-07-27; topics: Azure Static Web App, Azure, Playwright, GitHub Actions): How to run your Playwright tests against your Azure Static Web App preview environment, which is build and deployed with the Azure/static-web-apps-deploy GitHub Action. - [Exploring the new output caching middleware](https://timdeschryver.dev/blog/exploring-the-new-output-caching-middleware.md) (2022-07-18; topics: .NET, ASP.NET, API): Taking a closer look at the capability of the new output caching middleware in .NET 7 - [Why we should verify HTTP response bodies, and why we should use zod for this](https://timdeschryver.dev/blog/why-we-should-verify-http-response-bodies-and-why-we-should-use-zod-for-this.md) (2022-07-04; topics: Angular, Libraries, Zod): Let's explore zod together and see it can be useful to create a safer enviroment by parsing HTTP response bodies. - [.NET Debugging Tips](https://timdeschryver.dev/blog/dotnet-debugging-tips.md) (2022-06-30; topics: .NET, Visual Studio, Rider): A collection of tips for debugging .NET applications. - [Enable shell scripts for the JetBrains Toolbox App](https://timdeschryver.dev/blog/enable-shell-scripts-for-the-jetbrains-toolbox-app.md) (2022-06-24; topics: JetBrains, Windows): How to open your JetBrains IDEs that are installed via the JetBrains Toolbox directly from the command line. - [Feature Flags in .NET, from simple to more advanced](https://timdeschryver.dev/blog/feature-flags-in-net-from-simple-to-more-advanced.md) (2022-06-21; topics: .NET, Azure): Let's implement a naive feature flag, refactor the code with the .NET Feature Management API, and to top things off, the Azure Feature Management Feature is thrown into the mix to tweak the feature flags dynamically without having an impact on the users. - [Specify your Node.js version for the Azure Static Web App GitHub Action](https://timdeschryver.dev/blog/specify-your-nodejs-version-for-the-azure-static-web-app-github-action.md) (2022-06-03; topics: GitHub Actions, DevOps, Azure): Learn how to specify the Node.js version for the Azure/static-web-apps-deploy GitHub action. - [Tye, starting and running multiple APIs with a single command](https://timdeschryver.dev/blog/tye-starting-and-running-multiple-apis-with-a-single-command.md) (2022-05-30; topics: .NET, Angular, DeveloperExperience, Tye): Using Tye to run your local development environment. - [Using Playwright test shards in combination with a job matrix to improve your CI speed](https://timdeschryver.dev/blog/using-playwright-test-shards-in-combination-with-a-job-matrix-to-improve-your-ci-speed.md) (2022-05-23; topics: DevOps, CI/CD, Playwright, GitHub Actions, Testing): Utilizing a matrix within your GitHub workflow to create a "test shard matrix" is a major improvement to your CI. This practice can cut the time in half (or better) to run your Playwright test suite. - [How to stay up-to-date](https://timdeschryver.dev/blog/how-to-stay-up-to-date.md) (2022-05-03; topics: Advice, Career, Growth): Continuous learning is an essential part of your career, let's take a look at how you can do your best to keep growing. - [Directory.Packages.props, a solution to unify your NuGet package versions](https://timdeschryver.dev/blog/directorypackagesprops-a-solution-to-unify-your-nuget-package-versions.md) (2022-04-18; topics: .NET, Csharp, NuGet): The Consolidate view is dead, long live `Directory.Packages.props`. Use the `Directory.Packages.props` file to define your NuGet package versions in a single file. - [Proof of concept: ngx-query-state](https://timdeschryver.dev/blog/proof-of-concept-ngx-query-state.md) (2022-04-04; topics: Angular, State): A hassle-free way to fetch data and render the current state of the HTTP request. - [Flush state with an NgRx meta-reducer](https://timdeschryver.dev/blog/ngrx-flush-state.md) (2022-03-29; topics: NgRx, Angular): A snippet on how to remove a specific slice within the NgRx state object. - [Trying out OData for the first time](https://timdeschryver.dev/blog/trying-out-odata-for-the-first-time.md) (2022-03-21; topics: .NET, OData, Csharp): What advantages does OData bring and why should we use it? - [Fast and easy authentication with Playwright](https://timdeschryver.dev/blog/fast-and-easy-authentication-with-playwright.md) (2022-03-14; topics: Playwright, Testing): Using the global setup feature from Playwright to authenticate a test user and reuse its authentication state throughout your test suite. - [Use Angular directives to extend components that you don't own](https://timdeschryver.dev/blog/use-angular-directives-to-extend-components-that-you-dont-own.md) (2022-03-07; topics: Angular): Angular directives allow us to extend components without changing their internal code. This is useful to bring a consistent UX to 3rd party components. The directive can be configured to always be applicable, or can be used in an opt-in or opt-out basis. - [Writing your first Playwright test](https://timdeschryver.dev/blog/writing-your-first-playwright-test.md) (2022-03-01; topics: Playwright, Testing, Angular): Setting up playwright and "writing" a first test only takes a few minutes! - [TIL params inheritance strategy to always have access to parent route info](https://timdeschryver.dev/blog/til-paramsinheritancestrategy-to-always-have-access-to-parent-route-info.md) (2022-02-22; topics: Angular, TIL): Configure the Angular router to always have access to the parent route data from within the child route. - [Be proactive when you join an Angular project](https://timdeschryver.dev/blog/be-proactive-when-you-join-an-angular-project.md) (2022-02-15; topics: Angular): Tips to help improve the shape of an older Angular codebase. - [Single Component Angular Modules and Component Tests go hand in hand](https://timdeschryver.dev/blog/single-component-angular-modules-and-component-tests-go-hand-in-hand.md) (2022-01-31; topics: Angular, Testing, Angular Testing Library): Say no to brittle tests with SCAMs - [Writing a performant client-side filter with \[hidden\] and trackBy](https://timdeschryver.dev/blog/writing-a-performant-client-side-filter-with-hidden-and-trackby.md) (2022-01-24; topics: Angular, Performance): Creating a better user experience with the hidden benefit of the hidden attribute. - [How I've set up my new Windows development environment in 2022](https://timdeschryver.dev/blog/how-i-have-set-up-my-new-windows-development-environment-in-2022.md) (2022-01-11; topics: Windows, .NET, Angular): Configuring a new Windows machine with ease for full-stack .NET and Angular development - [Configuring Azure Application Insights in an Angular application](https://timdeschryver.dev/blog/configuring-azure-application-insights-in-an-angular-application.md) (2021-12-22; topics: Angular, Azure, Application Insights): Creating a wrapper around the Application Insights SDK to easily consume it in an Angular application - [Testing an NgRx project](https://timdeschryver.dev/blog/testing-an-ngrx-project.md) (2021-11-17; topics: Angular, NgRx, Testing): How write maintainable NgRx tests within an Angular application - [Stop misusing TypeScript type assertions](https://timdeschryver.dev/blog/stop-misusing-typescript-type-assertions.md) (2021-10-18; topics: TypeScript): Don't create a false sense of security by overusing type assertions, instead use type annotations and return types. - [Refactor Functional Tests to support Minimal Web APIs](https://timdeschryver.dev/blog/refactor-functional-tests-to-support-minimal-web-apis.md) (2021-10-11; topics: .NET, Csharp, Testing, Minimal api): Some small changes that are needed to create application instances in Functional Tests for Minimal Web APIs - [The simplicity of ASP.NET Endpoints](https://timdeschryver.dev/blog/the-simplicity-of-net-endpoints.md) (2021-10-05; topics: .NET, Csharp, Architecture): Keepings it simple with ASP.NET Endpoints and its dependency system - [Maybe it's time to rethink our project structure with .NET 6](https://timdeschryver.dev/blog/maybe-its-time-to-rethink-our-project-structure-with-dot-net-6.md) (2021-09-27; topics: .NET, Architecture, Csharp, Minimal api): Challenging the status quo with some thoughts on the new .NET Minimal Web API to keep code simple - [Pattern Matching Examples in C#](https://timdeschryver.dev/blog/pattern-matching-examples-in-csharp.md) (2021-09-13; topics: .NET, Csharp, Pattern-matching): Some basic and more advanced examples of pattern matching in C#. - [Building incremental views with XState Parallel States](https://timdeschryver.dev/blog/building-incremental-views-with-xstate-parallel-states.md) (2021-08-24; topics: Xstate, Angular, State): How to load data from different sources without blocking the UI - [Solving Angular slow renders with NgRx selectors](https://timdeschryver.dev/blog/solving-angular-slow-renders-with-ngrx-selectors.md) (2021-08-15; topics: Angular, Performance): Prepare your (view)models before they reach the component to make them faster and easier to render. - [Using the .NET CLI to restore packages from a private NuGet feed](https://timdeschryver.dev/blog/using-the-net-cli-to-restore-packages-from-a-private-nuget-feed.md) (2021-07-25; topics: .NET, Cli, NuGet): A fix for "Response status code does not indicate success: 401 (Unauthorized)" - [Reduce memory usage of .NET services on a single machine](https://timdeschryver.dev/blog/reduce-memory-usage-of-net-services-on-a-single-machine.md) (2021-07-22; topics: .net, Infra): A snippet on how to configure your project to reduce its memory consumption when multiple services are hosted on one server. - [Prevent a .NET API from adding cache headers to unsuccessful requests](https://timdeschryver.dev/blog/prevent-a-net-api-from-adding-cache-headers-to-unsuccessful-requests.md) (2021-07-19; topics: .NET, Csharp, Api): Implementing custom cache middleware to prevent non-200 responses from being cached by a client - [Getting the most value out of your Angular Component Tests](https://timdeschryver.dev/blog/getting-the-most-value-out-of-your-angular-component-tests.md) (2021-07-06; topics: Angular, Testing, Angular Testing Library): How I write my Angular Component Tests with the Angular Testing Library. - [Why I stopped worrying about test setups by using AutoFixture](https://timdeschryver.dev/blog/why-i-stopped-worrying-about-test-setups-by-using-autofixture.md) (2021-06-21; topics: .NET, Testing, Architecture): A model is always changing, but that shouldn't be the concern of your tests - [How to patch an HTTP Response with Cypress](https://timdeschryver.dev/blog/how-to-patch-an-http-response-with-cypress.md) (2021-06-08; topics: Testing, Cypress): A brief post on how to patch a part of an incoming HTTP response - [How to set up a dynamic CI/CD pipeline with GitHub Actions](https://timdeschryver.dev/blog/how-to-set-up-a-dynamic-ci-cd-pipeline-with-github-actions.md) (2021-05-25; topics: DevOps, CICD, GitHub): Learn how to create a single workflow that runs on multiple environments with conditional steps - [Automagically optimize your images with Squoosh](https://timdeschryver.dev/blog/automagically-optimize-your-images-with-squoosh.md) (2021-05-17; topics: Blog, Tools, Optimization, Node): Minify images as a pre-commit step with Squoosh, husky, and lint-staged - [Environment variables with SvelteKit](https://timdeschryver.dev/blog/environment-variables-with-sveltekit.md) (2021-04-26; topics: Svelte, SvelteKit, Environment Variables): A simple workaround to use environment variables in SvelteKit - [A generic Angular template-driven validator](https://timdeschryver.dev/blog/a-generic-angular-template-driven-validator.md) (2021-04-14; topics: Angular, Forms, Template Driven): One validator to rule them all - [A practical guide to Angular Template-Driven Forms](https://timdeschryver.dev/blog/a-practical-guide-to-angular-template-driven-forms.md) (2021-03-10; topics: Angular, Guide, Forms, Template Driven): The things I looked up while learning the template-driven way - [A new way to validate Angular Forms](https://timdeschryver.dev/blog/a-new-way-to-validate-angular-forms.md) (2021-02-25; topics: Angular, Forms, Architecture): Adding a layer on top of the Angular Forms API to declare useful and readable form validators - [Argument of type 'interface' is not assignable to parameter of type 'interface'](https://timdeschryver.dev/blog/argument-of-type-interface-is-not-assignable-to-parameter-of-type-interface.md) (2021-02-09; topics: TypeScript): A peculiar TypeScript error at compile time and how to solve it - [Creating a new C# API: Validate incoming requests](https://timdeschryver.dev/blog/creating-a-new-csharp-api-validate-incoming-requests.md) (2021-01-22; topics: .NET, Csharp, Architecture, Api): Clean validation with MediatR, FluentValidation and the Problem Detail specification - [Faster SQL Bulk Inserts With C#](https://timdeschryver.dev/blog/faster-sql-bulk-inserts-with-csharp.md) (2021-01-06; topics: .NET, Sql, Performance): Using SQL Bulk Copy to have a huge performance gain - [Preload lazy-loaded modules based on user roles](https://timdeschryver.dev/blog/preload-lazy-loaded-modules-based-on-user-roles.md) (2020-11-30; topics: Angular, Performance): Let's create a custom Angular preload strategy that loads all modules for the authenticated user - [Nested NgRx Entity State](https://timdeschryver.dev/blog/nested-ngrx-entity-state.md) (2020-11-16; topics: NgRx, Angular, State): How to manage nested state with multiple NgRx entity adapters. - [Process your list in parallel to make it faster in .NET](https://timdeschryver.dev/blog/process-your-list-in-parallel-to-make-it-faster-in-dotnet.md) (2020-11-02; topics: .NET, Csharp, Performance): Lessons learned while refactoring a process to make a migration from one system to another system faster - [Auto-focus a form control with an Angular directive](https://timdeschryver.dev/blog/auto-focus-a-form-control-with-an-angular-directive.md) (2020-10-19; topics: Angular): Give auto-focus to form controls with just a few lines of code - [How to make your Azure DevOps CI/CD pipeline faster](https://timdeschryver.dev/blog/how-to-make-your-azure-devops-ci-cd-pipeline-faster.md) (2020-10-12; topics: DevOps, CI/CD, DeveloperExperience, Azure): Make your CI/CD pipeline smarter and only build (and release) what's modified to optimize a run - [Finding that C# memory leak](https://timdeschryver.dev/blog/finding-that-csharp-memory-leak.md) (2020-09-21; topics: Csharp, Performance, Debug, .NET): Tracking the cause of my first memory leak written in C# (that I know of) - [The benefits of adding rx-query to your Angular project](https://timdeschryver.dev/blog/the-benefits-of-adding-rx-query-to-your-angular-project.md) (2020-09-07; topics: RxJS, Angular, State): Highlighting the functional and technical advantages by using rx-query - [Making your application feel faster by prefetching data with NgRx](https://timdeschryver.dev/blog/making-your-application-feel-faster-by-prefetching-data-with-ngrx.md) (2020-08-31; topics: NgRx, Performance, Angular): Utilize the NgRx Global Store cache to persist data before it's shown - [Getting to know SQL Server Extended Events](https://timdeschryver.dev/blog/getting-to-know-sql-server-extended-events.md) (2020-08-17; topics: SQL, Performance, Profiling): How to convert your SQL Profiler template to an XEvent template. - [SQL Server Profiler, underused and undervalued](https://timdeschryver.dev/blog/sql-server-profiler-underused-and-undervalued.md) (2020-08-11; topics: SQL, Performance, Profiling): How to use the SQL Server Profiler as a utility knife to get a better understanding of your system. - [A use case for the RxJS expand operator](https://timdeschryver.dev/blog/a-use-case-for-the-rxjs-expand-operator.md) (2020-07-27; topics: RxJS, Rx-query): How I used the expand operator to create a retry functionality in rx-query. - [Show stacktrace when dotnet core API doesn't start](https://timdeschryver.dev/blog/show-stacktrace-when-dotnet-core-api-doesnt-start.md) (2020-07-22; topics: .NET, Debugging): A snippet on how to get a stacktrace when a .NET Api fails to start. - [Testing RxJS streams with rxjs-for-await](https://timdeschryver.dev/blog/testing-rxjs-streams-with-rxjs-for-await.md) (2020-07-21; topics: Testing, Rxjs, Rx-query): How does rxjs-for-await compare to other approaches when it comes to testing RxJS streams, and what I like about these tests. - [Using MSW (Mock Service Worker) in an Angular project](https://timdeschryver.dev/blog/using-msw-in-an-angular-project.md) (2020-06-15; topics: Angular, Testing, TypeScript): Using MSW to mock your server in an Angular project - [Why writing integration tests on a C# API is a productivity booster](https://timdeschryver.dev/blog/why-writing-integration-tests-on-a-csharp-api-is-a-productivity-booster.md) (2020-06-08; topics: .NET, Csharp, Testing): Time-consuming tasks that can be prevented with integration tests. - [Making sure you're using the correct query](https://timdeschryver.dev/blog/making-sure-youre-using-the-correct-query.md) (2020-06-01; topics: Testing, Angular Testing Library, Accessibility): Keeping your Angular Testing Library tests maintainable by using its new features. - [Polling with a NgRx Effect](https://timdeschryver.dev/blog/polling-with-a-ngrx-effect.md) (2020-05-25; topics: NgRx, Angular): A snippet on how to poll a service by using a NgRx Effect. - [Consistency over motivation](https://timdeschryver.dev/blog/consistency-over-motivation.md) (2020-05-25; topics: Personal, Productivity): Eliminate motivation as a factor to get things done, find your rhythm, and just (start to) do. - [The initial developer experience while trying out Deno for the first time](https://timdeschryver.dev/blog/the-initial-developer-experience-while-trying-out-deno-for-the-first-time.md) (2020-05-18; topics: Deno, TypeScript): Some notes from my first experience with Deno while writing a minimal API server. - [Don't commit focused tests](https://timdeschryver.dev/blog/dont-commit-focused-tests.md) (2020-05-10; topics: Linters, DeveloperExperience, Tooling, ContinuousIntegration): Prevent an accidental commit by using a linter. - [TIL: URLSearchParams](https://timdeschryver.dev/blog/til-urlsearchparams.md) (2020-05-03; topics: TIL, JavaScript): From my experience dealing with query strings was harder than it should be. But with URLSearchParams and URL it's actually pretty easy to do! - [An experiment, using the global NgRx Store as a local store](https://timdeschryver.dev/blog/an-experiment-using-the-global-ngrx-store-as-a-local-store.md) (2020-04-27; topics: Angular, NgRx, State): Getting to know the internals of NgRx to make a local component store happen. - [I like my components big](https://timdeschryver.dev/blog/i-like-my-components-big.md) (2020-04-20; topics: Angular, Architecture): Creating sub-components comes with a cost. So what do I think of before creating a new component, because if a component passes the x lines of code isn't a valid reason. - [The difference between the canActivate and canActivateChild guards](https://timdeschryver.dev/blog/the-difference-between-the-canactivate-and-canactivatechild-guards.md) (2020-04-13; topics: Angular, Router): How do the canActivate and canActivateChild guards work in Angular and how to these guards compare? - [Migrating a TSLint Rule to ESLint with @typescript-eslint](https://timdeschryver.dev/blog/migrating-a-tslint-rule-to-eslint-with-typescript-eslint.md) (2020-04-06; topics: Linters, Developer Experience, Tooling, TypeScript): The most important pointers you need to know before migrating your TSLint rules to ESLint rules. - [How to not create your RxJS Observables](https://timdeschryver.dev/blog/how-to-not-create-your-rxjs-observables.md) (2020-03-30; topics: Rxjs, NgRx, TypeScript, Angular): Do not reassign an Observable, instead wrap it in another Observable. - [How to test your C# Web API](https://timdeschryver.dev/blog/how-to-test-your-csharp-web-api.md) (2020-03-23; topics: .NET, Csharp, Testing, Xunit): How to use functional testing to have confidence in the code you ship. - [Generated tests with XState and Cypress](https://timdeschryver.dev/blog/generated-tests-with-xstate-and-cypress.md) (2020-03-16; topics: Cypress, Testing, XState, Cypress-testing-library): Let's explore how we can stop writing tests and at the same time be more confident in the code we write. We do this by using the new XState test package, in combination with Cypress and Testing Library. - [Make your C# applications faster with LINQ joins](https://timdeschryver.dev/blog/make-your-csharp-applications-faster-with-linq-joins.md) (2020-03-09; topics: .NET, Csharp, LINQ, Performance): If you don't watch out your C# application might suddenly perform badly. As a solution, we can limit the number of operations with a LINQ Join. - [Setting up Cypress with axe for accessibility](https://timdeschryver.dev/blog/setting-up-cypress-with-axe-for-accessibility.md) (2020-03-02; topics: Cypress, Testing, A11y): Having an accessible website is important. With the combination of Cypress and axe you can verify that your website is accessible, with only 2 extra lines of code. - [Flagged enum, why and how](https://timdeschryver.dev/blog/flagged-enum-what-why-and-how.md) (2020-02-24; topics: Angular, TypeScript): Let's take a look at what a flagged enum is and when these can be handy - [Unlocking reactivity with Svelte and RxJS](https://timdeschryver.dev/blog/unlocking-reactivity-with-svelte-and-rxjs.md) (2020-02-17; topics: Svelte, RxJS, Reactive, JavaScript): I keep being surprised by how reactive Svelte feels. In this article, we take a glance at the Svelte internals to see how Svelte accomplishes this. This is important if we want to use RxJS in Svelte. - [Help Angular to make your application faster](https://timdeschryver.dev/blog/help-angular-to-make-your-application-faster.md) (2020-02-03; topics: Angular, Performance, NgRx): Learn what we did to make our Angular application snappier. - [Destructure an object to remove a property](https://timdeschryver.dev/blog/destructure-an-object-to-remove-a-property.md) (2020-01-28; topics: Javascript): A snippet on use destructuring to remove a property from an object in an immutable way. - [How to test Svelte components](https://timdeschryver.dev/blog/how-to-test-svelte-components.md) (2020-01-26; topics: Svelte, Testing, Tutorial, Testing-library, Svelte-testing-library): Writing Svelte component tests with the Svelte Testing Library is simple. Let's take a look at the setup to get you started! - [Print CSS with Angular](https://timdeschryver.dev/blog/print-css-with-angular.md) (2020-01-19; topics: Print CSS, Angular, CSS): If you're using Angular, there's a good chance that you're using a component-based architecture. We can use this architecture to our advantage. Instead of creating one big print stylesheet with some selectors, which becomes unmanageable complex when you have to support multiple printable pages. We can move some of the layout back to the components. - [NgRx creator functions 101](https://timdeschryver.dev/blog/ngrx-creator-functions-101.md) (2020-01-13; topics: Angular, NgRx, State, Creator functions): The createAction creator function opened opportunities in the NgRx world. With it came two other creator functions, createReducer and createEffect. Let's take a look at what's so special about it and why it's important. - [Managing different slices of the same NgRx state](https://timdeschryver.dev/blog/managing-different-slices-of-the-same-ngrx-state.md) (2020-01-06; topics: Angular, NgRx, Effects, State): In this article, we'll iterate over an implementation to introduce multiple independent instances of a NgRx store slice. In an application, these instances can be represented by a tab-like interface. To come to a solution we'll use the Angular Router, NgRx Effects, and NgRx Router Store. We'll also see meta-reducers, helper reducer functions, and smart and dumb components. - [Multiple service calls from an Effect](https://timdeschryver.dev/blog/multiple-service-calls-from-an-effect.md) (2019-12-18; topics: NgRx, Angular): A snippet on how to invoke multiple service calls within a single NgRx Effect. - [Google Maps is now an Angular component](https://timdeschryver.dev/blog/google-maps-as-an-angular-component.md) (2019-11-03; topics: Angular, Material, Component, Google Maps): The Angular Component pearl-lullaby (v9.0.0-rc.0) release introduces the second official @angular/component component, a Google Maps component. In this post, we take a look at getting started with the Google Maps component. - [Use the new Angular Clipboard CDK to interact with the clipboard](https://timdeschryver.dev/blog/use-the-new-angular-clipboard-cdk-to-interact-with-the-clipboard.md) (2019-10-28; topics: Angular, Material, CDK, Clipboard): The new Angular Material release brings us a new CDK clipboard module to interact with the clipboard. In this post, we'll explore how to use the new Clipboard CDK by going over some examples. - [Reseed your database with Cypress](https://timdeschryver.dev/blog/reseed-your-database-with-cypress.md) (2019-10-14; topics: Cypress, Testing, Reseed, Database, DevOps): By using a Cypress task it's possible to run code JavaScript code in Node.js. We can leverage this API to reseed a database with data we're in control of. Having control over the data allows us to write specific and isolated scenarios to run tests against. - [Good testing practices with 🦔 Angular Testing Library](https://timdeschryver.dev/blog/good-testing-practices-with-angular-testing-library.md) (2019-10-03; topics: Angular, Testing, Angular Testing Library): The Angular Testing Library provides utility functions to interact with Angular components, in the same way as a user would. This brings more maintainability to our tests, gives us more confidence that our component does what it's supposed to do, and it improves the accessibility which is better for our users. All these benefits, plus you'll see that it's fun to write tests in this way. - [Guarding your Angular modules 💂‍](https://timdeschryver.dev/blog/guarding-your-angular-modules.md) (2019-09-16; topics: Angular, ForRoot, NgModule, Module): A lot of Angular modules need to be imported with a static forRoot() function, via this function it allows us to configure the module. But sometimes we make the mistake to use the forRoot function more than once throughout an application. We might not notice it when this happens but often it is the cause of unexpected behavior, which is sadly hard to debug. In this post, we'll look into a solution. - [A little trick with Angular forms and directives 🃏](https://timdeschryver.dev/blog/a-little-trick-with-angular-forms-and-directives.md) (2019-07-29; topics: Angular, Forms, Directive): Imagine having a form that you want to use at multiple places inside your application. The form will have the same layout but the validation will be different. In our case, this form is used in a procedure and in each step of the procedure the form gets more restrictive. Can you keep it DRY? We had this problem and came up with the following solution. - [My love letter to XState and statecharts ♥](https://timdeschryver.dev/blog/my-love-letter-to-xstate-and-statecharts.md) (2019-07-08; topics: Angular, React, Vue, Svelte, XState, State): I discovered XState a year ago, I already had encountered state machines and statecharts before but I missed the point. Now a year further, I'm here to tell you that these are worth looking into and that XState is a the library to get you started. For me, the most important points to use XState or statecharts would be that it's declarative and explicit, it's hard to create invalid state. The nice extra's that you get with it, is the tooling around it and the portability across frameworks. - [Don't miss out on css variables](https://timdeschryver.dev/blog/do-not-miss-out-on-css-variables.md) (2019-07-01; topics: Webdev, Css, Javascript, Css variables): At first when I heard of css variables, I was a bit skeptical. Why would anyone use it if there are extension languages as scss, sass, less and stylus. After several years, I stated to notice more and more peoples using it, writing about it and talking about it. I was missing out on something... After a while of using it, I was hooked. - [Writing a dev.to blog post with VSCode](https://timdeschryver.dev/blog/writing-a-devto-blog-post-with-vscode.md) (2019-06-12; topics: Vscode, Writing, Showdev, Blogging): Writing and publishing a dev.to blog post directly within VSCode - [Reading Code Coverage](https://timdeschryver.dev/blog/reading-code-coverage.md) (2019-06-02; topics: JavaScript, Beginners, Testing, Webdev): An intro to code coverage, how to read it, and how to make use of it in your workflow. - [Build once deploy to multiple environments 🚀](https://timdeschryver.dev/blog/angular-build-once-deploy-to-multiple-environments.md) (2019-05-20; topics: Angular, DevOps, CI/CD): In our quest to build a twelve-factor app where we build once and deploy to multiple environment we encountered some problems, but we managed to solve them. Read here how we did it. - [Jump start your developer career with these 13 tips](https://timdeschryver.dev/blog/jump-start-your-developer-career-with-these-13-tips.md) (2019-05-14; topics: Career, Level-up, Development, Productivity): I believe that to become a better engineer it all comes down to practice, practice and more practice. Especially when you just started your career. The problem is that when you're just getting started, there is much more to it than just writing lines of code. - [Working with Angular forms in an enterprise environment](https://timdeschryver.dev/blog/working-with-angular-forms-in-an-enterprise-environment.md) (2019-04-23; topics: Angular, Forms, Enterprise, Angular Forms, Reactive Forms): At our company, we struggled with Angular Forms at the start. This is because we dived in head first, without talking about how we would want to use it throughout our projects. This post shows how we're currently using Angular Forms to be more productive. - [Social media cards with Vue and Gridsome](https://timdeschryver.dev/blog/gridsome-social-cards.md) (2019-04-15; topics: Vue, Gridsome, Social Media, Cards): It's easy to create metadata tags with Gridsome, I was so happy with it that I wanted to write this post 😃. There is also a page in the docs on how to create metadata tags, but let's translate the theory into a real world example. - [Common and easy-to-make mistakes when you’re new to NgRx](https://timdeschryver.dev/blog/common-and-easy-to-make-mistakes-when-youre-new-to-ngrx.md) (2019-03-04; topics: NgRx, Redux, Angular): Writing and refactoring FizzBuzz in NgRx with maintainability in mind - [Bending TSLint to your needs](https://timdeschryver.dev/blog/bending-tslint-to-your-needs.md) (2019-01-10; topics: TypeScript, TSLint, RxJS): Using the power of TSLint in an unconventional way to create rxjs-operator-counter. - [Keeping browser tabs in sync using localStorage, NgRx, and RxJS](https://timdeschryver.dev/blog/keeping-browser-tabs-in-sync-using-localstorage-ngrx-and-rxjs.md) (2018-12-03; topics: Angular, NgRx, RxJS, Redux): We’re going to take a look at how we can keep the state in sync when a user has multiple tabs open. - [Semantically release your Angular library](https://timdeschryver.dev/blog/semantically-release-your-angular-library.md) (2018-10-22; topics: Angular, Continuous Integration, Continuous Deployment): I’m taking you along in my journey towards a fully automated process for releasing a library! Using CircleCI and the semantic-release. - [Test for accessibility and help millions of people](https://timdeschryver.dev/blog/test-for-accessibility-and-help-millions-of-people.md) (2018-10-11; topics: A11y, Accessibility, Testing): Essential tools for maximum accessibility - [Exploring Drag and Drop with the new Angular Material CDK](https://timdeschryver.dev/blog/exploring-drag-and-drop-with-the-new-angular-material-cdk.md) (2018-10-04; topics: Angular, Angular Material, Material, CDK, Drag and Drop): Drag and Drop is a new feature in the new Angular Material CDK. Let’s explore it together! - [Sharing NgRx state between Angular modules is peanuts](https://timdeschryver.dev/blog/sharing-data-between-modules-is-peanuts.md) (2018-09-10; topics: Angular, NgRx, Redux): A dive into NgRx selectors - [Integrate Jest into an Angular application and library](https://timdeschryver.dev/blog/integrate-jest-into-an-angular-application-and-library.md) (2018-08-15; topics: Angular, Testing, Jest, Library): Follow me in this play-by-play guide and let's integrate Jest within your Angular project! - [Let's have a chat about Actions and Action Creators within NgRx](https://timdeschryver.dev/blog/lets-have-a-chat-about-actions-and-action-creators-within-ngrx.md) (2018-07-30; topics: NgRx, Redux, Angular): I think it's time you and I talk a bit about action creators. But before we get into action creators let's first start with actions. - [Start using ngrx/effects for this](https://timdeschryver.dev/blog/start-using-ngrx-effects-for-this.md) (2018-07-09; topics: Angular, NgRx, Redux, Effects): You're probably only using ngrx/effects to handle the communication to an external source by triggering an effect with a NgRx action. But you can do more. - [How I test my NgRx selectors](https://timdeschryver.dev/blog/how-i-test-my-ngrx-selectors.md) (2018-06-25; topics: NgRx, Redux, Angular): Let us explore which methods I'm using to test my NgRx selectors. - [Introducing ngx-testing-library](https://timdeschryver.dev/blog/introducing-ngx-testing-library.md) (2018-06-18; topics: Angular, Testing, Library): An adapter around dom-testing-library to provide lightweight utility functions to test Angular components. - [Simple state mutations in NGXS with Immer](https://timdeschryver.dev/blog/simple-state-mutations-in-ngrx-with-immer.md) (2018-06-07; topics: Angular, NgRx, NGXS, Redux): A follow-up post of "Clean NgRx reducers using Immer". But this time we're using NGXS as our state management library. - [Clean NgRx reducers using Immer](https://timdeschryver.dev/blog/clean-ngrx-reducers-using-immer.md) (2018-06-04; topics: NgRx, Redux, Angular): Declutter your reducers with Immer - [Data synchronization in multiple clients](https://timdeschryver.dev/blog/data-synchronization-in-multiple-clients.md) (2018-05-28; topics: Angular, Data): Often when working with a CRUD heavy application you find yourself or someone else asking the question, what should be done when multiple users are using the same screens at the same time. - [ng update: the setup](https://timdeschryver.dev/blog/ng-update-the-setup.md) (2018-05-21; topics: Angular, Angular CLI): Within 5 minutes you can automagically have your library upgraded when a user runs the ng update command. - [Required @Input() properties](https://timdeschryver.dev/blog/required-input-parameters.md) (2018-05-14; topics: Angular): How to create required input parameters - [Parameterized NgRx Selectors](https://timdeschryver.dev/blog/parameterized-selectors.md) (2018-05-07; topics: NgRx, Redux, Angular, State): NgRx Selectors with Props - [Normalizing state](https://timdeschryver.dev/blog/normalizing-state.md) (2018-04-30; topics: NgRx, Redux, Angular): A quick look at state normalization. ## Developer bits - [Playwright v1.45 makes you a Time Wizard](https://timdeschryver.dev/bits/playwright-v145-makes-you-a-time-wizard.md) (2024-06-25; topics: playwright, testing): The latest release of Playwright, version 1.45, introduces a new feature called Clock . This feature allows you to manipulate the time in your tests, making... - [Inferred Type Predicates](https://timdeschryver.dev/bits/inferred-type-predicates.md) (2024-06-18; topics: typescript): It's finally here! While working with TypeScript, I assume we all have been in a situation where we have to write a type predicate to help TypeScript... - [Automatic Service Discovery and Registration using Scrutor](https://timdeschryver.dev/bits/automatic-service-discovery-and-registration-using-scrutor.md) (2024-06-11; topics: dotnet, developer-experience): Scrutor , created by Kristian Hellang , is a library that extends the functionality of the built-in ASP.NET Core Dependency Injection (DI) container (... - [Interacting with GitHub through the GitHub CLI](https://timdeschryver.dev/bits/interacting-with-github-through-the-github-cli.md) (2024-06-04; topics: developer-experience, productivity, devtools): Throughout the last few years, GitHub has provided us with more and more tools that improve the experience with their platform. The development never stops,... - [Empathy Matters (as a Software Developer)](https://timdeschryver.dev/bits/empathy-matters-as-a-software-developer.md) (2024-05-28; topics: empathy, non-technical): The most challenging aspect of software development isn't the technical side of the coding process, but rather the human interactions involved. To quote... - [Enforce module boundaries with no-restricted-imports](https://timdeschryver.dev/bits/enforce-module-boundaries-with-no-restricted-imports.md) (2024-05-21; topics: typescript, developer-experience, architecture): Define module boundaries in your project by restricting specific imports using ESLint's no-restricted-imports rule. The rule allows you to prevent certain... - [Different scenarios require different Entity Framework behaviors](https://timdeschryver.dev/bits/different-scenarios-require-different-entity-framework-behaviors.md) (2024-05-14; topics: dotnet, entity-framework): Don't just duplicate the way you query entities in your project, consider tweaking how entities are retrieved for some specific scenarios. Being attentive to... - [Using ngxtension to migrate towards "Modern" Angular](https://timdeschryver.dev/bits/using-ngxtension-to-migrate-towards-modern-angular.md) (2024-05-07; topics: angular): In recent versions, Angular has introduced a new set of APIs and features that are considered "modern" Angular. The inject method, signal based inputs, and... - [Simplified Dictionary Lookups](https://timdeschryver.dev/bits/simplified-dictionary-lookups.md) (2024-04-30; topics: dotnet): When accessing values from a dictionary, it is common to check if the key exists before accessing the value to avoid exceptions when the key does not exist... - [An improved content projection experience with fallback content](https://timdeschryver.dev/bits/an-improved-content-projection-experience-with-fallback-content.md) (2024-04-23; topics: angular): In Angular 18 you will be able to specify fallback content for ng-content slots. This feature allows you to define default content within ng-content tags, if... - [Take control of query parameterization in EF 9](https://timdeschryver.dev/bits/take-control-of-query-parameterization-in-ef-9.md) (2024-04-16; topics: dotnet, entity-framework): In Entity Framework 9 we will have more control on how parameters and constants are used within the generated SQL queries. Using the two new methods... - [Improvements to `dotnet test` in .NET9](https://timdeschryver.dev/bits/improvements-to-dotnet-test-in-net-9.md) (2024-04-09; topics: dotnet): So far, the preview versions of .NET 9 have introduced two improvements to the dotnet test command. - [Load testing](https://timdeschryver.dev/bits/load-testing.md) (2024-04-02; topics: tools, performance): To measure is to know. As a developer, it's crucial to evaluate your system's capability for building robust and reliable software applications. - [SQL Temporal Tables](https://timdeschryver.dev/bits/sql-temporal-tables.md) (2024-03-26; topics: sql, entity-framework): SQL Temporal Tables is a feature that allows you to keep a history of changes to a table without an effort. By enabling SYSTEM_VERSIONING on a table, SQL... - [Creating a good-looking Windows Terminal](https://timdeschryver.dev/bits/creating-a-good-looking-windows-terminal.md) (2024-03-19; topics: windows, developer-experience): As a developer, I spend a "lot" of time in the terminal. I use it to run various other commands ranging from navigating to folders, running my environment,... - [Rate limiting in ASP.NET](https://timdeschryver.dev/bits/rate-limiting-in-aspnet.md) (2024-03-12; topics: dotnet): Rate limiting is a technique used to control the number of requests a client can make to a server. It is often used to prevent abuse of an API, e.g. to... - [The Methods to Update an Array: Cheat Sheet](https://timdeschryver.dev/bits/the-methods-to-update-an-array-cheat-sheet.md) (2024-03-05; topics: typescript): ECMAScript 2023 (ES2023 or ES14) introduces a fresh set of array instance methods to enhance the way arrays can be modified. - [Angular DevTools](https://timdeschryver.dev/bits/angular-devtools.md) (2024-02-27; topics: angular, devtools): The Angular DevTools is a browser extension that provides debugging and profiling capabilities for Angular applications. With the DevTools you can explore... - [Snapshot testing in C# with Verify](https://timdeschryver.dev/bits/snapshot-testing-in-c-with-verify.md) (2024-02-20; topics: dotnet, libraries): Snapshot testing is a powerful technique that allows you to compare the output of your code with a previously stored value, also known as a snapshot. This... - [Simplify Grouping Arrays in JavaScript with Object.groupBy()](https://timdeschryver.dev/bits/simplify-grouping-arrays-in-javascript-with-objectgroupby.md) (2024-02-13; topics: typescript): Grouping an array of objects in JavaScript no longer needs to be complex. The new Object.groupBy() static method simplifies this task by allowing you to... - [Entity Framework Include Filters](https://timdeschryver.dev/bits/entity-framework-include-filters.md) (2024-02-06; topics: dotnet, entity-framework): The location where you filter (included) entities is important, as it has a significant impact on the result set. Without knowing the details, it's easy to... - [Automatically verify that team rules are met using Architectural Tests](https://timdeschryver.dev/bits/automatically-verify-that-team-rules-are-met-using-architectural-tests.md) (2024-01-30; topics: libraries, developer-experience, productivity): Every team has rules and agreements on how to write and structure code. In the best case, these are documented, and yes we all know that developers don't... - [Generate code with NSwag using the OpenAPI Specification](https://timdeschryver.dev/bits/generate-code-with-nswag-using-the-openapi-specification.md) (2024-01-23; topics: devtools, libraries): It appears that the popular Swashbuckle.AspNetCore project isn't being actively maintained anymore, and doesn't support .NET 8. NSwag provides a good and... - [Use Zod to parse Unknown Data](https://timdeschryver.dev/bits/use-zod-to-parse-unknown-data.md) (2024-01-16; topics: typescript, developer-experience, libraries): How many times was there an issue within your application because you trusted data that you don't control (e.g. incoming data), or worse, how many times did... - [New in Entity Framework 8: Primitive collection properties](https://timdeschryver.dev/bits/new-in-entity-framework-8-primitive-collection-properties.md) (2024-01-09; topics: dotnet, entity-framework): Starting from EF 8, EF automatically stores a collection of primitive values directly in a column (as JSON), whereas previously a separate table was required. - [Improve your development tasks with Windows Dev Drive](https://timdeschryver.dev/bits/improve-your-development-tasks-with-windows-dev-drive.md) (2023-12-26; topics: productivity, developer-experience): If you know me, you know that I like to fully optimize my workflow, and a Dev Drive helps to improve it. - [Optimize your bundle size with source-map-explorer](https://timdeschryver.dev/bits/optimize-your-bundle-size-with-source-map-explorer.md) (2023-12-19; topics: angular, performance): Recently I was able to reduce the initial load of our Angular application from 2.8MB to 750kb ( a 75% reduction! ) in just a few minutes. - [Simpler code with Using Declarations](https://timdeschryver.dev/bits/simpler-code-with-using-declarations.md) (2023-12-12; topics: dotnet): The using declaration is a feature (introduced in C# 8.0) that allows you to declare a disposable object with the using keyword. - [👋 Hello @ngrx/signals](https://timdeschryver.dev/bits/hello-ngrx-signals.md) (2023-12-05; topics: angular, ngrx): Exciting news for Angular developers! - [Use jq to query and manipulate JSON data](https://timdeschryver.dev/bits/use-jq-to-query-and-manipulate-json-data.md) (2023-11-28; topics: devtools, productivity): jq is a lightweight command-line tool to quickly process your JSON data. I mainly use it to search ( grep ) and select specific fields of a JSON file, but it... - [NuGet Central Package Management](https://timdeschryver.dev/bits/nuget-central-package-management.md) (2023-11-21; topics: dotnet): When you've worked in a mono-repository that contains multiple C# projects, you've probably felt the pain of maintaining NuGet dependencies. Updating... - [Pretty TypeScript types](https://timdeschryver.dev/bits/pretty-typescript-types.md) (2023-11-14; topics: typescript): I learned this trick from Matt Pocock , and I've seen the power by seeing Marko Stanimirović using it in the NgRx codebase. Because I think that we'll see... - [Edit and send HTTP requests directly from the Browser DevTools](https://timdeschryver.dev/bits/edit-and-send-http-requests-directly-from-the-browser-devtools.md) (2023-11-07; topics: devtools, productivity): Did you know you can use the browser DevTools (in Microsoft Edge and Firefox) to edit and send network requests? - [How are the TypeScript Partial and Required types implemented?](https://timdeschryver.dev/bits/how-are-the-typescript-partial-and-required-types-implemented.md) (2023-10-31; topics: typescript): I find it important to know how the most-used TypeScript utility types are implemented. Here, we see the implementation of the Partial (all properties of a... - [Bulk updates in Entity Framework](https://timdeschryver.dev/bits/bulk-updates-in-entity-framework.md) (2023-10-24; topics: dotnet, entity-framework): Use bulk updates to update entities with a single command (without the need of the change tracker). - [How to quickly open a GitHub repository within an IDE](https://timdeschryver.dev/bits/how-to-quickly-open-a-github-repository-within-an-ide.md) (2023-10-17; topics: devtools): As developers, we read more code than we write. - [New in C# 12: Collection expressions](https://timdeschryver.dev/bits/new-in-c-12-collection-expressions.md) (2023-10-10; topics: dotnet): Creating collections becomes simpler in C# 12 using collection expressions. We can also make use of the spread operator .. to copy the values from a collection. - [Polyglot Notebooks](https://timdeschryver.dev/bits/polyglot-notebooks.md) (2023-10-03; topics: devtools, developer-experience, vscode): As developers, we sometimes need an isolated environment or a testing sandbox. For example, to reproduce a problem, or to share a snippet with a team member. - [Angular Control Flow](https://timdeschryver.dev/bits/angular-control-flow.md) (2023-09-26; topics: angular): The past week I cursed Angular a little bit because I just wanted to have a simple if-else condition within my HTML template. But, as you probably already... - [Cypress to Playwright converters](https://timdeschryver.dev/bits/cypress-to-playwright-converters.md) (2023-09-19; topics: playwright): Migrating from one test library to another can be a daunting task, but with the right tools, we can make it a smoother transition. - [Switch Exhaustiveness](https://timdeschryver.dev/bits/switch-exhaustiveness.md) (2023-09-12; topics: dotnet, typescript): How many times have you added a new option (enum, union, expression, ...) without updating all code paths? Did this result in unforeseen issues? - [The Evolution of C# Constructors](https://timdeschryver.dev/bits/the-evolution-of-csharp-constructors.md) (2023-09-05; topics: dotnet): C# 12 introduces a new syntax to declare class constructors with Primary Constructors . That's why I thought that it's a good time to look back at the... - [Simplified Node.js Version Management with fnm](https://timdeschryver.dev/bits/simplified-nodejs-version-management-with-fnm.md) (2023-08-29; topics: devtools, nodejs): Are you working on multiple projects that each require a different Node.js version, and are you tired of juggling between them? Then I've got the right tool... - [Git Log Heatmap](https://timdeschryver.dev/bits/git-log-heatmap.md) (2023-08-22; topics: git): Use git log to create a heatmap of the files that have been changed the most frequently within a repository. This is useful to identify the files that most... - [Raw SQL Queries for Unmapped Types in Entity Framework 8](https://timdeschryver.dev/bits/raw-sql-queries-for-unmapped-types-in-entity-framework-8.md) (2023-08-15; topics: dotnet, entity-framework): Entity Framework 8 has a new feature that allows you to execute raw SQL queries against the database and return results as unmapped types. To use this... - [Big List of Naughty Strings](https://timdeschryver.dev/bits/big-list-of-naughty-strings.md) (2023-08-08; topics: libraries, security): Does your application correctly handle all kinds of input correctly? Do you need some inspiration to test your application with some edge/special cases? - [Http Files](https://timdeschryver.dev/bits/http-files.md) (2023-08-01; topics: devtools, developer-experience): .http files are a simple way to quickly invoke your API endpoints because you don't have to leave your IDE to use a separate tool. I use it regularly when... - [Angular Input enhancements](https://timdeschryver.dev/bits/angular-input-enhancements.md) (2023-07-25; topics: angular): The Angular 16 release adds useful enhancements to the @Input decorator. We can make an input required, we can transform the input value, and we can bind... - [Tools to keep your NPM dependencies up-to-date](https://timdeschryver.dev/bits/tools-to-keep-your-npm-dependencies-up-to-date.md) (2023-07-18; topics: devtools, vscode): You can use the default npm commands npm outdated (check the registry to see if any packages are currently outdated) and npm update (update all the packages... ## Optional - [RSS feed](https://timdeschryver.dev/blog/rss.xml): Full-content feed of long-form articles - [XML sitemap](https://timdeschryver.dev/sitemap.xml): Complete index of canonical pages - [GitHub profile](https://github.com/timdeschryver): Open-source work and source repositories