UNPKG

@orchestrator/ngx-testing

Version:
114 lines 16.2 kB
import { __decorate, __metadata } from "tslib"; import { Component, ComponentFactoryResolver, Injectable, Injector, NgModule, Type, ViewChild, } from '@angular/core'; import { getOutputMock } from './output-mock'; import { genHostCompTpl, genHostCompTplStar } from './template-gen'; import { ExtraConfigToken, TestModuleToken, TestTypeKindToken, TestTypeToken, } from './tokens'; import { TestTypeKind, } from './types'; import { getDirectiveIO } from './util'; import * as i0 from "@angular/core"; /** * @internal */ let HostGeneratorService = class HostGeneratorService { constructor(cfr, injector) { this.cfr = cfr; this.injector = injector; this.testModule = this.injector.get(TestModuleToken); this.typeToken = this.injector.get(TestTypeToken); this.typeKind = this.injector.get(TestTypeKindToken); this.extraConfig = this.injector.get(ExtraConfigToken); } generateModuleFor(host) { const testModule = this.testModule; const ngModule = this.extraConfig.ngModule; let TestModule = class TestModule { }; TestModule = __decorate([ NgModule({ imports: [testModule], declarations: [host], exports: [host], entryComponents: [host], schemas: ngModule ? ngModule.schemas : [], }) ], TestModule); return TestModule; } generate() { switch (this.typeKind) { case TestTypeKind.Component: return this.generateForComponent(); case TestTypeKind.Directive: return this.generateForDirective(); default: throw Error(`HostGeneratorService: Cannot generate host component for unknown kind: ${this.typeKind}`); } } generateForComponent() { return this.genForComponent(this.typeToken); } generateForDirective() { return this.genForDirective(this.typeToken); } genForComponent(compType) { const factory = this.cfr.resolveComponentFactory(compType); const selector = `host-${factory.selector}`; const template = this.extraConfig.template || genHostCompTpl(factory.selector, factory, this.extraConfig.projectContent); return this.genComponent({ selector, template }, compType, factory); } genForDirective(dirType) { const io = getDirectiveIO(dirType); const selector = 'host-directive'; const templateTag = this.extraConfig.template ? '' : this.extraConfig.hostComponent ? this.cfr.resolveComponentFactory(this.extraConfig.hostComponent) .selector : this.extraConfig.hostTag; const template = this.extraConfig.template || (templateTag ? this.genDirectiveTemplate(templateTag, io) : ''); return this.genComponent({ selector, template }, dirType, io); } genDirectiveTemplate(tag, io) { return this.extraConfig.useStarSyntax ? genHostCompTplStar(io.inputs[0].templateName, tag, io, this.extraConfig.projectContent, this.extraConfig.templateBindings) : genHostCompTpl(tag, io, this.extraConfig.projectContent, this.extraConfig.templateBindings); } genComponent(meta, type, io) { // eslint-disable-next-line @typescript-eslint/no-this-alias const hostGeneratorService = this; let TestHostComponent = class TestHostComponent { constructor() { hostGeneratorService.initComponent(type, this, io); } }; __decorate([ ViewChild(type), __metadata("design:type", Object) ], TestHostComponent.prototype, "instance", void 0); TestHostComponent = __decorate([ Component(meta), __metadata("design:paramtypes", []) ], TestHostComponent); return TestHostComponent; } initComponent(compType, hostComp, io) { io.inputs.forEach(({ propName }) => (hostComp[propName] = undefined)); io.outputs.forEach(({ propName }) => (hostComp[propName] = getOutputMock()(propName, compType.name, compType, () => hostComp.instance))); } }; HostGeneratorService.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: Injector } ]; HostGeneratorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function HostGeneratorService_Factory() { return new HostGeneratorService(i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(i0.INJECTOR)); }, token: HostGeneratorService, providedIn: "root" }); HostGeneratorService = __decorate([ Injectable({ providedIn: 'root', }), __metadata("design:paramtypes", [ComponentFactoryResolver, Injector]) ], HostGeneratorService); export { HostGeneratorService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC1nZW5lcmF0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BvcmNoZXN0cmF0b3Ivbmd4LXRlc3RpbmcvIiwic291cmNlcyI6WyJsaWIvaG9zdC1nZW5lcmF0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLFFBQVEsRUFDUixRQUFRLEVBQ1IsSUFBSSxFQUNKLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsYUFBYSxHQUNkLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFJTCxZQUFZLEdBQ2IsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7QUFFeEM7O0dBRUc7QUFJSCxJQUFhLG9CQUFvQixHQUFqQyxNQUFhLG9CQUFvQjtJQU0vQixZQUNVLEdBQTZCLEVBQzdCLFFBQWtCO1FBRGxCLFFBQUcsR0FBSCxHQUFHLENBQTBCO1FBQzdCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFQcEIsZUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hELGNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoRCxnQkFBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7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aEIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FDZixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FDbkMsUUFBUSxFQUNSLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsUUFBUSxFQUNSLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ3hCLENBQUMsQ0FDTCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUE7O1lBaElnQix3QkFBd0I7WUFDbkIsUUFBUTs7O0FBUmpCLG9CQUFvQjtJQUhoQyxVQUFVLENBQUM7UUFDVixVQUFVLEVBQUUsTUFBTTtLQUNuQixDQUFDO3FDQVFlLHdCQUF3QjtRQUNuQixRQUFRO0dBUmpCLG9CQUFvQixDQXVJaEM7U0F2SVksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBOZ01vZHVsZSxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZ2V0T3V0cHV0TW9jayB9IGZyb20gJy4vb3V0cHV0LW1vY2snO1xuaW1wb3J0IHsgZ2VuSG9zdENvbXBUcGwsIGdlbkhvc3RDb21wVHBsU3RhciB9IGZyb20gJy4vdGVtcGxhdGUtZ2VuJztcbmltcG9ydCB7XG4gIEV4dHJhQ29uZmlnVG9rZW4sXG4gIFRlc3RNb2R1bGVUb2tlbixcbiAgVGVzdFR5cGVLaW5kVG9rZW4sXG4gIFRlc3RUeXBlVG9rZW4sXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7XG4gIEFzSG9zdENvbXBvbmVudCxcbiAgRGlyZWN0aXZlSU8sXG4gIEhvc3RDb21wb25lbnQsXG4gIFRlc3RUeXBlS2luZCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXREaXJlY3RpdmVJTyB9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBIb3N0R2VuZXJhdG9yU2VydmljZSB7XG4gIHByaXZhdGUgdGVzdE1vZHVsZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFRlc3RNb2R1bGVUb2tlbik7XG4gIHByaXZhdGUgdHlwZVRva2VuID0gdGhpcy5pbmplY3Rvci5nZXQoVGVzdFR5cGVUb2tlbik7XG4gIHByaXZhdGUgdHlwZUtpbmQgPSB0aGlzLmluamVjdG9yLmdldChUZXN0VHlwZUtpbmRUb2tlbik7XG4gIHByaXZhdGUgZXh0cmFDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChFeHRyYUNvbmZpZ1Rva2VuKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICApIHt9XG5cbiAgZ2VuZXJhdGVNb2R1bGVGb3IoaG9zdDogVHlwZTxhbnk+KTogVHlwZTxhbnk+IHtcbiAgICBjb25zdCB0ZXN0TW9kdWxlID0gdGhpcy50ZXN0TW9kdWxlO1xuICAgIGNvbnN0IG5nTW9kdWxlID0gdGhpcy5leHRyYUNvbmZpZy5uZ01vZHVsZTtcblxuICAgIEBOZ01vZHVsZSh7XG4gICAgICBpbXBvcnRzOiBbdGVzdE1vZHVsZV0sXG4gICAgICBkZWNsYXJhdGlvbnM6IFtob3N0XSxcbiAgICAgIGV4cG9ydHM6IFtob3N0XSxcbiAgICAgIGVudHJ5Q29tcG9uZW50czogW2hvc3RdLFxuICAgICAgc2NoZW1hczogbmdNb2R1bGUgPyBuZ01vZHVsZS5zY2hlbWFzIDogW10sXG4gICAgfSlcbiAgICBjbGFzcyBUZXN0TW9kdWxlIHt9XG5cbiAgICByZXR1cm4gVGVzdE1vZHVsZTtcbiAgfVxuXG4gIGdlbmVyYXRlPFQgPSBhbnk+KCk6IFR5cGU8QXNIb3N0Q29tcG9uZW50PFQ+PiB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGVLaW5kKSB7XG4gICAgICBjYXNlIFRlc3RUeXBlS2luZC5Db21wb25lbnQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRm9yQ29tcG9uZW50PFQ+KCk7XG4gICAgICBjYXNlIFRlc3RUeXBlS2luZC5EaXJlY3RpdmU6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRm9yRGlyZWN0aXZlPFQ+KCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgSG9zdEdlbmVyYXRvclNlcnZpY2U6IENhbm5vdCBnZW5lcmF0ZSBob3N0IGNvbXBvbmVudCBmb3IgdW5rbm93biBraW5kOiAke3RoaXMudHlwZUtpbmR9YCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUZvckNvbXBvbmVudDxUID0gYW55PigpOiBUeXBlPEFzSG9zdENvbXBvbmVudDxUPj4ge1xuICAgIHJldHVybiB0aGlzLmdlbkZvckNvbXBvbmVudDxUPih0aGlzLnR5cGVUb2tlbik7XG4gIH1cblxuICBnZW5lcmF0ZUZvckRpcmVjdGl2ZTxUID0gYW55PigpOiBUeXBlPEFzSG9zdENvbXBvbmVudDxUPj4ge1xuICAgIHJldHVybiB0aGlzLmdlbkZvckRpcmVjdGl2ZTxUPih0aGlzLnR5cGVUb2tlbik7XG4gIH1cblxuICBnZW5Gb3JDb21wb25lbnQ8VD4oY29tcFR5cGU6IFR5cGU8VD4pOiBUeXBlPEFzSG9zdENvbXBvbmVudDxUPj4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgaG9zdC0ke2ZhY3Rvcnkuc2VsZWN0b3J9YDtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9XG4gICAgICB0aGlzLmV4dHJhQ29uZmlnLnRlbXBsYXRlIHx8XG4gICAgICBnZW5Ib3N0Q29tcFRwbChcbiAgICAgICAgZmFjdG9yeS5zZWxlY3RvcixcbiAgICAgICAgZmFjdG9yeSxcbiAgICAgICAgdGhpcy5leHRyYUNvbmZpZy5wcm9qZWN0Q29udGVudCxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5nZW5Db21wb25lbnQoeyBzZWxlY3RvciwgdGVtcGxhdGUgfSwgY29tcFR5cGUsIGZhY3RvcnkpO1xuICB9XG5cbiAgZ2VuRm9yRGlyZWN0aXZlPFQ+KGRpclR5cGU6IFR5cGU8VD4pOiBUeXBlPEFzSG9zdENvbXBvbmVudDxUPj4ge1xuICAgIGNvbnN0IGlvID0gZ2V0RGlyZWN0aXZlSU8oZGlyVHlwZSk7XG5cbiAgICBjb25zdCBzZWxlY3RvciA9ICdob3N0LWRpcmVjdGl2ZSc7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZVRhZyA9IHRoaXMuZXh0cmFDb25maWcudGVtcGxhdGVcbiAgICAgID8gJydcbiAgICAgIDogdGhpcy5leHRyYUNvbmZpZy5ob3N0Q29tcG9uZW50XG4gICAgICA/IHRoaXMuY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMuZXh0cmFDb25maWcuaG9zdENvbXBvbmVudClcbiAgICAgICAgICAuc2VsZWN0b3JcbiAgICAgIDogdGhpcy5leHRyYUNvbmZpZy5ob3N0VGFnO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPVxuICAgICAgdGhpcy5leHRyYUNvbmZpZy50ZW1wbGF0ZSB8fFxuICAgICAgKHRlbXBsYXRlVGFnID8gdGhpcy5nZW5EaXJlY3RpdmVUZW1wbGF0ZSh0ZW1wbGF0ZVRhZywgaW8pIDogJycpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2VuQ29tcG9uZW50KHsgc2VsZWN0b3IsIHRlbXBsYXRlIH0sIGRpclR5cGUsIGlvKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuRGlyZWN0aXZlVGVtcGxhdGUodGFnOiBzdHJpbmcsIGlvOiBEaXJlY3RpdmVJTyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFDb25maWcudXNlU3RhclN5bnRheFxuICAgICAgPyBnZW5Ib3N0Q29tcFRwbFN0YXIoXG4gICAgICAgICAgaW8uaW5wdXRzWzBdLnRlbXBsYXRlTmFtZSxcbiAgICAgICAgICB0YWcsXG4gICAgICAgICAgaW8sXG4gICAgICAgICAgdGhpcy5leHRyYUNvbmZpZy5wcm9qZWN0Q29udGVudCxcbiAgICAgICAgICB0aGlzLmV4dHJhQ29uZmlnLnRlbXBsYXRlQmluZGluZ3MsXG4gICAgICAgIClcbiAgICAgIDogZ2VuSG9zdENvbXBUcGwoXG4gICAgICAgICAgdGFnLFxuICAgICAgICAgIGlvLFxuICAgICAgICAgIHRoaXMuZXh0cmFDb25maWcucHJvamVjdENvbnRlbnQsXG4gICAgICAgICAgdGhpcy5leHRyYUNvbmZpZy50ZW1wbGF0ZUJpbmRpbmdzLFxuICAgICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5Db21wb25lbnQ8VD4oXG4gICAgbWV0YTogQ29tcG9uZW50LFxuICAgIHR5cGU6IFR5cGU8VD4sXG4gICAgaW86IERpcmVjdGl2ZUlPLFxuICApOiBUeXBlPEFzSG9zdENvbXBvbmVudDxUPj4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGNvbnN0IGhvc3RHZW5lcmF0b3JTZXJ2aWNlID0gdGhpcztcblxuICAgIEBDb21wb25lbnQobWV0YSlcbiAgICBjbGFzcyBUZXN0SG9zdENvbXBvbmVudCBpbXBsZW1lbnRzIEhvc3RDb21wb25lbnQ8VD4ge1xuICAgICAgQFZpZXdDaGlsZCh0eXBlKVxuICAgICAgaW5zdGFuY2U6IFQ7XG5cbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBob3N0R2VuZXJhdG9yU2VydmljZS5pbml0Q29tcG9uZW50KHR5cGUsIHRoaXMsIGlvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gVGVzdEhvc3RDb21wb25lbnQgYXMgVHlwZTxBc0hvc3RDb21wb25lbnQ8VD4+O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29tcG9uZW50PFQ+KFxuICAgIGNvbXBUeXBlOiBUeXBlPGFueT4sXG4gICAgaG9zdENvbXA6IEhvc3RDb21wb25lbnQ8YW55PixcbiAgICBpbzogRGlyZWN0aXZlSU8sXG4gICkge1xuICAgIGlvLmlucHV0cy5mb3JFYWNoKCh7IHByb3BOYW1lIH0pID0+IChob3N0Q29tcFtwcm9wTmFtZV0gPSB1bmRlZmluZWQpKTtcbiAgICBpby5vdXRwdXRzLmZvckVhY2goXG4gICAgICAoeyBwcm9wTmFtZSB9KSA9PlxuICAgICAgICAoaG9zdENvbXBbcHJvcE5hbWVdID0gZ2V0T3V0cHV0TW9jaygpKFxuICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgIGNvbXBUeXBlLm5hbWUsXG4gICAgICAgICAgY29tcFR5cGUsXG4gICAgICAgICAgKCkgPT4gaG9zdENvbXAuaW5zdGFuY2UsXG4gICAgICAgICkpLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==