GithubHelp home page GithubHelp logo

devlato / async-wait-until Goto Github PK

View Code? Open in Web Editor NEW
72.0 3.0 12.0 582 KB

Waits for an expectation to be truthy. A small library with a convenient API suitable for unit and integration testing

Home Page: https://devlato.github.io/async-wait-until/

License: MIT License

JavaScript 20.28% TypeScript 79.17% Shell 0.55%
npm nodejs javascript node async wait await promise timer sync typescript predicate testing unit-testing integration-testing jsdom react-testing-library

async-wait-until's Introduction

async-wait-until

A tiny yet convenient and fast zero-dependency library that makes it possible to write an asynchronous code that awaits some event to happen. It works on any JavaScript runtime that supports Promises either natively or with a polyfill (i.e. this one), including old Node.js versions and old web browsers.

npm version npm downloads, weekly online documentation build status maintainability code coverage minzipped bundle size license

⚙️ Installation

The package is available on npm:

$ npm install --save async-wait-until

It ships with an UMD bundle by default (which works well as-is on Node.js and web browsers), but bundles for other module systems are also available in the package's dist/ folder.

import { waitUntil } from 'async-wait-until';

// ...
await waitUntil(() => document.querySelector('#hey') != null);
Click to see examples for other module systems
  • CommonJS:
    const { waitUntil } = require('async-wait-until/dist/commonjs');
    // ...
  • ES Modules:
    import { waitUntil } from 'async-wait-until';
    // ...
    or
    import { waitUntil } from 'async-wait-until/dist/index.esm.js';
    // ...
  • AMD:
    <script type="text/javascript" src="scripts/require.js"></script>
    <script type="text/javascript">
      requirejs.config({
        baseUrl: 'scripts/node_modules',
        paths: {
          'async-wait-until': 'async-wait-until/dist/amd.js',
        },
      });
      define(['async-wait-until'], ({ waitUntil }) => {
        // ...
      });
    </script>
  • IIFE:
    <script type="text/javascript" src="async-wait-until/dist/iife.js"></script>
    <script type="text/javascript">
      const { waitUntil } = asyncWaitUntil;
      // ...    
    </script>
  • SystemJS:
    <script src="scripts/system.js"></script>
    <script type="systemjs-importmap">
      {
        imports: {
          'async-wait-until': './scripts/node_modules/async-wait-until/dist/systemjs.js',
        }
      }
    </script>
    <script type="systemjs-module">
      System
          .import('async-wait-until')
          .then(({ waitUntil }) => {
            // ...
          });
    </script>

👨‍💻👩‍💻 Use

Let's assume we have a piece of code that asynchronously appends a new <div /> node to the page body, and we want to wait for it to happen and then do something with that node. Let's also assume that for some unknown reason, we can neither use MutationObserver nor modify the code that adds the node 🤷‍♂️. How bizarre!

However, we know that optimistically, on a fast enough computer, this will happen within let's say 10 seconds (but it's not guaranteed). The following code snippet mimics this behaviour:

// @file a-sneaky-module.js

// Aha! Sometimes, it can take more than 10 seconds, and this is how we emulate it
const MAX_IDLE_INTERVAL_MILLISECONDS_BEFORE_ADDING_A_DIV_IN = 11 * 1000;

// Some utility functions, it's safe to ignore them 
const randomIntegerInRange = ({ min = 0, max }) => 
  min + Math.floor(Math.random() * (max - min));
const randomTimeInterval = () => randomIntegerInRange({ 
  max: MAX_IDLE_INTERVAL_MILLISECONDS_BEFORE_ADDING_A_DIV_IN,
});

// Adds a <div /> to the document body
const appendADivToTheDocumentBody = () => {
  const node = document.createElement('div');
  node.className = 'spooky-spooky-skeleton';
  window.document.body.appendChild(node);
};

// A sneaky function that schedules adding a <div /> to the document body 
// at some time within 11 seconds
const appendADivToTheDocumentBodySomeAtTimeWithinAGivenTimeInterval = () => 
  setTimeout(
    appendADivToTheDocumentBody,
    randomTimeInterval(),
  );

export const doTheDivThing = appendADivToTheDocumentBodySomeAtTimeWithinAGivenTimeInterval;

Let's call the above code a-sneaky-module.js.

So how do we the consumers of the a-sneaky-module.js know when exactly the <div /> node gets added?

import { doTheDivThing } from './a-sneaky-module.js';

const doOutThing = async () => {
  // ...

  doTheDivThing();
  // Hmmmm... so what? How do we work with that <div />. Is it already in the DOM?
};

async-wait-until to the rescue, we can easily detect when it happens (and react to it):

import { doTheDivThing } from './a-sneaky-module.js';
import { waitUntil } from './async-wait-until';

const doOutThing = async () => {
  // ...
  
  doTheDivThing();

  // Yup! Easy right?
  const divNode = await waitUntil(
    // Here, we specify a function that will be repeatedly called from time to time
    // Let's call this kind of function a `predicate`
    () => window.document.body.querySelector('div.spooky-spooky-skeleton'),
    // Here, we can specify a timeout in milliseconds. Once it passes, 
    // we'll stop waiting and throw an exception
    { timeout: 10000 },
  );
  // A colour of triumph
  divNode.style.backgroundColor = 'rgba(255, 0, 0, 0.5)';
};

However, we aren't 100% sure that the <div /> will be added within 10 seconds. What will happen if 10 seconds have passed and the <div /> node still isn't there?

From the above code, it's clear that our 'predicate' function (or simply 'predicate') won't return the DOM node. So what waitUntil will do in that case is it will throw a TimeoutException (also exported from the library so you can handle it).

import { doTheDivThing } from './a-sneaky-module.js';
import { waitUntil, TimeoutError } from './async-wait-until';

const doOurThing = async () => {
  // ...
  
  doTheDivThing();

  try {
    const predicate = () => window.document.body.querySelector('div.spooky-spooky-skeleton');
    const divNode = await waitUntil(predicate, { timeout: 10000 });
    
    divNode.style.backgroundColor = 'rgba(255, 0, 0, 0.5)';
  } catch (e) {
    if (e instanceof TimeoutError) {
      // Unfortunately, 10 seconds have passed but we haven't detected the `<div />`
      // If we had a UI, we could show an error there or allow the user to retry
      alert('No <div /> have been detected unfortunately');
    } else {
      // Some other error, most likely thrown from the predicate function.
      alert('Unknown error occurred');
      console.error(e);
    }    
  }
};

So, summing up the above, the predicate will run again and again within the given timeout, until it first returns a non-falsy value. If this doesn't happen, a TimeoutError is thrown.

API

Let's start with the waitUntil function. It takes up to two parameters (deprecated: up to three), and returns a Promise that will be resolved with the first non-falsy value returned by the predicate.

Parameter Type Required Default Description
predicate Function ✅ Yes - A function that is expected to return a non-falsy (aka a 'truthy') value, or a Promise to return such a value. Hence, both sync and async functions are supported.
options Options object 🚫 No 5000 ms Options for the wait algorithm implemented by waitUntil, see its properties on the below table. Deprecated: timeout in milliseconds.
intervalBetweenAttempts number 🚫 No 50 ms Deprecated parameter: number of milliseconds between retry attempts. Please use options instead.

Above, you can see the options param. Here are the available options:

Parameter Type Required Default Description
timeout number 🚫 No 5000 ms Timeout in milliseconds.
intervalBetweenAttempts number 🚫 No 50 ms Number of milliseconds between retry attempts.

Recipes

Waiting for something forever

If you aren't sure how long a process will take, you can use waitUntil.Forever (which is a shortcut for Number.POSITIVE_INFINITY) as the timeout value:

import { waitUntil, WAIT_FOREVER } from 'async-wait-until';

// ...

const result = waitUntil(() => Date.now() >= new Date('Jan 13, 2022 11:35 am'), {
  timeout: WAIT_FOREVER, // === Number.POSITIVE_INFINITY
});

