{"version":3,"file":"ngx-security-permissions.mjs","sources":["../../../projects/permissions/src/lib/subject-permissions.provider.ts","../../../projects/permissions/src/lib/is-permitted/is-permitted.directive.ts","../../../projects/permissions/src/lib/is-permitted/is-permitted.pipe.ts","../../../projects/permissions/src/lib/permissions.module.ts","../../../projects/permissions/src/ngx-security-permissions.ts"],"sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { Subject, SubjectDetails, SubjectService } from '@ngx-security/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { newTrie, ShiroTrie } from 'shiro-trie';\n\nexport abstract class SubjectPermissionsProvider {\n\n  private trie: ShiroTrie;\n\n  abstract permissions$: Observable<string[]>;\n\n  abstract getPermissions(): string[];\n\n  protected constructor() {\n    this.trie = newTrie();\n  }\n\n  apply(): void {\n    this.trie.reset();\n    this.trie.add(...this.getPermissions());\n  }\n\n  isPermittedAsync(permission: string): Observable<boolean> {\n    return this.permissions$.pipe(\n      map(() => this._isPermitted(permission))\n    );\n  }\n\n  isPermitted(permission: string): boolean {\n    return this._isPermitted(permission);\n  }\n\n  protected _isPermitted(permission: string) {\n    return this.trie.check(permission);\n  }\n}\n\n@Injectable()\nexport class StandardSubjectPermissionsProvider<D extends SubjectDetails, S extends Subject<D>> extends SubjectPermissionsProvider {\n\n  permissions$: Observable<string[]> = this.subject.authorities$;\n\n  constructor(private subject: SubjectService<D, S>) {\n    super();\n  }\n\n  getPermissions(): string[] {\n    return this.subject.getAuthorities();\n  }\n}\n\n@Injectable()\nexport class UpdatableSubjectPermissionsProvider extends SubjectPermissionsProvider implements OnDestroy {\n\n  private permissions: BehaviorSubject<string[]> = new BehaviorSubject([]);\n\n  permissions$: Observable<string[]> = this.permissions.asObservable();\n\n  constructor() {\n    super();\n    this.apply();\n  }\n\n  ngOnDestroy(): void {\n    this.permissions.complete();\n  }\n\n  getPermissions(): string[] {\n    return this.permissions.getValue();\n  }\n\n  update(permissions: string[]): void {\n    this.permissions.next(permissions);\n  }\n}\n","import { Directive, ElementRef, EmbeddedViewRef, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { SubjectPermissionsProvider } from '../subject-permissions.provider';\n\n@Directive({selector: '[isPermitted]'})\nexport class IsPermittedDirective implements OnInit, OnDestroy {\n\n  private permission: string = null;\n\n  private sub: Subscription;\n  private embeddedViewRef: EmbeddedViewRef<any> = null;\n\n  @Input()\n  set isPermitted(permission: string) {\n    this.permission = permission;\n    this.updateView();\n  }\n\n  constructor(private element: ElementRef, private templateRef: TemplateRef<any>,\n              private viewContainer: ViewContainerRef, private subject: SubjectPermissionsProvider) {\n  }\n\n  ngOnInit(): void {\n    this.sub = this.subject.permissions$.subscribe(() => this.updateView());\n  }\n\n  ngOnDestroy(): void {\n    if (this.sub) {\n      this.sub.unsubscribe();\n    }\n  }\n\n  private updateView() {\n    if (!this.subject.isPermitted(this.permission)) {\n      this.viewContainer.clear();\n      this.embeddedViewRef = null;\n    } else if (!this.embeddedViewRef) {\n      this.embeddedViewRef = this.viewContainer.createEmbeddedView(this.templateRef);\n    }\n  }\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { SubjectPermissionsProvider } from '../subject-permissions.provider';\n\n@Pipe({name: 'isPermitted', pure: false})\nexport class IsPermittedPipe implements PipeTransform, OnDestroy {\n\n  private isPermitted: boolean = null;\n\n  private sub: Subscription = null;\n\n  constructor(private ref: ChangeDetectorRef, private subject: SubjectPermissionsProvider) {\n  }\n\n  transform(permission: string, permissionAsArg: string): boolean {\n    permission = permissionAsArg || permission;\n    this.clear();\n    this.sub = this.subject.isPermittedAsync(permission).subscribe((isPermitted) => {\n      if (this.isPermitted !== isPermitted) {\n        this.isPermitted = isPermitted;\n        this.ref.markForCheck();\n      }\n    });\n    return this.isPermitted;\n  }\n\n  ngOnDestroy(): void {\n    this.clear();\n  }\n\n  private clear(): void {\n    this.isPermitted = null;\n    if (this.sub) {\n      this.sub.unsubscribe();\n      this.sub = null;\n    }\n  }\n}\n","import { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { StandardSubjectService, SubjectService } from '@ngx-security/core';\n\nimport { StandardSubjectPermissionsProvider, SubjectPermissionsProvider } from './subject-permissions.provider';\nimport { IsPermittedDirective } from './is-permitted/is-permitted.directive';\nimport { IsPermittedPipe } from './is-permitted/is-permitted.pipe';\n\nexport interface SecurityPermissionsModuleConfig {\n  subject?: Provider;\n  subjectPermissions?: Provider;\n}\n\n@NgModule({\n  declarations: [\n    IsPermittedDirective,\n    IsPermittedPipe\n  ],\n  exports: [\n    IsPermittedDirective,\n    IsPermittedPipe\n  ]\n})\nexport class SecurityPermissionsModule {\n  static forRoot(config: SecurityPermissionsModuleConfig = {}): ModuleWithProviders<SecurityPermissionsModule> {\n    return {\n      ngModule: SecurityPermissionsModule,\n      providers: [\n        config.subject || {provide: SubjectService, useClass: StandardSubjectService},\n        config.subjectPermissions || {provide: SubjectPermissionsProvider, useClass: StandardSubjectPermissionsProvider}\n      ]\n    };\n  }\n\n  static forChild(config: SecurityPermissionsModuleConfig = {}): ModuleWithProviders<SecurityPermissionsModule> {\n    return {\n      ngModule: SecurityPermissionsModule,\n      providers: []\n    };\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.SubjectPermissionsProvider"],"mappings":"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"}