Skip to content

CoNarrative/framework-x

Repository files navigation

image

NPM JavaScript Style Guide Netlify Status CircleCI

Framework-X is a Javascript framework that separates code from its execution, allowing the representation of programmer intent to exist independently of when, where and how it's performed.

Developers don't need to write and maintain event handling code in two different places to have repeatable behavior and functional purity. You can write everything that happens in the order you want it to as a pure function and Framework-X will perform it on your behalf.

Learn more.

Installation

npm i framework-x

Example: State changes + side effects

View the complete code here.

import * as R from 'ramda' import { fx } from '../fx' import { regEventFx, regFx } from '../store' import { updateIn } from '../util' const evt = { INITIALIZE_DB: 'initialize-db', ADD_TODO: 'todo/add', SET_TODO_TEXT: 'todo/set-text', SHOW_NOTIFICATION: 'notification/show', HIDE_NOTIFICATION: 'notification/hide', } // Initialize the global state atom  regEventFx(evt.INITIALIZE_DB, (_, state = {}) => { return [ fx.db(state) ] }) // Adding a todo // Three things: // 1. Add it to the state // 2. Clear the todo input text // 3. Show a notification that says "Todo added" for two seconds regEventFx(evt.ADD_TODO, ({ db }, { id, text, done = false }) => [ fx.db(updateIn(['todos'], R.append({ id, text, done }))), fx.dispatch(evt.SET_TODO_TEXT, ''), fx.notification({ type: 'success', message: 'Todo added.', duration: 2000 }) ]) // Setting the todo text.  // Affects the `db`/global state // Associates `db.newTodoText` with SET_TODO_TEXT event's value regEventFx(evt.SET_TODO_TEXT, (_, value) => [ fx.db( R.assoc('newTodoText', value)) ]) // Notification side effect definition // `ADD_TODO` only returns a description of this so it remains a pure function even though this isn't.  regFx('notification', (env, { type, message, duration = 900 }) => { // Get the `dispatch` function from the Framework-X environment // All other registered `fx` effects are here too if you need them const { fx: { dispatch } } = env const id = type + '/' + performance.now() // Show the notification  dispatch(env, [evt.SHOW_NOTIFICATION, { id, type, message }]) // Hide it after X ms setTimeout(() => dispatch(env, [evt.HIDE_NOTIFICATION, { id }]), duration) }) // Showing a notification: add it to the state (views can subscribe, react to changes) regEventFx(evt.SHOW_NOTIFICATION, ({ db }, { id, type, message, timeout }) => [ fx.db(updateIn(['notifications'], R.append({ id, type, message, timeout }))) ]) // Hiding a notification: Remove it from the state regEventFx(evt.HIDE_NOTIFICATION, ({ db }, { id }) => [ fx.db(updateIn(['notifications'], R.reject(R.propEq('id', id)))) ])

API

https://framework-x.io/api

Packages

Examples

Examples are in the examples folder. To install and run an example (e.g. todomvc):

git clone https://github.com/CoNarrative/framework-x cd framework-x/examples/todomvc npm i npm start

todomvc

Source: https://github.com/CoNarrative/framework-x/tree/master/examples/todomvc

CodeSandbox:

RealWorld

Source: https://github.com/CoNarrative/framework-x/tree/master/examples/realworld

CodeSandbox:

License

MIT © CoNarrative