<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>javascript &#8211; Noise</title>
	<atom:link href="https://noise.getoto.net/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://noise.getoto.net</link>
	<description>The collective thoughts of the interwebz</description>
	<lastBuildDate>Tue, 25 Nov 2025 22:19:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
	<item>
		<title>Node.js 24 runtime now available in AWS Lambda</title>
		<link>https://noise.getoto.net/2025/11/26/node-js-24-runtime-now-available-in-aws-lambda/</link>
		
		<dc:creator><![CDATA[Andrea Amorosi]]></dc:creator>
		<pubDate>Tue, 25 Nov 2025 22:19:46 +0000</pubDate>
				<category><![CDATA[announcements]]></category>
		<category><![CDATA[AWS Cloud Development Kit]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[AWS Serverless Application Model]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Lambda@Edge]]></category>
		<category><![CDATA[serverless]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=109ef70d2e0f76b70906773149be4bf9</guid>

					<description><![CDATA[You can now develop AWS Lambda functions using Node.js 24, either as a managed runtime or using the container base image. Node.js 24 is in active LTS status and ready for production use. It is expected to be supported with security patches and bugfixes until April 2028. The Lambda runtime for Node.js 24 includes a new implementation of the […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How Cloudflare’s client-side security made the npm supply chain attack a non-event</title>
		<link>https://noise.getoto.net/2025/10/24/how-cloudflares-client-side-security-made-the-npm-supply-chain-attack-a-non-event/</link>
		
		<dc:creator><![CDATA[Bashyam Anant]]></dc:creator>
		<pubDate>Fri, 24 Oct 2025 17:10:43 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Developer Platform]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Malicious JavaScript]]></category>
		<category><![CDATA[Supply Chain Attacks]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=9274059caa3c00bf1b5ffe8b5365ae94</guid>

					<description><![CDATA[A recent npm supply chain attack compromised 18 popular packages. This post explains how Cloudflare’s graph-based machine learning model, which analyzes 3.5 billion scripts daily, was built to detect and block exactly this kind of threat automatically.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Improving the trustworthiness of Javascript on the Web</title>
		<link>https://noise.getoto.net/2025/10/16/improving-the-trustworthiness-of-javascript-on-the-web/</link>
		
		<dc:creator><![CDATA[Michael Rosenberg]]></dc:creator>
		<pubDate>Thu, 16 Oct 2025 14:00:00 +0000</pubDate>
				<category><![CDATA[Cryptography]]></category>
		<category><![CDATA[deep dive]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Malicious JavaScript]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=dfa3972c6f6fd8739443c25e01c39bfa</guid>

					<description><![CDATA[There's no way to audit a site’s client-side code as it changes, making it hard to trust sites that use cryptography. We preview a specification we co-authored that adds auditability to the web.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>A year of improving Node.js compatibility in Cloudflare Workers</title>
		<link>https://noise.getoto.net/2025/09/25/a-year-of-improving-node-js-compatibility-in-cloudflare-workers/</link>
		
		<dc:creator><![CDATA[James M Snell]]></dc:creator>
		<pubDate>Thu, 25 Sep 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[Birthday Week]]></category>
		<category><![CDATA[Cloudflare Workers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[Servers]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=601276c09d18fe40aac7074cd6173b8c</guid>

					<description><![CDATA[Over the year we have greatly expanded Node.js compatibility. There are hundreds of new Node.js APIs now available that make it easier to run existing Node.js code on our platform.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Cap&#8217;n Web: a new RPC system for browsers and web servers</title>
		<link>https://noise.getoto.net/2025/09/22/capn-web-a-new-rpc-system-for-browsers-and-web-servers/</link>
		
		<dc:creator><![CDATA[Kenton Varda]]></dc:creator>
		<pubDate>Mon, 22 Sep 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[Birthday Week]]></category>
		<category><![CDATA[Cloudflare Workers]]></category>
		<category><![CDATA[Developer Platform]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[open source]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=c25b615fea348d39524021a62c88587d</guid>

					<description><![CDATA[Cap'n Web is a new open source, JavaScript-native RPC protocol for use in browsers and web servers. It provides the expressive power of Cap'n Proto, but with no schemas and no boilerplate.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Bringing Node.js HTTP servers to Cloudflare Workers</title>
		<link>https://noise.getoto.net/2025/09/08/bringing-node-js-http-servers-to-cloudflare-workers/</link>
		
		<dc:creator><![CDATA[Yagiz Nizipli]]></dc:creator>
		<pubDate>Mon, 08 Sep 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[Cloudflare Workers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[Servers]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=b01e288c12cf55f1680f2aa8bde00906</guid>

					<description><![CDATA[We've implemented the node:http client and server APIs in Cloudflare Workers, allowing developers to migrate existing Node.js applications with minimal code changes.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>We shipped FinalizationRegistry in Workers: why you should never use it</title>
		<link>https://noise.getoto.net/2025/06/11/we-shipped-finalizationregistry-in-workers-why-you-should-never-use-it/</link>
		
		<dc:creator><![CDATA[Ketan Gupta]]></dc:creator>
		<pubDate>Wed, 11 Jun 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[Cloudflare Workers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[WebAssembly]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=1c0d5c32353bd0536b9ac75801a3801f</guid>

					<description><![CDATA[Cloudflare Workers now support FinalizationRegistry, but just because you can use it doesn’t mean you should.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Cloudflare Snippets are now Generally Available</title>
		<link>https://noise.getoto.net/2025/04/09/cloudflare-snippets-are-now-generally-available/</link>
		
		<dc:creator><![CDATA[Nikita Cano]]></dc:creator>
		<pubDate>Wed, 09 Apr 2025 14:00:00 +0000</pubDate>
				<category><![CDATA[CDN]]></category>
		<category><![CDATA[Developer Week]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[Edge Rules]]></category>
		<category><![CDATA[General Availability]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Snippets]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=74a301d2e31d8c7ecf5656134cfe096c</guid>

					<description><![CDATA[Cloudflare Snippets are now generally available, enabling fast, cost-free JavaScript-based HTTP traffic modifications across all paid plans.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>New URLPattern API brings improved pattern matching to Node.js and Cloudflare Workers</title>
		<link>https://noise.getoto.net/2025/03/24/new-urlpattern-api-brings-improved-pattern-matching-to-node-js-and-cloudflare-workers/</link>
		
		<dc:creator><![CDATA[Yagiz Nizipli]]></dc:creator>
		<pubDate>Mon, 24 Mar 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[Cloudflare Workers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=5ac031813a47ac322ed6d69e7cb0807c</guid>

					<description><![CDATA[Today we're announcing our latest contribution to Node.js, now available in v23.8.0: URLPattern.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How we train AI to uncover malicious JavaScript intent and make web surfing safer</title>
		<link>https://noise.getoto.net/2025/03/19/how-we-train-ai-to-uncover-malicious-javascript-intent-and-make-web-surfing-safer/</link>
		
		<dc:creator><![CDATA[Juan Miguel Cejuela]]></dc:creator>
		<pubDate>Wed, 19 Mar 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[Malicious JavaScript]]></category>
		<category><![CDATA[Page Shield]]></category>
		<category><![CDATA[Security Week]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=beb9ce3df8f1582fe251ecd94454a3b3</guid>

					<description><![CDATA[Learn more about how Cloudflare developed an AI model to uncover malicious JavaScript intent using a Graph Neural Network, from pre-processing data to inferencing at scale.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Internationalization and localization: bringing Cloudflare Radar to a global audience</title>
		<link>https://noise.getoto.net/2024/12/16/internationalization-and-localization-bringing-cloudflare-radar-to-a-global-audience/</link>
		
		<dc:creator><![CDATA[Alejandro Diaz-Garcia]]></dc:creator>
		<pubDate>Mon, 16 Dec 2024 14:00:00 +0000</pubDate>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Localization]]></category>
		<category><![CDATA[Radar]]></category>
		<category><![CDATA[Radar Maps]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=bfdeea29ced9712398c5747408e81dd0</guid>

					<description><![CDATA[Internationalization and localization require more than translation: tone, images, date/time and number formatting, among other items, need to be considered.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>DO it again: how we used Durable Objects to add WebSockets support and authentication to AI Gateway</title>
		<link>https://noise.getoto.net/2024/11/20/do-it-again-how-we-used-durable-objects-to-add-websockets-support-and-authentication-to-ai-gateway/</link>
		
		<dc:creator><![CDATA[Catarina Pires Mota]]></dc:creator>
		<pubDate>Tue, 19 Nov 2024 22:00:00 +0000</pubDate>
				<category><![CDATA[Без категория]]></category>
		<category><![CDATA[Agile Developer Services]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Gateway]]></category>
		<category><![CDATA[Developer Platform]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=536d2f8fd4428be821d31aebfe589eb3</guid>

					<description><![CDATA[We used Cloudflare’s Developer Platform and Durable Objects to build authentication and a WebSockets API that developers can use to call AI Gateway, enabling continuous communication over a single, persistent connection.]]></description>
		
		
		
			</item>
		<item>
		<title>Diving Deeper into Projen: Exploring Advanced Features</title>
		<link>https://noise.getoto.net/2024/10/29/diving-deeper-into-projen-exploring-advanced-features/</link>
		
		<dc:creator><![CDATA[Michael Tran]]></dc:creator>
		<pubDate>Tue, 29 Oct 2024 14:31:19 +0000</pubDate>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[AWS .NET Development]]></category>
		<category><![CDATA[AWS Cloud Development Kit]]></category>
		<category><![CDATA[AWS Java Development]]></category>
		<category><![CDATA[AWS Mobile Development]]></category>
		<category><![CDATA[AWS PHP Development]]></category>
		<category><![CDATA[AWS Ruby Development]]></category>
		<category><![CDATA[Best practices]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[How-to]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Programing Language]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=2ee4834bfbb597f29afe2fd2bc2979f9</guid>

					<description><![CDATA[We will be highlighting Projen’s powerful features that cater to various aspects of project management and development. We’ll examine how Projen enhances polyglot programming within Amazon Web Services (AWS) Cloud Development Kit constructs. We’ll also touch on its built-in support for common development tools and practices. In our previous blog, we introduced you to the […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Automatically replacing polyfill.io links with Cloudflare’s mirror for a safer Internet</title>
		<link>https://noise.getoto.net/2024/06/26/automatically-replacing-polyfill-io-links-with-cloudflares-mirror-for-a-safer-internet/</link>
		
		<dc:creator><![CDATA[Matthew Prince]]></dc:creator>
		<pubDate>Wed, 26 Jun 2024 20:23:41 +0000</pubDate>
				<category><![CDATA[Application Security]]></category>
		<category><![CDATA[Application Services*]]></category>
		<category><![CDATA[Attacks]]></category>
		<category><![CDATA[Better Internet]]></category>
		<category><![CDATA[CDNJS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Supply Chain Attacks]]></category>
		<category><![CDATA[vulnerabilities]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=9908ec80d7b53b7328b7084af6670f64</guid>

					<description><![CDATA[polyfill.io, a popular JavaScript library service, can no longer be trusted and should be removed from websites]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Get young people making interactive websites with JavaScript and our ‘More web’ path</title>
		<link>https://noise.getoto.net/2024/04/25/get-young-people-making-interactive-websites-with-javascript-and-our-more-web-path/</link>
		
		<dc:creator><![CDATA[Pete Bell]]></dc:creator>
		<pubDate>Thu, 25 Apr 2024 11:59:54 +0000</pubDate>
				<category><![CDATA[coding for kids]]></category>
		<category><![CDATA[coding projects]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Project paths]]></category>
		<category><![CDATA[web development]]></category>
		<guid isPermaLink="false">https://www.raspberrypi.org/?p=87120</guid>

					<description><![CDATA[<p>Modern web design has turned websites from static and boring walls of information into ways of providing fun and engaging experiences to the user. Our new ‘More web’ project path shows young creators how to add interaction and animation to a webpage through JavaScript code. Why learn JavaScript? As of 2024, JavaScript is the most…</p>
<p>The post <a href="https://www.raspberrypi.org/blog/more-web-learn-javascript/">Get young people making interactive websites with JavaScript and our ‘More web’ path</a> appeared first on <a href="https://www.raspberrypi.org/">Raspberry Pi Foundation</a>.</p>]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>polyfill.io now available on cdnjs: reduce your supply chain risk</title>
		<link>https://noise.getoto.net/2024/02/29/polyfill-io-now-available-on-cdnjs-reduce-your-supply-chain-risk/</link>
		
		<dc:creator><![CDATA[Sven Sauleau]]></dc:creator>
		<pubDate>Thu, 29 Feb 2024 17:51:32 +0000</pubDate>
				<category><![CDATA[CDNJS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Supply Chain Attacks]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=32184c8c4858cdd24798b13b51cabff9</guid>

					<description><![CDATA[Polyfill.io is now available on cdnjs to reduce the risk of supply chain attacks. Replace your polyfill.io links today for a seamless experience]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Introducing SafeTest: A Novel Approach to Front End Testing</title>
		<link>https://noise.getoto.net/2024/02/13/introducing-safetest-a-novel-approach-to-front-end-testing/</link>
		
		<dc:creator><![CDATA[Netflix Technology Blog]]></dc:creator>
		<pubDate>Tue, 13 Feb 2024 16:07:48 +0000</pubDate>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Netflix]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[testing]]></category>
		<guid isPermaLink="false">https://medium.com/p/37f9f88c152d</guid>

					<description><![CDATA[<p>by <a href="https://medium.com/u/a155da075195">Moshe Kolodny</a></p><p>In this post, we’re excited to introduce SafeTest, a revolutionary library that offers a fresh perspective on End-To-End (E2E) tests for web-based User Interface (UI) applications.</p><h3>The Challenges of Traditional UI Testing</h3><p>Traditionally, UI tests have been conducted through either unit testing or integration testing (also referred to as End-To-End (E2E) testing). However, each of these methods presents a unique trade-off: you have to choose between controlling the test fixture and setup, or controlling the test driver.</p><p>For instance, when using <a href="https://testing-library.com/docs/react-testing-library/intro/">react-testing-library</a>, a unit testing solution, you maintain complete control over what to render and how the underlying services and imports should behave. However, you lose the ability to interact with an actual page, which can lead to a myriad of pain points:</p><ul><li>Difficulty in interacting with complex UI elements like &#60;Dropdown /&#62; components.</li><li>Inability to test CORS setup or GraphQL calls.</li><li>Lack of visibility into z-index issues affecting click-ability of buttons.</li><li>Complex and unintuitive authoring and debugging of tests.</li></ul><p>Conversely, using integration testing tools like Cypress or Playwright provides control over the page, but sacrifices the ability to instrument the bootstrapping code for the app. These tools operate by remotely controlling a browser to visit a URL and interact with the page. This approach has its own set of challenges:</p><ul><li>Difficulty in making calls to an alternative API endpoint without implementing custom network layer API rewrite rules.</li><li>Inability to make assertions on spies/mocks or execute code within the app.</li><li>Testing something like dark mode entails clicking the theme switcher or knowing the localStorage mechanism to override.</li><li>Inability to test segments of the app, for example if a component is only visible after clicking a button and waiting for a 60 second timer to countdown, the test will need to run those actions and will be at least a minute long.</li></ul><p>Recognizing these challenges, solutions like E2E Component Testing have emerged, with offerings from <a href="https://docs.cypress.io/guides/component-testing/overview">Cypress</a> and <a href="https://playwright.dev/docs/test-components">Playwright</a>. While these tools attempt to rectify the shortcomings of traditional integration testing methods, they have other limitations due to their architecture. They start a dev server with bootstrapping code to load the component and/or setup code you want, which limits their ability to handle complex enterprise applications that might have OAuth or a complex build pipeline. Moreover, updating TypeScript usage could break your tests until the Cypress/Playwright team updates their runner.</p><h3>Welcome to SafeTest</h3><p>SafeTest aims to address these issues with a novel approach to UI testing. The main idea is to have a <a href="https://www.npmjs.com/package/safetest#bootstrapping-your-application">snippet of code in our application bootstrapping stage that injects hooks to run our tests</a> (see the <a href="https://www.npmjs.com/package/safetest#how-safetest-works">How Safetest Works</a> sections for more info on what this is doing). <strong>Note that how this works has no measurable impact on the regular usage of your app since SafeTest leverages lazy loading to dynamically load the tests only when running the tests (in the README example, the tests aren’t in the production bundle at all).</strong> Once that’s in place, we can use Playwright to run regular tests, thereby achieving the ideal browser control we want for our tests.</p><p>This approach also unlocks some exciting features:</p><ul><li>Deep linking to a specific test without needing to run a node test server.</li><li>Two-way communication between the browser and test (node) context.</li><li>Access to all the DX features that come with Playwright (excluding the ones that come with @playwright/test).</li><li>Video recording of tests, trace viewing, and pause page functionality for trying out different page selectors/actions.</li><li>Ability to make assertions on spies in the browser in node, matching snapshot of the call within the browser.</li></ul><h3>Test Examples with SafeTest</h3><p>SafeTest is designed to feel familiar to anyone who has conducted UI tests before, as it leverages the best parts of existing solutions. Here’s an example of how to test an entire application:</p><pre>import { describe, it, expect } from 'safetest/jest';<br>import { render } from 'safetest/react';<br><br>describe('my app', () =&#62; {<br>  it('loads the main page', async () =&#62; {<br>    const { page } = await render();<br><br>    await expect(page.getByText('Welcome to the app')).toBeVisible();<br>    expect(await page.screenshot()).toMatchImageSnapshot();<br>  });<br>});</pre><p>We can just as easily test a specific component</p><pre>import { describe, it, expect, browserMock } from 'safetest/jest';<br>import { render } from 'safetest/react';<br><br>describe('Header component', () =&#62; {<br>  it('has a normal mode', async () =&#62; {<br>    const { page } = await render(&#60;Header /&#62;);<br><br>    await expect(page.getByText('Admin')).not.toBeVisible();<br>   });<br><br>  it('has an admin mode', async () =&#62; {<br>    const { page } = await render(&#60;Header admin={true} /&#62;);<br><br>    await expect(page.getByText('Admin')).toBeVisible();<br>  });<br><br>  it('calls the logout handler when signing out', async () =&#62; {<br>    const spy = browserMock.fn();<br>    const { page } = await render(&#60;Header handleLogout={fn} /&#62;);<br><br>    await page.getByText('logout').click();<br>    expect(await spy).toHaveBeenCalledWith();<br>  });<br>});</pre><h3>Leveraging Overrides</h3><p>SafeTest utilizes React Context to allow for value overrides during tests. For an example of how this works, let’s assume we have a fetchPeople function used in a component:</p><pre>import { useAsync } from 'react-use';<br>import { fetchPerson } from './api/person';<br><br>export const People: React.FC = () =&#62; {<br>  const { data: people, loading, error } = useAsync(fetchPeople);<br>  <br>  if (loading) return &#60;Loader /&#62;;<br>  if (error) return &#60;ErrorPage error={error} /&#62;;<br>  return &#60;Table data={data} rows=[...] /&#62;;<br>}</pre><p>We can modify the People component to use an Override:</p><pre> import { fetchPerson } from './api/person';<br>+import { createOverride } from 'safetest/react';<br><br>+const FetchPerson = createOverride(fetchPerson);<br><br> export const People: React.FC = () =&#62; {<br>+  const fetchPeople = FetchPerson.useValue();<br>   const { data: people, loading, error } = useAsync(fetchPeople);<br>  <br>   if (loading) return &#60;Loader /&#62;;<br>   if (error) return &#60;ErrorPage error={error} /&#62;;<br>   return &#60;Table data={data} rows=[...] /&#62;;<br> }</pre><p>Now, in our test, we can override the response for this call:</p><pre>const pending = new Promise(r =&#62; { /* Do nothing */ });<br>const resolved = [{name: 'Foo', age: 23], {name: 'Bar', age: 32]}];<br>const error = new Error('Whoops');<br><br>describe('People', () =&#62; {<br>  it('has a loading state', async () =&#62; {<br>    const { page } = await render(<br>      &#60;FetchPerson.Override with={() =&#62; () =&#62; pending}&#62;<br>        &#60;People /&#62;<br>      &#60;/FetchPerson.Override&#62;<br>    );<br><br>    await expect(page.getByText('Loading')).toBeVisible();<br>  });<br><br>  it('has a loaded state', async () =&#62; {<br>    const { page } = await render(<br>      &#60;FetchPerson.Override with={() =&#62; async () =&#62; resolved}&#62;<br>        &#60;People /&#62;<br>      &#60;/FetchPerson.Override&#62;<br>    );<br><br>    await expect(page.getByText('User: Foo, name: 23')).toBeVisible();<br>  });<br><br>  it('has an error state', async () =&#62; {<br>    const { page } = await render(<br>      &#60;FetchPerson.Override with={() =&#62; async () =&#62; { throw error }}&#62;<br>        &#60;People /&#62;<br>      &#60;/FetchPerson.Override&#62;<br>    );<br><br>    await expect(page.getByText('Error getting users: "Whoops"')).toBeVisible();<br>  });<br>});</pre><p>The render function also accepts a function that will be passed the initial app component, allowing for the injection of any desired elements anywhere in the app:</p><pre>it('has a people loaded state', async () =&#62; {<br>  const { page } = await render(app =&#62;<br>    &#60;FetchPerson.Override with={() =&#62; async () =&#62; resolved}&#62;<br>      {app}<br>    &#60;/FetchPerson.Override&#62;<br>  );<br>   await expect(page.getByText('User: Foo, name: 23')).toBeVisible();<br>});</pre><p>With overrides, we can write complex test cases such as ensuring a service method which combines API requests from /foo, /bar, and /baz, has the correct retry mechanism for just the failed API requests and still maps the return value correctly. So if /bar takes 3 attempts to resolve the method will make a total of 5 API calls.</p><p>Overrides aren’t limited to just API calls (since we can use also use <a href="https://playwright.dev/docs/api/class-page#page-route">page.route</a>), we can also override specific app level values like feature flags or changing some static value:</p><pre>+const UseFlags = createOverride(useFlags);<br> export const Admin = () =&#62; {<br>+  const useFlags = UseFlags.useValue();<br>   const { isAdmin } = useFlags();<br>   if (!isAdmin) return &#60;div&#62;Permission error&#60;/div&#62;;<br>   // ...<br> }<br><br>+const Language = createOverride(navigator.language);<br> export const LanguageChanger = () =&#62; {<br>-  const language = navigator.language;<br>+  const language = Language.useValue();<br>   return &#60;div&#62;Current language is { language } &#60;/div&#62;;<br> }<br><br> describe('Admin', () =&#62; {<br>   it('works with admin flag', async () =&#62; {<br>     const { page } = await render(<br>       &#60;UseIsAdmin.Override with={oldHook =&#62; {<br>         const oldFlags = oldHook();<br>         return { ...oldFlags, isAdmin: true };<br>       }}&#62;<br>         &#60;MyComponent /&#62;<br>       &#60;/UseIsAdmin.Override&#62;<br>     );<br><br>     await expect(page.getByText('Permission error')).not.toBeVisible();<br>   });<br> });<br><br> describe('Language', () =&#62; {<br>   it('displays', async () =&#62; {<br>     const { page } = await render(<br>       &#60;Language.Override with={old =&#62; 'abc'}&#62;<br>         &#60;MyComponent /&#62;<br>       &#60;/Language.Override&#62;<br>     );<br><br>     await expect(page.getByText('Current language is abc')).toBeVisible();<br>   });<br> });</pre><p>Overrides are a powerful feature of SafeTest and the examples here only scratch the surface. For more information and examples, refer to the <a href="https://www.npmjs.com/package/safetest#overrides">Overrides section</a> on the <a href="https://github.com/kolodny/safetest/blob/main/README.md">README</a>.</p><h3>Reporting</h3><p>SafeTest comes out of the box with powerful reporting capabilities, such as automatic linking of video replays, Playwright trace viewer, and even <a href="https://safetest-two.vercel.app/vite-react-ts/?test_path=./Another.safetest&#38;test_name=Main2+can+do+many+interactions+fast">deep link directly to the mounted tested component</a>. The SafeTest repo <a href="https://github.com/kolodny/safetest/blob/main/README.md">README</a> links to all the <a href="https://safetest-two.vercel.app/">example apps</a> as well as the <a href="https://safetest-two.vercel.app/report.html#results=vite-react-ts/artifacts/results.json&#38;url=vite-react-ts/">reports</a></p><figure><img alt="Image of SafeTest report showing a video of a test run" src="https://cdn-images-1.medium.com/max/995/1*OFmV3PX7Is8X48-V9ryeig.png"></figure><h3>SafeTest in Corporate Environments</h3><p>Many large corporations need a form of authentication to use the app. Typically, navigating to localhost:3000 just results in a perpetually loading page. You need to go to a different port, like localhost:8000, which has a proxy server to check and/or inject auth credentials into underlying service calls. This limitation is one of the main reasons that Cypress/Playwright Component Tests aren’t suitable for use at Netflix.</p><p>However, there’s usually a service that can generate test users whose credentials we can use to log in and interact with the application. This facilitates creating a light wrapper around SafeTest to automatically generate and assume that test user. For instance, here’s basically how we do it at Netflix:</p><pre>import { setup } from 'safetest/setup';<br>import { createTestUser, addCookies } from 'netflix-test-helper';<br><br>type Setup = Parameters&#60;typeof setup&#62;[0] &#38; {<br>  extraUserOptions?: UserOptions;<br>};<br><br><br>export const setupNetflix = (options: Setup) =&#62; {<br>  setup({<br>    ...options,<br>    hooks: { beforeNavigate: [async page =&#62; addCookies(page)] },<br>  });<br><br>  beforeAll(async () =&#62; {<br>    createTestUser(options.extraUserOptions)<br>  });<br>};</pre><p>After setting this up, we simply import the above package in place of where we would have used safetest/setup.</p><h3>Beyond React</h3><p>While this post focused on how SafeTest works with React, it’s not limited to just React. SafeTest also works with Vue, Svelte, Angular, and even can run on NextJS or Gatsby. It also runs using either Jest or Vitest based on which test runner your scaffolding started you off with. The <a href="https://github.com/kolodny/safetest/tree/main/examples">examples folder</a> demonstrates how to use SafeTest with different tooling combinations, and we encourage contributions to add more cases.</p><p>At its core, SafeTest is an intelligent glue for a test runner, a UI library, and a browser runner. Though the most common usage at Netflix employs Jest/React/Playwright, it’s easy to add more adapters for other options.</p><h3>Conclusion</h3><p>SafeTest is a powerful testing framework that’s being adopted within Netflix. It allows for easy authoring of tests and provides comprehensive reports when and how any failures occurred, complete with links to view a playback video or manually run the test steps to see what broke. We’re excited to see how it will revolutionize UI testing and look forward to your feedback and contributions.</p><img src="https://medium.com/_/stat?event=post.clientViewed&#38;referrerSource=full_rss&#38;postId=37f9f88c152d" width="1" height="1" alt=""><hr><p><a href="https://netflixtechblog.com/introducing-safetest-a-novel-approach-to-front-end-testing-37f9f88c152d">Introducing SafeTest: A Novel Approach to Front End Testing</a> was originally published in <a href="https://netflixtechblog.com/">Netflix TechBlog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Running Serverless Puppeteer with Workers and Durable Objects</title>
		<link>https://noise.getoto.net/2023/09/28/running-serverless-puppeteer-with-workers-and-durable-objects/</link>
		
		<dc:creator><![CDATA[Tanushree Sharma]]></dc:creator>
		<pubDate>Thu, 28 Sep 2023 13:00:38 +0000</pubDate>
				<category><![CDATA[Birthday Week]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[Durable Objects]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Product News]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=27cc8a8cd733e50c25aa91b1b9f490a4</guid>

					<description><![CDATA[We’ve heard from developers that configuring and maintaining their own serverless browser automation systems can be quite painful. The Workers Browser Rendering API solves this]]></description>
		
		
		<enclosure url="http://blog.cloudflare.com/content/images/2023/09/Running-Serverless-Puppeteer-with-Workers-and-Durable-Objects-1.png" length="0" type="" />

			</item>
		<item>
		<title>Implementing idempotent AWS Lambda functions with Powertools for AWS Lambda (TypeScript)</title>
		<link>https://noise.getoto.net/2023/09/19/implementing-idempotent-aws-lambda-functions-with-powertools-for-aws-lambda-typescript/</link>
		
		<dc:creator><![CDATA[Pascal Vogel]]></dc:creator>
		<pubDate>Tue, 19 Sep 2023 07:40:52 +0000</pubDate>
				<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[AWS SDK for JavaScript in Node.js]]></category>
		<category><![CDATA[contributed]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[serverless]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=ded4e87d9f8688811cd18e74ce8eed91</guid>

					<description><![CDATA[This post is written by Alexander Schüren, Sr Specialist SA, Powertools. One of the design principles of AWS Lambda is to “develop for retries and failures”. If your function fails, the Lambda service will retry and invoke your function again with the same event payload. Therefore, when your function performs tasks such as processing orders […]]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>More Node.js APIs in Cloudflare Workers — Streams, Path, StringDecoder</title>
		<link>https://noise.getoto.net/2023/05/19/more-node-js-apis-in-cloudflare-workers-streams-path-stringdecoder/</link>
		
		<dc:creator><![CDATA[James M Snell]]></dc:creator>
		<pubDate>Fri, 19 May 2023 13:00:47 +0000</pubDate>
				<category><![CDATA[Cloudflare Workers]]></category>
		<category><![CDATA[Developer Week]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[WinterCG]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=337e7177b22cbda1b8f6513fd76e233c</guid>

					<description><![CDATA[Today we are announcing support for three additional APIs from Node.js in Cloudflare Workers — stream, crypto, and http/https.request. This increases compatibility with the existing ecosystem of open source NPM packages, allowing you to use your preferred libraries in Workers.]]></description>
		
		
		<enclosure url="http://blog.cloudflare.com/content/images/2023/05/image2-34.png" length="0" type="" />

			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Object Caching 82/445 objects using Memcached
Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Database Caching using Memcached

Served from: noise.getoto.net @ 2025-12-05 13:59:34 by W3 Total Cache
-->