Giter Site home page Giter Site logo

rx-sandbox's Introduction

Build Status codecov npm

RxSandbox

RxSandbox is test suite for RxJS, based on marble diagram DSL for easier assertion around Observables. For RxJS 5 support, check pre-1.x versions. 1.x supports latest RxJS 6.x. 2.* supports [email protected] and above.

Maintenance notes

This project is still maintained. I consider this project as feature complete so there is not much activity going on. I'll be updating time to time as new upstream RxJS releases, but do not have much plan to add new features. If you're experiencing issues with latest RxJS, please open issue with reproducible test case. I'll try to fix as soon as possible.

What's difference with TestScheduler in RxJS?

RxJs core itself includes its own TestScheduler implementation. With latest updates, it have different semantics around how to translate virtual frame and time progression also slightly different api surfaces based on callbacks. RxSandbox aims to provide test interface with below design goals, bit different to core's test scheduler.

  • Support extended marble diagram DSL
  • Near-zero configuration, works out of box
  • No dependencies to specific test framework
  • Flexible TestMessage support: test can be created from marble syntax, but also can be created from plain objects.

Install

This has a peer dependencies of rxjs, which will have to be installed as well.

npm install rx-sandbox

Usage

Observable marble diagram token description

In RxSandbox, Observable is represented via marble diagram. Marble syntax is a string represents events happening over virtual time so called as frame.

  • - : Single frame of time passage, by default 1.
  • | : Successful completion of an observable signaling complete().
  • # : An error terminating the observable signaling error().
  • (whitespace) : Noop, whitespace does nothing but allows align marbles for readability.
  • a : Any other character than predefined token represents a value being emitted by next()
  • () : When multiple events need to single in the same frame synchronously, parenthesis are used to group those events. You can group nexted values, a completion or an error in this manner. The position of the initial (determines the time at which its values are emitted.
  • ^ : (hot observables only) Shows the point at which the tested observables will be subscribed to the hot observable. This is the "zero frame" for that observable, every frame before the ^ will be negative.
  • ! : (for subscription testing) Shows the point at which the tested observables will be unsubscribed.
  • ...n... : (n is number) Expanding timeframe. For cases of testing long time period in observable, can shorten marble diagram instead of repeating -.

The first character of marble string always represents 0 frame.

Few examples

const never = `------`; // Observable.never() regardless of number of `-`
const empty = `|`;      // Observable.empty();
const error = `#`;      // Observable.throw(`#`);
const obs1 = `----a----`;
//`           01234    `, emits `a` on frame 4
const obs2 = `----a---|`;
//`           012345678`, emits `a` on frame 4, completes on 8
const obs2 = `-a-^-b--|`;
//`              012345`, emits `b` on frame 2, completes on 5 - hot observable only
const obs3 = `--(abc)-|`;
//`           012222234, emits `a`,`b`,`c` on frame 2, completes on 4
const obs4 = `----(a|)`;
//`           01234444, emits `a` and complets on frame 4
const obs5 = ` - --a- -|`;
//`            0 1234 56, emits `a` on frame 3, completes on frame 6
const obs6 = `--...4...--|`
//`           01......5678, completes on 8

Subscription marble diagram token description

The subscription marble syntax is slightly different to conventional marble syntax. It represents the subscription and an unsubscription points happening over time. There should be no other type of event represented in such diagram.

  • - : Single frame of time passage, by default 1.
  • ^ : Shows the point in time at which a subscription happen.
  • ! : Shows the point in time at which a subscription is unsubscribed.
  • (whitespace) : Noop, whitespace does nothing but allows align marbles for readability.
  • ...n... : (n is number) Expanding timeframe. For cases of testing long time period in observable, can shorten marble diagram instead of repeating -.

There should be at most one ^ point in a subscription marble diagram, and at most one ! point. Other than that, the - character is the only one allowed in a subscription marble diagram.

Few examples

const sub1 = `-----`; // no subscription
const sub2 = `--^--`;
//`           012`, subscription happend on frame 2, not unsubscribed
const sub3 = `--^--!-`;
//`           012345, subscription happend on frame 2, unsubscribed on frame 5

Anatomy of test interface

You can import rxSandbox, and create instance using create().

import { expect } from 'chai';
import { rxSandbox } from 'rx-sandbox';

it('testcase', () => {
  const { hot, cold, flush, getMessages, e, s } = rxSandbox.create();
  const e1 = hot('  --^--a--b--|');
  const e2 = cold('   ---x--y--|', {x: 1, y: 2});

  const expected = e('       ---q--r--|');
  const sub =      s('       ^        !');

  const messages = getMessages(e1.merge(e2));

  flush();

  //assertion
  expect(messages).to.deep.equal(expected);
  expect(e1.subscriptions).to.deep.equal(sub);
});

Creating sandbox

rxSandbox.create(autoFlush?: boolean, frameTimeFactor?: number, maxFrameValue?: number): RxSandboxInstance

rxSandbox.create({
  autoFlush?: boolean,
  frameTimeFactor?: number,
  maxFrameValue?: boolean,
  flushWithAsyncTick?: boolean,
}): RxSandboxInstance | RxAsyncSandboxInstance

frameTimeFactor allows to override default frame passage 1 to given value. maxFrameValue allows to override maximum frame number testscheduler will accept. (1000 by default). Maxframevalue is relavant to frameTimeFactor. (i.e if frameTimeFactor = 2 and maxFrameValue = 4, -- will represent max frame)

Refer below for autoFlush option.

Using RxSandboxInstance

RxSandboxInstance exposes below interfaces.

Creating hot, cold observable

hot<T = string>(marble: string, value?: { [key: string]: T } | null, error?: any): HotObservable<T>;
hot<T = string>(messages: Array<TestMessage<T>>): HotObservable<T>;

cold<T = string>(marble: string, value?: { [key: string]: T } | null, error?: any): ColdObservable<T>;
cold<T = string>(messages: Array<TestMessage<T>>): ColdObservable<T>;

Both interfaces accepts marble diagram string, and optionally accepts custom values for marble values or errors. Otherwise, you can create Array<TestMessage<T>> directly instead of marble diagram.

Creating expected value, subscriptions

To compare observable's result, we can use marble diagram as well wrapped by utility function to generate values to be asserted.

e<T = string>(marble: string, value?: { [key: string]: T } | null, error?: any): Array<TestMessage<T>>;

//const expected = e(`----a---b--|`);

It accepts same parameter to hot / cold observable creation but instead of returning observable, returns array of metadata for marble diagram.

Subscription metadata also need to be generated via wrapped function.

s(marble: string): SubscriptionLog;

//const subs = s('--^---!');

Getting values from observable

Once we have hot, cold observables we can get metadata from those observables as well to assert with expected metadata values.

getMessages<T = string>(observable: Observable<any>, unsubscriptionMarbls: string = null): Array<TestMessage<T>>>;

const e1 = hot('--a--b--|');
const messages = getMessages(e1.mapTo('x'));

//at this moment, messages are empty!
assert(messages.length === 0);

It is important to note at the moment of getting metadata array, it is not filled with actual value but just empty array. Scheduler should be flushed to fill in values.

const e1 = hot('    --a--b--|');
const expected = e('--x--x--|')
const subs = s(`    ^       !`);
const messages = getMessages(e1.mapTo('x'));

//at this moment, messages are empty!
expect(messages).to.be.empty;

flush();

//now values are available
expect(messages).to.deep.equal(expected);
//subscriptions are also available too
expect(e1.subscriptions).to.deep.equal(subs);

Or if you need to control timeframe instead of flush out whole at once, you can use advanceTo as well.

const e1 = hot('    --a--b--|');
const subs = s(`    ^       !`);
const messages = getMessages(e1.mapTo('x'));

//at this moment, messages are empty!
expect(messages).to.be.empty;

advanceTo(3);
const expected = e('--x------'); // we're flushing to frame 3 only, so rest of marbles are not constructed

//now values are available
expect(messages).to.deep.equal(expected);
//subscriptions are also available too
expect(e1.subscriptions).to.deep.equal(subs);

Flushing scheduler automatically

By default sandbox instance requires to flush() explicitly to execute observables. For cases each test case doesn't require to schedule multiple observables but only need to test single, we can create sandbox instance to flush automatically. Since it flushes scheduler as soon as getMessages being called, subsequent getMessages call will raise errors.

const { hot, e } = rxSandbox.create(true);

const e1 = hot('    --a--b--|');
const expected = e('--x--x--|')
const messages = getMessages(e1.mapTo('x'));

//without flushing, observable immeditealy executes and values are available.
expect(messages).to.deep.equal(expected);

//subsequent attempt will throw
expect(() => getMessages(e1.mapTo('y'))).to.throw();

Scheduling flush into native async tick (Experimental, 2.0 only)

If you create sandbox instance with flushWithAsyncTick option, sandbox will return instance of RxAsyncSandboxInstance which all of flush interfaces need to be asynchronously awaited:

interface RxAsyncSandboxInstance {
  ...,
  advanceTo(toFrame: number) => Promise<void>;
  flush: () => Promise<void>;
  getMessages: <T = string>(observable: Observable<T>, unsubscriptionMarbles?: string | null) => Promise<void>;
}

It is not uncommon practices chaining native async function or promise inside of observables, especially for inner observables. Let's say if there's a redux-observable epic like below

const epic = (actionObservable) => actionObservable.ofType(...).pipe((mergeMap) => {
  return new Promise.resolve(...);
})

Testing this epic via rxSandbox won't work. Once sandbox flush all internal actions synchronously, promises are still scheduled into next tick so there's no inner observable subscription value collected by flush. RxAsyncSandboxInstance in opposite no longer flush actions synchronously but schedule each individual action into promise tick to try to collect values from async functions.

NOTE: this is beta feature and likely have some issues. Also until stablized internal implementation can change without semver breaking.

Custom frame time factor

Each timeframe - is predefined to 1, can be overridden.

const { e } = rxSandbox.create(false, 10);

const expected = e('--x--x--|');

// now each frame takes 10
expect(expected[0].frame).to.equal(20);

Custom assertion for marble diagram

Messages generated by rxSandbox is plain object array, so any kind of assertion can be used. In addition to those, rxSandbox provides own custom assertion method marbleAssert for easier marble diagram diff.

marbleAssert<T = string>(source: Array<SubscriptionLog | TestMessage<T>>): { to: { equal(expected: Array<SubscriptionLog | TestMessage<T>>): void } }

It accepts array of test messages generated by getMessages and e, or subscription log by Hot/ColdObservable.subscriptions or s (in case of utility method s it returns single subscription, so need to be constructed as array).

import { rxSandbox } from 'rx-sandbox';
const { marbleAssert } = rxSandbox;

const {hot, e, s, getMessages, flush} = rxSandbox.create();

const source = hot('---a--b--|');
const expected = e('---x--x---|');
const sub = s('^-----!');

const messages = getMessages(source.mapTo('x'));
flush();

marbleAssert(messages).to.equal(expected);
marbleAssert(messages).toEqual(expected); // if you prefer jasmin / jest style matcher syntax
marbleAssert(source.subscriptions).to.equal([sub]);

When assertion fails, it'll display visual / object diff with raw object values for easier debugging.

Assert Observable marble diagram

Assert subscription log marble diagram

Building / Testing

Few npm scripts are supported for build / test code.

  • build: Transpiles code to ES5 commonjs to dist.
  • build:clean: Clean up existing build
  • test: Run unit test. Does not require build before execute test.
  • lint: Run lint over all codebases
  • lint:staged: Run lint only for staged changes. This'll be executed automatically with precommit hook.
  • commit: Commit wizard to write commit message

rx-sandbox's People

Contributors

avocadowastaken avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar ericadamski avatar greenkeeper[bot] avatar greenkeeperio-bot avatar hsubra89 avatar kgkma avatar kwonoj 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  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

rx-sandbox's Issues

Hello world not working

I'm trying to run the first code sample from the README with no success. I keep getting "e1.merge is not a function".

I've put together a minimum project here: https://github.com/thiagoarrais/rx-sandbox-helloworld

You should be able to reproduce by git cloning and then npm testing.

I'm using node 6 and npm 5. Here's what I'm getting on my side:

$ node -v
v6.11.2
$ npm -v
5.3.0
$ npm install
npm WARN [email protected] No description
npm WARN [email protected] No repository field.

added 100 packages in 6.924s
$ npm test

> [email protected] test /tmp/rx-sandbox-helloworld
> mocha spec.js



  1) testcase

  0 passing (39ms)
  1 failing

  1)  testcase:
     TypeError: e1.merge is not a function
      at Context.it (spec.js:12:35)



npm ERR! Test failed.  See above for more details.

Maybe cold doesn't return an Observable any longer? I don't know... I'm completely lost lost here...

Broken character encoding on console, wrong source string

Hi there,

was trying to setup a first simple test case with rx-sandbox, but wasn't successful so far:

it('rx: should notify on loading events with debouncing', (fakeAsync(() => {

    // GIVEN

    const { cold, getMessages, e } = rxSandbox.create(true)

    const mappings = { t: true, f: false }
    const triggerEvents$ = cold('t...75...f-t-120-f', mappings)
    const expected = e('...50...t...50...f...170...f', mappings)

    // WHEN
    const messages = getMessages(underTest.isLoading$)
    triggerEvents$.subscribe(loadingState => underTest.setLoadingState(loadingState))

    // THEN
    tick(300) // <-- appearently needed for any events to be received

    marbleAssert(messages).to.equal(expected)
  })))

underTest.isLoading$' is defined as follows:

(...).pipe(
      distinctUntilChanged(),
      debounceTime(50),
)

So basically it should just debounce booleans 50 ms if different than the last value.

But when I run the test, I got a very strange result:

Error: 
"Source:   Γ€-----"
"Expected: -...48...-Γ€-...177...-αΈ…-----"

Maybe my test is just wrong but I don't see why Source hasn't the value defined by me and has (as well as Expected) strange characters like ' Γ€' and 'αΈ…' in it.

