diff --git a/api/mount.js b/api/mount.js index d6430c5f..95de4a9a 100644 --- a/api/mount.js +++ b/api/mount.js @@ -3,8 +3,7 @@ var coreRenderer = require("../render/render") var autoredraw = require("../api/autoredraw") -module.exports = function($window, pubsub) { - var renderer = coreRenderer($window) +module.exports = function(renderer, pubsub) { return function(root, component) { var run = autoredraw(root, renderer, pubsub, function() { renderer.render(root, {tag: component}) diff --git a/api/router.js b/api/router.js index 5c637997..155001e0 100644 --- a/api/router.js +++ b/api/router.js @@ -4,8 +4,7 @@ var coreRenderer = require("../render/render") var coreRouter = require("../router/router") var autoredraw = require("../api/autoredraw") -module.exports = function($window, pubsub) { - var renderer = coreRenderer($window) +module.exports = function($window, renderer, pubsub) { var router = coreRouter($window) var route = function(root, defaultRoute, routes) { var replay = router.defineRoutes(routes, function(component, args) { diff --git a/api/tests/test-mount.js b/api/tests/test-mount.js index 5e72badb..a181a561 100644 --- a/api/tests/test-mount.js +++ b/api/tests/test-mount.js @@ -4,6 +4,7 @@ var o = require("../../ospec/ospec") var domMock = require("../../test-utils/domMock") var m = require("../../render/hyperscript") +var coreRenderer = require("../../render/render") var apiPubSub = require("../../api/pubsub") var apiMounter = require("../../api/mount") @@ -17,7 +18,7 @@ o.spec("mount", function() { root = $window.document.body redraw = apiPubSub() - mount = apiMounter($window, redraw) + mount = apiMounter(coreRenderer($window), redraw) }) o("renders into `root`", function() { diff --git a/api/tests/test-router.js b/api/tests/test-router.js index b4cf6c10..5143d799 100644 --- a/api/tests/test-router.js +++ b/api/tests/test-router.js @@ -5,6 +5,7 @@ var pushStateMock = require("../../test-utils/pushStateMock") var domMock = require("../../test-utils/domMock") var m = require("../../render/hyperscript") +var coreRenderer = require("../../render/render") var apiPubSub = require("../../api/pubsub") var apiRouter = require("../../api/router") @@ -24,7 +25,7 @@ o.spec("route", function() { root = $window.document.body redraw = apiPubSub() - route = apiRouter($window, redraw) + route = apiRouter($window, coreRenderer($window), redraw) }) o("renders into `root`", function() { diff --git a/index.js b/index.js index 82e9ceca..1aa1478d 100644 --- a/index.js +++ b/index.js @@ -1,14 +1,14 @@ "use strict" var m = require("./render/hyperscript") -var coreRenderer = require("./render/render") +var renderer = require("./render/render")(window) var redraw = require("./api/pubsub")() m.request = require("./request/request")(window, Promise).ajax -m.render = coreRenderer(window).render +m.route = require("./api/router")(window, renderer, redraw) +m.mount = require("./api/mount")(renderer, redraw) m.trust = require("./render/trust") -m.mount = require("./api/mount")(window, redraw) -m.route = require("./api/router")(window, redraw) +m.render = renderer.render m.redraw = redraw.publish module.exports = m diff --git a/mithril.js b/mithril.js index 0bc644f5..483f518f 100644 --- a/mithril.js +++ b/mithril.js @@ -84,7 +84,7 @@ function changeNS(ns, vnode) { } } var m = hyperscript -var coreRenderer = function($window) { +var renderer = function($window) { var $doc = $window.document var onevent function setEventCallback(callback) {return onevent = callback} @@ -558,7 +558,7 @@ var coreRenderer = function($window) { if ($doc.activeElement !== active) active.focus() } return {render: render, setEventCallback: setEventCallback} -} +}(window) var redraw = function() { var callbacks = [] function unsubscribe(callback) { @@ -699,53 +699,6 @@ m.request = function($window, Promise) { return {ajax: ajax, jsonp: jsonp} }(window, Promise).ajax -m.render = coreRenderer(window).render -m.trust = function(html) { - return Node("<", undefined, undefined, html, undefined, undefined) -} -var throttle = function(callback) { - //60fps translates to 16.6ms, round it down since setTimeout requires int - var time = 16 - var last = 0, pending = null - var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout - return function(synchronous) { - var now = new Date().getTime() - if (synchronous === true || last === 0 || now - last >= time) { - last = now - callback() - } - else if (pending === null) { - pending = timeout(function() { - pending = 0 - callback() - last = new Date().getTime() - }, time - (now - last)) - } - } -} -var autoredraw = function(root, renderer, pubsub, callback) { - var run = throttle(callback) - renderer.setEventCallback(function(e) { - if (e.redraw1 !== false) run() - }) - - if (pubsub != null) { - if (root.redraw1) pubsub.unsubscribe(root.redraw1) - pubsub.subscribe(run) - } - - return root.redraw1 = run -} -m.mount = function($window, pubsub) { - var renderer = coreRenderer($window) - return function(root, component) { - var run = autoredraw(root, renderer, pubsub, function() { - renderer.render(root, {tag: component}) - }) - - run() - } -}(window, redraw) var parseQueryString = function(string) { if (string === "" || string == null) return {} if (string.charAt(0) === "?") string = string.slice(1) @@ -887,21 +840,66 @@ var coreRouter = function($window) { return {setPrefix: setPrefix, getPath: getPath, setPath: setPath, defineRoutes: defineRoutes, link: link} } -m.route = function($window, pubsub) { - var renderer = coreRenderer($window) +var throttle = function(callback) { + //60fps translates to 16.6ms, round it down since setTimeout requires int + var time = 16 + var last = 0, pending = null + var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout + return function(synchronous) { + var now = new Date().getTime() + if (synchronous === true || last === 0 || now - last >= time) { + last = now + callback() + } + else if (pending === null) { + pending = timeout(function() { + pending = 0 + callback() + last = new Date().getTime() + }, time - (now - last)) + } + } +} +var autoredraw = function(root, renderer2, pubsub, callback) { + var run = throttle(callback) + renderer2.setEventCallback(function(e) { + if (e.redraw1 !== false) run() + }) + + if (pubsub != null) { + if (root.redraw1) pubsub.unsubscribe(root.redraw1) + pubsub.subscribe(run) + } + + return root.redraw1 = run +} +m.route = function($window, renderer1, pubsub) { var router = coreRouter($window) var route = function(root, defaultRoute, routes) { var replay = router.defineRoutes(routes, function(component, args) { - renderer.render(root, {tag: component, attrs: args}) + renderer1.render(root, {tag: component, attrs: args}) }, function() { router.setPath(defaultRoute) }) - autoredraw(root, renderer, pubsub, replay) + autoredraw(root, renderer1, pubsub, replay) } route.link = router.link route.prefix = router.setPrefix return route -}(window, redraw) +}(window, renderer, redraw) +m.mount = function(renderer3, pubsub) { + return function(root, component) { + var run = autoredraw(root, renderer3, pubsub, function() { + renderer3.render(root, {tag: component}) + }) + + run() + } +}(renderer, redraw) +m.trust = function(html) { + return Node("<", undefined, undefined, html, undefined, undefined) +} +m.render = renderer.render m.redraw = redraw.publish module.exports = m