Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| 'use strict'; | |
| var SingleEvent = require('geval/single'); | |
| var MultipleEvent = require('geval/multiple'); | |
| var extend = require('xtend'); | |
| /* | |
| Pro tip: Don't require `mercury` itself. | |
| require and depend on all these modules directly! | |
| */ | |
| var mercury = module.exports = { | |
| // Entry | |
| main: require('main-loop'), | |
| app: app, | |
| // Base | |
| BaseEvent: require('value-event/base-event'), | |
| // Input | |
| Delegator: require('dom-delegator'), | |
| // deprecated: use hg.channels instead. | |
| input: input, | |
| // deprecated: use hg.channels instead. | |
| handles: channels, | |
| channels: channels, | |
| // deprecated: use hg.send instead. | |
| event: require('value-event/event'), | |
| send: require('value-event/event'), | |
| // deprecated: use hg.sendValue instead. | |
| valueEvent: require('value-event/value'), | |
| sendValue: require('value-event/value'), | |
| // deprecated: use hg.sendSubmit instead. | |
| submitEvent: require('value-event/submit'), | |
| sendSubmit: require('value-event/submit'), | |
| // deprecated: use hg.sendChange instead. | |
| changeEvent: require('value-event/change'), | |
| sendChange: require('value-event/change'), | |
| // deprecated: use hg.sendKey instead. | |
| keyEvent: require('value-event/key'), | |
| sendKey: require('value-event/key'), | |
| // deprecated use hg.sendClick instead. | |
| clickEvent: require('value-event/click'), | |
| sendClick: require('value-event/click'), | |
| // State | |
| // remove from core: favor hg.varhash instead. | |
| array: require('observ-array'), | |
| struct: require('observ-struct'), | |
| // deprecated: use hg.struct instead. | |
| hash: require('observ-struct'), | |
| varhash: require('observ-varhash'), | |
| value: require('observ'), | |
| state: state, | |
| // Render | |
| diff: require('virtual-dom/vtree/diff'), | |
| patch: require('virtual-dom/vdom/patch'), | |
| partial: require('vdom-thunk'), | |
| create: require('virtual-dom/vdom/create-element'), | |
| h: require('virtual-dom/virtual-hyperscript'), | |
| // Utilities | |
| // remove from core: require computed directly instead. | |
| computed: require('observ/computed'), | |
| // remove from core: require watch directly instead. | |
| watch: require('observ/watch') | |
| }; | |
| function input(names) { | |
| if (!names) { | |
| return SingleEvent(); | |
| } | |
| return MultipleEvent(names); | |
| } | |
| function state(obj) { | |
| var copy = extend(obj); | |
| var $channels = copy.channels; | |
| var $handles = copy.handles; | |
| if ($channels) { | |
| copy.channels = mercury.value(null); | |
| } else if ($handles) { | |
| copy.handles = mercury.value(null); | |
| } | |
| var observ = mercury.struct(copy); | |
| if ($channels) { | |
| observ.channels.set(mercury.channels($channels, observ)); | |
| } else if ($handles) { | |
| observ.handles.set(mercury.channels($handles, observ)); | |
| } | |
| return observ; | |
| } | |
| function channels(funcs, context) { | |
| return Object.keys(funcs).reduce(createHandle, {}); | |
| function createHandle(acc, name) { | |
| var handle = mercury.Delegator.allocateHandle( | |
| funcs[name].bind(null, context)); | |
| acc[name] = handle; | |
| return acc; | |
| } | |
| } | |
| function app(elem, observ, render, opts) { | |
| if (!elem) { | |
| throw new Error( | |
| 'Element does not exist. ' + | |
| 'Mercury cannot be initialized.'); | |
| } | |
| mercury.Delegator(opts); | |
| var loop = mercury.main(observ(), render, extend({ | |
| diff: mercury.diff, | |
| create: mercury.create, | |
| patch: mercury.patch | |
| }, opts)); | |
| elem.appendChild(loop.target); | |
| return observ(loop.update); | |
| } |