Coder Social home page Coder Social logo

tapzero's Introduction

@socketsupply/tapzero

Zero dependency test framework

Source code

The implementation is <250 loc, (<500 with comments) ( https://github.com/Raynos/tapzero/blob/master/index.js ) and very readable.

Migrating from tape

const tape = require('tape')
// Tapzero exports an object with a test function property.
const tapzero = require('@socketsupply/tapzero').test
tape('my test', (t) => {
  t.equal(2, 2, 'ok')
  t.end()
})

// Auto ending behavior on function completion
tapzero('my test', (t) => {
  t.equal(2, 2, 'ok')
  // t.end() does not exist.
})

End automatically

Return a promise. The test will end when the promise resolves.

// tapzero "auto" ends async tests when the async function completes
tapzero('my cb test', async (t) => {
  await new Promise((resolve) => {
    t.equal(2, 2, 'ok')
    setTimeout(() => {
      // instead of calling t.end(), resolve a promise
      resolve()
    }, 10)
  })
})

Plan the number of assertions

tapzero('planning example', t => {
  // this test will fail if we execute more or fewer
  //   than planned assertions
  t.plan(2)
  t.ok('hello')
  t.equal(2, 2, 'two is two')
})

API

No aliases, smaller API surface area

tape('my test', (t) => {
  t.equals(2, 2)
  t.is(2, 2)
  t.isEqual(2, 2)
})

tapzero('my test', (t) => {
  // tapzero does not implement any aliases, very small surface area.
  t.equal(2, 2)
  t.equal(2, 2)
  t.equal(2, 2)
})

Motivation

Small library, zero dependencies

$ package-size ./build/src/index.js zora baretest,assert qunit tape jasmine mocha

  package                      size       minified   gzipped
  ./build/src/index.js         8.97 KB    3.92 KB    1.53 KB
  [email protected]                   32.44 KB   11.65 KB   4.08 KB
  [email protected],[email protected]  51.61 KB   16.48 KB   5.82 KB
  [email protected]                  195.83 KB  62.04 KB   20.38 KB
  [email protected]                  304.71 KB  101.46 KB  28.8 KB
  [email protected]                413.61 KB  145.2 KB   41.07 KB
  [email protected]                  811.55 KB  273.07 KB  91.61 KB

Small library, small install size.

@socketsupply/tapzero baretest zora pta tape
pkg size tapzero baretest zora pta tape
Min.js size @socketsupply/tapzero baretest zora pta tape
dep count @socketsupply/tapzero baretest zora pta tape
Mocha Ava Jest tap
pkg size mocha ava jest tap
Min.js size mocha ava jest tap
dep count mocha ava jest tap

Docs

const test = require('@socketsupply/tapzero').test

test(name, [fn])

Run a single named test case. The fn will be called with the t test object.

Tests run one at a time and complete when the fn completes, the fn can be async.

test.only(name, fn)

Like test(name, fn) except if you use .only this is the only test case that will run for the entire process, all other test cases using tape will be ignored.

test.skip(name, [fn])

Creates a test case that will be skipped

Harness docs

const testHarness = require('@socketsupply/tapzero/harness')

See HARNESS.md

tapzero's People

Contributors

andreyyyyyyyyy avatar bcomnes avatar chicoxyzzy avatar jwerle avatar nichoth avatar raynos avatar wankdanker 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

tapzero's Issues

zora stack traces brittle to node version change

When running node v19.9.0 a bunch of the tests fail due to the Error.stack format changing between node releases.

I started hacking on strip() in test/util.js but it feels wrong, any ideas how best to deal with this?

diff --git a/test/zora/fixtures/bailout_fail_out.txt b/test/zora/fixtures/bailout_fail_out.txt
index a89a03a..48e319a 100644
--- a/test/zora/fixtures/bailout_fail_out.txt
+++ b/test/zora/fixtures/bailout_fail_out.txt
@@ -11,4 +11,6 @@ Error: Oh no!
     at TestRunner.run ($TAPE/index.js:$LINE:$COL)
     at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)
     at listOnTimeout (node:internal/timers:$LINE:$COL)
-    at processTimers (node:internal/timers:$LINE:$COL)
+    at process.processTimers (node:internal/timers:$LINE:$COL)
+
+Node.js v19.9.0

supporting the `t.plan()` method

I find the t.plan() method from node-tap particularly useful, such as in situations like this where I want the test to fail if the callback is never called:

test('something', t => {
  t.plan(1)

  events.on('message', (msg) => {
    t.equal(msg, 'hello')
  })
})

Would you be open to adding this to tapzero?
Is there a compelling reason it was not included, such as adding too much complexity to the code?
If not, would you be open to accepting a PR to add it?

The function gets a Test object as its only argument. From there, you can call the t.end() method on that object to end the test, or use the t.plan() method to specify how many child tests or asserts the test will have.

