GithubHelp home page GithubHelp logo

rxjs-hooks's Introduction

React hooks for RxJS

CircleCI codecov npm version

Installation

Using npm:

$ npm i --save rxjs-hooks rxjs

Or yarn:

$ yarn add rxjs-hooks rxjs

Quick look

import React from "react";
import ReactDOM from "react-dom/client";
import { useObservable } from "rxjs-hooks";
import { interval } from "rxjs";
import { map } from "rxjs/operators";

function App() {
  const value = useObservable(() => interval(500).pipe(map((val) => val * 3)));

  return (
    <div className="App">
      <h1>Incremental number: {value}</h1>
    </div>
  );
}
import React from "react";
import ReactDOM from "react-dom/client";
import { useEventCallback } from "rxjs-hooks";
import { map } from "rxjs/operators";

function App() {
  const [clickCallback, [description, x, y]] = useEventCallback((event$) =>
    event$.pipe(
      map((event) => [event.target.innerHTML, event.clientX, event.clientY]),
    ),
    ["nothing", 0, 0],
  )

  return (
    <div className="App">
      <h1>click position: {x}, {y}</h1>
      <h1>"{description}" was clicked.</h1>
      <button onClick={clickCallback}>click me</button>
      <button onClick={clickCallback}>click you</button>
      <button onClick={clickCallback}>click him</button>
    </div>
  );
}

Apis

useObservable

export type InputFactory<State> = (state$: Observable<State>) => Observable<State>
export type InputFactoryWithInputs<State, Inputs> = (
  state$: Observable<State>,
  inputs$: Observable<RestrictArray<Inputs>>,
) => Observable<State>

export function useObservable<State>(inputFactory: InputFactory<State>): State | null
export function useObservable<State>(inputFactory: InputFactory<State>, initialState: State): State
export function useObservable<State, Inputs>(
  inputFactory: InputFactoryWithInputs<State, Inputs>,
  initialState: State,
  inputs: RestrictArray<Inputs>,
): State

Examples:

import React from 'react'
import ReactDOM from 'react-dom'
import { useObservable } from 'rxjs-hooks'
import { of } from 'rxjs'

function App() {
  const value = useObservable(() => of(1000))
  return (
    // render twice
    // null and 1000
    <h1>{value}</h1>
  )
}

With default value:

import React from 'react'
import ReactDOM from 'react-dom'
import { useObservable } from 'rxjs-hooks'
import { of } from 'rxjs'

function App() {
  const value = useObservable(() => of(1000), 200)
  return (
    // render twice
    // 200 and 1000
    <h1>{value}</h1>
  )
}

Observe props change:

import React from 'react'
import ReactDOM from 'react-dom'
import { useObservable } from 'rxjs-hooks'
import { map } from 'rxjs/operators'

function App(props: { foo: number }) {
  const value = useObservable((_, inputs$) => inputs$.pipe(
    map(([val]) => val + 1),
  ), 200, [props.foo])
  return (
    // render three times
    // 200 and 1001 and 2001
    <h1>{value}</h1>
  )
}
const rootElement = document.querySelector("#app");
ReactDOM.createRoot(rootElement).render(<App foo={1000}/>);
ReactDOM.createRoot(rootElement).render(<App foo={2000}/>);

useObservable with state$

live demo

import React from 'react'
import ReactDOM from 'react-dom/client'
import { useObservable } from 'rxjs-hooks'
import { interval } from 'rxjs'
import { map, withLatestFrom } from 'rxjs/operators'

function App() {
  const value = useObservable((state$) => interval(1000).pipe(
    withLatestFrom(state$),
    map(([_num, state]) => state * state),
  ), 2)
  return (
    // 2
    // 4
    // 16
    // 256
    // ...
    <h1>{value}</h1>
  )
}

useEventCallback

Examples:

import React from 'react'
import ReactDOM from 'react-dom'
import { useEventCallback } from 'rxjs-hooks'
import { mapTo } from 'rxjs/operators'

function App() {
  const [clickCallback, value] = useEventCallback((event$: Observable<React.SyntheticEvent<HTMLButtonElement>>) =>
    event$.pipe(
      mapTo(1000)
    )
  )
  return (
    // render null
    // click button
    // render 1000
    <>
      <h1>{value}</h1>
      <button onClick={clickCallback}>click me</button>
    </>
  )
}

With initial value:

import React from 'react'
import ReactDOM from 'react-dom'
import { useEventCallback } from 'rxjs-hooks'
import { mapTo } from 'rxjs/operators'

function App() {
  const [clickCallback, value] = useEventCallback((event$: Observable<React.SyntheticEvent<HTMLButtonElement>>) =>
    event$.pipe(
      mapTo(1000)
    ),
    200,
  )
  return (
    // render 200
    // click button
    // render 1000
    <>
      <h1>{value}</h1>
      <button onClick={clickCallback}>click me</button>
    </>
  )
}

