@kephas/reflection
Version:
Provides reflection capabilities, like TypeInfoRegistry, ITypeInfo, and IProperty.
106 lines • 11.6 kB
JavaScript
var TypeInfoRegistry_1;
import { __decorate, __metadata } from "tslib";
import { Requires, SingletonAppServiceContract, AppService, Priority, Serializable } from '@kephas/core';
import { ReflectionError } from './reflectionError';
import { TypeName } from './typeName';
/**
* Provides centralized access to the application's type system.
*
* @export
* @class TypeInfoRegistry
*/
let TypeInfoRegistry = TypeInfoRegistry_1 = class TypeInfoRegistry {
/**
* Creates an instance of TypeInfoRegistry.
* @memberof TypeInfoRegistry
*/
constructor() {
/**
* Gets the registerd types.
*
* @type {ITypeInfo[]}
* @memberof TypeInfoRegistry
*/
this.types = [];
this._typesByFullName = {};
this._typesByName = {};
this.types = [];
this.initialize(this);
}
/**
* Gets the singleton instance of the type registry.
*
* @static
* @type {TypeInfoRegistry}
* @memberof TypeInfoRegistry
*/
static get Instance() {
return TypeInfoRegistry_1._instance || (TypeInfoRegistry_1._instance = new TypeInfoRegistry_1());
}
/**
* Gets the type in the registry by its name.
*
* @param {string | Function} typeRef The full name of the type or the runtime type.
* @param {boolean} [throwOnNotFound=true] True to throw if the type cannot be found.
* @returns {TypeInfo}
* @memberof TypeInfoRegistry
*/
getType(typeRef, throwOnNotFound) {
Requires.HasValue(typeRef, 'typeRef');
if (throwOnNotFound === undefined) {
throwOnNotFound = true;
}
let fullName = typeof typeRef === 'function'
? Serializable.getTypeFullName(typeRef)
: typeRef;
if (fullName && fullName.endsWith('[]')) {
fullName = TypeName.ArrayOfAnyTypeName;
}
let type = fullName ? this._typesByFullName[fullName] : undefined;
if (!type && fullName) {
type = this._typesByName[fullName];
}
if (!type && throwOnNotFound) {
throw new ReflectionError(`The type with name '${typeRef}' was not found.`);
}
return type;
}
/**
* Registers the provided types.
*
* @param {ITypeInfo[]} types The types to register.
* @returns {this} This registry.
* @memberof TypeInfoRegistry
*/
register(...types) {
if (!types) {
return this;
}
for (const type of types) {
const typeKey = type.fullName || type.name;
if (this._typesByFullName[typeKey]) {
throw new ReflectionError(`The type ${typeKey} is already registered.`);
}
this._typesByFullName[typeKey] = type;
this._typesByName[type.name] = type;
}
this.types.push.apply(this.types, types);
return this;
}
/**
* Initializes the registry.
*
* @protected
* @param {TypeInfoRegistry} registry
* @memberof TypeInfoRegistry
*/
initialize(registry) {
}
};
TypeInfoRegistry = TypeInfoRegistry_1 = __decorate([
AppService({ overridePriority: Priority.Low, provider: _ => TypeInfoRegistry_1.Instance }),
SingletonAppServiceContract(),
__metadata("design:paramtypes", [])
], TypeInfoRegistry);
export { TypeInfoRegistry };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZUluZm9SZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlcGhhcy9yZWZsZWN0aW9uL3NyYy9saWIvdHlwZUluZm9SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsMkJBQTJCLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEM7Ozs7O0dBS0c7QUFHSCxJQUFhLGdCQUFnQix3QkFBN0IsTUFBYSxnQkFBZ0I7SUF3QnpCOzs7T0FHRztJQUNIO1FBM0JBOzs7OztXQUtHO1FBQ00sVUFBSyxHQUFnQixFQUFFLENBQUM7UUFjekIscUJBQWdCLEdBQWlDLEVBQUUsQ0FBQTtRQUNuRCxpQkFBWSxHQUFpQyxFQUFFLENBQUE7UUFPbkQsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBdEJEOzs7Ozs7T0FNRztJQUNILE1BQU0sS0FBSyxRQUFRO1FBQ2YsT0FBTyxrQkFBZ0IsQ0FBQyxTQUFTLElBQUksQ0FBQyxrQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxrQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQWVEOzs7Ozs7O09BT0c7SUFDSSxPQUFPLENBQUMsT0FBMEIsRUFBRSxlQUF5QjtRQUNoRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDL0IsZUFBZSxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUVELElBQUksUUFBUSxHQUFHLE9BQU8sT0FBTyxLQUFLLFVBQVU7WUFDeEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDZCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JDLFFBQVEsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7U0FDMUM7UUFFRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFFO1lBQ25CLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxDQUFDLElBQUksSUFBSSxlQUFlLEVBQUU7WUFDMUIsTUFBTSxJQUFJLGVBQWUsQ0FBQyx1QkFBdUIsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFFBQVEsQ0FBQyxHQUFHLEtBQWtCO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzNDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNoQyxNQUFNLElBQUksZUFBZSxDQUFDLFlBQVksT0FBTyx5QkFBeUIsQ0FBQyxDQUFDO2FBQzNFO1lBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDdkM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sVUFBVSxDQUFDLFFBQTBCO0lBQy9DLENBQUM7Q0FDSixDQUFBO0FBdEdZLGdCQUFnQjtJQUY1QixVQUFVLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLGtCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hGLDJCQUEyQixFQUFFOztHQUNqQixnQkFBZ0IsQ0FzRzVCO1NBdEdZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcXVpcmVzLCBTaW5nbGV0b25BcHBTZXJ2aWNlQ29udHJhY3QsIEFwcFNlcnZpY2UsIFByaW9yaXR5LCBTZXJpYWxpemFibGUgfSBmcm9tICdAa2VwaGFzL2NvcmUnO1xyXG5pbXBvcnQgeyBJVHlwZUluZm8sIElUeXBlSW5mb1JlZ2lzdHJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgUmVmbGVjdGlvbkVycm9yIH0gZnJvbSAnLi9yZWZsZWN0aW9uRXJyb3InO1xyXG5pbXBvcnQgeyBUeXBlTmFtZSB9IGZyb20gJy4vdHlwZU5hbWUnO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIGNlbnRyYWxpemVkIGFjY2VzcyB0byB0aGUgYXBwbGljYXRpb24ncyB0eXBlIHN5c3RlbS5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgVHlwZUluZm9SZWdpc3RyeVxyXG4gKi9cclxuQEFwcFNlcnZpY2UoeyBvdmVycmlkZVByaW9yaXR5OiBQcmlvcml0eS5Mb3csIHByb3ZpZGVyOiBfID0+IFR5cGVJbmZvUmVnaXN0cnkuSW5zdGFuY2UgfSlcclxuQFNpbmdsZXRvbkFwcFNlcnZpY2VDb250cmFjdCgpXHJcbmV4cG9ydCBjbGFzcyBUeXBlSW5mb1JlZ2lzdHJ5IGltcGxlbWVudHMgSVR5cGVJbmZvUmVnaXN0cnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSByZWdpc3RlcmQgdHlwZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0lUeXBlSW5mb1tdfVxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvUmVnaXN0cnlcclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgdHlwZXM6IElUeXBlSW5mb1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHR5cGUgcmVnaXN0cnkuXHJcbiAgICAgKlxyXG4gICAgICogQHN0YXRpY1xyXG4gICAgICogQHR5cGUge1R5cGVJbmZvUmVnaXN0cnl9XHJcbiAgICAgKiBAbWVtYmVyb2YgVHlwZUluZm9SZWdpc3RyeVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IElUeXBlSW5mb1JlZ2lzdHJ5IHtcclxuICAgICAgICByZXR1cm4gVHlwZUluZm9SZWdpc3RyeS5faW5zdGFuY2UgfHwgKFR5cGVJbmZvUmVnaXN0cnkuX2luc3RhbmNlID0gbmV3IFR5cGVJbmZvUmVnaXN0cnkoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBJVHlwZUluZm9SZWdpc3RyeTtcclxuICAgIHByaXZhdGUgX3R5cGVzQnlGdWxsTmFtZTogeyBba2V5OiBzdHJpbmddOiBJVHlwZUluZm8gfSA9IHt9XHJcbiAgICBwcml2YXRlIF90eXBlc0J5TmFtZTogeyBba2V5OiBzdHJpbmddOiBJVHlwZUluZm8gfSA9IHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFR5cGVJbmZvUmVnaXN0cnkuXHJcbiAgICAgKiBAbWVtYmVyb2YgVHlwZUluZm9SZWdpc3RyeVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnR5cGVzID0gW107XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdHlwZSBpbiB0aGUgcmVnaXN0cnkgYnkgaXRzIG5hbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBGdW5jdGlvbn0gdHlwZVJlZiBUaGUgZnVsbCBuYW1lIG9mIHRoZSB0eXBlIG9yIHRoZSBydW50aW1lIHR5cGUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0aHJvd09uTm90Rm91bmQ9dHJ1ZV0gVHJ1ZSB0byB0aHJvdyBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgZm91bmQuXHJcbiAgICAgKiBAcmV0dXJucyB7VHlwZUluZm99XHJcbiAgICAgKiBAbWVtYmVyb2YgVHlwZUluZm9SZWdpc3RyeVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VHlwZSh0eXBlUmVmOiBzdHJpbmcgfCBGdW5jdGlvbiwgdGhyb3dPbk5vdEZvdW5kPzogYm9vbGVhbik6IElUeXBlSW5mbyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgUmVxdWlyZXMuSGFzVmFsdWUodHlwZVJlZiwgJ3R5cGVSZWYnKTtcclxuICAgICAgICBpZiAodGhyb3dPbk5vdEZvdW5kID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3dPbk5vdEZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmdWxsTmFtZSA9IHR5cGVvZiB0eXBlUmVmID09PSAnZnVuY3Rpb24nXHJcbiAgICAgICAgICAgID8gU2VyaWFsaXphYmxlLmdldFR5cGVGdWxsTmFtZSh0eXBlUmVmKVxyXG4gICAgICAgICAgICA6IHR5cGVSZWY7XHJcbiAgICAgICAgaWYgKGZ1bGxOYW1lICYmIGZ1bGxOYW1lLmVuZHNXaXRoKCdbXScpKSB7XHJcbiAgICAgICAgICAgIGZ1bGxOYW1lID0gVHlwZU5hbWUuQXJyYXlPZkFueVR5cGVOYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHR5cGUgPSBmdWxsTmFtZSA/IHRoaXMuX3R5cGVzQnlGdWxsTmFtZVtmdWxsTmFtZV0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKCF0eXBlICYmIGZ1bGxOYW1lKSB7XHJcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLl90eXBlc0J5TmFtZVtmdWxsTmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXR5cGUgJiYgdGhyb3dPbk5vdEZvdW5kKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZsZWN0aW9uRXJyb3IoYFRoZSB0eXBlIHdpdGggbmFtZSAnJHt0eXBlUmVmfScgd2FzIG5vdCBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB0eXBlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0lUeXBlSW5mb1tdfSB0eXBlcyBUaGUgdHlwZXMgdG8gcmVnaXN0ZXIuXHJcbiAgICAgKiBAcmV0dXJucyB7dGhpc30gVGhpcyByZWdpc3RyeS5cclxuICAgICAqIEBtZW1iZXJvZiBUeXBlSW5mb1JlZ2lzdHJ5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWdpc3RlciguLi50eXBlczogSVR5cGVJbmZvW10pOiB0aGlzIHtcclxuICAgICAgICBpZiAoIXR5cGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHR5cGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGVLZXkgPSB0eXBlLmZ1bGxOYW1lIHx8IHR5cGUubmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGVzQnlGdWxsTmFtZVt0eXBlS2V5XSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmxlY3Rpb25FcnJvcihgVGhlIHR5cGUgJHt0eXBlS2V5fSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3R5cGVzQnlGdWxsTmFtZVt0eXBlS2V5XSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHRoaXMuX3R5cGVzQnlOYW1lW3R5cGUubmFtZV0gPSB0eXBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50eXBlcy5wdXNoLmFwcGx5KHRoaXMudHlwZXMsIHR5cGVzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgcmVnaXN0cnkuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtUeXBlSW5mb1JlZ2lzdHJ5fSByZWdpc3RyeVxyXG4gICAgICogQG1lbWJlcm9mIFR5cGVJbmZvUmVnaXN0cnlcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemUocmVnaXN0cnk6IFR5cGVJbmZvUmVnaXN0cnkpIHtcclxuICAgIH1cclxufVxyXG4iXX0=