https://node-tap.org/docs/api/#tplannumber
https://github.com/tapjs/libtap/blob/main/lib/test.js#L746

TypeError: t.plan is not a function

`undefined` not displayed in report output

If an expected object has some property whose value is undefined and the actual object does not have that value at all, a deepEqual test will properly fail, but the output does not show why. This is because JSON.stringify() is used for the failure report in _assert and object properties whose value are undefined are excluded in the JSON output.

I was considering submitting a PR that uses node's util.inspect for the report message, but noticed that not only does this module not use any external dependencies, it does't appear to require anything at all. Would using util.inspect to solve this problem violate this modules zero dependency manifesto? If that's not acceptable, any ideas how to show undefined in the report message?

Tests don't pass

this is running on a Mac with M1, node version v16.13.2

clone the repo, then do npm i and npm test

> [email protected] test
> npm run tsc && npm run lint && node test/harness.js && node test/index.js && npr type-coverage


> [email protected] tsc
> npr tsc -p jsconfig.json --maxNodeModuleJsDepth 0


> [email protected] lint
> npr tsdocstandard -v

TAP version 13
# a test
ok 1 null
ok 2 should be equal
ok 3 should be equal
# no options
ok 4 null
ok 5 should be equal
ok 6 should be equal
# async await
ok 7 should be equal
ok 8 should be equal
# async await no end
ok 9 should be equal
ok 10 should be equal
# async await promise
ok 11 should be equal
ok 12 should be equal
# async await promise without end
ok 13 should be equal
ok 14 should be equal

1..14
# tests 14
# pass  14

