jw-ng-forward
Version:
Temporary package. The default solution for those that want to write Angular 2.x style code in Angular 1.x
76 lines (75 loc) • 3.45 kB
JavaScript
;
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
Object.defineProperty(exports, "__esModule", { value: true });
var writers_1 = require("../writers");
var get_injectable_name_1 = require("../util/get-injectable-name");
var providers_1 = require("../decorators/providers");
var opaque_token_1 = require("../classes/opaque-token");
var component_1 = require("./component");
function Inject() {
var injects = [];
for (var _i = 0; _i < arguments.length; _i++) {
injects[_i] = arguments[_i];
}
return function (t1, name, _a) {
var t2 = (_a === void 0 ? { value: undefined } : _a).value;
var targetIsClass = arguments.length === 1;
var t = targetIsClass ? t1 : t2;
var notStringBased = function (inj) { return typeof inj !== 'string' && !(inj instanceof opaque_token_1.OpaqueToken); };
var ensureInjectable = function (inj) {
if (!writers_1.providerStore.get('name', inj) || !writers_1.providerStore.get('type', inj)) {
throw new Error("Processing \"" + t.name + "\" @Inject parameter: \"" + (inj.name || inj.toString()) + "\" is not a valid injectable.\n\t\t\t\tPlease ensure " + (inj.name || inj.toString()) + " is injectable. Valid examples can be:\n\t\t\t\t- a string representing an ng1 provider, e.g. '$q'\n\t\t\t\t- an @Injectable ng-forward class\n\t\t\t\t- a Provider, e.g. provide(SOME_CONFIG, {asValue: 100})");
}
return inj;
};
var providers = injects
.filter(notStringBased)
.map(ensureInjectable);
providers_1.Providers.apply(void 0, __spread(providers))(t, "while analyzing '" + t.name + "' injected providers");
var dependencies = injects.map(get_injectable_name_1.getInjectableName).filter(function (n) { return n !== undefined; });
if (writers_1.bundleStore.has('$inject', t)) {
var parentInjects = writers_1.bundleStore.get('$inject', t);
writers_1.bundleStore.set('$inject', __spread(dependencies, parentInjects), t);
}
else {
writers_1.bundleStore.set('$inject', dependencies, t);
}
};
}
exports.Inject = Inject;
component_1.componentHooks.beforeCtrlInvoke(injectParentComponents);
function injectParentComponents(caller, injects, controller, ddo, $injector, locals) {
injects.forEach(function (inject) {
if (!$injector.has(inject)) {
var parent_1 = locals.$element;
do {
if (!parent_1.controller)
continue;
var parentCtrl = parent_1.controller(inject);
if (parentCtrl) {
locals[inject] = parentCtrl;
return;
}
} while ((parent_1 = parent_1.parent()) && parent_1.length > 0);
}
});
}