I am using Jest 28 and rx-sandbox 2.0.4.

Thank you!

An in-range update of husky is breaking the build 🚨

The devDependency husky was updated from 1.0.1 to 1.1.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

husky is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Commits

The new version differs by 9 commits.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Release allow `undefined` as token value.

Currently my tests need undefined to be allowed as a token value instead of defaulting to the token name. I need this new feature to be released so that I can test properly.

An in-range update of ts-jest is breaking the build 🚨

The devDependency ts-jest was updated from 23.10.1 to 23.10.2.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

ts-jest is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Commits

The new version differs by 44 commits.

  • 13cb48d Merge pull request #764 from huafu/release/23.10.2
  • aa3e5f7 chore(release): 23.10.2
  • 9db3337 Merge pull request #763 from huafu/wrong-error-if-import-fails
  • e0d6c57 fix(import): wrong error message when a module exists but fails
  • e765875 Merge pull request #757 from huafu/testMatch-and-testRegex
  • a4bbdcd docs(preset): typos
  • ddc2f79 docs(preset): usage of all presets + note about testMatch
  • 6985e07 Merge branch 'testMatch-and-testRegex' of github.com:huafu/ts-jest into testMatch-and-testRegex
  • 6a72a87 test(cli): test migrate preset detection
  • febd8d3 feat(cli): CLI 'config:migrate' now detects best preset
  • f55d895 feat(preset): adds presets typings and export all presets
  • e409653 Merge branch 'master' into testMatch-and-testRegex
  • 0534889 Merge pull request #759 from kulshekhar/dependabot/npm_and_yarn/@types/node-10.11.0
  • e23e0be build(deps-dev): bump @types/node from 10.10.3 to 10.11.0
  • 7890162 Merge branch 'master' into testMatch-and-testRegex

