npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@theia-extension-tester/repeat

v0.1.2

Published

Repeat function until it returns truthful value.

Downloads

10

Readme

repeat

Repeat module was heavily inspired by Selenium WebDriver.wait method. However it was not possible to use in @theia-extension-tester/abstract-element due to recursion problem when searching elements. By the time the functionality was extended even further and the repeat function was prioritized more than driver.wait function.

Features

The Repeat class implements the same features as driver.wait but there are some key differences:

  1. Method behavior when timeout = 0 :: driver.wait uses infinity timeout instead / the Repeat class performs single iteration
  2. Method behavior when timeout = undefined :: The same behavior. Loop indefinitely.
  3. The Repeat class supports threshold timer. Timer which does not resolve promise immediately but checks returned value was truthful for duration of threshold time. Useful when some page object is laggy.

Single loop in the class is one execution of given function as argument. This behavior can be overridden by returning object in the given function. The object has the following format:

{
   // Value to be checked and returned.
   value?: T;
   // Use one of these to mark loop end.
   // If given LOOP_DONE and timeout = 0 then the repeat returns the value.
   loopStatus: LoopStatus.LOOP_DONE | LoopStatus.LOOP_UNDONE
   // Delay next loop. Default is 0.
   delay?: number;
}

Support for delaying next iteration. Some operations requires multiple checks but the checks cannot be repeated rapidly in consecutive manner. This feature was for example used in TextEditor page object. Without delays Eclipse Che web sockets were failing. To see how to use delays please refer to example above.

Usage

Install via npm

npm install @theia-extension-tester/repeat

Install via yarn

yarn add @theia-extension-tester/repeat

Verify Input page object does not have error message when given input. This action is sometimes flaky and therefore repeat might be good for this situation.

const input = await InputBox.create();
// Do not await on purpose of demonstration.
input.setText("[email protected]");
// Verify email validation went through.
await repeat(async () => {
 try {
     // In case the input becomes stale.
     const in = await InputBox.create();
     return await in.hasError() === false;
     // or
     // return {
     //   value: await in.hasError() === false,
     //   loopStatus: LoopStatus.LOOP_DONE,
     //   delay: 150
     // };
 }
 catch (e) {
     return false;
 }
}, {
 timeout: 30000,
 message: "Email could not be successfully verified.",
 // Make sure the result is stable.
 threshold: 1000
})

Limitations

At this moment it is not possible to share timeouts between nested repeats. So when working with repeats take in account other repeats because if one of them raises an exception, others repeats are not aborted by default. If any task is left running and unbound by timeout condition then it will run until program finishes and might result in program getting stuck and deadlocked.