A little retry tool for javascript/typescript

Overview

ts-retry

A little retry tool to execute a function until the function is successful. Can also bind a timeout to a function. This lib is usable in typescript, in javascript, in node, in SPA tools (rest, Vue, Svelte...) and browser (available in ESM and common js format).


Breaking change: To migrate to 3.x: retryAsyncDecorator and retryAsync ahs been move in utils/decorators. These impact only those that import those functions directly from decorator.ts file Other 3.X items are new and implies no breaking change.

For those who are using 1.x in typescript, you may have to add a type to RetryOptions if you want to use the new untilfunction. This type is the called function returns type.


How to

  • to retry something:

    const result = await retry(
      () => {
        /* do something */
      },
      { delay: 100, maxTry: 5 }
    );
  • to retry something async :

    const result = await retryAsync(
      async () => {
        /* do something */
      },
      { delay: 100, maxTry: 5 }
    );
  • to retry until the answer is 42 :

    try {
      await retryAsync(
        async () => {
          /* do something */
        },
        {
          delay: 100,
          maxTry: 5,
          until: (lastResult) => lastResult === 42,
        }
      );
    } catch (err) {
      if (isTooManyTries(err)) {
        // Did not get 42 after 'maxTry' calls
      } else {
        // something else goes wrong
      }
    }
  • Need to call a function at multiple locations with same retryOptions ? Use decorators:

    const fn = (param1: string, param2:number) => /* do something */;
    const decoratedFn = retryDecorator(
      fn,
      { delay:100, maxTry:5 }
    );
    const title1 = await decoratedFn("value1", 1);
    const title2 = await decoratedFn("valueXXX", 2);
    
    const fn = async (name: string): Promise<any> => { /* something async */ };
    const decoratedFn = retryAsyncDecorator(
      fn,
      { delay:100, maxTry:5 }
    );
    const result1 = await decoratedFn("Smith");
    const result2 = await decoratedFn("Doe");
  • to wait:

    await wait(10000); // Wait for 10 seconds
  • to set a timeout:

    try {
      const result = await waitUntil(
        async ()=> {/* do something */},
        10000
      );
    } catch (err) {
      if (isTimeoutError(error)) { {
        // fn does not complete after 10 seconds
      } else {
        // fn throws an exception
      }
    }
  • to set a timeout on something async:

    try {
      const result = await waitUntilAsync(async () => {
        /* do something */
      }, 10000);
    } catch (err) {
      if (isTimeoutError(error)) {
        // fn does not complete after 10 seconds
      } else {
        // fn throws an exception
      }
    }
  • Need to call a function at multiple locations with same retryOptions ? Use decorators:

      const fn = (title: string, count:number) => /* a long task */;
      const decoratedFn = waitUntilDecorator(
        fn,
        { delay:100, maxTry:5 }
      );
      const title1 = await decoratedFn("Intro", 1);
      const title2 = await decoratedFn("A chapter", 2);
    const fn = async (name: string): Promise<any> => {
      /* a long task */
    };
    const decoratedFn = waitUntilAsyncDecorator(fn, { delay: 100, maxTry: 5 });
    const result1 = await decoratedFn("John");
    const result2 = await decoratedFn("Doe");

Utils

retry comes with handy utilities function for common use case:

  • to retry until a function returns something defined (aka not null neither not undefined):
  // in all cases results is a string and cannot be null or undefined
  const result = await retryUntilDefined( (): string|undefined => { ... } ) );

  const result = await retryUntilAsyncDefined( (): Promise<string|null> => { ... } );

  const decorated = retryUntilDefinedDecorator( (p1: string): string|undefined => { ... } );
  const result = await decorated('hello world');

  const decorated = retryAsyncUntilDefinedDecorator( (p1: string): Promise<string|undefined> => { ... } );
  const result = await decorated('hello world');
  • to retry until a function returns something truthy:
  // in all cases results is a string and cannot be null or undefined
  const result = await retryUntilTruthy( (): boolean|undefined => { ... } ) );

  const result = await retryAsyncUntilTruthy( (): Promise<number|null> => { ... } );

  const decorated = retryUntilTruthyDecorator( (p1: string): boolean|undefined => { ... } );
  const result = await decorated('hello world');

  const decorated = retryAsyncUntilTruthyDecorator( (p1: string): Promise<boolean|null> => { ... } );
  const result = await decorated('hello world');
  • to retry until fetch is successfully:
  const result = await retryAsyncUntilResponse( () => fetch(...) );

  const decorated = retryAsyncUntilResponseDecorator( (param) => fetch(...) );
  const result = await decorated('q=1');

