@trademe/ensure
Version:
Utility decorators for Angular applications
41 lines • 1.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
// Dependencies:
var ensure_error_1 = require("../ensure-error");
function Singleton() {
return function (injectable) {
var singleton = createSingleton(injectable);
setPrototype(injectable, singleton);
setMetadata(injectable, singleton);
setName(injectable, singleton);
return singleton;
};
}
exports.Singleton = Singleton;
function createSingleton(injectable) {
var instantiated = null;
return function singleton() {
if (!instantiated) {
instantiated = true;
this._reset = function () { return instantiated = false; };
return injectable.apply(this, arguments);
}
throw new ensure_error_1.EnsureError("\n " + injectable.name + " is a singleton and must not be instantiated multiple times.\n ");
};
}
function setMetadata(injectable, singleton) {
for (var _i = 0, _a = Reflect.getOwnMetadataKeys(injectable); _i < _a.length; _i++) {
var key = _a[_i];
var metadata = Reflect.getOwnMetadata(key, injectable);
Reflect.defineMetadata(key, metadata, singleton);
}
}
function setName(injectable, singleton) {
var fnName = injectable.name + "Singleton";
singleton.prototype.toString = function () { return fnName; };
Object.defineProperty(singleton, 'name', { value: fnName });
}
function setPrototype(injectable, singleton) {
singleton.prototype = Object.create(injectable.prototype);
}
//# sourceMappingURL=singleton.js.map