UNPKG

ngx-feature-toggle

Version:

Your module to handle with feature toggles in Angular applications easier.

156 lines (148 loc) 7.58 kB
import * as i0 from '@angular/core'; import { isDevMode, Directive, Input, Component, NgModule, Injectable } from '@angular/core'; import { isOn, set } from 'feature-toggle-service'; import { CommonModule } from '@angular/common'; import * as i1 from '@angular/router'; class FeatureToggleDirective { constructor(templateRef, viewContainer) { this.templateRef = templateRef; this.viewContainer = viewContainer; this.isOn = false; } ngOnInit() { if (!this.featureToggle) { throw new Error('Attribute `featureToggle` should not be null or empty'); } this.shouldRender(); } ngDoCheck() { if (this.isOn !== this.isOnCheck(this.featureToggle)) { this.shouldRender(); } } shouldRender() { this.isOn = this.isOnCheck(this.featureToggle); if (this.isOn) { this.viewContainer.createEmbeddedView(this.templateRef); } else { this.viewContainer.clear(); } } isOnCheck(featureToggle) { if (typeof featureToggle !== 'string' && !Array.isArray(featureToggle)) { if (isDevMode()) { console.error('`NgxFeatureToggle`: `featureToggle` should receive an array or an string as a value.'); } return false; } return [].concat(featureToggle).every(toggle => toggle[0] === '!' ? !isOn(toggle.replace('!', '')) : isOn(toggle)); } } /** @nocollapse */ FeatureToggleDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ FeatureToggleDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.5", type: FeatureToggleDirective, selector: "[featureToggle]", inputs: { featureToggle: "featureToggle" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleDirective, decorators: [{ type: Directive, args: [{ // tslint:disable-next-line: directive-selector selector: '[featureToggle]', }] }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { featureToggle: [{ type: Input }] } }); class FeatureToggleProviderComponent { constructor() { this.features = {}; this.currentConfig = {}; } ngOnInit() { if (typeof this.features !== 'object') { throw new Error('Attribute `features` should not be null or empty'); } this.setFeatureToggles(); } ngDoCheck() { this.setFeatureToggles(); } setFeatureToggles() { if (this.currentConfig !== this.features) { // Using `Object.assign()` method for bundle size decreasing purposes // It's required since it needs a new memory reference // for the new object value this.currentConfig = Object.assign({}, this.features); set(this.features); } } } /** @nocollapse */ FeatureToggleProviderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleProviderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ FeatureToggleProviderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.5", type: FeatureToggleProviderComponent, selector: "feature-toggle-provider", inputs: { features: "features" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleProviderComponent, decorators: [{ type: Component, args: [{ selector: 'feature-toggle-provider', template: '<ng-content></ng-content>', }] }], propDecorators: { features: [{ type: Input }] } }); class FeatureToggleModule { } /** @nocollapse */ FeatureToggleModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); /** @nocollapse */ FeatureToggleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleModule, declarations: [FeatureToggleProviderComponent, FeatureToggleDirective], imports: [CommonModule], exports: [FeatureToggleProviderComponent, FeatureToggleDirective] }); /** @nocollapse */ FeatureToggleModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleModule, imports: [CommonModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: FeatureToggleModule, decorators: [{ type: NgModule, args: [{ declarations: [FeatureToggleProviderComponent, FeatureToggleDirective], exports: [FeatureToggleProviderComponent, FeatureToggleDirective], imports: [CommonModule], }] }] }); class NgxFeatureToggleRouteGuard { constructor(router) { this.router = router; } isDevMode() { return isDevMode(); } isOnCheck(route) { if (!route || !route.data || (typeof route.data.featureToggle !== 'string' && !Array.isArray(route.data.featureToggle))) { if (this.isDevMode()) { console.error( // tslint:disable-next-line: max-line-length '`NgxFeatureToggleRouteGuard` need to receive `featureToggle` as data as an array or string in your route configuration.'); } return false; } const hasAllTogglesOn = [].concat(route.data.featureToggle).every(toggle => toggle[0] === '!' ? !isOn(toggle.replace('!', '')) : isOn(toggle)); if (!hasAllTogglesOn && route.data.redirectTo) { this.router.navigate([].concat(route.data.redirectTo)); } return hasAllTogglesOn; } canLoad(route) { return this.isOnCheck(route); } canActivateChild(route) { return this.isOnCheck(route); } canActivate(route) { return this.isOnCheck(route); } } /** @nocollapse */ NgxFeatureToggleRouteGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgxFeatureToggleRouteGuard, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ NgxFeatureToggleRouteGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgxFeatureToggleRouteGuard, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: NgxFeatureToggleRouteGuard, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.Router }]; } }); /* * Public API Surface of ngx-feature-toggle */ /** * Generated bundle index. Do not edit. */ export { FeatureToggleDirective, FeatureToggleModule, FeatureToggleProviderComponent, NgxFeatureToggleRouteGuard }; //# sourceMappingURL=ngx-feature-toggle.mjs.map