With state$:

live demo

import React from "react";
import ReactDOM from "react-dom/client";
import { useEventCallback } from "rxjs-hooks";
import { map, withLatestFrom } from "rxjs/operators";

function App() {
  const [clickCallback, [description, x, y, prevDescription]] = useEventCallback(
    (event$, state$) =>
      event$.pipe(
        withLatestFrom(state$),
        map(([event, state]) => [
           event.target.innerHTML,
           event.clientX,
           event.clientY,
          state[0],
        ])
      ),
    ["nothing", 0, 0, "nothing"]
  );

  return (
    <div className="App">
      <h1>
        click position: {x}, {y}
      </h1>
      <h1>"{description}" was clicked.</h1>
      <h1>"{prevDescription}" was clicked previously.</h1>
      <button onClick={clickCallback}>click me</button>
      <button onClick={clickCallback}>click you</button>
      <button onClick={clickCallback}>click him</button>
    </div>
  );
}

A complex example: useEventCallback with both inputs$ and state$

live demo

import React, { useState } from "react";
import ReactDOM from "react-dom";
import { useEventCallback } from "rxjs-hooks";
import { map, withLatestFrom, combineLatest } from "rxjs/operators";

import "./styles.css";

function App() {
  const [count, setCount] = useState(0);
  const [clickCallback, [description, x, y, prevDesc]] = useEventCallback(
    (event$, state$, inputs$) =>
      event$.pipe(
        map(event => [event.target.innerHTML, event.clientX, event.clientY]),
        combineLatest(inputs$),
        withLatestFrom(state$),
        map(([eventAndInput, state]) => {
          const [[text, x, y], [count]] = eventAndInput;
          const prevDescription = state[0];
          return [text, x + count, y + count, prevDescription];
        })
      ),
    ["nothing", 0, 0, "nothing"],
    [count]
  );

  return (
    <div className="App">
      <h1>
        click position: {x}, {y}
      </h1>
      <h1>"{description}" was clicked.</h1>
      <h1>"{prevDesc}" was clicked previously.</h1>
      <button onClick={clickCallback}>click me</button>
      <button onClick={clickCallback}>click you</button>
      <button onClick={clickCallback}>click him</button>
      <div>
        <p>
          click buttons above, and then click this `+++` button, the position
          numbers will grow.
        </p>
        <button onClick={() => setCount(count + 1)}>+++</button>
      </div>
    </div>
  );
}

Example of combining callback observables coming from separate elements - animation with start/stop button and rate controllable via slider

live demo

const Animation = ({ frame }) => {
  const frames = "|/-\\|/-\\|".split("");
  return (
    <div>
      <p>{frames[frame % frames.length]}</p>
    </div>
  );
};


const App = () => {
  const defaultRate = 5;

  const [running, setRunning] = useState(false);

  const [onEvent, frame] = useEventCallback(events$ => {
    const running$ = events$.pipe(
      filter(e => e.type === "click"),
      scan(running => !running, running),
      startWith(running),
      tap(setRunning)
    );

    return events$.pipe(
      filter(e => e.type === "change"),
      map(e => parseInt(e.target.value, 10)),
      startWith(defaultRate),
      switchMap(i => timer(200, 1000 / i)),
      withLatestFrom(running$),
      filter(([_, running]) => running),
      scan(frame => frame + 1, 0)
    );
  });

  return (
    <div className="App">
      <button onClick={onEvent}>{running ? "Stop" : "Start"}</button>
      <input
        type="range"
        onChange={onEvent}
        defaultValue={defaultRate}
        min="1"
        max="10"
      ></input>
      <Animation frame={frame} />
    </div>
  );
};

Known issues

If you are using React 18 + StrictMode under NODE_ENV=development, rxjs-hooks may not work properly. facebook/react#24502 (comment)

rxjs-hooks's People

Contributors

brooooooklyn avatar dependabot-preview[bot] avatar dependabot[bot] avatar fubhy avatar greenkeeper[bot] avatar greenkeeperio-bot avatar infinitexyy avatar jeetiss avatar miloas avatar morlay avatar obe95 avatar oliverjash avatar runjuu avatar wmaurer avatar zry656565 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rxjs-hooks's Issues

How to combine observables from different useEventCallback?

Hi, I don't quite get how I can get to work combining together two streams made separately with useEventCallback.
Here's what I would like to achieve: I have an animation, that can be controlled in two ways: user can click "run/stop" button and moreover he can control animation rate via slider input. I would like to use values from slider combined with button clicks mapped to "true/false", representing whether animation is running or not. Then I'd like to filter this combined stream based on this value, so in the end animation is triggered only when last click from the button turned it on again (with switchMap to interval() based on slider value). Here's a minimal reproduction of my code: https://codesandbox.io/s/pprzmxy230. How to fix it?

