@triviality/core
Version:
Purely typed service container
90 lines • 3.54 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 lib_1 = require("../lib");
var TaggedServiceFactoryReference_1 = require("../Value/TaggedServiceFactoryReference");
var GlobalContext_1 = require("./GlobalContext");
var InternalServiceFactoryReference_1 = require("../Value/InternalServiceFactoryReference");
var MergedTaggedServiceFunctionReference_1 = require("../Value/MergedTaggedServiceFunctionReference");
exports.SERVICE_REFERENCE = Symbol.for('SERVICE_REFERENCE');
exports.asReference = function (sf) {
var factory = lib_1.once(sf);
var result = function () { return factory(); };
/**
* Only used when services not called by container factory.
*/
if (!GlobalContext_1.inCurrentContext()) {
return result;
}
var currentContainer = GlobalContext_1.getCurrentContainer();
/**
* Multiple dependency can reference this internal dependency.
*/
var referencedDependency = new InternalServiceFactoryReference_1.InternalServiceFactoryReference({
factory: sf,
feature: GlobalContext_1.getCurrentFeatureFactory(),
});
factory = currentContainer.add(referencedDependency);
/**
* When the service factory is returned by a SF, this function will be called.
*/
result[exports.SERVICE_REFERENCE] = function (builder, tag) {
var dependency = new TaggedServiceFactoryReference_1.TaggedServiceFactoryReference({
tag: tag,
factory: factory,
feature: GlobalContext_1.getCurrentFeatureFactory(),
});
referencedDependency.addReferenceProxy(dependency);
factory = builder.add(dependency);
};
return result;
};
exports.asMergeReference = function (reference) {
var result = function () {
return reference().getProxy()();
};
result[exports.SERVICE_REFERENCE] = function (builder, tag) {
var dependency = new MergedTaggedServiceFunctionReference_1.MergedTaggedServiceFunctionReference(reference(), tag, GlobalContext_1.getCurrentFeatureFactory());
/**
* Does this re-assignment have any use?
*/
builder.add(dependency);
};
return result;
};
exports.isServiceReferenced = function (factory) {
return typeof factory[exports.SERVICE_REFERENCE] === 'function';
};
exports.handleServiceReferenced = function (builder, factory, tag) {
return factory[exports.SERVICE_REFERENCE](builder, tag);
};
exports.wrapReturnAsReference = (function (toWrap) { return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return exports.asReference(toWrap.apply(void 0, __spread(args)));
}; });
exports.createServiceFactoryReferenceContext = function () { return ({
reference: exports.asReference,
}); };
//# sourceMappingURL=ReferenceContext.js.map
;