Customizing the interval between retries

In addition to the timeout option, you can customize the interval between retries:

import { waitUntil } from 'async-wait-until';

// ...

const result = waitUntil(() => Date.now() >= new Date('Jan 13, 2022 11:35 am'), {
  intervalBetweenAttempts: 1000, // Retry every second instead of 50 milliseconds
});

👨‍⚖️👩‍⚖️ License

Library is shipped "as is" under the MIT License.

👷‍♂️👷‍♀️ Contributing

Contributions (issues, bug and feature requests, and PRs) are welcome! Please follow the contribution guidelines.

Click for additional information on development dependencies and available commands

Development dependencies

  1. The library is written in TypeScript and is bundled with Parcel.
  2. Code style is powered by ESLint and Prettier with a custom config.
  3. We use jest for running unit tests.

Available commands

Test:

$ npm test

Lint:

$ npm run lint

Reformat:

$ npm run format

Build

$ npm run build

Generate docs

The following command generates docs from the inline JSDoc/TSDoc:

$ npm run docs

async-wait-until's People

Contributors

devlato avatar github-actions[bot] avatar lukaszkokot avatar si458 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

async-wait-until's Issues

[Bug Report] WaitUntil does not close handlers so jest stuck and waits

Describe the bug
waitUntil does not close all open handlers so jest sits and waits

To Reproduce
Steps to reproduce the behavior:

  1. Create jest test like
const end = Date.now() + 1000
await waitUntil(() => Date.now() < end)
  1. Run test

You will see

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.

Expected behavior
All handlers are closed

Screenshots
If you run with --detectOpenHandles you will see

Screen Shot 2022-02-09 at 6 55 06 PM

Additional context
Add any other context about the problem here.

ChainAlert: npm package release (2.0.11) has no matching tag in this repo

Dear async-wait-until maintainers,
Thank you for your contribution to the open-source community.

This issue was automatically created to inform you a new version (2.0.11) of async-wait-until was published without a matching tag in this repo.

Our service monitors the open-source ecosystem and informs popular packages' owners in case of potentially harmful activity.
If you find this behavior legitimate, kindly close and ignore this issue. Read more

badge

[Bug Report] Latest release (2.0.10) is broken

Describe the bug

The latest version of async-wait-until is broken - it contains no code assets.

image

To Reproduce
Steps to reproduce the behavior:

  1. Update to [email protected]
  2. See compiler/IDE error.

Expected behavior
A clear and concise description of what you expected to happen.

N/A

Screenshots
If applicable, add screenshots to help explain your problem.

Additional context
Add any other context about the problem here.

waitUntil throws exception however keeps on running the predicate

Describe the bug
When I use a predicate with a timeout and interval, an exception is correctly thrown after the timeout but the predicate is still being executed.

To Reproduce
https://codesandbox.io/s/vigilant-dust-c3119?file=/src/index.js

import { waitUntil } from "async-wait-until";

(() => {
  waitUntil(
    () => {
      console.log("Trying");
      return Promise.resolve(false);
    },
    { timeout: 1000, intervalBetweenAttempts: 100 }
  );
})();

Expected behavior
Exception is thrown and the predicate no longer runs. However, the exception is thrown but the predicate is still being executed

[Bug Report]: ESM build needed

Thanks for this package, I've been using it with Svelte, and I'm migrating our codebase to SvelteKit/Vite which uses ES modules. I'm getting the following error when building the project:

> Named export 'waitUntil' not found. The requested module 'async-wait-until' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'async-wait-until';
const {waitUntil} = pkg;

file:///Users/ben/dev/myproject/.svelte-kit/output/server/app.js:12
import {waitUntil} from "async-wait-until";
        ^^^^^^^^^