There are 44 commits in total.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

RxJS4 advanceBy equivalent

Hi!

The library looks pretty good already, there's only one thing that I'm missing from the RxJS4 testing API: manually advancing the TestScheduler. Right now, calling flush() makes it run all the way through.

The point of that method (as far as I've seen it used, anyway) would be to verify the timing of arbitrary side effects, introduced via a do() operator. If there are other / better alternatives for this, I'm also open to suggestions.

An in-range update of husky is breaking the build 🚨

The devDependency husky was updated from 1.0.0 to 1.0.1.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

husky is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Commits

The new version differs by 12 commits.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Update rxjs version in readme

Hi,
rx-sandbox 1.0 just supports RxJS 6, but the readme still states that this library supports RxJS 5. This is a little confusing.

An in-range update of ts-jest is breaking the build 🚨

The devDependency ts-jest was updated from 23.10.0 to 23.10.1.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

ts-jest is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Commits

The new version differs by 13 commits.

  • d9c5b45 Merge pull request #743 from huafu/release/23.10.1
  • e4a3a09 chore(release): 23.10.1
  • ab94359 Merge pull request #742 from huafu/fix-740-no-js-compilation-with-allow-js
  • a844fd4 Merge branch 'master' into fix-740-no-js-compilation-with-allow-js
  • 18dced1 Merge pull request #741 from huafu/e2e-weird-deep-paths
  • 9e7d6a0 test(config): adds test related to allowJs
  • 374dca1 fix(compile): js files were never transpiled thru TS
  • 70fd9af ci(cache): removes some paths from the caching
  • c12dfff fix(windows): normalize paths
  • 0141098 test(e2e): deep paths and coverage
  • 6ccbff3 Merge pull request #736 from huafu/detect-import-and-throw-if-none
  • a2a4be2 fix(config): warn instead of forcing ESM interoperability
  • 21644da Merge pull request #735 from huafu/master

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Error when testing an observable with null emissions

Hi,

If you try to test an observable that emits null, the test fails due to this error inside constructObservableMarble when it tries to pick a symbol:

TypeError: Cannot read property 'toString' of null
    at appendNotificationValue (http://localhost:9876/_karma_webpack_/webpack:/node_modules/rx-sandbox/dist/src/assert/constructObservableMarble.js:57:1)
    at Object.constructObservableMarble (http://localhost:9876/_karma_webpack_/webpack:/node_modules/rx-sandbox/dist/src/assert/constructObservableMarble.js:103:1)
    at Object.equal (http://localhost:9876/_karma_webpack_/webpack:/node_modules/rx-sandbox/dist/src/assert/marbleAssert.js:41:1)
    at ...

Version: 1.0.0

It looks like this is no longer occurs in master thanks to a095623, so a new release should fix this issue.

An in-range update of lint-staged is breaking the build 🚨

Version 4.2.0 of lint-staged just got published.

Branch Build failing 🚨
Dependency lint-staged
Current Version 4.1.3
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As lint-staged is β€œonly” a devDependency of this project it might not break production or downstream projects, but β€œonly” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this πŸ’ͺ

Status Details
  • ❌ ci/circleci Your tests failed on CircleCI Details

Release Notes v4.2.0

4.2.0 (2017-09-15)

Features

  • Print friendlier error if config is missing (#281) (30fa594)
Commits

The new version differs by 8 commits.

  • 30fa594 feat: Print friendlier error if config is missing (#281)
  • 0077644 chore: Cleanup package.json (#250)
  • 7abe23f ci: Disable email notifications from Travis CI
  • c9d0849 docs: Use emojis in the Readme
  • e976a3c docs: Add screenshot with the animated gif (#276)
  • 92e586b docs: Reformat code blocks
  • 9b0282a docs: Use diff formatting for code
  • 33da9b3 ci: Whitelist build branches to avoid duplicate builds (#269)

See the full diff

Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

Tiny tiny typo in tokenParseReducer.ts

Love the marbles, but there is this tiny spelling/typo error in tokenParseReducer.ts line 89, that I get to see quite often (because I suck at writing tests):

const validateTimeFrameToken = (acc: TokenParseAccumulator) => {   
  if (acc.expandingTokenCount > 0 || acc.simultaneousGrouped) {  
    throw new Error('Incorret timeframe specified');  
  }  
};

Should be:

const validateTimeFrameToken = (acc: TokenParseAccumulator) => {
  if (acc.expandingTokenCount > 0 || acc.simultaneousGrouped) {
    throw new Error('Incorrect timeframe specified');
  }
};

An in-range update of @commitlint/cli is breaking the build 🚨

The devDependency @commitlint/cli was updated from 7.1.2 to 7.2.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@commitlint/cli is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Jest matcher import is breaking webpack projects.

The Issue

This project, or one of its dependencies, has an incorrect import path. This causes the test suite to crash whenever the rxSandbox.create() function is called.

The offending import is here: https://github.com/kwonoj/rx-sandbox/blob/master/src/assert/marbleAssert.ts

Steps to reproduce:

Create a new Angular project. Import rxSandbox and call the create() function.

Error Log

ERROR in ./node_modules/jest-matchers/node_modules/pretty-format/build-es5/plugins/ReactElement.js
Module not found: Error: Can't resolve 'babel-runtime/helpers/typeof' in 'E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\build-es5\plugins'
resolve 'babel-runtime/helpers/typeof' in 'E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\build-es5\plugins'
  Parsed request is a module
  using description file: E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\package.json (relative path: ./build-es5/plugins)
    Field 'browser' doesn't contain a valid alias configuration
    resolve as module
      looking for modules in E:/test/dddd
        using description file: E:\test\dddd\package.json (relative path: .)
          Field 'browser' doesn't contain a valid alias configuration
          using description file: E:\test\dddd\package.json (relative path: ./babel-runtime/helpers/typeof)
            no extension
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\babel-runtime\helpers\typeof doesn't exist
            .ts
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\babel-runtime\helpers\typeof.ts doesn't exist
            .tsx
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\babel-runtime\helpers\typeof.tsx doesn't exist
            .mjs
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\babel-runtime\helpers\typeof.mjs doesn't exist
            .js
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\babel-runtime\helpers\typeof.js doesn't exist
            as directory
              E:\test\dddd\babel-runtime\helpers\typeof doesn't exist
      E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\build-es5\plugins\node_modules doesn't exist or is not a directory
      E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\build-es5\node_modules doesn't exist or is not a directory
      E:\test\dddd\node_modules\jest-matchers\node_modules\node_modules doesn't exist or is not a directory
      E:\test\dddd\node_modules\node_modules doesn't exist or is not a directory
      E:\test\node_modules doesn't exist or is not a directory
      E:\node_modules doesn't exist or is not a directory
      looking for modules in E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules
        using description file: E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\package.json (relative path: ./node_modules)
          Field 'browser' doesn't contain a valid alias configuration
      looking for modules in E:\test\dddd\node_modules\jest-matchers\node_modules
        using description file: E:\test\dddd\node_modules\jest-matchers\package.json (relative path: ./node_modules)
          Field 'browser' doesn't contain a valid alias configuration
      looking for modules in E:\test\dddd\node_modules
        using description file: E:\test\dddd\package.json (relative path: ./node_modules)
          Field 'browser' doesn't contain a valid alias configuration
          using description file: E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\package.json (relative path: ./node_modules/babel-runtime/helpers/typeof)
            no extension
              Field 'browser' doesn't contain a valid alias configuration
          using description file: E:\test\dddd\node_modules\jest-matchers\package.json (relative path: ./node_modules/babel-runtime/helpers/typeof)
            no extension
              Field 'browser' doesn't contain a valid alias configuration
          using description file: E:\test\dddd\package.json (relative path: ./node_modules/babel-runtime/helpers/typeof)
            no extension
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof doesn't exist
            .ts
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof doesn't exist
            .ts
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\babel-runtime\helpers\typeof doesn't exist
            .ts
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.ts doesn't exist
            .tsx
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.ts doesn't exist
            .tsx
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\babel-runtime\helpers\typeof.ts doesn't exist
            .tsx
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.tsx doesn't exist
            .mjs
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.tsx doesn't exist
            .mjs
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\babel-runtime\helpers\typeof.tsx doesn't exist
            .mjs
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.mjs doesn't exist
            .js
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.mjs doesn't exist
            .js
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\babel-runtime\helpers\typeof.mjs doesn't exist
            .js
              Field 'browser' doesn't contain a valid alias configuration
              E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.js doesn't exist
            as directory
              E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof doesn't exist
              E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.js doesn't exist
            as directory
              E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof doesn't exist
              E:\test\dddd\node_modules\babel-runtime\helpers\typeof.js doesn't exist
            as directory
              E:\test\dddd\node_modules\babel-runtime\helpers\typeof doesn't exist
[E:\test\dddd\babel-runtime\helpers\typeof]
[E:\test\dddd\babel-runtime\helpers\typeof.ts]
[E:\test\dddd\babel-runtime\helpers\typeof.tsx]
[E:\test\dddd\babel-runtime\helpers\typeof.mjs]
[E:\test\dddd\babel-runtime\helpers\typeof.js]
[E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\build-es5\plugins\node_modules]
[E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\build-es5\node_modules]
[E:\test\dddd\node_modules\jest-matchers\node_modules\node_modules]
[E:\test\dddd\node_modules\node_modules]
[E:\test\node_modules]
[E:\node_modules]
[E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof]
[E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof]
[E:\test\dddd\node_modules\babel-runtime\helpers\typeof]
[E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.ts]
[E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.ts]
[E:\test\dddd\node_modules\babel-runtime\helpers\typeof.ts]
[E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.tsx]
[E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.tsx]
[E:\test\dddd\node_modules\babel-runtime\helpers\typeof.tsx]
[E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.mjs]
[E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.mjs]
[E:\test\dddd\node_modules\babel-runtime\helpers\typeof.mjs]
[E:\test\dddd\node_modules\jest-matchers\node_modules\pretty-format\node_modules\babel-runtime\helpers\typeof.js]
[E:\test\dddd\node_modules\jest-matchers\node_modules\babel-runtime\helpers\typeof.js]
[E:\test\dddd\node_modules\babel-runtime\helpers\typeof.js]
 @ ./node_modules/jest-matchers/node_modules/pretty-format/build-es5/plugins/ReactElement.js 1:128-167
 @ ./node_modules/jest-matchers/node_modules/pretty-format/build-es5/index.js
 @ ./node_modules/jest-matchers/node_modules/jest-matcher-utils/build-es5/index.js
 @ ./node_modules/jest-matchers/build/matchers.js
 @ ./node_modules/rx-sandbox/dist/src/assert/marbleAssert.js
 @ ./node_modules/rx-sandbox/dist/src/index.js
 @ ./src/app/app.component.spec.ts
 @ ./src sync \.spec\.ts$
 @ ./src/test.ts

An in-range update of lint-staged is breaking the build 🚨

The devDependency lint-staged was updated from 7.2.2 to 7.3.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

lint-staged is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Release Notes for v7.3.0

7.3.0 (2018-09-20)

Features

  • Allow linting files outside of project folder (#495) (d386c80)
Commits

The new version differs by 1 commits.

  • d386c80 feat: Allow linting files outside of project folder (#495)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

RxJS 6

Love this repository!! Awesome package πŸ‘

Is there a plan to update the dependencies and support RxJS 6?

Incompatibility with RxJS 7.8.1

Hello there,

I'm not sure if this repository is being actively maintained, but we use rx-sandbox in our repo to help test observables in RxJS.

It seems like after updating our RxJS version, our unit tests that were using rx-sandbox stopped working with this message in all the import locations:

    Cannot find module 'rxjs/internal/scheduler/AsyncAction' from '../../node_modules/rx-sandbox/dist/utils/coreInternalImport.js'

    Require stack:
      /Users/dsawali/Desktop/ecadlabs/taquito/node_modules/rx-sandbox/dist/utils/coreInternalImport.js
      /Users/dsawali/Desktop/ecadlabs/taquito/node_modules/rx-sandbox/dist/assert/marbleAssert.js
      /Users/dsawali/Desktop/ecadlabs/taquito/node_modules/rx-sandbox/dist/index.js
      test/wallet/increase-paid-storage-operation.spec.ts

      at Resolver.resolveModule (../../node_modules/jest-runtime/node_modules/jest-resolve/build/index.js:306:11)
      at Object.<anonymous> (../../node_modules/rx-sandbox/src/utils/coreInternalImport.ts:7:1)

apologies in advance if this isn't a regression caused by rx-sandbox.

Thanks

An in-range update of @types/jest is breaking the build 🚨

The devDependency @types/jest was updated from 23.3.2 to 23.3.3.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@types/jest is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Pass in TestMessage as items when using an array for the 'e' function

It would be pretty useful to be able to pass in TestMessage as items in an array to the 'e' function. It could allow developers to supply a frame number and skip having to add marble strings to put the expected message on the correct frame. It would also be useful to be able to use the same function to generate the expected messages and the messages coming out of hot/cold observables.

An in-range update of jest-spin-reporter is breaking the build 🚨

The devDependency jest-spin-reporter was updated from 1.0.1 to 1.0.2.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

jest-spin-reporter is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Release Notes for Release 1.0.2

1.0.2 (2018-09-21)

Bug Fixes

  • reporter: update output (21085eb)
Commits

The new version differs by 8 commits.

  • 258743e Merge pull request #4 from kwonoj/fix-output
  • c9e10b7 build(release): release 1.0.2
  • 37f2222 build(package): bump up version
  • 21085eb fix(reporter): update output
  • 0a17d85 build(webpack): update configuration
  • fc0624a build(package): update dependencies
  • e09bfc9 Merge pull request #3 from kwonoj/bump-dep
  • 8818b8c build(package): bump up dependencies

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of lint-staged is breaking the build 🚨

The devDependency lint-staged was updated from 8.0.2 to 8.0.3.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

lint-staged is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ continuous-integration/appveyor/branch: AppVeyor build failed (Details).
  • βœ… Travis CI - Branch: The build passed.

Release Notes for v8.0.3

8.0.3 (2018-10-30)

Bug Fixes

Commits

The new version differs by 1 commits.

  • 225a904 fix: Allow to use lint-staged on CI (#523)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of prettier is breaking the build 🚨

The devDependency prettier was updated from 1.14.2 to 1.14.3.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

prettier is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Release Notes for 1.14.3

πŸ”— Changelog

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

IDEA: use regex syntax {n} instead of ...n...

Don't you think the regex syntax {n} is better than ...n...?
The current ...n... can only simulate n of dashes. But if we use {n} we can have:

const = 'a-{8}b'; // 'a--------b'
const = 'a{8}b'; // 'aaaaaaaab'

Align marble string in Error message with spaces

Current error message:

Error: 
    "Source:   -(bbb)|"
    "Expected: (aaa)(bbb)|"

Expected error message:

Error: 
    "Source:   -    (bbb)|"
    "Expected: (aaa)(bbb)|"

I think the same frame of 2 streams should be aligned.

An in-range update of husky is breaking the build 🚨

The devDependency husky was updated from 1.1.0 to 1.1.1.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

husky is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Commits

The new version differs by 8 commits.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

hot() replaces the first frame character with a dash

    const {marbleAssert} = rxSandbox;
    const {hot, cold, e, s, getMessages, flush} = rxSandbox.create();

    const coldSource$ = cold('a     b   |'); // work
    const hotSource$ = hot('  a     b   |'); // error
    const expected = e('      (aaa)(bbb)|');

    const coldMessages = getMessages(coldSource$.switchMap(value => Observable.from([value, value, value])));
    const hotMessages = getMessages(hotSource$.switchMap(value => Observable.from([value, value, value])));
    flush();

    marbleAssert(coldMessages).to.equal(expected);
    marbleAssert(hotMessages).to.equal(expected);
Error: 
    "Source:   -(bbb)|"
    "Expected: (aaa)(bbb)|"

Jest matcher utils dependency upgrade

Since upgading to Angular 12 and Webpack 5, this package no longer works when running tests and errors with

Chrome 91.0.4472.114 (Linux x86_64) ERROR
  An error was thrown in afterAll
  Uncaught ReferenceError: Buffer is not defined
  ReferenceError: Buffer is not defined
      at Object.45513 (http://localhost:9876/_karma_webpack_/webpack:/node_modules/jest-matcher-utils/build/deepCyclicCopyReplaceable.js:18:1)
      at __webpack_require__ (http://localhost:9876/_karma_webpack_/webpack:/webpack/bootstrap:19:1)
      at Object.79283 (http://localhost:9876/_karma_webpack_/webpack:/node_modules/jest-matcher-utils/build/index.js:19:3)
      at __webpack_require__ (http://localhost:9876/_karma_webpack_/webpack:/webpack/bootstrap:19:1)
      at Object.53442 (http://localhost:9876/_karma_webpack_/webpack:/node_modules/rx-sandbox/dist/assert/marbleAssert.js:9:55)
      at __webpack_require__ (http://localhost:9876/_karma_webpack_/webpack:/webpack/bootstrap:19:1)
      at Object.89949 (http://localhost:9876/_karma_webpack_/webpack:/node_modules/rx-sandbox/dist/index.js:4:24)
      at __webpack_require__ (http://localhost:9876/_karma_webpack_/webpack:/webpack/bootstrap:19:1)
      at Module.534 (http://localhost:9876/_karma_webpack_/main.js:2450:68)

Could the jest-matcher-utils package be upgraded to the latest version #663 as it might solve this issue

An in-range update of commitizen is breaking the build 🚨

The devDependency commitizen was updated from 3.0.1 to 3.0.2.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

commitizen is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Release Notes for v3.0.2

<a name"3.0.2">

3.0.2 (2018-10-03)

Bug Fixes

Commits

The new version differs by 4 commits.

  • 7c4703b fix(cli): Make gz -a working again (#573)
  • b81dcb3 docs: add stackoverflow tag
  • 5436732 docs: add azure pipelines badge
  • 55f3ebd docs: Remove bithound badge

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of ts-jest is breaking the build 🚨

The devDependency ts-jest was updated from 23.1.4 to 23.10.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

ts-jest is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Release Notes for 23.10.0

ts-jest, reloaded!

  • lots of new features including full type-checking and internal cache (see changelog)
  • improved performances
  • Babel not required anymore
  • improved (and growing) documentation
  • a ts-jest Slack community where you can find some instant help
  • end-to-end isolated testing over multiple jest, typescript and babel versions
Commits

The new version differs by 293 commits.

  • 0e5ffed chore(release): 23.10.0
  • 3665609 Merge pull request #734 from huafu/appveyor-optimizations
  • 45d44d1 Merge branch 'master' into appveyor-optimizations
  • 76e2fe5 ci(appveyor): cache npm versions as well
  • 191c464 ci(appveyor): try to improve appveyor's config
  • 0f31b42 Merge pull request #733 from huafu/fix-test-snap
  • 661853a Merge branch 'master' into fix-test-snap
  • aa7458a Merge pull request #731 from kulshekhar/dependabot/npm_and_yarn/tslint-plugin-prettier-2.0.0
  • 70775f1 ci(lint): run lint scripts in series instead of parallel
  • a18e919 style(fix): exclude package.json from tslint rules
  • 011b580 test(config): stop using snapshots for pkg versions
  • 7e5a3a1 build(deps-dev): bump tslint-plugin-prettier from 1.3.0 to 2.0.0
  • fbe90a9 Merge pull request #730 from kulshekhar/dependabot/npm_and_yarn/@types/node-10.10.1
  • a88456e build(deps-dev): bump @types/node from 10.9.4 to 10.10.1
  • 54fd239 Merge pull request #729 from kulshekhar/dependabot/npm_and_yarn/prettier-1.14.3

There are 250 commits in total.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of ts-jest is breaking the build 🚨

The devDependency ts-jest was updated from 23.10.3 to 23.10.4.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

ts-jest is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • ❌ ci/circleci: Your tests failed on CircleCI (Details).

Release Notes for 23.10.4 (2018-10-06)

Bug Fixes

  • cache: adds project's dep versions to cache key (6cacbea), closes #785
  • cli: change options to better reflect the new presets (68abcfb)
  • helpers: deprecate import from ts-jest, now ts-jest/utils (33ff29f), closes #782
  • typings: typo in presets definition file (53767ab)
  • typings: wrong import in preset typings + test (94dc4e7)
Commits

The new version differs by 22 commits.

  • ef89ee6 Merge pull request #795 from huafu/release/23.10.4
  • 82a930b chore(release): 23.10.4
  • 69b80ad Merge pull request #794 from huafu/fix-preset-typings
  • 94dc4e7 fix(typings): wrong import in preset typings + test
  • 53767ab fix(typings): typo in presets definition file
  • 90beca8 Merge pull request #787 from huafu/fix-testing-utils
  • 89ad06a style(cli): more readable code when setting defaults for init
  • b1eed98 docs(install): includes @types/jest in install script
  • b837acd test(typings): repalce jest.SpyInstance with MockInstance
  • 6cacbea fix(cache): adds project's dep versions to cache key
  • 7b2dd01 test(preset): fixes tests, doc and cli for presets
  • ec78757 docs(utils): updates docs related to moved helpers
  • 8d5a60a test(preset): updates tests related to presets
  • 68abcfb fix(cli): change options to better reflect the new presets
  • 33ff29f fix(helpers): deprecate import from ts-jest, now ts-jest/utils

There are 22 commits in total.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Is there any ideas how to make custom values working correctly?

Hi!

Thank you for the tool. Thats really cool. I want to use it because of beautiful expected / actual output.

Is there any possibility to add support of custom values?

Example:

  const values = { a: 1, b: 2, x: 2, y: 4, t: true, f: false };
  const source = hot('---a--bt--|', values);
  const expected = e('---x--yf---|', values);
  // ...

You will get this as a result:

        "Source:   ---2--4Γ€--|"
        "Expected: ---2--4Γ€---|"

Is there any possibility to make it:

        "Source:   ---x--yt--|"
        "Expected: ---x--yf---|"

?

Looks like API retrieves all information to make it possible. Looks like you don't even need to change / improve API to achieve this.

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.