# ok
TAP version 13
# zerotap outputs TAP
ok 1 should be equivalent
# zerotap with two blocks
ok 2 should be equivalent
# zerotap handles failures
ok 3 should be equal
# zerotap handles errors
not ok 4 should be equal
  ---
    operator: equal
    expected: |-
      'TAP version 13\n# zero\nnot ok 1 Error: foo\n  ---\n    operator: ifError\n    expected: "no error"\n    actual:   "foo"\n    at:       Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: foo\n          at Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (internal/timers.js:$LINE:$COL)\n          at processTimers (internal/timers.js:$LINE:$COL)\n  ...\n\n1..1\n# tests 1\n# pass  0\n# fail  1'
    actual: |-
      'TAP version 13\n# zero\nnot ok 1 Error: foo\n  ---\n    operator: ifError\n    expected: "no error"\n    actual:   "foo"\n    at:       Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: foo\n          at Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (node:internal/timers:$LINE:$COL)\n          at processTimers (node:internal/timers:$LINE:$COL)\n  ...\n\n1..1\n# tests 1\n# pass  0\n# fail  1'
    at: verify (/Users/nick/code/tapzero/test/unit/smoke.js:126:12)
    stack: |-
      Error: should be equal
          at Test.assert [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:225:54)
          at Test.bound [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at Test.equal (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:385:10)
          at Test.bound [as equal] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at verify (/Users/nick/code/tapzero/test/unit/smoke.js:126:12)
          at TestRunner.report (/Users/nick/code/tapzero/test/util.js:37:7)
          at TestRunner.run (/Users/nick/code/tapzero/index.js:424:12)
  ...
# zerotap handles multiple asserts
not ok 5 should be equal
  ---
    operator: equal
    expected: |-
      'TAP version 13\n# test one\nok 1 should be truthy\nok 2 message\nnot ok 3 some message\n  ---\n    operator: ok\n    expected: "truthy value"\n    actual:   false\n    at:       Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: some message\n          at Test._assert ($TAPE/index.js:$LINE:$COL)\n          at Test.ok ($TAPE/index.js:$LINE:$COL)\n          at Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (internal/timers.js:$LINE:$COL)\n          at processTimers (internal/timers.js:$LINE:$COL)\n  ...\n\n1..3\n# tests 3\n# pass  2\n# fail  1'
    actual: |-
      'TAP version 13\n# test one\nok 1 should be truthy\nok 2 message\nnot ok 3 some message\n  ---\n    operator: ok\n    expected: "truthy value"\n    actual:   false\n    at:       Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: some message\n          at Test._assert ($TAPE/index.js:$LINE:$COL)\n          at Test.ok ($TAPE/index.js:$LINE:$COL)\n          at Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (node:internal/timers:$LINE:$COL)\n          at processTimers (node:internal/timers:$LINE:$COL)\n  ...\n\n1..3\n# tests 3\n# pass  2\n# fail  1'
    at: verify (/Users/nick/code/tapzero/test/unit/smoke.js:168:12)
    stack: |-
      Error: should be equal
          at Test.assert [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:225:54)
          at Test.bound [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at Test.equal (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:385:10)
          at Test.bound [as equal] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at verify (/Users/nick/code/tapzero/test/unit/smoke.js:168:12)
          at TestRunner.report (/Users/nick/code/tapzero/test/util.js:37:7)
          at TestRunner.run (/Users/nick/code/tapzero/index.js:424:12)
  ...
# zerotap with multiple blocks
ok 6 should be equal
# zerotap other methods
ok 7 should be equal
# zerotap undefined is string
not ok 8 should be equal
  ---
    operator: equal
    expected: |-
      'TAP version 13\n# test one\nnot ok 1 should be equal\n  ---\n    operator: equal\n    expected: "foo"\n    actual:   undefined\n    at:       Test.fn ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: should be equal\n          at Test._assert ($TAPE/index.js:$LINE:$COL)\n          at Test.equal ($TAPE/index.js:$LINE:$COL)\n          at Test.fn ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (internal/timers.js:$LINE:$COL)\n          at processTimers (internal/timers.js:$LINE:$COL)\n  ...\n\n1..1\n# tests 1\n# pass  0\n# fail  1'
    actual: |-
      'TAP version 13\n# test one\nnot ok 1 should be equal\n  ---\n    operator: equal\n    expected: "foo"\n    actual:   undefined\n    at:       Test.fn ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: should be equal\n          at Test._assert ($TAPE/index.js:$LINE:$COL)\n          at Test.equal ($TAPE/index.js:$LINE:$COL)\n          at Test.fn ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (node:internal/timers:$LINE:$COL)\n          at processTimers (node:internal/timers:$LINE:$COL)\n  ...\n\n1..1\n# tests 1\n# pass  0\n# fail  1'
    at: verify (/Users/nick/code/tapzero/test/unit/smoke.js:287:12)
    stack: |-
      Error: should be equal
          at Test.assert [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:225:54)
          at Test.bound [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at Test.equal (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:385:10)
          at Test.bound [as equal] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at verify (/Users/nick/code/tapzero/test/unit/smoke.js:287:12)
          at TestRunner.report (/Users/nick/code/tapzero/test/util.js:37:7)
          at TestRunner.run (/Users/nick/code/tapzero/index.js:424:12)
  ...
# zerotap fail
not ok 9 should be equal
  ---
    operator: equal
    expected: |-
      'TAP version 13\n# test one\nnot ok 1 my message\n  ---\n    operator: fail\n    expected: "fail not called"\n    actual:   "fail called"\n    at:       Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: my message\n          at Test._assert ($TAPE/index.js:$LINE:$COL)\n          at Test.fail ($TAPE/index.js:$LINE:$COL)\n          at Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (internal/timers.js:$LINE:$COL)\n          at processTimers (internal/timers.js:$LINE:$COL)\n  ...\n\n1..1\n# tests 1\n# pass  0\n# fail  1'
    actual: |-
      'TAP version 13\n# test one\nnot ok 1 my message\n  ---\n    operator: fail\n    expected: "fail not called"\n    actual:   "fail called"\n    at:       Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n    stack:    |-\n      Error: my message\n          at Test._assert ($TAPE/index.js:$LINE:$COL)\n          at Test.fail ($TAPE/index.js:$LINE:$COL)\n          at Test._ [as fn] ($TEST/unit/smoke.js:$LINE:$COL)\n          at Test.run ($TAPE/index.js:$LINE:$COL)\n          at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n          at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n          at listOnTimeout (node:internal/timers:$LINE:$COL)\n          at processTimers (node:internal/timers:$LINE:$COL)\n  ...\n\n1..1\n# tests 1\n# pass  0\n# fail  1'
    at: verify (/Users/nick/code/tapzero/test/unit/smoke.js:329:12)
    stack: |-
      Error: should be equal
          at Test.assert [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:225:54)
          at Test.bound [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at Test.equal (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:385:10)
          at Test.bound [as equal] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at verify (/Users/nick/code/tapzero/test/unit/smoke.js:329:12)
          at TestRunner.report (/Users/nick/code/tapzero/test/util.js:37:7)
          at TestRunner.run (/Users/nick/code/tapzero/index.js:424:12)
  ...
# test zora/case: adding_test_cases_async_fail.js
ok 10 should be equal
not ok 11 should be equal
  ---
    operator: equal
    expected: |-
      'TAP version 13\n# tester sync\nok 1 assert1\n\n1..1\n# tests 1\n# pass  1\n\n# ok\n$TAPE/index.js:$LINE\n      throw new Error(\'Cannot add() a test case after tests completed.\')\n      ^\n\nError: Cannot add() a test case after tests completed.\n    at TestRunner.add ($TAPE/index.js:$LINE:$COL)\n    at test ($TAPE/index.js:$LINE:$COL)\n    at Timeout._onTimeout ($TEST/zora/fixtures/adding_test_cases_async_fail.js:$LINE:$COL)\n    at listOnTimeout (internal/timers.js:$LINE:$COL)\n    at processTimers (internal/timers.js:$LINE:$COL)\n'
    actual: |-
      'TAP version 13\n# tester sync\nok 1 assert1\n\n1..1\n# tests 1\n# pass  1\n\n# ok\n$TAPE/index.js:$LINE\n      throw new Error(\'Cannot add() a test case after tests completed.\')\n      ^\n\nError: Cannot add() a test case after tests completed.\n    at TestRunner.add ($TAPE/index.js:$LINE:$COL)\n    at test ($TAPE/index.js:$LINE:$COL)\n    at Timeout._onTimeout ($TEST/zora/fixtures/adding_test_cases_async_fail.js:$LINE:$COL)\n    at listOnTimeout (node:internal/timers:$LINE:$COL)\n    at processTimers (node:internal/timers:$LINE:$COL)\n'
    at: equalDiff (/Users/nick/code/tapzero/test/zora/test-cases.js:46:5)
    stack: |-
      Error: should be equal
          at Test.assert [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:225:54)
          at Test.bound [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at Test.equal (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:385:10)
          at Test.bound [as equal] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at equalDiff (/Users/nick/code/tapzero/test/zora/test-cases.js:46:5)
          at /Users/nick/code/tapzero/test/zora/test-cases.js:34:7
  ...


--------------diff:--------------

-------raw actual-----
TAP version 13
# tester sync
ok 1 assert1

1..1
# tests 1
# pass  1

# ok
$TAPE/index.js:$LINE
      throw new Error('Cannot add() a test case after tests completed.')
      ^

Error: Cannot add() a test case after tests completed.
    at TestRunner.add ($TAPE/index.js:$LINE:$COL)
    at test ($TAPE/index.js:$LINE:$COL)
    at Timeout._onTimeout ($TEST/zora/fixtures/adding_test_cases_async_fail.js:$LINE:$COL)
    at listOnTimeout (node:internal/timers:$LINE:$COL)
    at processTimers (node:internal/timers:$LINE:$COL)

------------------------
# test zora/case: async.js
ok 12 should be equal
ok 13 should be equal
# test zora/case: bailout_fail.js
ok 14 should be equal
not ok 15 should be equal
  ---
    operator: equal
    expected: |-
      'TAP version 13\n# will not go to the end\nok 1 okay\n$TAPE/index.js:$LINE\n  function rethrow () { throw err }\n                        ^\n\nError: Oh no!\n    at Test._ [as fn] ($TEST/zora/fixtures/bailout_fail.js:$LINE:$COL)\n    at Test.run ($TAPE/index.js:$LINE:$COL)\n    at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n    at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n    at listOnTimeout (internal/timers.js:$LINE:$COL)\n    at processTimers (internal/timers.js:$LINE:$COL)\n'
    actual: |-
      'TAP version 13\n# will not go to the end\nok 1 okay\n$TAPE/index.js:$LINE\n  function rethrow () { throw err }\n                        ^\n\nError: Oh no!\n    at Test._ [as fn] ($TEST/zora/fixtures/bailout_fail.js:$LINE:$COL)\n    at Test.run ($TAPE/index.js:$LINE:$COL)\n    at TestRunner.run ($TAPE/index.js:$LINE:$COL)\n    at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)\n    at listOnTimeout (node:internal/timers:$LINE:$COL)\n    at processTimers (node:internal/timers:$LINE:$COL)\n'
    at: equalDiff (/Users/nick/code/tapzero/test/zora/test-cases.js:46:5)
    stack: |-
      Error: should be equal
          at Test.assert [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:225:54)
          at Test.bound [as _assert] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at Test.equal (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:385:10)
          at Test.bound [as equal] (/Users/nick/code/tapzero/node_modules/@pre-bundled/tape/lib/test.js:77:32)
          at equalDiff (/Users/nick/code/tapzero/test/zora/test-cases.js:46:5)
          at /Users/nick/code/tapzero/test/zora/test-cases.js:34:7
  ...


--------------diff:--------------

-------raw actual-----
TAP version 13
# will not go to the end
ok 1 okay
$TAPE/index.js:$LINE
  function rethrow () { throw err }
                        ^

Error: Oh no!
    at Test._ [as fn] ($TEST/zora/fixtures/bailout_fail.js:$LINE:$COL)
    at Test.run ($TAPE/index.js:$LINE:$COL)
    at TestRunner.run ($TAPE/index.js:$LINE:$COL)
    at Timeout._onTimeout ($TAPE/index.js:$LINE:$COL)
    at listOnTimeout (node:internal/timers:$LINE:$COL)
    at processTimers (node:internal/timers:$LINE:$COL)

------------------------

1..15
# tests 15
# pass  9
# fail  6

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.