1.1.3 โ€ข Published 6 years ago

machinate v1.1.3

Weekly downloads
5
License
MIT
Repository
github
Last release
6 years ago

๐Ÿ•ต๏ธโ€โ™‚๏ธ machinate

npm build

โš ๏ธ Not yet ready for production use.


machinate (mackยทinยทeight) verb:

  • Practical, simple, and hassle-free state management.

  • A cutesy reverse portmanteau of "state machine".

  • To engage in plots and intrigues; scheme. (This is what your app does if you're not managing state properly, we'll help put an end to that.)


๐Ÿ Goals:

  • ๐Ÿš€ Instantly launch your app in any given state.
  • ๐Ÿค“ Heavy emphasis on developer experience. Your time and sanity are respected.
  • ๐Ÿšผ Baked in best practices. Guardrails for guidance.
  • ๐Ÿž Dead simple. Plain javascript objects. Minimal boilerplate.
  • ๐Ÿ›  High quality tooling.

Install

yarn add machinate

Use

Every app has states. 1) Define them. 2) Implement them. 3) Connect them.

1. define your app's states

// object where keys are a domain, values are the states of that domain.

const scheme = {
  Auth: ["LoggedIn", "LoggedOut", "Unknown"]
};

2. implement the states

import { Machinate, States } from "machinate";

const initialState = { Auth: "LoggedOut" };

const App = (
    <Machinate
        scheme={scheme}
        initial={initialState}>

        <States of="Auth"
            LoggedIn={...}
            LoggedOut={...}
            Unknown={...}
        />
    </Machinate>
);

ReactDOM.render(<App />, document.body)

๐Ÿ’ก Tip! If you forget to implement a state, machinate will warn you:

<States of="Auth"
    LoggedIn={...}
    LoggedOut={...}
    // 'Unknown' prop left out intentionally
>

web console:

Warning: Failed prop type: The prop `Unknown` is marked as required in `Auth[Domain]`, but its value is `undefined`.

3. connecting states

Each state prop receives an object with the following parameters:

  1. data: the data if any, associated with the state
  2. transition(stateName, optionalData): move the machine to stateName and set the data associated with the state to data
  3. go(stateName, optionalData): same as transition(), but wrapped in a function to delay execution; essentially a convenient helper for transitioning on callbacks
  4. update(stateName, updateFn): same as transition(), except the second parameter is a function that transforms the current data to new data

Here we use the go() function:

<States of="Auth"
    LoggedIn={({data}) => <h1>Hi {data.user}</h1>}
    LoggedOut={({ go }) => (
        <button
            onClick={ go("Auth.LoggedIn", {user: "bob"}) }
            value="Login"
        />
    )}
    Unknown={() => null)}
/>

Note: "Auth.LoggedIn" is shorthand notation, referring to the LoggedIn state of the Auth domain.


๐Ÿ”€ Syntactic Shortcuts

The following are all equivalent:

const scheme = {
  Auth: ["LoggedIn", "LoggedOut"]
};

const scheme = {
  Auth: {
    states: ["LoggedIn", "LoggedOut"],
    deps: []
  }
};
const initialState = {
  Auth: "LoggedOut"
};

const initialState = {
  Auth: {
    state: "LoggedOut",
    data: null
  }
};
1.1.3

6 years ago

1.1.2

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.15

6 years ago

1.0.14

6 years ago

1.0.13

6 years ago

1.0.12

6 years ago

1.0.11

6 years ago

1.0.10

6 years ago

1.0.9

6 years ago

1.0.8

6 years ago

1.0.7

6 years ago

1.0.6

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago