<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Task guides on AngularTS</title><link>https://angular-wave.github.io/angular.ts/docs/guides/</link><description>Recent content in Task guides on AngularTS</description><generator>Hugo</generator><language>en</language><atom:link href="https://angular-wave.github.io/angular.ts/docs/guides/index.xml" rel="self" type="application/rss+xml"/><item><title>Keep the application on the server</title><link>https://angular-wave.github.io/angular.ts/docs/guides/server-first/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/server-first/</guid><description>&lt;h2 id="start-with-html-from-the-server">Start with HTML from the server&lt;a class="td-heading-self-link" href="#start-with-html-from-the-server" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>Do not start by building an SPA. Render the useful page on the server and use
normal links and forms. Keep domain models, validation, authorization,
transactions, URLs, and HTML generation together for as long as possible.&lt;/p>
&lt;p>This is the simplest way to keep the model consistent. The server reads current
data, applies the rules, and renders the result in one place. The browser
receives HTML it can display immediately. There is no second model to
synchronize, no client startup request for content the server already had, and
no duplicated loading, routing, validation, and error behavior.&lt;/p></description></item><item><title>Structure an application</title><link>https://angular-wave.github.io/angular.ts/docs/guides/application-structure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/application-structure/</guid><description>&lt;h2 id="start-with-server-rendering">Start with server rendering&lt;a class="td-heading-self-link" href="#start-with-server-rendering" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>Follow the &lt;a href="https://angular-wave.github.io/angular.ts/docs/guides/server-first/">server-first guideline&lt;/a>.
Keep domain models, validation, authorization, navigation, and HTML rendering
together on the server. Render the useful document and initial state before
AngularTS starts.&lt;/p>
&lt;p>Place an AngularTS root around the smallest region that needs browser behavior.
Do not create a browser copy of the domain model merely to make the page
interactive. Local selection, disclosure, pending state, and DOM behavior can
remain small browser concerns while durable state stays on the server.&lt;/p></description></item><item><title>Build and validate a form</title><link>https://angular-wave.github.io/angular.ts/docs/guides/forms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/forms/</guid><description>&lt;h2 id="separate-validity-from-validation-visibility">Separate validity from validation visibility&lt;a class="td-heading-self-link" href="#separate-validity-from-validation-visibility" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>A field can be invalid before the user has interacted with it. Show field
feedback after blur or a failed submit, but always prevent invalid submission.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">form&lt;/span> &lt;span style="color:#c4a000">name&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;taskForm&amp;#34;&lt;/span> &lt;span style="color:#c4a000">ng-submit&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;submit(taskForm)&amp;#34;&lt;/span> &lt;span style="color:#c4a000">novalidate&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">label&lt;/span> &lt;span style="color:#c4a000">for&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;task-title&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>Task title&lt;span style="color:#000;font-weight:bold">&amp;lt;/&lt;/span>&lt;span style="color:#204a87;font-weight:bold">label&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">input&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;task-title&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">name&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;title&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">ng-model&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;draft.title&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">required&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">aria-describedby&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;task-title-error&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">p&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">id&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;task-title-error&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">role&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;alert&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#c4a000">ng-show&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;submitted &amp;amp;&amp;amp; taskForm.title.$invalid&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Enter a task title.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">&amp;lt;/&lt;/span>&lt;span style="color:#204a87;font-weight:bold">p&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">button&lt;/span> &lt;span style="color:#c4a000">ng-disabled&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;saving&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>Add task&lt;span style="color:#000;font-weight:bold">&amp;lt;/&lt;/span>&lt;span style="color:#204a87;font-weight:bold">button&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">&amp;lt;/&lt;/span>&lt;span style="color:#204a87;font-weight:bold">form&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The controller owns &lt;code>submitted&lt;/code>, &lt;code>saving&lt;/code>, and the editable draft. The
repository owns the write.&lt;/p></description></item><item><title>Load server data</title><link>https://angular-wave.github.io/angular.ts/docs/guides/server-data/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/server-data/</guid><description>&lt;h2 id="represent-request-state-explicitly">Represent request state explicitly&lt;a class="td-heading-self-link" href="#represent-request-state-explicitly" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>Do not use &lt;code>tasks.length === 0&lt;/code> to mean both “not loaded” and “loaded empty.”&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">type&lt;/span> &lt;span style="color:#000">LoadState&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;idle&amp;#39;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">|&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;loading&amp;#39;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">|&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;ready&amp;#39;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">|&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;error&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">class&lt;/span> &lt;span style="color:#000">TaskList&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">state&lt;/span>: &lt;span style="color:#204a87;font-weight:bold">LoadState&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;idle&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">tasks&lt;/span>: &lt;span style="color:#204a87;font-weight:bold">Task&lt;/span>&lt;span style="color:#000;font-weight:bold">[]&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000;font-weight:bold">[];&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">error&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="put-transport-behavior-in-a-repository">Put transport behavior in a repository&lt;a class="td-heading-self-link" href="#put-transport-behavior-in-a-repository" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">app&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">factory&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;taskRepository&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000;font-weight:bold">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#39;$http&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">$http&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&amp;gt;&lt;/span> &lt;span style="color:#000;font-weight:bold">({&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">list&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">cancelled&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">$http&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#204a87;font-weight:bold">get&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;/api/tasks&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span> &lt;span style="color:#000">timeout&lt;/span>: &lt;span style="color:#204a87;font-weight:bold">cancelled&lt;/span> &lt;span style="color:#000;font-weight:bold">})&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">then&lt;/span>&lt;span style="color:#000;font-weight:bold">((&lt;/span>&lt;span style="color:#000">response&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&amp;gt;&lt;/span> &lt;span style="color:#000">response&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">data&lt;/span>&lt;span style="color:#000;font-weight:bold">),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">]);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The timeout promise should resolve when the component is destroyed or a newer
query supersedes the request. Cancellation saves work; a request sequence or
identity check still protects against transports that complete while
cancellation is racing.&lt;/p></description></item><item><title>Add routing</title><link>https://angular-wave.github.io/angular.ts/docs/guides/routing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/routing/</guid><description>&lt;h2 id="do-not-default-to-client-side-routing">Do not default to client-side routing&lt;a class="td-heading-self-link" href="#do-not-default-to-client-side-routing" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>Use server routes and ordinary links first. They provide addressability,
history, streaming HTML, metadata, authorization boundaries, and resilient
navigation without a client router.&lt;/p>
&lt;p>Introduce the AngularTS router when multiple screens are intentionally owned by
one bootstrapped application and preserving client state or resources between
those screens materially improves the product. A client router is not required
for AngularTS components embedded in server-rendered pages.&lt;/p></description></item><item><title>Handle errors</title><link>https://angular-wave.github.io/angular.ts/docs/guides/error-handling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/error-handling/</guid><description>&lt;h2 id="classify-before-rendering">Classify before rendering&lt;a class="td-heading-self-link" href="#classify-before-rendering" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>Validation and domain rejection are expected outcomes near the action.&lt;/li>
&lt;li>HTTP timeout, abort, offline, and non-success status belong to the request
owner.&lt;/li>
&lt;li>Route resolve failure belongs to transition policy.&lt;/li>
&lt;li>Unexpected exceptions belong to &lt;code>$exceptionHandler&lt;/code> and diagnostics.&lt;/li>
&lt;/ul>
&lt;p>Do not convert every rejection to &lt;code>[]&lt;/code>, &lt;code>null&lt;/code>, or &lt;code>false&lt;/code>. That destroys
information and commonly renders an empty success state after a real failure.&lt;/p>
&lt;p>Wrap low-level errors with the operation name while retaining the original
cause. The UI should receive a stable category and recovery action, not a stack
trace or server payload. Logs may include release, route, operation, and
correlation identifiers but must exclude credentials and private data.&lt;/p></description></item><item><title>Test application behavior</title><link>https://angular-wave.github.io/angular.ts/docs/guides/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/testing/</guid><description>&lt;h2 id="use-the-narrowest-layer-that-can-fail">Use the narrowest layer that can fail&lt;a class="td-heading-self-link" href="#use-the-narrowest-layer-that-can-fail" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>Test transformations and domain transitions as plain TypeScript. Compile typed
component views to catch invalid model properties, event types, and DOM property
names. Use a browser for compilation, directives, focus, routing, and reactive
rendering.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">test&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;task form prevents duplicate submission&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87;font-weight:bold">async&lt;/span> &lt;span style="color:#000;font-weight:bold">({&lt;/span> &lt;span style="color:#000">page&lt;/span> &lt;span style="color:#000;font-weight:bold">})&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&amp;gt;&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">await&lt;/span> &lt;span style="color:#000">page&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#204a87;font-weight:bold">goto&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;/tasks&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">await&lt;/span> &lt;span style="color:#000">page&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">getByLabel&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;Task title&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">).&lt;/span>&lt;span style="color:#000">fill&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;Write tests&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">await&lt;/span> &lt;span style="color:#000">page&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">getByRole&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;button&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span> &lt;span style="color:#000">name&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;Add task&amp;#39;&lt;/span> &lt;span style="color:#000;font-weight:bold">}).&lt;/span>&lt;span style="color:#000">dblclick&lt;/span>&lt;span style="color:#000;font-weight:bold">();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">await&lt;/span> &lt;span style="color:#000">expect&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">page&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">getByRole&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;listitem&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">)).&lt;/span>&lt;span style="color:#000">toHaveCount&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Select by role, label, visible text, or stable application identifiers. Scope
IDs, generated comments, internal CSS classes, and scheduler timing are
implementation details.&lt;/p></description></item><item><title>Troubleshoot an application</title><link>https://angular-wave.github.io/angular.ts/docs/guides/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/troubleshooting/</guid><description>&lt;h2 id="find-the-first-failed-boundary">Find the first failed boundary&lt;a class="td-heading-self-link" href="#find-the-first-failed-boundary" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;ol>
&lt;li>Confirm the JavaScript module loaded.&lt;/li>
&lt;li>Confirm registration completed before automatic or manual bootstrap.&lt;/li>
&lt;li>Confirm &lt;code>ng-app&lt;/code> names the created module.&lt;/li>
&lt;li>Read the first AngularTS error, not the cascade.&lt;/li>
&lt;li>Confirm injected token order matches function parameters.&lt;/li>
&lt;li>Confirm the owning scope/controller contains the value read by the view.&lt;/li>
&lt;li>Inspect transport status before changing rendering code.&lt;/li>
&lt;/ol>
&lt;p>Raw interpolation means bootstrap or compilation did not complete. “Module not
available” usually means boot order or spelling. “Unknown provider” means the
token is absent from the loaded module graph.&lt;/p></description></item><item><title>Production and deployment</title><link>https://angular-wave.github.io/angular.ts/docs/guides/production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/production/</guid><description>&lt;h2 id="produce-one-immutable-artifact">Produce one immutable artifact&lt;a class="td-heading-self-link" href="#produce-one-immutable-artifact" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>Install from the lockfile, typecheck source and tests, validate generated
bindings, run browser tests, and build once. Promote the same artifact through
environments. Rebuilding after approval changes the release.&lt;/p>
&lt;p>Fingerprint immutable assets. Revalidate HTML and route manifests so they
reference current fingerprints. Version service-worker caches and remove
obsolete entries only after the new worker can serve a complete application.&lt;/p>
&lt;h2 id="verify-production-behavior">Verify production behavior&lt;a class="td-heading-self-link" href="#verify-production-behavior" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>Smoke-test generated output with development fallbacks disabled. Cover direct
route entry, refresh on nested URLs, CSP, API credentials, loading and failure
states, offline behavior, and service-worker upgrade from the previous release.&lt;/p></description></item><item><title>Browser support</title><link>https://angular-wave.github.io/angular.ts/docs/guides/browser-support/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/browser-support/</guid><description>&lt;p>List browser families and versions, mobile requirements, assistive-technology
coverage, and optional capabilities. Framework support does not automatically
provide WebTransport, service workers, storage, workers, or WebAssembly
everywhere.&lt;/p>
&lt;p>Isolate capability selection:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">function&lt;/span> &lt;span style="color:#000">createRealtime() {&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;WebTransport&amp;#39;&lt;/span> &lt;span style="color:#204a87;font-weight:bold">in&lt;/span> &lt;span style="color:#204a87">window&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">createWebTransport&lt;/span>&lt;span style="color:#000;font-weight:bold">();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">if&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;WebSocket&amp;#39;&lt;/span> &lt;span style="color:#204a87;font-weight:bold">in&lt;/span> &lt;span style="color:#204a87">window&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">createWebSocket&lt;/span>&lt;span style="color:#000;font-weight:bold">();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">return&lt;/span> &lt;span style="color:#000">createPolling&lt;/span>&lt;span style="color:#000;font-weight:bold">();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Detect the API used, not a browser brand. Keep fallback selection in one service
so components consume domain events rather than transport differences.&lt;/p>
&lt;p>Test production output: cold load, direct route entry, back/forward, storage
denial, offline transition, reduced motion, keyboard navigation, and
service-worker upgrade. Disable capabilities to test fallbacks even when CI
supports them.&lt;/p></description></item><item><title>Accessibility</title><link>https://angular-wave.github.io/angular.ts/docs/guides/accessibility/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/accessibility/</guid><description>&lt;p>&lt;code>ng-if&lt;/code> removes content and destroys focused descendants. Before closing a
dialog, menu, or editor, choose the element that regains focus. &lt;code>ng-show&lt;/code>
retains the subtree; verify hidden descendants cannot remain in keyboard order.&lt;/p>
&lt;p>Use native buttons, links, labels, headings, and lists before ARIA. Attach
AngularTS events to those controls instead of rebuilding their keyboard behavior
on generic elements.&lt;/p>
&lt;p>Associate errors with controls using &lt;code>aria-describedby&lt;/code>. Show invalid state
after interaction or submission, retain the invalid value, focus the first
invalid control after failed submission, and provide a summary for long forms.
Server failures are separate from field constraints.&lt;/p></description></item><item><title>Internationalization</title><link>https://angular-wave.github.io/angular.ts/docs/guides/internationalization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/internationalization/</guid><description>&lt;p>Use stable message identifiers and named placeholders. Do not concatenate
translated fragments or use English text as an identifier. Choose plural forms
from locale rules rather than &lt;code>count === 1&lt;/code>.&lt;/p>
&lt;p>AngularTS formatting filters delegate to &lt;code>Intl&lt;/code>. Pass the application locale and
explicit currency or time-zone policy; browser defaults may differ from user
settings.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">span&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>{{ total | currency:user.locale }}&lt;span style="color:#000;font-weight:bold">&amp;lt;/&lt;/span>&lt;span style="color:#204a87;font-weight:bold">span&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">&amp;lt;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">time&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>{{ dueAt | date:user.locale }}&lt;span style="color:#000;font-weight:bold">&amp;lt;/&lt;/span>&lt;span style="color:#204a87;font-weight:bold">time&lt;/span>&lt;span style="color:#000;font-weight:bold">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A locale service should deduplicate catalog requests, cache by locale and
catalog version, and expose loading and fallback state. Do not render raw
message identifiers while loading.&lt;/p></description></item><item><title>Application security</title><link>https://angular-wave.github.io/angular.ts/docs/guides/security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/security/</guid><description>&lt;p>External sources include URL parameters, forms, storage, server responses,
realtime messages, worker messages, and cross-window events. Sensitive sinks
include HTML, executable URLs, navigation, credentials, logs, and persisted
state.&lt;/p>
&lt;p>Prefer interpolation, text children, and typed DOM properties. Use
&lt;code>ng-bind-html&lt;/code> only for markup that passed application sanitization. A trust
override must be local and reviewable; never trust a value merely because it
came from your server.&lt;/p>
&lt;p>Hidden routes, disabled buttons, and client guards improve UX but do not
authorize operations. The server must validate identity, permission, input
shape, size, and state transition.&lt;/p></description></item><item><title>Observability</title><link>https://angular-wave.github.io/angular.ts/docs/guides/observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://angular-wave.github.io/angular.ts/docs/guides/observability/</guid><description>&lt;p>Assign a stable operation name and correlation ID at the user-action or route
boundary. Record start, terminal outcome, duration, release, and route. Do not
log every reactive read or scope write; volume hides causality and changes
timing.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">performance&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">mark&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#4e9a06">`task-save:&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">id&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">:start`&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">try&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">await&lt;/span> &lt;span style="color:#000">repository&lt;/span>&lt;span style="color:#000;font-weight:bold">.&lt;/span>&lt;span style="color:#000">save&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">task&lt;/span>&lt;span style="color:#000;font-weight:bold">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">record&lt;/span>&lt;span style="color:#000;font-weight:bold">({&lt;/span> &lt;span style="color:#000">operation&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;task.save&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">outcome&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;success&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">id&lt;/span> &lt;span style="color:#000;font-weight:bold">});&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span> &lt;span style="color:#204a87;font-weight:bold">catch&lt;/span> &lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">error&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">record&lt;/span>&lt;span style="color:#000;font-weight:bold">({&lt;/span> &lt;span style="color:#000">operation&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;task.save&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">outcome&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">:&lt;/span> &lt;span style="color:#000">classify&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">error&lt;/span>&lt;span style="color:#000;font-weight:bold">),&lt;/span> &lt;span style="color:#000">id&lt;/span> &lt;span style="color:#000;font-weight:bold">});&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">throw&lt;/span> &lt;span style="color:#000">error&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Expected domain and transport failures should produce classified outcomes.
Unexpected exceptions should reach &lt;code>$exceptionHandler&lt;/code> with their cause. Redact
credentials, request bodies, user-entered text, and model snapshots.&lt;/p></description></item></channel></rss>