API

Retry family

  • retry(fn, retryOptions?): call repeatedly fn until fn does not throw an exception. Stop after retryOptions.maxTry count. Between each call wait retryOptions.delay milliseconds. if stop to call fn after retryOptions.maxTry, throws fn exception, otherwise returns fn return value.

  • retryAsync(fn, retryOptions?): same as retry, except fn is an asynchronous function.

  • retryOptions:

    • maxTry: [optional] maximum calls to fn.
    • delay: [optional] delay between each call (in milliseconds). Could be either a number or a function (when delay time dependent from number of retrys, of previous result...), see below for explanation about delay
    • until: [optional] (lastResult) => boolean: return false if last fn results is not the expected one: continue to call fn until until returns true. A TooManyTries is thrown after maxTry calls to fn; When an option value is not provided, the default one is applied. The default options are:
      delay: 250,
      maxTry: 4 * 60,
      until: null
  • setDefaultRetryOptions<T>(retryOptions: RetryOptions<T>): change the default retryOptions.

  • getDefaultRetryOptions<T>(): returns the current default retry options.

  • retryAsyncDecorator<T>(fn: T, retryOptions?: RetryOptions<T>) and retryDecorator<T>(fn: T, retryOptions?: RetryOptions<T>): decorators that return a function with same signature than the given function. On decorated call, fn is called repeteadly it does not throw an exception or until retryOptions.maxTry.

  • TooManyTries: an error thrown by retry functions when until returns false after maxTry calls. It comes with a type guard and includes the last failed result:

if (isTooManyTries(error)) {
  // retry failed
  console.error(`last error is ${error.getLastResult()}`)
}

When delay can vary

When delay option is a function, it is called before each retry: this allow to have a delay that can change between retires (ex: delay can increase exponentially). The function receives the following parameters:

(parameter: {
  currentTry: number,
  marTry: number,
  lastDelay?: number
  lastResult?: RETURN_TYPE
}) => number;

where:

  • currentTry: the number of call to fn (first is 1, not 0).
  • maxTry: maximum calls to fn.
  • lastDelay: the previous delay, undefined when no delay has been computed yet.
  • lastResult: the last result, undefined is last call to fn failed

Until family

retry comes with handy utilities function for common use case:

UntilDefined : To retry until we get a value which is neither null nor undefined.

For calling sync function:

