Commit
- Loading branch information
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
var runtime = require("."); | ||
var createTemplate = runtime.t; | ||
var registered = {}; | ||
|
||
runtime.t = function (typeName) { | ||
if (registered[typeName]) { | ||
return registered[typeName]; | ||
} | ||
|
||
var renderFn; | ||
var template = (registered[typeName] = createTemplate(typeName)); | ||
Object.defineProperty(template, "_", { | ||
get: function () { | ||
return renderFn && proxyRenderFn; | ||
}, | ||
set: function (v) { | ||
renderFn = v; | ||
} | ||
}); | ||
|
||
return template; | ||
|
||
function proxyRenderFn() { | ||
return renderFn.apply(this, arguments); | ||
} | ||
}; | ||
|
||
module.exports = runtime; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
var runtime = require("."); | ||
var queueMicrotask = require("../queueMicrotask"); | ||
var util = require("../components/util"); | ||
var registry = require("../components/registry"); | ||
var updateManager = require("../components/update-manager"); | ||
|
||
var createTemplate = runtime.t; | ||
var createComponent = registry.___createComponent; | ||
var registered = {}; | ||
var queue; | ||
|
||
runtime.t = function (typeName) { | ||
if (registered[typeName]) { | ||
return registered[typeName]; | ||
} | ||
|
||
var renderFn; | ||
var template = (registered[typeName] = createTemplate(typeName)); | ||
var instances = (template.___instances = []); | ||
Object.defineProperty(template, "_", { | ||
get: function () { | ||
return renderFn && proxyRenderer; | ||
}, | ||
set: function (v) { | ||
renderFn = v; | ||
|
||
if (instances.length) { | ||
if (!queue) { | ||
queue = []; | ||
queueMicrotask(batchUpdate); | ||
} | ||
|
||
queue.push(function () { | ||
var newProto = registry.___getComponentClass(typeName).prototype; | ||
instances.forEach(function (instance) { | ||
if (hasLifecycleChanged(instance.__proto__, newProto)) { | ||
var startNode = instance.___rootNode.startNode; | ||
var endNode = instance.___rootNode.endNode; | ||
var parentNode = startNode.parentNode; | ||
var curNode; | ||
|
||
instance.___hmrDestroyed = true; | ||
instance.___emitDestroy(); | ||
instance.___removeDOMEventListeners(); | ||
|
||
if (instance.___subscriptions) { | ||
instance.___subscriptions.removeAllListeners(); | ||
instance.___subscriptions = null; | ||
} | ||
|
||
while ((curNode = startNode.nextSibling) !== endNode) { | ||
util.___destroyNodeRecursive(curNode); | ||
parentNode.removeChild(curNode); | ||
} | ||
|
||
instance.___hmrDestroyed = false; | ||
instance.___mounted = false; | ||
} | ||
|
||
instance.__proto__ = newProto; | ||
instance | ||
.___rerender(instance.___input, false) | ||
.afterInsert(instance.___document); | ||
}); | ||
}); | ||
} | ||
} | ||
}); | ||
|
||
return template; | ||
|
||
function proxyRenderer() { | ||
return renderFn.apply(this, arguments); | ||
} | ||
}; | ||
|
||
registry.___createComponent = function (typeName, id) { | ||
var instances = registered[typeName].___instances; | ||
var instance = createComponent(typeName, id); | ||
instances.push(instance); | ||
instance.once("destroy", function () { | ||
if (!instance.___hmrDestroyed) { | ||
instances.splice(1, instances.indexOf(instance)); | ||
} | ||
}); | ||
|
||
return instance; | ||
}; | ||
|
||
function hasLifecycleChanged(oldProto, newProto) { | ||
return ( | ||
hasMethodChanged("onCreate") || | ||
hasMethodChanged("onInput") || | ||
hasMethodChanged("onRender") || | ||
hasMethodChanged("onMount") | ||
); | ||
|
||
function hasMethodChanged(method) { | ||
return ( | ||
(oldProto[method] && oldProto[method].toString()) !== | ||
(newProto[method] && newProto[method].toString()) | ||
); | ||
} | ||
} | ||
|
||
function batchUpdate() { | ||
updateManager.___batchUpdate(function () { | ||
var pending = queue; | ||
queue = undefined; | ||
|
||
for (var i = 0; i < pending.length; i++) { | ||
pending[i](); | ||
} | ||
}); | ||
} | ||
|
||
module.exports = runtime; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,28 @@ | ||
"use strict"; | ||
|
||
// helpers provide a core set of various utility methods | ||
// that are available in every template | ||
var AsyncVDOMBuilder = require("./AsyncVDOMBuilder"); | ||
var makeRenderable = require("../renderable"); | ||
|
||
/** | ||
* Method is for internal usage only. This method | ||
* is invoked by code in a compiled Marko template and | ||
* it is used to create a new Template instance. | ||
* @private | ||
*/ | ||
exports.t = function createTemplate(path) { | ||
return new Template(path); | ||
exports.t = function createTemplate(typeName) { | ||
return new Template(typeName); | ||
}; | ||
|
||
function Template(path, func) { | ||
this.path = path; | ||
this._ = func; | ||
this.meta = undefined; | ||
} | ||
|
||
function createOut(globalData, parent, parentOut) { | ||
return new AsyncVDOMBuilder(globalData, parent, parentOut); | ||
function Template(typeName) { | ||
this.___typeName = typeName; | ||
} | ||
|
||
var Template_prototype = (Template.prototype = { | ||
createOut: createOut | ||
}); | ||
|
||
makeRenderable(Template_prototype); | ||
|
||
exports.Template = Template; | ||
exports.___createOut = createOut; | ||
|
||
require("../createOut").___setCreateOut(createOut); | ||
var AsyncVDOMBuilder = require("./AsyncVDOMBuilder"); | ||
require("../createOut").___setCreateOut( | ||
(Template.prototype.createOut = function createOut( | ||
globalData, | ||
parent, | ||
parentOut | ||
) { | ||
return new AsyncVDOMBuilder(globalData, parent, parentOut); | ||
}) | ||
); | ||
|
||
require("../renderable")(Template.prototype); |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.