mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
71 lines
1.7 KiB
JavaScript
71 lines
1.7 KiB
JavaScript
var loadComponent = require('./loadComponent');
|
|
var defineComponent = require('./defineComponent');
|
|
|
|
var registered = {};
|
|
var loaded = {};
|
|
var componentTypes = {};
|
|
|
|
function register(typeName, def) {
|
|
// We do this to kick off registering of nested components
|
|
// but we don't use the return value just yet since there
|
|
// is a good chance that it resulted in a circular dependency
|
|
def();
|
|
|
|
registered[typeName] = def;
|
|
delete loaded[typeName];
|
|
delete componentTypes[typeName];
|
|
return typeName;
|
|
}
|
|
|
|
function load(typeName) {
|
|
var target = loaded[typeName];
|
|
if (!target) {
|
|
target = registered[typeName];
|
|
|
|
if (target) {
|
|
target = target();
|
|
} else {
|
|
target = loadComponent(typeName); // Assume the typeName has been fully resolved already
|
|
}
|
|
|
|
if (!target) {
|
|
throw Error('Not found: ' + typeName);
|
|
}
|
|
|
|
loaded[typeName] = target;
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
function getComponentClass(typeName) {
|
|
var ComponentClass = componentTypes[typeName];
|
|
|
|
if (ComponentClass) {
|
|
return ComponentClass;
|
|
}
|
|
|
|
ComponentClass = load(typeName);
|
|
|
|
ComponentClass = ComponentClass.Component || ComponentClass;
|
|
|
|
if (!ComponentClass.$__isComponent) {
|
|
ComponentClass = defineComponent(ComponentClass, ComponentClass.renderer);
|
|
}
|
|
|
|
// Make the component "type" accessible on each component instance
|
|
ComponentClass.prototype.$__type = typeName;
|
|
|
|
componentTypes[typeName] = ComponentClass;
|
|
|
|
return ComponentClass;
|
|
}
|
|
|
|
function createComponent(typeName, id) {
|
|
var ComponentClass = getComponentClass(typeName);
|
|
return new ComponentClass(id);
|
|
}
|
|
|
|
exports.$__register = register;
|
|
exports.$__createComponent = createComponent;
|