Type-safe reactive state management

Overview

rxsv

Actions Status lerna

Framework agnostic minimal state management library based on RxJS, heavily inspired by Redux and Redux-Observable with limited boilerplate and TypeScript first approach.

Although the library is framework agnostic and it can be used with any framework, it provides especially smooth integration with Vue.js using vue-rx. It has been battle tested in few small to medium projects currently running on production.

Installation:

npm install rxjs @rxsv/core
npm install vue-rx # only if you are using vue

Vue Example:

///////////////// todo module

// todoState.ts

import {
    U,
    ActionsUnion,
    createReducer,
    Effect,
    fromActions,
    select,
    createStore,
} from '@rxsv/core';

type Todo = { id: string; text: string; isDone: boolean };

// create type-safe actions and action creators in one go using `U`
export const Actions = U.createUnion(
    U.caseOf('ADD_TODO')<Todo>(),
    U.caseOf('REMOVE_TODO')<Todo['id']>(),
    U.caseOf('UPDATE_TODO')<Todo>(),
);

// infer union type of all actions from `U`
type Actions = ActionsUnion<typeof Actions>;

// create reducer function using `createReducer` and infered action union type
// `createReducer` will force you to cover all cases, if you don't want this behaviour consider using simple switch
export const todosReducer = createReducer([] as Todo[])<Actions>({
    ADD_TODO: (state, { payload }) => [...state, payload],
    UPDATE_TODO: (state, { payload }) =>
        state.map(todo => (todo.id === payload.id ? payload : todo)),
    REMOVE_TODO: (state, { payload }) => state.filter(({ id }) => id !== payload),
});

// infer state type from the reducer
type State = ReturnType<typeof reducer>;

// handle side effects using rxjs based sagas.
// The same concept and almost the same (there is no support for DI in rxsv's effects) API as in `https://redux-observable.js.org/`
export const todosEffect: Effect<Actions, State> = (action$, state$) =>
    action$.pipe(
        fromActions(Actions.ADD_TODO),  // fromActions works only with `U`. It will infer the action type from `U` of arbitrary length
        withLatestFrom(state$), // you could access state in a effects like this
        tap(([action, state]) => console.log('todo added'))),
    );

// You can use `reselect` but in most cases you won't need selector library, rxjs is more than enough
// use `select` which has built in memoization, or use `distinctUntilChanged` operator directly
export const todosSelector = (state$: Observable<State>) =>
  combineLatest(
    state$.pipe(select(a => a)), // take part(s) of the state
    state$.pipe(select(a => a.length)),
    (todos, length) => todos.map(todo => ({ todo, length })) // do your projection
  );


///////////////// users module

// usersState.ts

// In most cases you'd want to use `U` and `createReducer`.
// But there are situations when having simple record with `createAction` and switch based reducer is helpful

import { createAction, ActionsUnion } from '@rxsv/core';

const USER_CHANGED = 'USER_CHANGED';

const UserActions = {
    userChanged: () => createAction(USER_CHANGED),
};

export type UserActions = ActionsUnion<typeof UserActions>;

import { Reducer } from '@rxsv/core';
import { AppAction } from '@rootStore';

const initialUserState = {
    sth: '',
};

type UserState = typeof initialUserState;

export const userReducer: Reducer<AppAction, UserState> = (state = initialUserState, action) => {
    switch (action.type) {
        case USER_CHANGED:
            return {
                ...state,
                sth: 'hardcoded',
            };
        default:
            return state;
    }
};

import { ofType } from '@rxsv/core';
import { AppEffect } from '@/rootStore';

const userChangedEffectEffect: AppEffect = action$ =>
    action$.pipe(
        ofType(USER_CHANGED), // `ofType` will work only with simple actions created by `createAction`. It loses type safety for 4 or more elements
        debounceTime(1000),
        mapTo(TodoActions.REMOVE_TODO('1'))
    );

///////////////// rootState.ts

// this is supposed to be root of your applications
// here you can combine application modules, inject dependencies to your effects .etc

import { Store, Effect, combineReducers, combineEffects } from '@rxsv/core';
import { TodosActions, todosReducer, todosEffect } from '@/modules/todos/store';
import { UserActions, usersReducer, usersEffect } from '@/modules/users/store';

// combineReducers works the same way as in `Redux`
// it relies on the `===` comparisment so never mutate your state data!
const rootReducer = combineReducers({ users: usersReducer, todos: usersReducer });

// combineEffects will merge all of your effects into one super-effect ๐Ÿ’ฅ Just as in `Redux-Observable`
const rootEffect = combineEffects(usersEffect, todosEffect);

export const rxStore = createStore(rootReducer, rootEffectFactory);

export type AppAction = VisActions | UserActions;
export type AppState = ReturnType<typeof rootReducer>;
export type AppEffect = Effect<AppAction, AppState>;
export type AppStore = Store<AppAction, AppState>;

///////////////// main.ts
import VueRx from 'vue-rx';
import { rxStore } from '@/rootStore';

Vue.use(VueRx);

// you can set store as a global property for less boilerplate,
// (remember about adding appropriate typings that are extending Vue namespace)
// However such setup doesn't work in the embeddable applications
// and might not be that clear
Vue.prototype.$rxStore = rxStore;

Connecting to the Vue App:

If you don't want global property, the store could be initialized in vue's Provide and injected to the components through Inject

<template>
    <div id="App">
        App
    </div>
</template>

<script lang="ts">
import { Component, Vue, Prop, Provide } from 'vue-property-decorator';
import { Observables } from 'vue-rx';
import * as RxSV from 'rxsv';

import { rootReducer, rootEffect, AppStore } from '@/rootStore';

@Component
export default class App extends Vue {
    @Provide('rxstore')
    private get rxStore(): AppStore {
        const store = RxSV.createStore(rootReducer, rootEffect);

        this.$subscribeTo(store.action$, logAction);

        return store;
    }
}
</script>

Usage in Vue components:

Thanks to the vue-rx observables will be unpacked so their values could used without any headache and be passed to the template to render or used as a prop to other components

<template>
  <p>
    <button @click="onClick">
      dispatch
    </button>
    <SomeOtherComponent :todos="todos$" />
    <p> {{ isInital$ }} </p>
  </p>
</template>

<script lang="ts">
import { Component, Vue,  Inject } from 'vue-property-decorator';
import { select, Store } from 'rxsv';
import { map } from 'rxjs/operators';
import { Observable } from 'rxjs';
import { Observables } from 'vue-rx';

import SomeOtherComponent from './SomeOtherComponent.vue';
import { TodosActions, todosSelector } from '@/modules/visualization/store';
import { AppStore } from '@/rootStore'

@Component<Home>({
    components: {
        SomeOtherComponent,
    },
    subscriptions(): Observables {
        const { state$ } = this.rxStore;

        return {
            todos$: todosSelector(state$),
            isInital$: state$.pipe(
                select(usersSelector),
                map(el => el.length > 0)
            ),
        };
    },
})
export default class Home extends Vue {
    @Inject('store') public readonly rxStore!: AppStore

    private onClick(): void {
        this.rxStore.action$.next(TodosActions.ADD_TODO({ id: 1, text: "kek", isDone: false }));
    }
}
</script>
Comments
  • [WIP] Sane action ordering for sync effects

    [WIP] Sane action ordering for sync effects

    Addresses https://github.com/grzegorz-bielski/rxsv/issues/21

    @GrzegorzKazana I couldn't figure out how to make it work with an observeOn, so instead, I delegated the effects subscription.

    It means that no effect will be run if there aren't any subscribers to the state$. This is clearly a breaking change, it might need more tests.

    Available from npm at @rxsv/[email protected]

    opened by grzegorz-bielski 3
  • Update @typescript-eslint/eslint-plugin to the latest version ๐Ÿš€

    Update @typescript-eslint/eslint-plugin to the latest version ๐Ÿš€


    ๐Ÿšจ Reminder! Less than one month left to migrate your repositories over to Snyk before Greenkeeper says goodbye on June 3rd! ๐Ÿ’œ ๐Ÿšš๐Ÿ’จ ๐Ÿ’š

    Find out how to migrate to Snyk at greenkeeper.io


    The devDependency @typescript-eslint/eslint-plugin was updated from 2.34.0 to 3.0.0.

    This version is not covered by your current version range.

    If you donโ€™t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: jameshenry License: MIT

    Release Notes for v3.0.0

    This major release has been a long time coming! We've been saving up breaking changes for a while now, waiting for the ESLint v7 release which we knew would deprecate support for node version 8.

    Due to our weekly release cadence, this major release mostly contains breaking changes!

    Breaking Changes

    Dropped support for Node version 8 (#1420)

    In line with ESLint v7 - we've also dropped explicit support for node version 8.
    This version of node has been end of life since 2019-12-31.
    We no longer test against the version, so we provide no guarantees about whether or not future versions of our tooling will work on it.

    Dropped support for TypeScript 3.2 (#2004)

    Old TS versions cause us maintenance pain as we work on integrating tightly with the TypeScript APIs for performance and stability reasons.

    As such we've updated our required TS version range to require a minimum of >=3.3.1.

    Each version of TS brings bugfixes and features, but most importantly they bring performance improvements. TS 3.9 is releasing with a host of performance improvements that will improve both your build times, and your lint times - so you should endeavour to upgrade if you can. We cannot provide any guarantees around the performance of old TS versions.

    Configs

    We've updated all of our configs! We've added new rules, old rules, and removed some stylistic rules.

    Both of the recommended and recommended-requiring-typechecking sets now inherit from the eslint-recommended set. We noticed that the majority of the time, users were using the sets in tandem, so this just removes one line of config for everyone.

    Check out the linked issues for more information about added/removed rules:

    • eslint-recommended config (#1273)
    • recommended config (#1423)
    • recommended-requiring-typechecking (#1423)

    Rules Changes

    • ban-types got a rework of its default ban list to provide some more sensible defaults and remove fixers that caused users issues. (#848)
    • no-floating-promises now has the ignoreVoid option set to true by default. (#2003)
    • no-unnecessary-condition
      • the ignoreRHS option has been removed. The rule will now only check the RHS when it matters (i.e. in boolean contexts). (#1163)
      • the checkArrayPredicates option has been removed. The rule will now always check array predicate functions. (#1579)
      • the rule now will report if you do an equality check against null/undefined when the value is not nullable. (#1659)
    • prefer-nullish-coalescing
      • the fixer has been converted to a suggestion fixer always - it was unsafe in most cases.
      • removed option forceSuggestionFixer.
    • prefer-optional-chain
      • the fixer has been converted to a suggestion fixer always - it was unsafe in a number of cases.
      • removed option suggestInsteadOfAutofix.
    • restrict-template-expressions
      • now has the allowNumber option set to true by default. (#2005)
      • allowNullable has been renamed to allowNullish. (#2006)
    • strict-boolean-expression received a complete rework. The rule is now more configurable, with smarter defaults and more intuitive logic. (#1515)

    Rule Removals

    The following deprecated rules have been deleted. Please switch to the listed alternative:

    AST Changes

    • typescript-estree now emits a TSEmptyBodyFunctionExpression when it encounters a function expression without a body. Previously this was done in parser (for legacy reasons). This change should only affect users directly consuming typescript-estree. (#1289)
    • When a method is marked as optional (class Foo { name?() {} }) we now mark the MethodDefinition/TSAbstractMethodDefinition as optional. Previously we marked the key of the node as optional, but this only works if the key is an Identifier, and didn't work in the case of a computed key (class Foo { ['name']?() {} }). (#1429)
    • Import expressions (import('foo')) now conform to the newly released ESTree spec, outputting as an ImportExpression. (#1950)
    • BigInt literals now conform to the newly released ESTree spec, outputting as a Literal with a value of type bigint. (#1999)

    Parser Services

    parserServices are now always emitted from both typescript-estree and parser, regardless of the parserOptions.project configuration. (#716)

    This will allow you to consume parts of the TypeScript API that are generated at the file level, like variable usage diagnostics, without requiring full type information is generated for the project.

    Part of this change includes a new boolean flag on the output: parserServices.hasFullTypeInformation which is true when parserOptions.project was configured, and false otherwise.

    If you were using our getParserServices function from experimental-utils, then this will be handled automatically, and you will not notice any changes. If you built your own function for resolving the parserServices, then you'll have to update accordingly.

    ESLint Types (experimental-utils)

    The old version of our ESLint types were based on those found in the DefinitelyTyped repo. There was a lot of missing documentation, missing properties, misnamed types.

    As part of this release, we've reworked some of the internals to be much closer to the ESLint library itself. (#2023)

    As part of this change, we have also added the types for the new ESLint class.
    SourceCode.isSpaceBetween has also been marked as optional, because it is only available in ESLint v6+

    Non-breaking changes

    ESLint v7

    We now have full support for ESLint v7 (#1550).

    Better handling for TS 3.9's non-null assertion changes (#2036)

    TS 3.9 introduced a breaking change for how non-null assertions are handled in optional chains.

    Pre-3.9, x?.y!.z means (x?.y).z - i.e. it essentially scrubbed the optionality from the chain
    Post-3.9, x?.y!.z means x?.y!.z - i.e. it just asserts that the property y is non-null, not the result of x?.y

    Previously x?.y!.z produced MemberExpression > TSNonNullAssertion > OptionalMemberExpression.
    Now it produces OptionalMemberExpression > TSNonNullAssertion > OptionalMemberExpression.

    Note that both (x?.y)!.z and (x?.y!).z still produce MemberExpression > TSNonNullAssertion > OptionalMemberExpression.
    The same applies for call expressions.

    The rule no-non-null-asserted-optional-chain was also updated to handle this appropriately. It will no longer error on x?.y!.z, but it will still error on (x?.y)!.z.

    Bug Fixes

    • eslint-plugin: [dot-notation] fix typo in schema (#2040) (242328f)
    Commits

    The new version differs by 34 commits.

    • 1765a17 chore: remove v3 canary Ci step
    • 7e39f5b v3.0.0
    • 3dfc46d feat: add index files to parser and typescript-estree
    • 52b6085 feat(eslint-plugin): [prefer-nullish-coalescing][prefer-optional-chain] remove unsafe fixers
    • ae82ea4 fix(experimental-utils): add back SourceCode.isSpaceBetweenTokens
    • fe59f69 fix(eslint-plugin): correct parser peerDep version
    • f199cbd fix(typescript-estree): remove now defunct Import node type
    • a35026d chore: provide more granularity in the CI logs (#2024)
    • 06869c9 feat(experimental-utils): upgrade eslint types for v7 (#2023)
    • 208de71 feat: upgrade to ESLint v7 (#2022)
    • 7ad4d7c feat: bump minimum required TS version (#2004)
    • 264b017 feat(eslint-plugin): [restrict-template-expressions] rename allowNullable to allowNullish (#2006)
    • bfd9b60 feat(eslint-plugin): [no-unnecessary-condition] remove checkArrayPredicates and always check it (#1579)
    • 7fa9060 feat(eslint-plugin): [no-unnecessary-condition] report when non-nullish is compared to null/undefined (#1659)
    • 643ec24 feat(eslint-plugin): [restrict-template-expressions] allowNumber: true by default (#2005)

    There are 34 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 :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 3
  • Update @typescript-eslint/parser to the latest version ๐Ÿš€

    Update @typescript-eslint/parser to the latest version ๐Ÿš€


    ๐Ÿšจ Reminder! Less than one month left to migrate your repositories over to Snyk before Greenkeeper says goodbye on June 3rd! ๐Ÿ’œ ๐Ÿšš๐Ÿ’จ ๐Ÿ’š

    Find out how to migrate to Snyk at greenkeeper.io


    The devDependency @typescript-eslint/parser was updated from 2.34.0 to 3.0.0.

    This version is not covered by your current version range.

    If you donโ€™t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: jameshenry License: BSD-2-Clause

    Release Notes for v3.0.0

    This major release has been a long time coming! We've been saving up breaking changes for a while now, waiting for the ESLint v7 release which we knew would deprecate support for node version 8.

    Due to our weekly release cadence, this major release mostly contains breaking changes!

    Breaking Changes

    Dropped support for Node version 8 (#1420)

    In line with ESLint v7 - we've also dropped explicit support for node version 8.
    This version of node has been end of life since 2019-12-31.
    We no longer test against the version, so we provide no guarantees about whether or not future versions of our tooling will work on it.

    Dropped support for TypeScript 3.2 (#2004)

    Old TS versions cause us maintenance pain as we work on integrating tightly with the TypeScript APIs for performance and stability reasons.

    As such we've updated our required TS version range to require a minimum of >=3.3.1.

    Each version of TS brings bugfixes and features, but most importantly they bring performance improvements. TS 3.9 is releasing with a host of performance improvements that will improve both your build times, and your lint times - so you should endeavour to upgrade if you can. We cannot provide any guarantees around the performance of old TS versions.

    Configs

    We've updated all of our configs! We've added new rules, old rules, and removed some stylistic rules.

    Both of the recommended and recommended-requiring-typechecking sets now inherit from the eslint-recommended set. We noticed that the majority of the time, users were using the sets in tandem, so this just removes one line of config for everyone.

    Check out the linked issues for more information about added/removed rules:

    • eslint-recommended config (#1273)
    • recommended config (#1423)
    • recommended-requiring-typechecking (#1423)

    Rules Changes

    • ban-types got a rework of its default ban list to provide some more sensible defaults and remove fixers that caused users issues. (#848)
    • no-floating-promises now has the ignoreVoid option set to true by default. (#2003)
    • no-unnecessary-condition
      • the ignoreRHS option has been removed. The rule will now only check the RHS when it matters (i.e. in boolean contexts). (#1163)
      • the checkArrayPredicates option has been removed. The rule will now always check array predicate functions. (#1579)
      • the rule now will report if you do an equality check against null/undefined when the value is not nullable. (#1659)
    • prefer-nullish-coalescing
      • the fixer has been converted to a suggestion fixer always - it was unsafe in most cases.
      • removed option forceSuggestionFixer.
    • prefer-optional-chain
      • the fixer has been converted to a suggestion fixer always - it was unsafe in a number of cases.
      • removed option suggestInsteadOfAutofix.
    • restrict-template-expressions
      • now has the allowNumber option set to true by default. (#2005)
      • allowNullable has been renamed to allowNullish. (#2006)
    • strict-boolean-expression received a complete rework. The rule is now more configurable, with smarter defaults and more intuitive logic. (#1515)

    Rule Removals

    The following deprecated rules have been deleted. Please switch to the listed alternative:

    AST Changes

    • typescript-estree now emits a TSEmptyBodyFunctionExpression when it encounters a function expression without a body. Previously this was done in parser (for legacy reasons). This change should only affect users directly consuming typescript-estree. (#1289)
    • When a method is marked as optional (class Foo { name?() {} }) we now mark the MethodDefinition/TSAbstractMethodDefinition as optional. Previously we marked the key of the node as optional, but this only works if the key is an Identifier, and didn't work in the case of a computed key (class Foo { ['name']?() {} }). (#1429)
    • Import expressions (import('foo')) now conform to the newly released ESTree spec, outputting as an ImportExpression. (#1950)
    • BigInt literals now conform to the newly released ESTree spec, outputting as a Literal with a value of type bigint. (#1999)

    Parser Services

    parserServices are now always emitted from both typescript-estree and parser, regardless of the parserOptions.project configuration. (#716)

    This will allow you to consume parts of the TypeScript API that are generated at the file level, like variable usage diagnostics, without requiring full type information is generated for the project.

    Part of this change includes a new boolean flag on the output: parserServices.hasFullTypeInformation which is true when parserOptions.project was configured, and false otherwise.

    If you were using our getParserServices function from experimental-utils, then this will be handled automatically, and you will not notice any changes. If you built your own function for resolving the parserServices, then you'll have to update accordingly.

    ESLint Types (experimental-utils)

    The old version of our ESLint types were based on those found in the DefinitelyTyped repo. There was a lot of missing documentation, missing properties, misnamed types.

    As part of this release, we've reworked some of the internals to be much closer to the ESLint library itself. (#2023)

    As part of this change, we have also added the types for the new ESLint class.
    SourceCode.isSpaceBetween has also been marked as optional, because it is only available in ESLint v6+

    Non-breaking changes

    ESLint v7

    We now have full support for ESLint v7 (#1550).

    Better handling for TS 3.9's non-null assertion changes (#2036)

    TS 3.9 introduced a breaking change for how non-null assertions are handled in optional chains.

    Pre-3.9, x?.y!.z means (x?.y).z - i.e. it essentially scrubbed the optionality from the chain
    Post-3.9, x?.y!.z means x?.y!.z - i.e. it just asserts that the property y is non-null, not the result of x?.y

    Previously x?.y!.z produced MemberExpression > TSNonNullAssertion > OptionalMemberExpression.
    Now it produces OptionalMemberExpression > TSNonNullAssertion > OptionalMemberExpression.

    Note that both (x?.y)!.z and (x?.y!).z still produce MemberExpression > TSNonNullAssertion > OptionalMemberExpression.
    The same applies for call expressions.

    The rule no-non-null-asserted-optional-chain was also updated to handle this appropriately. It will no longer error on x?.y!.z, but it will still error on (x?.y)!.z.

    Bug Fixes

    • eslint-plugin: [dot-notation] fix typo in schema (#2040) (242328f)
    Commits

    The new version differs by 34 commits.

    • 1765a17 chore: remove v3 canary Ci step
    • 7e39f5b v3.0.0
    • 3dfc46d feat: add index files to parser and typescript-estree
    • 52b6085 feat(eslint-plugin): [prefer-nullish-coalescing][prefer-optional-chain] remove unsafe fixers
    • ae82ea4 fix(experimental-utils): add back SourceCode.isSpaceBetweenTokens
    • fe59f69 fix(eslint-plugin): correct parser peerDep version
    • f199cbd fix(typescript-estree): remove now defunct Import node type
    • a35026d chore: provide more granularity in the CI logs (#2024)
    • 06869c9 feat(experimental-utils): upgrade eslint types for v7 (#2023)
    • 208de71 feat: upgrade to ESLint v7 (#2022)
    • 7ad4d7c feat: bump minimum required TS version (#2004)
    • 264b017 feat(eslint-plugin): [restrict-template-expressions] rename allowNullable to allowNullish (#2006)
    • bfd9b60 feat(eslint-plugin): [no-unnecessary-condition] remove checkArrayPredicates and always check it (#1579)
    • 7fa9060 feat(eslint-plugin): [no-unnecessary-condition] report when non-nullish is compared to null/undefined (#1659)
    • 643ec24 feat(eslint-plugin): [restrict-template-expressions] allowNumber: true by default (#2005)

    There are 34 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 :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 3
  • Update html-webpack-plugin in group default to the latest version ๐Ÿš€

    Update html-webpack-plugin in group default to the latest version ๐Ÿš€


    โ˜๏ธ Important announcement: Greenkeeper will be saying goodbye ๐Ÿ‘‹ and passing the torch to Snyk on June 3rd, 2020! Find out how to migrate to Snyk and more at greenkeeper.io


    The dependency html-webpack-plugin was updated from 3.2.0 to 4.0.0.

    This version is not covered by your current version range.

    If you donโ€™t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: jantimon License: MIT

    Find out more about this release.


    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 :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 3
  • Unexpected action order with synchronous epics

    Unexpected action order with synchronous epics

    Do you want to request a feature or report a bug? Bug (?).

    What is the current behavior If action A triggers is synchronously mapped to action B in epic, reducer receives action in order B A.

    What is the expected behavior Actions that are mapped in epics should preserve dispatch order.

    Affected use-cases Suppose dispatching FETCH_REQUEST action which will trigger a http request in epic. If creating the request fails (due to i.e. malformed url/headers), an error will be emitted synchronously. This in turn may trigger a FETCH_FAILED action. Reducer will receive these actions in order: FETCH_FAILED, FETCH_REQUEST. State will transition to the pending state, even the request has already errored out.

    Minimal reproduction

    it('should send actions back to the action$ stream respecting dispatch order', () => {
        const aAction = { type: 'A' };
        const bAction = { type: 'B' };
        const someEffect: Effect<Action, {}> = (action$) =>
            action$.pipe(ofType(aAction.type), mapTo(bAction));
    
        const reducerMock = jest.fn((state = initialState, _action) => state);
    
        const store = createStore(reducerMock, someEffect);
    
        store.state$.subscribe();
        store.action$.next(aAction);
    
        expect(reducerMock).toBeCalledTimes(4);
        expect(reducerMock).toHaveBeenNthCalledWith(1, undefined, initStateAction);
        expect(reducerMock).toHaveBeenNthCalledWith(2, initialState, initAction);
        expect(reducerMock).toHaveBeenNthCalledWith(3, initialState, aAction);
        expect(reducerMock).toHaveBeenNthCalledWith(4, initialState, bAction);
    });
    // shamelessly stole existing testcase to show the behavior
    // test fails, swapping order of 2 last actions makes it pass
    

    Additional context For reference, redux-observable handles this case correctly, which leads me to believe this is not intended behavior: https://codepen.io/GrzegorzKazana/pen/eYZeQVJ?editors=1010 (check the console output for action logs)

    Potential cause My diagnosis is as follows: (could be wrong tho ๐Ÿคท ) effect$ is the first subscriber of action$ (subscription made during initialization). state$ is the second subscriber of action$ (subscription made when user subscribes state$). Therefore, effect stream will always receive actions before reducer, and if the effect synchronously dispatches another action, it will be immediately nexted to the action$ (even before the input action will be handled in the scan operator).

    Potential solution Option 1. (simple): Delay actions from epics using observeOn and asyncScheduler. This will guarantee that all action$ subscribers (including state$) will be flushed before resulting action from epic will be dispatched.

    Option 2. (not-so-simple): Redesign the creation of state$ from action$ and effect$. For now, no suggestions come to my mind. But I am fine with option 1.

    P.S. Pardon my mixed usage of effect and epic

    opened by GrzegorzKazana 2
  • Update prettier to the latest version ๐Ÿš€

    Update prettier to the latest version ๐Ÿš€


    โ˜๏ธ Important announcement: Greenkeeper will be saying goodbye ๐Ÿ‘‹ and passing the torch to Snyk on June 3rd, 2020! Find out how to migrate to Snyk and more at greenkeeper.io


    The devDependency prettier was updated from 1.19.1 to 2.0.0.

    This version is not covered by your current version range.

    If you donโ€™t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: thorn0 License: MIT

    Find out more about this release.


    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 :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 2
  • Support for redux-devtools?

    Support for redux-devtools?

    According to this article, it's possible to bind any custom (Redux-like) state management library to redux-devtools extension (you simply submit your actions and states via extension API). Will rxsv support that?

    opened by vicrac 2
  • Bump terser from 4.4.0 to 4.8.1

    Bump terser from 4.4.0 to 4.8.1

    Bumps terser from 4.4.0 to 4.8.1.

    Changelog

    Sourced from terser's changelog.

    v4.8.1 (backport)

    • Security fix for RegExps that should not be evaluated (regexp DDOS)

    v4.8.0

    • Support for numeric separators (million = 1_000_000) was added.
    • Assigning properties to a class is now assumed to be pure.
    • Fixed bug where yield wasn't considered a valid property key in generators.

    v4.7.0

    • A bug was fixed where an arrow function would have the wrong size
    • arguments object is now considered safe to retrieve properties from (useful for length, or 0) even when pure_getters is not set.
    • Fixed erroneous const declarations without value (which is invalid) in some corner cases when using collapse_vars.

    v4.6.13

    • Fixed issue where ES5 object properties were being turned into ES6 object properties due to more lax unicode rules.
    • Fixed parsing of BigInt with lowercase e in them.

    v4.6.12

    • Fixed subtree comparison code, making it see that [1,[2, 3]] is different from [1, 2, [3]]
    • Printing of unicode identifiers has been improved

    v4.6.11

    • Read unused classes' properties and method keys, to figure out if they use other variables.
    • Prevent inlining into block scopes when there are name collisions
    • Functions are no longer inlined into parameter defaults, because they live in their own special scope.
    • When inlining identity functions, take into account the fact they may be used to drop this in function calls.
    • Nullish coalescing operator (x ?? y), plus basic optimization for it.
    • Template literals in binary expressions such as + have been further optimized

    v4.6.10

    • Do not use reduce_vars when classes are present

    v4.6.9

    • Check if block scopes actually exist in blocks

    v4.6.8

    • Take into account "executed bits" of classes like static properties or computed keys, when checking if a class evaluation might throw or have side effects.

    v4.6.7

    • Some new performance gains through a AST_Node.size() method which measures a node's source code length without printing it to a string first.

    ... (truncated)

    Commits

    Dependabot compatibility score

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


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

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

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

    dependencies 
    opened by dependabot[bot] 1
  • Bump node-fetch from 2.6.1 to 2.6.7

    Bump node-fetch from 2.6.1 to 2.6.7

    Bumps node-fetch from 2.6.1 to 2.6.7.

    Release notes

    Sourced from node-fetch's releases.

    v2.6.7

    Security patch release

    Recommended to upgrade, to not leak sensitive cookie and authentication header information to 3th party host while a redirect occurred

    What's Changed

    Full Changelog: https://github.com/node-fetch/node-fetch/compare/v2.6.6...v2.6.7

    v2.6.6

    What's Changed

    Full Changelog: https://github.com/node-fetch/node-fetch/compare/v2.6.5...v2.6.6

    v2.6.2

    fixed main path in package.json

    Commits
    • 1ef4b56 backport of #1449 (#1453)
    • 8fe5c4e 2.x: Specify encoding as an optional peer dependency in package.json (#1310)
    • f56b0c6 fix(URL): prefer built in URL version when available and fallback to whatwg (...
    • b5417ae fix: import whatwg-url in a way compatible with ESM Node (#1303)
    • 18193c5 fix v2.6.3 that did not sending query params (#1301)
    • ace7536 fix: properly encode url with unicode characters (#1291)
    • 152214c Fix(package.json): Corrected main file path in package.json (#1274)
    • See full diff in compare view
    Maintainer changes

    This version was pushed to npm by endless, a new releaser for node-fetch since your current version.


    Dependabot compatibility score

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


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

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

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

    dependencies 
    opened by dependabot[bot] 1
  • Bump eventsource from 1.0.7 to 1.1.1

    Bump eventsource from 1.0.7 to 1.1.1

    Bumps eventsource from 1.0.7 to 1.1.1.

    Changelog

    Sourced from eventsource's changelog.

    1.1.1

    • Do not include authorization and cookie headers on redirect to different origin (#273 Espen Hovlandsdal)

    1.1.0

    • Improve performance for large messages across many chunks (#130 Trent Willis)
    • Add createConnection option for http or https requests (#120 Vasily Lavrov)
    • Support HTTP 302 redirects (#116 Ryan Bonte)
    • Prevent sequential errors from attempting multiple reconnections (#125 David Patty)
    • Add new to correct test (#111 Stรฉphane Alnet)
    • Fix reconnections attempts now happen more than once (#136 Icy Fish)
    Commits
    • aa7a408 1.1.1
    • 56d489e chore: rebuild polyfill
    • 4a951e5 docs: update history for 1.1.1
    • f9f6416 fix: strip sensitive headers on redirect to different origin
    • 9dd0687 1.1.0
    • 49497ba Update history for 1.1.0 (#146)
    • 3a38537 Update history for #136
    • 46fe04e Merge pull request #136 from icy-fish/master
    • 9a4190f Fix issue: reconnection only happends for 1 time after connection drops
    • 61e1b19 test: destroy both proxied request and response on close
    • Additional commits viewable in compare view

    Dependabot compatibility score

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


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

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

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

    dependencies 
    opened by dependabot[bot] 1
  • Bump async from 2.6.3 to 2.6.4

    Bump async from 2.6.3 to 2.6.4

    Bumps async from 2.6.3 to 2.6.4.

    Changelog

    Sourced from async's changelog.

    v2.6.4

    • Fix potential prototype pollution exploit (#1828)
    Commits
    Maintainer changes

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


    Dependabot compatibility score

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


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

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

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

    dependencies 
    opened by dependabot[bot] 1
  • [Snyk] Fix for 1 vulnerabilities

    [Snyk] Fix for 1 vulnerabilities

    This PR was automatically created by Snyk using the credentials of a real user.


    Snyk has created this PR to fix one or more vulnerable packages in the `npm` dependencies of this project.

    Changes included in this PR

    • Changes to the following files to upgrade the vulnerable dependencies to a fixed version:
      • packages/demo/package.json

    Vulnerabilities that will be fixed

    With an upgrade:

    Severity | Priority Score (*) | Issue | Breaking Change | Exploit Maturity :-------------------------:|-------------------------|:-------------------------|:-------------------------|:------------------------- medium severity | 713/1000
    Why? Proof of Concept exploit, Recently disclosed, Has a fix available, CVSS 6.4 | Prototype Pollution
    SNYK-JS-JSON5-3182856 | Yes | Proof of Concept

    (*) Note that the real score may have changed since the PR was raised.

    Commit messages
    Package name: html-webpack-plugin The new version differs by 59 commits.
    • 74fae99 chore(release): 5.0.0
    • 94a20df chore: update to webpack 5.20.0
    • c5c8212 feat: add meta attribute for html tags
    • d0ab774 feat: provide public path to the alterAssetTagGroups hook
    • 5200ae6 feat: provide public path to the alterAssetTags hook
    • ccbe93a chore: update examples to latest webpack version
    • 33cbd59 fix: generate html files even if no webpack entry exists
    • 826739f feat: allow to use the latest loader-utils and tapable version
    • 81d7b2c feat: add typings for options and version
    • 8d34b81 fix: use correct casing for webpack type import
    • 36f9aca chore: upgrade dev dependencies
    • 1755962 chore: fix css-loader for unit testing
    • a79ab17 chore: drop support for appcache-webpack-plugin as it is not compatible to webpack 5
    • 7c3146d feat: allow to set publicPath to empty string โ€™โ€™
    • b109213 docs: update installation instructions for webpack 4
    • 833b46b fix: inject javascripts in the <head> tag for inject:true and scriptLoading:'defer'
    • 13af0fb feat: add full support for public paths inside templates
    • fd5fe58 refactor: move the publicPath generation into a seperate function
    • 60a6ef8 test: add test for experiments: { outputModule: true }
    • a43ab72 feat: overrule module output
    • 10a0c5e fix: adjust tests as webpack 5 will no longer emit files for builds with errors
    • 2975a6a feat: process html during the processAssets stage PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
    • 0f9c239 fix: add support for publicPath: 'auto' in combination with type: 'asset/resource'
    • ab8b195 fix: support loaders like raw-loader

    See the full diff

    Package name: ts-loader The new version differs by 50 commits.
    • 268bc69 chore(deps): upgrade most production deps (#1237)
    • e160564 Add a cache to file path mapping (#1228)
    • 14fa3f8 Add documentation about performance profiling (#1230)
    • 3cc78b8 Fix typo in README.md (#1229)
    • 8f2a509 Add documentation for the useCaseSensitiveFileNames option (#1227)
    • 566e6ce Instead of checking date, check time thats more accurate to see if something has changed (#1217)
    • 172ebeb Feature/typescript 4 1 (#1213)
    • 0816fe9 Add peer dependencies for Yarn PnP (#1209)
    • 4909d99 Fixed missing errors in watch mode in webpack5 (#1208)
    • 3f73e98 Fix failed builds when using thread-loader (#1207)
    • e90f8ad Fix memory leak when using multiple webpack instances (#1205)
    • 95050eb Speeds up project reference build and doesnt store the result in memory (#1202)
    • f99c7c4 doc: escape pipe in table (#1201)
    • 0b4a86d Replace afterCompile to stop webpack 5 warning (#1200)
    • 6d8d601 Fixed deprecation warnings on [email protected] (#1195)
    • cafc933 Fix installation link on README.md (#1192)
    • f5e901e Bump http-proxy in /examples/react-babel-karma-gulp (#1182)
    • 0767bce add github action status badge (#1190)
    • db5ea55 Feature/upgrade testpack to ts4 (#1189)
    • 95b6fe8 Uses existing instance if config file is same as already built solution (#1177)
    • b38678a Update minimum compiler version to 3.6.3 (#1188)
    • f8eba53 Add documentation and example code for projectReferences (#1184)
    • 46d9761 Update docs to show transpileOnly does not affect project references (#1175)
    • 0e64ceb Fix getOptionsHash when two options has different props but same values. (#1170)

    See the full diff

    Check the changes in this PR to ensure they won't cause issues with your project.


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: ๐Ÿง View latest project report

    ๐Ÿ›  Adjust project settings

    ๐Ÿ“š Read more about Snyk's upgrade and patch logic


    Learn how to fix vulnerabilities with free interactive lessons:

    ๐Ÿฆ‰ Prototype Pollution

    opened by grzegorz-bielski 0
  • [Snyk] Fix for 1 vulnerabilities

    [Snyk] Fix for 1 vulnerabilities

    This PR was automatically created by Snyk using the credentials of a real user.


    Snyk has created this PR to fix one or more vulnerable packages in the `npm` dependencies of this project.

    Changes included in this PR

    • Changes to the following files to upgrade the vulnerable dependencies to a fixed version:
      • packages/demo/package.json

    Vulnerabilities that will be fixed

    With an upgrade:

    Severity | Priority Score (*) | Issue | Breaking Change | Exploit Maturity :-------------------------:|-------------------------|:-------------------------|:-------------------------|:------------------------- high severity | 661/1000
    Why? Recently disclosed, Has a fix available, CVSS 7.5 | Prototype Pollution
    SNYK-JS-LOADERUTILS-3043105 | Yes | No Known Exploit

    (*) Note that the real score may have changed since the PR was raised.

    Commit messages
    Package name: html-webpack-plugin The new version differs by 59 commits.
    • 74fae99 chore(release): 5.0.0
    • 94a20df chore: update to webpack 5.20.0
    • c5c8212 feat: add meta attribute for html tags
    • d0ab774 feat: provide public path to the alterAssetTagGroups hook
    • 5200ae6 feat: provide public path to the alterAssetTags hook
    • ccbe93a chore: update examples to latest webpack version
    • 33cbd59 fix: generate html files even if no webpack entry exists
    • 826739f feat: allow to use the latest loader-utils and tapable version
    • 81d7b2c feat: add typings for options and version
    • 8d34b81 fix: use correct casing for webpack type import
    • 36f9aca chore: upgrade dev dependencies
    • 1755962 chore: fix css-loader for unit testing
    • a79ab17 chore: drop support for appcache-webpack-plugin as it is not compatible to webpack 5
    • 7c3146d feat: allow to set publicPath to empty string โ€™โ€™
    • b109213 docs: update installation instructions for webpack 4
    • 833b46b fix: inject javascripts in the <head> tag for inject:true and scriptLoading:'defer'
    • 13af0fb feat: add full support for public paths inside templates
    • fd5fe58 refactor: move the publicPath generation into a seperate function
    • 60a6ef8 test: add test for experiments: { outputModule: true }
    • a43ab72 feat: overrule module output
    • 10a0c5e fix: adjust tests as webpack 5 will no longer emit files for builds with errors
    • 2975a6a feat: process html during the processAssets stage PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
    • 0f9c239 fix: add support for publicPath: 'auto' in combination with type: 'asset/resource'
    • ab8b195 fix: support loaders like raw-loader

    See the full diff

    Package name: ts-loader The new version differs by 50 commits.
    • 268bc69 chore(deps): upgrade most production deps (#1237)
    • e160564 Add a cache to file path mapping (#1228)
    • 14fa3f8 Add documentation about performance profiling (#1230)
    • 3cc78b8 Fix typo in README.md (#1229)
    • 8f2a509 Add documentation for the useCaseSensitiveFileNames option (#1227)
    • 566e6ce Instead of checking date, check time thats more accurate to see if something has changed (#1217)
    • 172ebeb Feature/typescript 4 1 (#1213)
    • 0816fe9 Add peer dependencies for Yarn PnP (#1209)
    • 4909d99 Fixed missing errors in watch mode in webpack5 (#1208)
    • 3f73e98 Fix failed builds when using thread-loader (#1207)
    • e90f8ad Fix memory leak when using multiple webpack instances (#1205)
    • 95050eb Speeds up project reference build and doesnt store the result in memory (#1202)
    • f99c7c4 doc: escape pipe in table (#1201)
    • 0b4a86d Replace afterCompile to stop webpack 5 warning (#1200)
    • 6d8d601 Fixed deprecation warnings on [email protected] (#1195)
    • cafc933 Fix installation link on README.md (#1192)
    • f5e901e Bump http-proxy in /examples/react-babel-karma-gulp (#1182)
    • 0767bce add github action status badge (#1190)
    • db5ea55 Feature/upgrade testpack to ts4 (#1189)
    • 95b6fe8 Uses existing instance if config file is same as already built solution (#1177)
    • b38678a Update minimum compiler version to 3.6.3 (#1188)
    • f8eba53 Add documentation and example code for projectReferences (#1184)
    • 46d9761 Update docs to show transpileOnly does not affect project references (#1175)
    • 0e64ceb Fix getOptionsHash when two options has different props but same values. (#1170)

    See the full diff

    Check the changes in this PR to ensure they won't cause issues with your project.


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: ๐Ÿง View latest project report

    ๐Ÿ›  Adjust project settings

    ๐Ÿ“š Read more about Snyk's upgrade and patch logic


    Learn how to fix vulnerabilities with free interactive lessons:

    ๐Ÿฆ‰ Prototype Pollution

    opened by grzegorz-bielski 0
Owner
Grzegorz Bielski
Stuff and things, but mostly types and functions.
Grzegorz Bielski
๐Ÿ—ƒ๏ธ Centralized State Management for Vue.js.

Vuex ?? HEADS UP! You're currently looking at Vuex 3 branch. If you're looking for Vuex 4, please check out 4.0 branch. Vuex is a state management pat

vuejs 27.9k Dec 30, 2022
Elm-inspired Application State Management for Vue.js.

VuElm It's a Vue state management inspired by Elm architecture. Concepts There are basically four elements on Elm architecture: Model, Actions, Update

Keuller Magalhรฃes 36 May 5, 2021
A very simple but powerful state management for vuejs projects.

Vuez A Simple but Powerful State Management for Vue.js projects. Vuez is a very simple but powerful state management library for Vue.js projects. Vuez

Mark Feng 42 Feb 18, 2022
:rabbit2: A tiny, light and handy state management for vuejs 2, writing less verbose code.

revuejs ?? A tiny, light and handy state management for vuejs 2, writing less verbose code. Installation Install the pkg with npm: npm install revuejs

Pomy 24 May 5, 2021
A light and easy shared state management plugin for Vue

vue-shared vue-shared is a tiny (~150 lines) vue plugin for shared state management, that can be used as an alternative to Vuex. It adds a new vue opt

null 11 Jan 22, 2021
State management system for Vue.js

Vue States Vue States is a state management system for Vue.js. Checkout the examples at https://github.com/JohannesLamberts/vue-states-examples. You m

sum.cumo GmbH 149 Nov 24, 2022
Simple, unopinionated, lightweight and extensible state management for Vue 3

Simple, unopinionated, lightweight and extensible state management for Vue 3

Andrew Courtice 466 Dec 30, 2022
Local state management within Vuex

vuex-local Local state management within Vuex Why? Global state management is one of the problems on huge application development. Developers address

Katashin 64 Nov 11, 2022
Simplify vuex loading state management

vuex-loading Simplify vuex loading state management Installing Using npm: $ npm install vuex-loadings -s Know Simplify vuex loading state management n

zhoulin 3 Jul 30, 2020
A vue boiler plate with state management, vuex, vue-router that can be backed by a laravel restful api using jwt auth

Laravel 6 (LTS) Vue.js Frontend Boilerplate A Vue.js Frontend starter project kit template/boilerplate with Laravel 6 Backend API support. Features Re

MUWONGE HASSAN 2 Oct 12, 2021
Simple counter with Vue.js and Vuex as state management

vuex-counter Project setup npm install Compiles and hot-reloads for development npm run serve Compiles and minifies for production npm run build Li

Kevin Hamdajani 0 Dec 30, 2021
A find Coach is a vue state management project that allows users to find coach to mentor a student

A find Coach is a vue state management project that allows users to find coach to mentor a student. A simple vue app with routing functionality and vuex management for solid SPA

Ogiogio Victor 4 Jul 2, 2022
Lightweight vuex inspired centralized state management library for all kinds of javascript applications. Great for React Native.

Verx Lightweight vuex inspired centralized state management library for all kinds of javascript applications. install npm install --save verx # yarn a

Jaynti Kanani 3 Nov 4, 2019
A state management library for react inspired by vue 3.0 reactivity api and immer

Welcome to costate ?? A state management library for react inspired by vue 3.0 reactivity api and immer costate is a tiny package that allows you to w

ๅทฅไธš่š 7 Mar 29, 2022
State Management made eXtraordinarily simple and effective for Angular, React, and Vue

XSM - State Management made eXtraordinarily simple and effective for Angular, React, Vue, and Svelte. ?? Homepage Demos Angular React Svelte Vue Realw

Peter Lu 138 Sep 21, 2022
Easily share reactive data between your Vue components.

vue-stash A Vue.js plugin that makes it easy to share reactive data between components. This plugin is best suited for the rapid development of protot

Cody Mercer 406 Dec 10, 2022
Sync and store vue state with browser URL params

vue-sync NOTE: Check out nuxt-url-sync to use it with SSR Sync Vue Component state with browser URL params Makes for easy bookmarking and sharing of v

Stefan Buhrmester 66 Nov 8, 2022
The state manager โ˜„๏ธ

โ˜„๏ธ effector The state manager Table of Contents Introduction Effector follows five basic principles: Installation Documentation Packages Articles Comm

effector โ˜„๏ธ 4k Dec 28, 2022
๐Ÿ“ฆ Fast, Simple, and Lightweight State Manager for Vue 3.0 built with composition API, inspired by Vuex.

v-bucket NPM STATUS: ?? Fast, Simple, and Lightweight State Management for Vue 3.0 built with composition API, inspired by Vuex. Table of Contents Mai

mehdi 42 Aug 10, 2022