babel-plugin-transform-alkali
This babel plugin will transform expressions that use a react
keyword/call to produce reactive variables. This relies on alkali for variable operations that produce reactively bound variables.
Installation
$ npm install babel-plugin-transform-alkali
Usage
The basic format of using the transform is to write reactive expressions in the form:
react(expression)
The react
variable should be imported from alkali. The expression
will be transformed to code that will reactively respond to any changes in inputs values, reflecting them in the output variable. For example:
import { react } from 'alkali'
let a = react(2)
let b = react(4)
let sum = react(a + b)
sum.valueOf() -> 6
a.put(4)
sum.valueOf() -> 8
Reactive properties and assignments are supported as well. Property access within a reactive expression will be converted to a property variable (basically obj.prop
-> obj.property('prop')
, with object mappings and safety checks). And assignments within a reactive expression will be converted to a put
call (basically v = 'hi'
-> v.put('hi')
with similar variable mapping/creation as necessary). For example:
let obj = react({
foo: 3
})
let doubleFoo = react(obj.foo * 2)
doubleFoo.valueOf() -> 6
react(obj.foo = 5)
doubleFoo.valueOf() -> 10
Function and method calls can be made written in reactive expressions as well. These calls will be performed lazily/on-demand, and reexecuted as needed. The target function will be called with the values of the variables (not the variables themselves). For example:
let smallest = react(Math.min(a, b))
The react
operator returns alkali variables, that can be bound to DOM elements or any other alkali target.
import { react, Div } from 'alkali'
// create a div with its text bound to the sum
parent.appendChild(new Div(sum))
And the reactive expressions maintain operator relationships, so alkali's reversible data flow is supported as well:
let a = react(2)
let doubleA = react(a * 2)
react(doubleA = 10) // will flow back through the expression
a.valueOf() -> 5
The react
function can take multiple arguments, the last argument output will be returned as the variable from the react
call.
Transform Usage
Via .babelrc
(Recommended)
.babelrc
{
"plugins": ["transform-alkali"]
}
Via CLI
$ babel --plugins transform-alkali
Via Node API
require("babel-core").transform("code", {
plugins: ["transform-alkali"]
});