UNPKG

@kephas/reflection

Version:

Provides reflection capabilities, like TypeInfoRegistry, ITypeInfo, and IProperty.

106 lines 11.6 kB
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=