Begin implementation registration phase of framework layer initialization process. This phase is responsible for registering resolved extensions with Angular, in a manner than individual extensions can later request dependencies from. WTD-518.
85 lines
2.9 KiB
JavaScript
85 lines
2.9 KiB
JavaScript
/*global define,Promise*/
|
|
|
|
/**
|
|
* Module defining ExtensionRegistrar. Created by vwoeltje on 11/3/14.
|
|
*/
|
|
define(
|
|
['./Constants', './PartialConstructor'],
|
|
function (Constants, PartialConstructor) {
|
|
"use strict";
|
|
|
|
/**
|
|
*
|
|
* @constructor
|
|
*/
|
|
function ExtensionRegistrar(app, $log) {
|
|
// Track which extension categories have already been registered.
|
|
// Exceptions will be thrown if the same extension category is
|
|
// registered twice.
|
|
var registeredCategories = {};
|
|
|
|
function identify(category, extension, index) {
|
|
var name = extension.key ?
|
|
(extension.key + "-" + index) :
|
|
index;
|
|
return category + "[" + name + "]";
|
|
}
|
|
|
|
function echo() {
|
|
return arguments.slice;
|
|
}
|
|
|
|
function staticFunction(value) {
|
|
return function () { return value; }
|
|
}
|
|
|
|
// Utility function; create the second argument for Angular's
|
|
// .service service registration method (an array containing
|
|
// both dependencies and a factory method for the service.)
|
|
function makeServiceArgument(extension) {
|
|
var dependencies = extension.depends || [],
|
|
factory = (typeof extension === 'function') ?
|
|
new PartialConstructor(extension) :
|
|
staticFunction(extension);
|
|
|
|
return dependencies.concat([factory]);
|
|
}
|
|
|
|
function registerExtensionArraysForCategory(category, names) {
|
|
var name = category + Constants.EXTENSION_SUFFIX;
|
|
app.factory(name, names.concat([echo]));
|
|
}
|
|
|
|
function registerExtensions(category, extensions) {
|
|
var names = [];
|
|
|
|
function registerExtension(extension, index) {
|
|
var name = identify(category, extension, index);
|
|
|
|
// Track individual extension names as-registered
|
|
names.push(name);
|
|
|
|
app.factory(name, makeServiceArgument(extension));
|
|
}
|
|
|
|
if (registeredCategories[category]) {
|
|
$log.warn([
|
|
"Tried to register extensions for category ",
|
|
category,
|
|
" more than once. Ignoring all but first set."
|
|
].join(""));
|
|
} else {
|
|
extensions.forEach(registerExtension);
|
|
registerExtensionArraysForCategory(category, names);
|
|
registeredCategories[category] = true;
|
|
}
|
|
}
|
|
|
|
return {
|
|
registerExtensions: registerExtensions
|
|
};
|
|
}
|
|
|
|
return ExtensionRegistrar;
|
|
}
|
|
); |