retryUntilDefined<RETURN_TYPE>(
  fn: () => RETURN_TYPE | undefined | null,
  retryOptions?: RetryUtilsOptions,
): Promise<RETURN_TYPE>
retryUntilDefinedDecorator<PARAMETERS_TYPE, RETURN_TYPE>(
  fn: (...args: PARAMETERS_TYPE) => RETURN_TYPE | undefined | null,
  retryOptions?: RetryUtilsOptions,
): (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>

For calling async function:

retryAsyncUntilDefined<RETURN_TYPE>(
  fn: () => Promise<RETURN_TYPE | undefined | null>,
  options?: RetryUtilsOptions,
): Promise<RETURN_TYPE>
retryAsyncUntilDefinedDecorator<PARAMETERS_TYPE, RETURN_TYPE>(
  fn: (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE | undefined | null>,
  retryOptions?: RetryUtilsOptions,
): (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>

UntilTruthy : To retry until we get a value which javascript consider as truthy.

For calling sync function:

retryUntilTruthy<PARAMETERS_TYPE, RETURN_TYPE>(
  fn: (...args: PARAMETERS_TYPE) => RETURN_TYPE,
  retryOptions?: RetryUtilsOptions,
): Promise<RETURN_TYPE>
retryUntilTruthyDecorator<PARAMETERS_TYPE,  RETURN_TYPE>(
  fn: (...args: PARAMETERS_TYPE) => RETURN_TYPE,
  retryOptions?: RetryUtilsOptions,
): (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>

For calling async function:

retryAsyncUntilTruthy<PARAMETERS_TYPE, RETURN_TYPE>(
  fn: (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>,
  retryOptions?: RetryUtilsOptions,
): Promise<RETURN_TYPE>
retryAsyncUntilTruthyDecorator<PARAMETERS_TYPE, RETURN_TYPE>(
  fn: (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>,
  retryOptions?: RetryUtilsOptions,
): (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>

UntilResponse : To retry until fetch is sucessfull.

retryAsyncUntilResponse<PARAMETERS_TYPE, RETURN_TYPE extends { ok: boolean }>(
  fn: () => Promise<RETURN_TYPE>,
  retryOptions?: RetryUtilsOptions,
): Promise<RETURN_TYPE>
retryAsyncUntilResponseDecorator<PARAMETERS_TYPE, RETURN_TYPE extends { ok: boolean }>(
  fn: (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>,
  retryOptions?: RetryUtilsOptions,
): (...args: PARAMETERS_TYPE) => Promise<RETURN_TYPE>

RetryUtilsOptions type is the same than RetryUtilsOptions but without until option.

Delay family

createExponetialDelay Returns a delay function that provide exponetial delais

const delay = createExponetialDelay(20);
const result = await retryAsync(
  async () => {
    /* do something */
  },
  { delay, maxTry: 5 }
);

delay between each try will return 20, 400, 8000, 160000, 3200000

createMutiplicableDelay Returns a delay function that provide multiplicated delais:

createMutiplicableDelay<RETURN_TYPE>(initialDelay: number, multiplicator: number)

First delay retunrs initialDelay, second initialDelaymultiplicator, third multiplicator initialDelay(multiplicator*2) and so on

const delay = createMutiplicableDelay(20);
const result = await retryAsync(
  async () => {
    /* do something */
  },
  { delay, maxTry: 5 }
);

delay will be 20, 60, 120, 180, 240

createRandomDelay Returns a delay function that provide radom delais between given min and max (included):

createRandomDelay<RETURN_TYPE>(min: number, max: number)

Each time the created delay is called, a value between min and max (both included) is generated

const delay = createRandomDelay(500, 10000);
const result = await retryAsync(
  async () => {
    /* do something */
  },
  { delay, maxTry: 5 }
);

delay betewwen each try will be a random value between 500 and 1000 ms.

Wait family

  • wait(duration?): Do nothing during "duration" milliseconds
  • waitUntil(fn, duration?, error?): waitUntil call asynchronously fn once. If fn complete within the duration (express in milliseconds), waitUntil returns the fn result. Otherwise, it throws the given error (if any) or a TimeoutError exception.
  • waitUntilAsync(fn, duration?, error?): same as waitUntil, except fn is an asynchronous function.
  • TimeoutError: an error thrown by waitUntil and waitUntilAsync. It comes with a isTimeoutError type guard:
if (isTimeoutError(error)) {
  // fn does not complete within 10 seconds
}

In case of timeout fn is still executing. It is advised to add a mean to abort it.

  • When duration is not provided, the default one is applied. The default is 60000ms.
  • setDefaultDuration(duration: number): change the default duration.
  • getDefaultDuration(): returns the current default duration.
  • waitUntilAsyncDecorator(fn: T, duration?: number, error?: Error) and waitUntilDecorator(fn: T, duration?: number, error?: Error): decorators that return a function with same signature than the given function. On decorated call, fn is called bounded to the duration.

Custom reaction when max retry is achieved

Sometimes, you need to perform some actions when max retry has achieved and the error is still there. For this onMaxRetryFunc?: (err: Error) => void; optional function was added to RetryOptions. For example, you would like to store results of the error into the file in order to process it later. Here's how you can do it :

export const runWithRetry = <T>(
  message: string,
  serviceUnderTest: ServiceUnderTest,
  fn: () => T | Promise<T>,
  delay = 1000,
  maxTry = 10
) => {
  const saveErrorReport = (err) => {
    const errorDetails = {
      serviceName: serviceUnderTest.connectorName,
      error: err.message as string,
      description: `Failed to ${message} because of ${err.message as string}`,
      errorName: err.name as string,
      stack: err.stack as string,
    };
    const path = resolve(
      __dirname,
      `../../../failed-service-report/${serviceUnderTest.connectorName}.json`
    );
    writeFile(path, Buffer.from(JSON.stringify(errorDetails)));
  };
  return retryAsync(
    async () => {
      logger.info(`${serviceUnderTest.description}: ${message}`);
      return fn();
    },
    {
      delay,
      maxTry,
      onMaxRetryFunc: saveErrorReport,
    }
  );
};

Compatibility

This lib works with Deno (to import it,use the url https://raw.githubusercontent.com/franckLdx/ts-retry/<version>/src/index.ts). However, it's more convenient to use the specific port of this lib to Deno: see https://deno.land/x/retry

Comments
  • Bump minimatch from 3.0.4 to 3.1.2

    Bump minimatch from 3.0.4 to 3.1.2

    Bumps minimatch from 3.0.4 to 3.1.2.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 2
  • Ability to access last error in TooManyTries

    Ability to access last error in TooManyTries

    Please add to TooManyTries a field that contains the last Error thrown by the async function, so one can easily access the last error that was thrown and react accordingly.

    enhancement 
    opened by sweethuman 2
  • Add a function that is executed before throwing an error on TooManyRetries

    Add a function that is executed before throwing an error on TooManyRetries

    Hi,

    Thanks for this great library. It really helps us with API tests that we are writing in the company. There's one thing that we were missing - when we hit max retry limit, we would like to keep a record of the error message and origin ( service ) of the issue. For that we made a wrapper around your library that looks something like this :

    export const runWithRetry = <T>(
        message: string,
        serviceUnderTest: ServiceUnderTest,
        fn: () => T | Promise<T>,
        delay = 1000,
        maxTry = 10
    ) => {    
        return retryAsync(
            async () => {
                logger.info(`${serviceUnderTest.description}: ${message}`)
                return fn()
            },
            {
                delay,
                maxTry,            
            }
        )
    }
    

    This way, when we run some function that we want to retry, we also keep things like "what is this function does" + which service is responsible for this action. This helps us to build reporting around this and make slack messages where developers can see right in the slack which service caused the problem.

    With initial implementation of the library I was not able to see how we can easily to try catch wrapping around retryAsync library and that's why I came up with this PR idea. What I have done is I simply added to retryOptions one more optional field that accepts a function. In this function we can do something like this :

    export const runWithRetry = <T>(
        message: string,
        serviceUnderTest: ServiceUnderTest,
        fn: () => T | Promise<T>,
        delay = 1000,
        maxTry = 10
    ) => {
        const saveErrorReport = (err) => {
            const errorDetails = {
                serviceName: serviceUnderTest.connectorName,
                error: err.message as string,
                description: `Failed to ${message} because of ${err.message as string}`,
                errorName: err.name as string,
                stack: err.stack as string,
            }
            const path = resolve(
                __dirname,
                `../../../failed-service-report/${serviceUnderTest.connectorName}.json`
            )
            writeFile(path, Buffer.from(JSON.stringify(errorDetails)))
        }
        return retryAsync(
            async () => {
                logger.info(`${serviceUnderTest.description}: ${message}`)
                return fn()
            },
            {
                delay,
                maxTry,
                onMaxRetryFunc: saveErrorReport,
            }
        )
    }
    

    This way all the error details will be stored in the file and later we can actually parse this data and include into our Slack notifications.

    I hope that you will accept this change and publish it with your library.

    Thanks !

    opened by azakordonets 2
  • Bump minimist from 1.2.5 to 1.2.7

    Bump minimist from 1.2.5 to 1.2.7

    Bumps minimist from 1.2.5 to 1.2.7.

    Changelog

    Sourced from minimist's changelog.

    v1.2.7 - 2022-10-10

    Commits

    • [meta] add auto-changelog 0ebf4eb
    • [actions] add reusable workflows e115b63
    • [eslint] add eslint; rules to enable later are warnings f58745b
    • [Dev Deps] switch from covert to nyc ab03356
    • [readme] rename and add badges 236f4a0
    • [meta] create FUNDING.yml; add funding in package.json 783a49b
    • [meta] use npmignore to autogenerate an npmignore file f81ece6
    • Only apps should have lockfiles 56cad44
    • [Dev Deps] update covert, tape; remove unnecessary tap 49c5f9f
    • [Tests] add aud in posttest 228ae93
    • [meta] add safe-publish-latest 01fc23f
    • [meta] update repo URLs 6b164c7

    v1.2.6 - 2022-03-21

    Commits

    • test from prototype pollution PR bc8ecee
    • isConstructorOrProto adapted from PR c2b9819
    • security notice for additional prototype pollution issue ef88b93
    Commits
    • c590d75 v1.2.7
    • 0ebf4eb [meta] add auto-changelog
    • e115b63 [actions] add reusable workflows
    • 01fc23f [meta] add safe-publish-latest
    • f58745b [eslint] add eslint; rules to enable later are warnings
    • 228ae93 [Tests] add aud in posttest
    • 236f4a0 [readme] rename and add badges
    • ab03356 [Dev Deps] switch from covert to nyc
    • 49c5f9f [Dev Deps] update covert, tape; remove unnecessary tap
    • 783a49b [meta] create FUNDING.yml; add funding in package.json
    • Additional commits viewable in compare view
    Maintainer changes

    This version was pushed to npm by ljharb, a new releaser for minimist since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • exponential backoff and and policy basing on error type

    exponential backoff and and policy basing on error type

    41b3577486839d799e669632927cdd12

    I would like to propose two features:

    1. exponential backoff - possible to realize by function with delay time dependent from number of retrys
    2. instant reject or resolve for some error types - possible by adding layer with error processing before next iteration
    opened by gustawdaniel 1
  • Bump minimist from 1.2.5 to 1.2.6

    Bump minimist from 1.2.5 to 1.2.6

    Bumps minimist from 1.2.5 to 1.2.6.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump glob-parent from 5.1.1 to 5.1.2

    Bump glob-parent from 5.1.1 to 5.1.2

    Bumps glob-parent from 5.1.1 to 5.1.2.

    Release notes

    Sourced from glob-parent's releases.

    v5.1.2

    Bug Fixes

    Changelog

    Sourced from glob-parent's changelog.

    5.1.2 (2021-03-06)

    Bug Fixes

    6.0.0 (2021-05-03)

    ⚠ BREAKING CHANGES

    • Correct mishandled escaped path separators (#34)
    • upgrade scaffold, dropping node <10 support

    Bug Fixes

    • Correct mishandled escaped path separators (#34) (32f6d52), closes #32

    Miscellaneous Chores

    • upgrade scaffold, dropping node <10 support (e83d0c5)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump browserslist from 4.16.3 to 4.16.6

    Bump browserslist from 4.16.3 to 4.16.6

    Bumps browserslist from 4.16.3 to 4.16.6.

    Changelog

    Sourced from browserslist's changelog.

    4.16.6

    • Fixed npm-shrinkwrap.json support in --update-db (by Geoff Newman).

    4.16.5

    • Fixed unsafe RegExp (by Yeting Li).

    4.16.4

    • Fixed unsafe RegExp.
    • Added artifactory support to --update-db (by Ittai Baratz).
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump lodash from 4.17.20 to 4.17.21

    Bump lodash from 4.17.20 to 4.17.21

    Bumps lodash from 4.17.20 to 4.17.21.

    Commits
    • f299b52 Bump to v4.17.21
    • c4847eb Improve performance of toNumber, trim and trimEnd on large input strings
    • 3469357 Prevent command injection through _.template's variable option
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump y18n from 4.0.0 to 4.0.3

    Bump y18n from 4.0.0 to 4.0.3

    Bumps y18n from 4.0.0 to 4.0.3.

    Changelog

    Sourced from y18n's changelog.

    4.0.3 (2021-04-07)

    Bug Fixes

    • release: 4.x.x should not enforce Node 10 (#126) (1e21a53)

    4.0.1 (2020-11-30)

    Bug Fixes

    Commits
    Maintainer changes

    This version was pushed to npm by oss-bot, a new releaser for y18n since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump y18n from 4.0.0 to 4.0.1

    Bump y18n from 4.0.0 to 4.0.1

    Bumps y18n from 4.0.0 to 4.0.1.

    Changelog

    Sourced from y18n's changelog.

    Change Log

    All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

    5.0.5 (2020-10-25)

    Bug Fixes

    5.0.4 (2020-10-16)

    Bug Fixes

    • exports: node 13.0 and 13.1 require the dotted object form with a string fallback (#105) (4f85d80)

    5.0.3 (2020-10-16)

    Bug Fixes

    • exports: node 13.0-13.6 require a string fallback (#103) (e39921e)

    5.0.2 (2020-10-01)

    Bug Fixes

    5.0.1 (2020-09-05)

    Bug Fixes

    5.0.0 (2020-09-05)

    ⚠ BREAKING CHANGES

    • exports maps are now used, which modifies import behavior.
    • drops Node 6 and 4. begin following Node.js LTS schedule (#89)

    Features

    ... (truncated)

    Commits
    Maintainer changes

    This version was pushed to npm by oss-bot, a new releaser for y18n since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
Releases(v3.1.2)
Owner
Franck Ledoux
Franck Ledoux
Full-stack @Linkedin clone but this one is a little different 👨🏻‍💻

Linkedout Running project $ docker-compose up Accessing the linkedout from a browser The starter linkedout works with a load balancer that binds to po

Cihat Salik 6 Jul 25, 2022
GUI tool to explore Slash Commands of your bot, built on Vue 3 and TailwindCSS 🚀

Slash Commands GUI Graphical User Interface to explore Slash Commands of your bot, built on Vue 3 and TailwindCSS ?? Features Everything you can do wi

Androz 121 Dec 23, 2022
L'atelier, a project management tool

L'atelier, a project management tool

Jérôme Blondon 83 Dec 20, 2022
Pathfinding visualization tool for pathfinding algorithm

Pathfinding Visualizer Welcome to my pathfinding visualizer, this pathfinding visualizer was inspired by Clément Mihailescu pathfinding algorithm proj

Gunawan Nur Ahmad 18 Feb 2, 2022
⚡ A beautiful Lanyard visualizer tool to display your Discord status online! Works with Spotify and all RPCs!

A service to see your Discord status online easy and for free with the help of the Lanyard API! To use this service, you have to be in Lanyard's Discord server so that it could monitor you, you can find the invite link in Lanyard's GitHub repository.

EGGSY 51 Dec 2, 2022
Cheat Facebook Algorithms is a tool that tries to simulate arabic chars shape with different unicode to cheat Facebook Algorithms.

Cheat Facebook Algorithms is a tool that tries to simulate arabic chars shape with different unicode to cheat Facebook Algorithms.

Abdelrhman Said 15 Feb 2, 2022
Vue front-end and back-end tool.

jVue 1. Class-based TS Vue 工程的类型检查需求,一直是一个大问题。 For Vue projects, the requirement of type checking has been a big problem so far. 现在我们可以像这样使用 TypeScrip

龙腾道 6 Jan 19, 2022
Gamebrary - Open source tool to organize video game collections.

Gamebrary Open source tool to organize video game collections. Gamebrary is an open source tool that helps organize video game collections. Written in

Roman Cervantes 76 Dec 14, 2022
CSS Transform Playground. Online tool to visualize 2D & 3D CSS3 Transform functions.

css-transform › css-transform.moro.es CSS3 Transform Functions Playground. Demo UI built with Vue, Gulp and LESS. Deployment via Netlify Development —

Jorge Moreno 132 Dec 7, 2022
Best-shot - a webpack config tool chain

Best-shot - a webpack config tool chain

best-shot 1 Apr 9, 2022
This is my project in building a simple tool to extract text from an image.

Extract Text About this is my project in building a simple tool to extract text from an image. I am implementing a Tesseract JS library in my project.

BAGUS BUDI SATOTO 6 Dec 28, 2022
ast-grep(sg) is a lightning fast and user friendly tool for code searching, linting, rewriting at large scale.

ast-grep(sg) is a lightning fast and user friendly tool for code searching, linting, rewriting at large scale.

null 11 Nov 5, 2022
Applications for any device with HTML, CSS and JavaScript - free and open source!

App Framework App Framework development has ended. I recommend using the Framework7 CLI instead. iOS and Android Apps with HTML & JavaScript - App Fra

null 646 Dec 28, 2022
🌟 DataFormsJS 🌟 A minimal JavaScript Framework and standalone React and Web Components for rapid development of high quality websites and single page applications.

?? Welcome to DataFormsJS! Thanks for visiting! ?? ?? ?? ?? ?? ?? 中文 (简体) 欢迎来到 DataFormsJS Español Bienvenido a DataFormsJS Português (do Brasil) Bem

DataFormsJS 156 Dec 8, 2022
A small game written in Javascript

Vue 3 + Vite This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 <script setup> SFCs, check out the scrip

Yosef Yudha Wijaya 2 Dec 4, 2022
Simple diceware password generator built using Vue and plain JavaScript

Vue Diceware This is simple diceware password generator built using Vue and plain JavaScript. It generates passwords consisting 4 up to 10 words using

Maciek Talaśka 0 Feb 3, 2021
A bundler for javascript and friends. Packs many modules into a few bundled assets

A bundler for javascript and friends. Packs many modules into a few bundled assets. Code Splitting allows for loading parts of the application on demand. Through

webpack 62.3k Jan 9, 2023
Singlepage.js is a pure Javascript portal platform for building modular Web applications

Singlepage.js is a pure Javascript portal platform for building modular Web applications.

Padmanabh Dabke 0 Jan 22, 2021
GSAP is a robust JavaScript toolset that turns developers into animation superheroes

GSAP is a robust JavaScript toolset that turns developers into animation superheroes. Build high-performance animations that work in every major browser. Animate CSS, SVG, canvas, React, Vue, WebGL, colors, strings, motion paths, generic objects...anything JavaScript can touch! GSAP's ScrollTrigger plugin lets you create jaw-dropping scroll-based animations with minimal code.

GreenSock 15.4k Jan 5, 2023