| 46 | } |
| 47 | |
| 48 | function makeDOMDriver(container: string | Element, options?: DOMDriverOptions) { |
| 49 | if (!options) { options = {}; } |
| 50 | const modules = options.modules || defaultModules; |
| 51 | const isolateModule = new IsolateModule(); |
| 52 | const patch = init([isolateModule.createModule()].concat(modules)); |
| 53 | const rootElement = getElement(container) || document.body; |
| 54 | const vnodeWrapper = new VNodeWrapper(rootElement); |
| 55 | const delegators = new MapPolyfill<string, EventDelegator>(); |
| 56 | makeDOMDriverInputGuard(modules); |
| 57 | |
| 58 | function DOMDriver(vnode$: Stream<VNode>, name = 'DOM'): DOMSource { |
| 59 | domDriverInputGuard(vnode$); |
| 60 | const sanitation$ = xs.create<null>(); |
| 61 | const rootElement$ = xs.merge(vnode$.endWhen(sanitation$), sanitation$) |
| 62 | .map(vnode => vnodeWrapper.call(vnode)) |
| 63 | .fold(patch, toVNode(rootElement)) |
| 64 | .drop(1) |
| 65 | .map(unwrapElementFromVNode) |
| 66 | .compose(dropCompletion) // don't complete this stream |
| 67 | .startWith(rootElement); |
| 68 | |
| 69 | // Start the snabbdom patching, over time |
| 70 | const listener = {error: reportSnabbdomError}; |
| 71 | if (document.readyState === 'loading') { |
| 72 | document.addEventListener('readystatechange', () => { |
| 73 | if (document.readyState === 'interactive') { |
| 74 | rootElement$.addListener(listener); |
| 75 | } |
| 76 | }); |
| 77 | } else { |
| 78 | rootElement$.addListener(listener); |
| 79 | } |
| 80 | |
| 81 | return new MainDOMSource( |
| 82 | rootElement$, |
| 83 | sanitation$, |
| 84 | [], |
| 85 | isolateModule, |
| 86 | delegators, |
| 87 | name, |
| 88 | ); |
| 89 | }; |
| 90 | |
| 91 | return DOMDriver; |
| 92 | } |
| 93 | |
| 94 | export {makeDOMDriver} |