ngx-feature-toggle
Version:
Your module to handle with feature toggles in Angular applications easier.
156 lines (148 loc) • 7.58 kB
JavaScript
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