SyntaxError: Named export 'waitUntil' not found. The requested module 'async-wait-until' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'async-wait-until';
const {waitUntil} = pkg;

    at ModuleJob._instantiate (internal/modules/esm/module_job.js:97:21)
    at async ModuleJob.run (internal/modules/esm/module_job.js:142:20)
    at async Loader.import (internal/modules/esm/loader.js:182:24)
    at async prerender (file:///Users/ben/dev/myproject/node_modules/@sveltejs/kit/dist/chunks/index5.js:79:14)
    at async Object.prerender (file:///Users/ben/dev/myproject/node_modules/@sveltejs/kit/dist/chunks/index5.js:296:5)
    at async adapt (file:///Users/ben/dev/myproject/node_modules/@sveltejs/adapter-netlify/index.js:33:4)
    at async adapt (file:///Users/ben/dev/myproject/node_modules/@sveltejs/kit/dist/chunks/index5.js:322:2)
    at async file:///Users/ben/dev/myproject/node_modules/@sveltejs/kit/dist/cli.js:616:5
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ build: `svelte-kit build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/ben/.npm/_logs/2021-05-18T09_25_30_601Z-debug.log

Here is an example of how to add ESM output to the package: jasonkuhrt/graphql-request#193

EDIT: Oops just realised that ESM exists, changed my import statement to import { waitUntil } from 'async-wait-until/dist/es.js'; but still getting an error:

> Named export 'waitUntil' not found. The requested module 'async-wait-until/dist/es.js' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'async-wait-until/dist/es.js';
const {waitUntil} = pkg;

file:///Users/ben/dev/language-platform/fluent.school/.svelte-kit/output/server/app.js:18
import {waitUntil} from "async-wait-until/dist/es.js";
        ^^^^^^^^^
SyntaxError: Named export 'waitUntil' not found. The requested module 'async-wait-until/dist/es.js' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'async-wait-until/dist/es.js';
const {waitUntil} = pkg;

    at ModuleJob._instantiate (internal/modules/esm/module_job.js:97:21)
    at async ModuleJob.run (internal/modules/esm/module_job.js:142:20)
    at async Loader.import (internal/modules/esm/loader.js:182:24)
    at async prerender (file:///Users/ben/dev/language-platform/fluent.school/node_modules/@sveltejs/kit/dist/chunks/index5.js:79:14)
    at async Object.prerender (file:///Users/ben/dev/language-platform/fluent.school/node_modules/@sveltejs/kit/dist/chunks/index5.js:296:5)
    at async adapt (file:///Users/ben/dev/language-platform/fluent.school/node_modules/@sveltejs/adapter-netlify/index.js:33:4)
    at async adapt (file:///Users/ben/dev/language-platform/fluent.school/node_modules/@sveltejs/kit/dist/chunks/index5.js:322:2)
    at async file:///Users/ben/dev/language-platform/fluent.school/node_modules/@sveltejs/kit/dist/cli.js:616:5
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ build: `svelte-kit build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the @ build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/ben/.npm/_logs/2021-05-18T09_33_57_911Z-debug.log

EDIT: Renaming the file from es.js to es.mjs seemed to fix this issue for me, let me know what you think and I can make a PR

EDIT: Perhaps the real issue is that there needs to be a "module": value pointing to the esm version in package.json, example: https://github.com/daybrush/moveable/blob/2c4420ed816f6d14ca1cb174c31c5f4f11324eae/package.json#L6

[Bug Report] version 2.0.1 breaks builds

While version 1.2.6 was working just fine after an upgrade to 2.0.1 the build breaks for no reason. (and on multiple projects which use this dependency)

The following log output is from Circle CI build. I am wondering what the reason could be.

Any idea, Denis?

#!/bin/bash -eo pipefail
npm test


> [email protected] test /home/circleci/vscode-atlasmap
> node ./out/test/runTest.js

Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stableDownloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 3784693/95471832 (4%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 7585789/95471832 (8%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 11517949/95471832 (12%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 16039929/95471832 (17%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 19890174/95471832 (21%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 23150583/95471832 (24%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 26263545/95471832 (28%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 30490615/95471832 (32%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 34422775/95471832 (36%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 39239665/95471832 (41%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 41074673/95471832 (43%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 45809664/95471832 (48%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 50839549/95471832 (53%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 55295997/95471832 (58%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 60227584/95471832 (63%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 65323001/95471832 (68%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 70074359/95471832 (73%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 75284473/95471832 (79%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 79937533/95471832 (84%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 85114865/95471832 (89%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: 89964537/95471832 (94%)Downloading VS Code 1.53.2 from https://update.code.visualstudio.com/1.53.2/linux-x64/stable: complete
Downloaded VS Code 1.53.2 into .vscode-test/vscode-linux-x64-1.53.2
Fontconfig warning: "/etc/fonts/fonts.conf", line 100: unknown element "blank"

(electron) Sending uncompressed crash reports is deprecated and will be removed in a future version of Electron. Set { compress: true } to opt-in to the new behavior. Crash reports will be uploaded gzipped, which most crash reporting servers support.

Warning: 'sandbox' is not in the list of known options, but still passed to Electron/Chromium.

[main 2021-02-18T07:08:16.466Z] update#setState idle

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

(node:317) electron: The default of contextIsolation is deprecated and will be changing from false to true in a future release of Electron.  See https://github.com/electron/electron/issues/23506 for more information

(node:399) Electron: Loading non-context-aware native module in renderer: '/home/circleci/vscode-atlasmap/.vscode-test/vscode-linux-x64-1.53.2/VSCode-linux-x64/resources/app/node_modules.asar.unpacked/vscode-sqlite3/build/Release/sqlite.node'. This is deprecated, see https://github.com/electron/electron/issues/18397.

(node:399) Electron: Loading non-context-aware native module in renderer: '/home/circleci/vscode-atlasmap/.vscode-test/vscode-linux-x64-1.53.2/VSCode-linux-x64/resources/app/node_modules.asar.unpacked/spdlog/build/Release/spdlog.node'. This is deprecated, see https://github.com/electron/electron/issues/18397.

Exit code:   1
Done

Failed to run tests
npm ERR! Test failed.  See above for more details.


Exited with code exit status 1

CircleCI received exit code 1

Support for async predicate

There are use cases that would need to repeatedly call an async operation until a certain condition is met. For instance, an API call.

something like:

await waitUntil( async ()=>{
   
   const response = await api.get(); //any async operations
   return response.status == 200;

})

Currently, having an async predicate skips the waitUntil predicate entirely

[Bug Report] after upgrade to 2.0.0 build is broken

In our project we had a PR created today for a version bump from 1.2.6 to 2.0.0. The build for the PR is broken and I am a out of ideas what could cause it.

See redhat-developer/vscode-didact#420 for the PR created by dependabot.

The build fails with the following error:

> [email protected] compile /home/circleci/vscode-didact
> tsc -p ./

src/test/suite/didact.test.ts:30:28 - error TS7016: Could not find a declaration file for module 'async-wait-until'. '/home/circleci/vscode-didact/node_modules/async-wait-until/dist/index.js' implicitly has an 'any' type.
  Try `npm i --save-dev @types/async-wait-until` if it exists or add a new declaration (.d.ts) file containing `declare module 'async-wait-until';`

30 import waitUntil = require('async-wait-until');
                              ~~~~~~~~~~~~~~~~~~


Found 1 error.

npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! [email protected] compile: `tsc -p ./`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the [email protected] compile script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/circleci/.npm/_logs/2021-02-17T08_06_24_845Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! [email protected] vscode:prepublish: `npm run clean && npm run compile`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the [email protected] vscode:prepublish script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/circleci/.npm/_logs/2021-02-17T08_06_25_008Z-debug.log

Is that a problem with the 2.0.0 version?

This does not seem to work with Jest

If I have a jest test that looks like this :

import waitUntil from "async-wait-until";
import React from "react";

test(' test something  ', () => {
    testAutocompleteAsync();
});

async function testAutocompleteAsync() {

    await waitUntil(() => {
        return 1 == 1;
    }, 2000)
        .then((result) => {
            throw "Error!!!"
        })
        .catch((error) => {
            throw "Error!!!"
        });

    throw "Error!!!"
}

then I will get it passing all the time.

Am I using this library correctly?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.