-
Notifications
You must be signed in to change notification settings - Fork 5
/
makeDOMDriver.js
52 lines (44 loc) · 1.66 KB
/
makeDOMDriver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import {init} from 'snabbdom'
import {DOMSource} from './DOMSource'
import {VNodeWrapper} from './VNodeWrapper'
import {IsolateModule} from './isolate/module'
import defaultModules from './modules'
import {transposeVNode} from './transposition'
import {getElement} from './util'
function makeDOMDriverInputGuard (modules) {
if (!Array.isArray(modules)) {
throw new Error('Optional modules option must be ' +
'an array for snabbdom modules')
}
}
function domDriverInputGuard (view$) { // eslint-disable-line complexity
if (!view$ || typeof view$.subscribe !== 'function') // eslint-disable-line brace-style
{
throw new Error('The DOM driver function expects as input an Observable ' +
'of virtual DOM elements')
}
}
export function makeDOMDriver (container, options = {}) {
const transposition = options.transposition || false
const modules = options.modules || defaultModules
const isolateModule = new IsolateModule(new Map([]))
const patch = init([isolateModule.createModule()].concat(modules))
const rootElement = getElement(container)
const vNodeWrapper = new VNodeWrapper(rootElement)
const delegators = new Map([])
makeDOMDriverInputGuard(modules)
return function DOMDriver (vNode$) {
domDriverInputGuard(vNode$)
const preprocessedVNode$ = transposition
? vNode$.map(transposeVNode).switch()
: vNode$
const rootElement$ = preprocessedVNode$
.map(vNode => vNodeWrapper.call(vNode))
.scan(patch, rootElement)
.startWith(rootElement)
.map(vNode => vNode.elm || vNode)
.replay(null, 1)
rootElement$.connect()
return new DOMSource(rootElement$, [], isolateModule, delegators)
}
}