Async calls with rxjs-hooks

Could you please provide an example of async calls with switchMap using rxjs-hooks and how we could handle the errors

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

The devDependency standard was updated from 14.0.0 to 14.0.1.

🚨 View failing branch.

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

standard 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: build: Your CircleCI tests were canceled (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 🌴

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

The devDependency sinon was updated from 7.3.1 to 7.3.2.

🚨 View failing branch.

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

sinon 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: build: Your tests passed on CircleCI! (Details).
  • ❌ ci/circleci: test: Your tests failed on CircleCI (Details).

Commits

The new version differs by 6 commits.

  • 15a9d65 Update docs/changelog.md and set new release id in docs/_config.yml
  • 5d770e0 Add release documentation for v7.3.2
  • 585a1e9 7.3.2
  • b51901d Update CHANGELOG.md and AUTHORS for new release
  • 83861a7 Update Lolex to bring in fix for sinonjs/lolex#232
  • 2430fd9 Documentation (#2004)

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 🌴

useMemo might not be stable

I see that you are using useMemo to persist the observable across renderings, however useMemo is / might not be stable in the future.

You may rely on useMemo as a performance optimization, not as a semantic guarantee. In the future, React may choose to β€œforget” some previously memoized values and recalculate them on next render, e.g. to free memory for offscreen components.
https://reactjs.org/docs/hooks-reference.html#usememo

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

The devDependency @types/lodash was updated from 4.14.137 to 4.14.138.

🚨 View failing branch.

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

@types/lodash 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: build: Your CircleCI tests were canceled (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 🌴

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

The devDependency husky was updated from 3.0.2 to 3.0.3.

🚨 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: build: Your CircleCI tests were canceled (Details).

Release Notes for v3.0.3

Fix: prevent old hooks (husky < 1.0) to be run if new ones are defined (husky >= 1.0 ) #556

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 🌴

how organize global state store ?

i am new to rxjs, the rxjs-hooks library is quite inspiring to me !!

since hooks have separated the hard nut to crack (state in class based component ) from component and make it easy to combine and reuse components, i am wondering that is there a way to handle global state by rxjs and how ?

it seems that "state" or "value" is calculated by useObservable or useEventCallback and pass logical code as parameter in myComponent , what if i want reuse it in myOtherComponents . Wrap it in my own useMyHooks maybe a method.

my questtion is that: in react hooks, is there a good way to handle global state with rxjs ? (like store in mobx, reducer in redux) , or do rxjs need it ?

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

The devDependency sinon was updated from 7.2.3 to 7.2.4.

🚨 View failing branch.

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

sinon 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: build: Your tests failed on CircleCI (Details).

Commits

The new version differs by 13 commits.

  • 06fc27d Update docs/changelog.md and set new release id in docs/_config.yml
  • 54da371 Add release documentation for v7.2.4
  • e5de1fe 7.2.4
  • d158672 Update CHANGELOG.md and AUTHORS for new release
  • 1431c78 minor package updates
  • 37c955d Merge pull request #1979 from fatso83/update-npm-deps
  • fc2a32a Merge pull request #1975 from ehmicky/master
  • 85f2fcd Update eslint-plugin-mocha
  • 707e068 Fix high prio audit warnings
  • 8282bc0 Update nise to use @sinonjs/text-encoding
  • c1d9625 Make all properties non-enumerable in spies, stubs, mocks and fakes
  • 894951c Merge pull request #1973 from mgred/default-sandbox-example
  • 876aebb docs(sandbox): add example for default sandbox

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 🌴

Feature Request: need to subscribe action$ when apply useReducer

When I am doing your hire problem 3 and 4: write a autocomplete component. I am using useReducer
to manage state. Then I found the useObservable and useEventCallback can not solve the problem properly.

It's more suitale to subscribe to the action stream when works with useReducer. And I have written a simple custom hook β€˜useReducerEffect’ to solve the problem, but still meet some difficulty.

My idea:

  1. Call the useReducer hook, which return state and dispatch.
  2. Pass state and dispatch and other params into 'useReducerEffect'.
  3. Replace dispatch with dispatchWithEffect for the particular action.
type EffectFactory<Action, State> =
  (action$: Observable<Action>, state$: Observable<State>) => Observable<any>

const [state, dispatch] = useReducer(reducer, initialState, initalAction)
const [result, dispatchWithEffect] =
  useReducerEffect(effectFactory, state, dispatch, initalAction, initialResult)

Now we have two versions of dispatch. You can call orignal 'dispatch', but this action
will not appear in the effectFactory's action$. And the action dispatched by 'dispatchWithEffect'
will appear. The state$ in effectFactory is guaranteed to be up to date. This means when
a action comes in effectFactory's action$, this action already passed the reducer and updated
the state.

My examples is here.

Question about VoidableEventCallback

I was trying write something like

const [callback, flag] = useEventCallback<
  React.MouseEvent<HTMLElement> | boolean,
  boolean
>($events => $events.pipe(mapTo(false)), false)

callback(true)

And there was type error.

Argument of type 'true' is not assignable to parameter of type 'false & true & MouseEvent<HTMLElement, MouseEvent>'.
  Type 'true' is not assignable to type 'false'.ts(2345)

Checking the source

export type VoidableEventCallback<EventValue> = EventValue extends void ? () => void : (e: EventValue) => void

It seems like for example

type Callback = VoidableEventCallback<string | boolean>

will be resolved as

type Callback = ((e: string) => void) | ((e: false) => void) | ((e: true) => void)

which means e has to be string & boolean. Is this a bug or am I missing something here?

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

The devDependency @types/sinon was updated from 5.0.5 to 5.0.6.

🚨 View failing branch.

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

@types/sinon 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: build: 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 🌴

A more practical example please.

Could you show some examples like this?

+----------+     +-----------+    +------------+
|          |     |           |    |            |
|  button  +---->+   loading +--->+   succeed  |
|          |     |           |    |            |
+----------+     +-----+-----+    +------------+
                       |
                       |
                 +-----v-----+
                 |           |
                 |   failed  |
                 |           |
                 +-----------+

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

The devDependency standard was updated from 13.0.1 to 13.0.2.

🚨 View failing branch.

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

standard 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: build: Your tests failed on CircleCI (Details).

Commits

The new version differs by 7 commits.

  • 9539d71 13.0.2
  • 9b9d0fc changelog
  • d1d0b7a Fix global installs: standard-engine@~11.0.1
  • edce3f3 Merge pull request #1323 from standard/greenkeeper/standard-engine-11.0.0
  • 2f3c712 fix tests for standard-engine 11
  • ae04dbb Cleanup the readme
  • 0474066 fix(package): update standard-engine to version 11.0.0

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 🌴

RFC: decouple `useEventCallback` from the state management means

Hi, thank you for the inspiration and make this awesome libs. I have the following RFC proposed:

Suggestion

Remove the overlapping of state management in useEventCallback, as we have useObservable, useState, and useReducer already, making this hook just purely for the async event management. This hook is best to be treated as an adaptor to convert DOMEvent to DOMEvent stream.

Why

After using it for a while, I always think useEventCallback is not so intuitive to use. It accepts up to 3 arguments: callback, initialState, and inputs. Why we need this initialState if we want to introduce prop dependencies? At the current implementation, what this hook would returns is not just a memorized event handler as a callback, but a tuple of handler + the observed state, which makes me feel this hook is doing too much, IMHO.

Ideally, what I have in mind is to have a similar interface as in the the native useCallback. But what can make this hook so useful is to convert the event object to an observable. Then we can manage DOMEvent as a stream easily.

If we need to performance side effects, like to update state, we should use tap operator instead. For example:

const deps = /* some dependencies, could be state, or props */
const [state, setState] = useState();

const onClick = useEventCallback(
  (event$, deps$) => event$.pipe(
    filter((e) => e.type === 'click'),
    map(({ target }) => target.value),
    tap((v) => setState(v))    // * re-render explicitly requested by the user.
    withLatestFrom(deps$),
    /* do something with dependencies */
  ),
  [deps] // optional
)

The deps would be any props or local state dependencies that is reactively emitted and passed as the second props to the callback. And we can think this like an epic in redux-observable. This way we decouple the state management part out of this hook. And this hook is never going to trigger re-render by itself, it will have to be introduced by the user.

Implementation

Here is the suggested implementation:

const createEvent$ = <T>() => {
  return new Subject<T>();
};

const createDeps$ = <D extends unknown[]>(deps: D) => {
  return deps.length ? new BehaviorSubject(deps) : undefined;
};

export const useEventCallback = <E = any, D extends unknown[] = never>(
  callback: (event$: Observable<E>, deps$: Observable<D>) => Observable<unknown>,
  deps: D = [] as never
) => {
  const event$ = useMemo(() => createEvent$<E>(), []);
  const deps$ = useMemo(() => createDeps$<D>(deps), []);

  useEffect(() => {
    const subscriber = callback(event$, deps$ as Observable<D>).subscribe();

    return () => {
      subscriber.unsubscribe();
      event$.complete();

      if (deps$) {
        deps$.complete();
      }
    };
  }, []);

  useEffect(() => {
    if (deps$) {
      deps$.next(deps);
    }
  }, deps);

  return useCallback((e: E) => event$.next(e), []);
};

And perhaps, it should be called as useEvent$Callback to make it more obvious what this hook is doing.

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

The devDependency lint-staged was updated from 9.2.3 to 9.2.4.

🚨 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: build: Your CircleCI tests were canceled (Details).

Release Notes for v9.2.4

9.2.4 (2019-08-25)

Bug Fixes

  • include renames when getting list of staged files (2243a83)
Commits

The new version differs by 1 commits.

  • 2243a83 fix: include renames when getting list of staged files

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 🌴

Bug: Emit same object will not trigger re-render

live demo: https://codesandbox.io/s/rxjs-hooks-bug-zuvek?fontsize=14

Only newer version of react(with setState bail out feature) have this bug. I use 16.10.2


I think the bug is caused by this line:

setState(value)

If my observable emit same mutable object again and again, the subscriber component will not re-render.
Because setState will bail out of updates if the next value is the same as the previous one

If the same mutable object contain different data among renders, we will not see the latest data.

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

The devDependency ts-jest was updated from 24.0.2 to 24.1.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: build: Your CircleCI tests were canceled (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 🌴

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

The devDependency husky was updated from 3.0.4 to 3.0.5.

🚨 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: build: Your CircleCI tests were canceled (Details).

Release Notes for v3.0.5

Fix: prevent postinstall from failing on windows #573

Commits

The new version differs by 9 commits.

  • 2dd9985 3.0.5
  • e0b99e6 [Fix] Prevent postinstall from ever failing on windows (#573)
  • 2f56681 add table of contents (#572)
  • 03b0b2f Bump mixin-deep from 1.3.1 to 1.3.2 (#571)
  • e15e09e Delete DOCS.md
  • 75a38e1 Update README.md
  • 96dd62c Bump eslint-utils from 1.3.1 to 1.4.2 (#569)
  • d3e6a76 Next.js doesn't use husky now (#568)
  • 179ffbe Update README.md

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 @types/jest is breaking the build 🚨

The devDependency @types/jest was updated from 24.0.17 to 24.0.18.

🚨 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: build: Your CircleCI tests were canceled (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 🌴

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

The devDependency sinon was updated from 7.4.1 to 7.4.2.

🚨 View failing branch.

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

sinon 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: build: Your CircleCI tests were canceled (Details).

Commits

The new version differs by 18 commits.

  • 3dd59a5 Update docs/changelog.md and set new release id in docs/_config.yml
  • 5419db2 Add release documentation for v7.4.2
  • d163383 7.4.2
  • ad553d1 Update CHANGELOG.md and AUTHORS for new release
  • bbe6f5e Upgrade nise to latest
  • 78a676f Update @sinonjs/samsam to latest
  • 157b537 Restore sinon.createStubInstance() behaviour (#2073)
  • 766cae4 Merge pull request #2076 from sinonjs/github-workflow
  • 261c4cd renamed step
  • 8525f4d trying built-in coveralls support
  • cf0f402 added coveralls (via npx)
  • 88cf7a9 added code coverage
  • e716d8d Upgrade eslint to latest
  • 4e7bcef Bump eslint-utils from 1.3.1 to 1.4.2
  • 2b1b2df Fix Typo in migration 6 and updated migration docs for migration from… (#2074)

There are 18 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 lint-staged is breaking the build 🚨

The devDependency lint-staged was updated from 8.0.4 to 8.0.5.

🚨 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: build: Your tests failed on CircleCI (Details).

Release Notes for v8.0.5

8.0.5 (2018-11-17)

Bug Fixes

Commits

The new version differs by 2 commits.

  • 503110d fix: Use listr-update-renderer from npm (#542)
  • 6f6c08d docs(readme): refine prettier examples (#541)

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 @types/react-dom is breaking the build 🚨

The devDependency @types/react-dom was updated from 16.8.5 to 16.9.0.

🚨 View failing branch.

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

@types/react-dom 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: build: Your CircleCI tests were canceled (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 🌴

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

The devDependency webpack was updated from 4.35.3 to 4.36.0.

🚨 View failing branch.

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

webpack 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: build: Your tests failed on CircleCI (Details).

Release Notes for v4.36.0

Features

  • SourceMapDevToolPlugin append option now supports the default placeholders in addition to [url]
  • Arrays in resolve and parser options (Rule and Loader API) support backreferences with "..." when overriding options.
Commits

The new version differs by 42 commits.

  • 95d21bb 4.36.0
  • aa1216c Merge pull request #9422 from webpack/feature/dot-dot-dot-merge
  • b3ec775 improve merging of resolve and parsing options
  • 53a5ae2 Merge pull request #9419 from vankop/remove-valid-jsdoc-rule
  • ab75240 Merge pull request #9413 from webpack/dependabot/npm_and_yarn/ajv-6.10.2
  • 0bdabf4 Merge pull request #9418 from webpack/dependabot/npm_and_yarn/eslint-plugin-jsdoc-15.5.2
  • f207cdc remove valid jsdoc rule in favour of eslint-plugin-jsdoc
  • 31333a6 chore(deps-dev): bump eslint-plugin-jsdoc from 15.3.9 to 15.5.2
  • 036adf0 Merge pull request #9417 from webpack/dependabot/npm_and_yarn/eslint-plugin-jest-22.8.0
  • 37d4480 Merge pull request #9411 from webpack/dependabot/npm_and_yarn/simple-git-1.121.0
  • ce2a183 chore(deps-dev): bump eslint-plugin-jest from 22.7.2 to 22.8.0
  • 0beeb7e Merge pull request #9391 from vankop/create-hash-typescript
  • bf1a24a #9391 resolve super call discussion
  • bd7d95b #9391 resolve discussions, AbstractMethodError
  • 4190638 chore(deps): bump ajv from 6.10.1 to 6.10.2

There are 42 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 🌴

Optimization request: avoid rendering twice

Hey,

I am using RxJS.BehaviorSubject which allows me to get the latest value at any given time. That said, my component looks a bit like this...

const MyComponent = ({ subject$ }) => {
  const data = useObservable(() => subject$, subject$.getValue());
  return (
    <h1>{data.name}</h1>
  );
};

Also, in code-sandbox: https://codesandbox.io/s/jlkrpny969

The fact of the matter is that the component renders twice, although the initial state value is the same as the value returned from the inputFactory.

Would it be possible to avoid an extra render when the initial state matches the returned value?

useEventCallback stop working with RJXS.ajax

when I add ajax.getJSON as one of my op parameters to my pipe, it seems to kill my observable ... am I doing it wrong or is it not supported ?

	const [ clickCallback, [ a, b, c ] ] = useEventCallback((event$, inputs$, state$) =>
			event$.pipe(
				() => ajax.getJSON("/api/v1/"), <-- adding this line breaks everything
				tap(x => console.log("tap2", x)),
				map((x) => {
					const { a, b } = x = {}
					debugger
					return [
						a,
						b,
						false
					]
				}),
				tap(x => console.log("tap3", x)),
			),
	)

suggest: default value can accept a observable, and use* function can return a subject as complementary for other propose

I think, it is can give more choose to mutate the value in use* function scope.
eg:

<Timer defaultValue={of(0)} />
function Timer({ defaultValue /* both accept primary value or observable */}) {
    const [value, /* subject */] = useObservable(
        (inputs$) => {
            mergeMap(interval(1000).mapTo((v) => v + 1)),input$.map(v=> ()=> v)).scan((a,b)=>b(a),0)
        },
        defaultValue)
    return (
    <h1>{value}</h1>
  )
}

An in-range update of @types/react-test-renderer is breaking the build 🚨

The devDependency @types/react-test-renderer was updated from 16.8.3 to 16.9.0.

🚨 View failing branch.

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

@types/react-test-renderer 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: build: Your CircleCI tests were canceled (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 🌴

why useEventCallback's inputs$ and states$ opposite to their input argument order

  const [onEvent] = useEventCallback((events$, x$, y$) => {
    x$.subscribe(x => console.log('x ', x)) // log: x [false]
    y$.subscribe(y => console.log('y ', y)) // log: y [0]
  }, [0], [false]);

I thinks x to be 0 and y to be false is expected, but useEventCallback give opposite result. Am I doing something wrong.

versions info:
rxjs-hooks: 0.4.3

[performance] create state$ and input$ base on callback length

Currently Subject state$ and input$ are always created. How about checking the length of the callback argument and only create the Subjects that are used by the callback.

One caveat of this approach is the length check does not recognize spread arguments and the use of arguments object. But I think it is rare to use callback this way.

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

The devDependency webpack was updated from 4.25.1 to 4.26.0.

🚨 View failing branch.

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

webpack 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: build: Your tests failed on CircleCI (Details).

Commits

The new version differs by 7 commits.

  • 04f90c5 4.26.0
  • e1df721 Merge pull request #8392 from vkrol/cherry-pick-terser-to-webpack-4
  • a818def fix for changed API in terser plugin warningsFilter
  • b39abf4 Rename test directories too
  • 311a728 Switch from uglifyjs-webpack-plugin to terser-webpack-plugin
  • a230148 Merge pull request #8351 from DeTeam/chunk-jsdoc-typo
  • 7a0af76 Fix a typo in Chunk#split jsdoc comment

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 webpack is breaking the build 🚨

The devDependency webpack was updated from 4.39.1 to 4.39.2.

🚨 View failing branch.

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

webpack 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: build: Your CircleCI tests were canceled (Details).

Release Notes for v4.39.2

Bugfixes

  • fix ProfilingPlugin not ending traces correctly
Commits

The new version differs by 38 commits.

  • 7265427 4.39.2
  • 9f27d0c Merge pull request #9559 from jamesgeorge007/feat/refactor-banner-plugin
  • b50a995 Merge pull request #9568 from webpack/dependabot/npm_and_yarn/eslint-plugin-jest-22.15.1
  • 385fe6a chore(deps-dev): bump eslint-plugin-jest from 22.15.0 to 22.15.1
  • 7ea8665 Merge pull request #9566 from timneutkens/fix/profiling-callback-override
  • 069c33a Fix asyncHook callback interceptor for ProfilingPlugin
  • ba56f7e Merge pull request #9564 from webpack/dependabot/npm_and_yarn/acorn-6.3.0
  • bd7655c chore(deps): bump acorn from 6.2.1 to 6.3.0
  • e62b643 Merge pull request #9558 from jamesgeorge007/hotfix/fix-typo
  • d7486fd fix: revert
  • aed5cce minor fix
  • 4f003c2 tweak
  • fa3b3ef refactor
  • 72ee5a3 fix: lint
  • af8906d fix: refactor

There are 38 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 🌴

VoidableCallback typing

I'm having problems with the typing for useEventCallback. I can't seem to pass a discriminated union as EventValue to the callback function:

import { useCallback } from 'react';
import { useEventCallback } from 'rxjs-hooks';
import { withLatestFrom, map } from 'rxjs/operators';

type State = number;
type Action = { type: 'add'; n: number } | { type: 'multiply'; n: number };

const reducer = <State, Action>(state: State, _action: Action) => state;

export const Cmpnt = () => {
    const [dispatch] = useEventCallback<Action, State>(
        (event$, state$) =>
            event$.pipe(
                withLatestFrom(state$),
                map(([action, state]) => reducer(state, action)),
            ),
        0,
    );

    const onAddClicked = useCallback((n: number) => dispatch({ type: 'add', n }), [dispatch]);
};

Here I'm getting the following Typescript error when calling the dispatch function:

Type '"add"' is not assignable to type '"add" & "multiply"'.
  Type '"add"' is not assignable to type '"multiply"'.ts(2322)

When I change the definition of VoidableCallback to:

declare type VoidableCallback<EventValue> = (val: EventValue) => void;

... then I have no problems. It seems that the more complex type definition here is wrong?

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

The devDependency @types/webpack was updated from 4.32.2 to 4.39.0.

🚨 View failing branch.

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

@types/webpack 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: build: Your CircleCI tests were canceled (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 🌴

Typing error when wrapping useObservable with generic

import { useObservable } from "rxjs-hooks";
import { map  } from "rxjs/operators";

export const useAsync = <State, Inputs extends any[]>(
  fn: (...args: Inputs) => State,
  deps: Inputs,
) =>
  useObservable<State, Inputs>(
    inputs$ =>
      inputs$.pipe(
        map(i => {
          return (i as unknown) as State;
        }),
      ),
    [0, 1, 2],
    deps,
  );

Results in the following:
image

It seems that passing generic values for useObservable isn't supported. Any ideas?

An in-range update of webpack-dev-server is breaking the build 🚨

The devDependency webpack-dev-server was updated from 3.7.2 to 3.8.0.

🚨 View failing branch.

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

webpack-dev-server 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: build: Your CircleCI tests were canceled (Details).

Release Notes for v3.8.0

3.8.0 (2019-08-09)

Bug Fixes

  • server: fix setupExitSignals usage (#2181) (bbe410e)
  • server: set port before instantiating server (#2143) (cfbf229)
  • check for name of HotModuleReplacementPlugin to avoid RangeError (#2146) (4579775)
  • server: check for external urls in array (#1980) (fa78347)
  • server: fix header check for socket server (#2077) (7f51859)
  • server: stricter headers security check (#2092) (078ddca)

Features

Potential Breaking Changes

We have migrated serverMode and clientMode to transportMode as an experimental option. If you want to use this feature, you have to change your settings.

Related PR: #2116

Commits

The new version differs by 65 commits.

  • 84cb481 chore(release): 3.8.0
  • b5b9cb4 feat(server): add transportMode (#2116)
  • 460f15a test(e2e): More e2e test improvements (#2163)
  • bc7005e chore(deps): update dependency husky to ^3.0.3 (master) (#2182)
  • bbe410e fix(server): fix setupExitSignals usage (#2181)
  • 21e7646 chore(deps): update dependency style-loader to v1 (#2179)
  • a28800d chore(deps): update [email protected] (#2176)
  • 68a1f29 chore(deps): update webpack to 4.39.0 (#2171)
  • c2da532 chore(deps): update dependency standard-version to v7 (#2160)
  • 18edd18 refactor: simplify (#2120)
  • cfbf229 fix(server): set port before instantiating server (#2143)
  • f80e2ae chore(babel): use api.cache (#2157)
  • 0de4eba chore(deps): update all patch dependencies (#2159)
  • 1f9f9dc test(utils): increase coverage (#2156)
  • 9c171d1 chore(deps): update all patch dependencies (master) (patch) (#2151)

There are 65 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 🌴

Error and loading state guide

Expose API like:

const value = useObservable((props$: Observable<[number, string]>) => props$.pipe(
  switchMap(([n, s]) => httpRequest.query(`https://mockbackend?n=${n}&s=${s}`)),
))

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

The devDependency @types/sinon-chai was updated from 3.2.2 to 3.2.3.

🚨 View failing branch.

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

@types/sinon-chai 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: build: Your CircleCI tests were canceled (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 🌴

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

The devDependency sinon was updated from 7.2.7 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.

sinon 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: build: Your tests passed on CircleCI! (Details).
  • ❌ ci/circleci: test: Your tests failed on CircleCI (Details).

Commits

The new version differs by 18 commits.

  • 059727b Update docs/changelog.md and set new release id in docs/_config.yml
  • e848851 Add release documentation for v7.3.0
  • fb55b11 7.3.0
  • b79a6ca Update CHANGELOG.md and AUTHORS for new release
  • c85fa66 Merge pull request #1999 from fatso83/fix-docker-headless-tests
  • 4b7a947 Simplify Circle CI setup
  • 3951eb7 Add a Docker Compose config file for testing the setup locally
  • 2119f08 Merge pull request #1994 from fatso83/expose-props-inject
  • 9faf58e Merge pull request #1997 from xeptore/patch-1
  • 0c7b2cd unnecessary things!
  • 20eeb48 Inject createStubInstance and fake functionality
  • 73d2ac8 Remove unused prop 'injectIntoThis'
  • fb5709f Fix #1974 by upgrading to @sinonjs/[email protected]
  • b8679fa Merge pull request #1989 from mgred/remove-deprecated
  • 617c40e chore: update @sinonsj/commons package

There are 18 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 coveralls is breaking the build 🚨

The devDependency coveralls was updated from 3.0.5 to 3.0.6.

🚨 View failing branch.

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

coveralls 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: build: Your CircleCI tests were canceled (Details).

Commits

The new version differs by 3 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 🌴

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

The devDependency @types/sinon-chai was updated from 3.2.0 to 3.2.1.

🚨 View failing branch.

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

@types/sinon-chai 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: build: 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 🌴

Question: useEventCallback could take any callback signature besides SyntheticEvent?

in the current implementation, it is assumed that useEventCallback will receive a react synthetic event. Is there any reason behind this assumption?

this does not let me use the callback on my custom event handlers.

For instance:

const MyInput = ({ onChange, value }) => (
   <input onChange={e => onChange(e.target.value)} value={value} />
)

I can't use useEventCallback on MyInput because the type signature of onChange there is:

type onChange = (val: string) => void

it doesn't work when afferent a object

import React, { useState } from "react";
import ReactDOM from "react-dom";
import { useObservable } from "rxjs-hooks";
import { timer } from "rxjs";
import { map, combineLatest } from "rxjs/operators";

import "./styles.css";

function Timer({ a }) {
  const [b, setB] = useState(0);
  const val = useObservable(
    (inputs$, state$) =>
      timer(1000).pipe(
        combineLatest(inputs$),
        map(([_index, [c]]) => {
          console.log(c)
          const { a, b } = c;
          return a + b;
        })
      ),
    0,
    [
      {
        a: a,
        b: b
      }
    ]
  );

  return (
    <div>
      <h1>{val}</h1>
      <button onClick={() => setB(b + 10)}>b: +10</button>
    </div>
  );
}

function App() {
  const [a, setA] = useState(100);

  return (
    <div>
      <Timer a={a} />
      <button onClick={() => setA(a + 100)}>a: +100</button>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

An in-range update of tslint-react is breaking the build 🚨

The devDependency tslint-react was updated from 4.0.0 to 4.1.0.

🚨 View failing branch.

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

tslint-react 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: build: Your CircleCI tests were canceled (Details).

Release Notes for v4.1.0
  • [new-rule] react-no-unnecessary-fragment (#245)
  • [new-rule] jsx-whitespace-literal (#243)
  • [new-rule] jsx-curly-brace-presence (#196)
  • [bugfix] jsx-wrap-multiline: check for nested JSX expressions (#240)
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 webpack-cli is breaking the build 🚨

The devDependency webpack-cli was updated from 3.3.7 to 3.3.8.

🚨 View failing branch.

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

webpack-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: build: Your CircleCI tests were canceled (Details).

Release Notes for Webpack-CLI v3.3.8

Webpack-CLI v3.3.8 comes with a validation bugfix to support webpack 5 and version 4. A full changelog is found here

Commits

The new version differs by 7 commits.

  • 7b1e946 chore: version update
  • 64fd810 Merge pull request #1065 from webpack/fix/patch
  • 70bf934 tests: add schema tests
  • 4275fd5 chore: remove lint err
  • 065e87e chore: abstract validation
  • 55b770c chore: vuln patch
  • d28f9f5 fix: support both webpack versions

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 🌴

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.