{"version":3,"file":"bootkit-ng1-security.mjs","sources":["../../../projects/ng1/security/user.ts","../../../projects/ng1/security/user-store.ts","../../../projects/ng1/security/claim.directive.ts","../../../projects/ng1/security/guest-user.directive.ts","../../../projects/ng1/security/security.module.ts","../../../projects/ng1/security/user.directive.ts","../../../projects/ng1/security/public-api.ts","../../../projects/ng1/security/bootkit-ng1-security.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { ClaimLike, ClaimObject } from '@bootkit/ng1/common';\n\n/** User */\nexport class User {\n    public readonly claims = signal<string[]>([]);\n\n    constructor(claims: string[]) {\n        this.claims.set(claims);\n    }\n\n    public addClaim(claim: string): boolean {\n        let currentClaims = this.claims();\n        if (currentClaims.includes(claim)) {\n            return false;\n        }\n        this.claims.set([...currentClaims, claim]);\n        return true;\n    }\n\n    public removeClaim(claim: string): boolean {\n        let currentClaims = this.claims();\n        if (!currentClaims.includes(claim)) {\n            return false;\n        }\n        this.claims.set(currentClaims.filter(x => x !== claim));\n        return true;\n    }\n\n    public hasAllClaims(claims: string[]): boolean {\n        return claims.every(x => this.claims().some(y => x === y));\n    }\n\n    public hasAnyClaim(claims: string[]): boolean {\n        return claims.length == 0 || claims.some(x => this.claims().some(y => x === y));\n    }\n\n    public hasClaim(claim: ClaimLike): boolean {\n        var type = typeof claim;\n        if (type === 'string') {\n            return this.claims().some(x => x === claim);\n        }\n\n        if (type === 'object') {\n            const claimObject = claim as ClaimObject;\n            if (claimObject?.any && claimObject?.all) {\n                throw Error('Setting \"any\" and \"all\" at the same time is not valid.');\n            }\n\n            if (Array.isArray(claimObject?.any)) {\n                return this.hasAnyClaim(claimObject.any);\n            }\n            if (Array.isArray(claimObject?.all)) {\n                return this.hasAllClaims(claimObject.all);\n            }\n        }\n\n        throw Error(`Invalid claim to check: ${JSON.stringify(claim)}`);\n    }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { User } from './user';\nimport { UserCondition } from '@bootkit/ng1/common';\n\n/**\n * Service to manage the current user state.\n */\n@Injectable({ providedIn: 'root' })\nexport class UserStore<U extends User = User> {\n    public readonly user = signal<U | null | undefined>(undefined);\n\n    /**\n     * Check if the given condition is met by the current user.\n     * If there is no user, only 'false' condition is met.\n     * If there is a user, 'true' conditions and claims will be checked.\n     * @param condition The user condition to check\n     * @returns Whether the condition is met\n     */\n    checkCondition(condition: UserCondition): boolean {\n        let user = this.user();\n\n        if (user) {\n            if (condition === true) {\n                return true;\n            } else if (condition === false) {\n                return false;\n            } else {\n                return user.hasClaim(condition);\n            }\n        } else {\n            return condition === false;\n        }\n    }\n}","import { Directive, TemplateRef, ViewContainerRef, input, effect, inject } from '@angular/core';\nimport { UserStore } from './user-store';\nimport { ClaimLike } from '@bootkit/ng1/common';\n\n/**\n * @deprecated use *ng1User instead\n */\n@Directive({\n  selector: '[ng1Claim]',\n  exportAs: 'ng1Claim',\n  standalone: true\n})\nexport class ClaimDirective {\n  private _viewCreated = false;\n  private _templateRef = inject(TemplateRef<any>);\n  private _viewContainer = inject(ViewContainerRef);\n  private _userStore = inject(UserStore);\n\n  /**\n   * Claim to check\n   */\n  public readonly claim = input<ClaimLike | null | undefined>('', { alias: 'ng1Claim' });\n\n  constructor() {\n    effect(() => {\n      let claim = this.claim();\n      let user = this._userStore.user();\n      let show = !user ? false : (claim == undefined ? true : user.hasClaim(claim))\n\n      if (show && !this._viewCreated) {\n        this._viewContainer.createEmbeddedView(this._templateRef);\n        this._viewCreated = true;\n      } else if (!show && this._viewCreated) {\n        this._viewContainer.clear();\n        this._viewCreated = false;\n      }\n    })\n  }\n}\n","import { Directive, TemplateRef, ViewContainerRef, effect } from '@angular/core';\nimport { UserStore } from './user-store';\n\n/**\n * @deprecated use *ng1User directive instead\n */\n@Directive({\n  selector: '[ng1GuestUser]',\n  exportAs: 'ng1GuestUser',\n  standalone: true\n})\nexport class GuestUserDirective {\n  private _created = false;\n\n  constructor(\n    templateRef: TemplateRef<any>,\n    viewContainer: ViewContainerRef,\n    userStore: UserStore,\n  ) {\n    effect(() => {\n      let show = userStore.user() == undefined\n\n      if (show && !this._created) {\n        viewContainer.createEmbeddedView(templateRef);\n        this._created = true;\n      } else if (!show && this._created) {\n        viewContainer.clear();\n        this._created = false;\n      }\n    })\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { ClaimDirective } from './claim.directive';\nimport { GuestUserDirective } from './guest-user.directive';\n\nconst items = [\n    ClaimDirective,\n    GuestUserDirective\n]\n\n@NgModule({\n    imports: items,\n    exports: items\n})\nexport class SecurityModule { }\n","import { Directive, TemplateRef, ViewContainerRef, input, effect, inject } from '@angular/core';\nimport { UserStore } from './user-store';\nimport { UserCondition } from '@bootkit/ng1/common';\nimport { User } from './user';\n\n/**\n * Directive to conditionally display content based on user claims or conditions.\n * If there is no condition provided, the content is always shown.\n * If a condition is provided, it checks against the current user.\n * @example\n * ```html\n * <ng-container *ng1User=\"true\">\n *  This content is shown only if there is a logged-in user, regardless of claims.\n * </ng-container>\n * <ng-container *ng1User=\"false\">\n * This content is shown only if there is no logged-in user.\n * </ng-container>\n * <ng-container *ng1User=\"'admin'\">\n * This content is shown only if the user has the 'admin' claim.\n * </ng-container>\n * <ng-container *ng1User=\"{ all: ['read', 'write'] }\">\n * This content is shown only if the user has both 'read' and 'write' claims.\n * </ng-container>\n * <ng-container *ng1User=\"{ any: ['editor', 'contributor'] }\">\n * This content is shown if the user has either 'editor' or 'contributor' claims.\n * </ng-container>\n * <ng-container *ng1User=\"null\">\n * This content is always shown, regardless of user state.\n * </ng-container>\n * ```\n */\n@Directive({\n  selector: '[ng1User]',\n  exportAs: 'ng1User',\n  standalone: true\n})\nexport class UserDirective {\n  private _viewCreated = false;\n  private readonly _templateRef = inject(TemplateRef<any>);\n  private readonly _viewContainer = inject(ViewContainerRef);\n  private readonly _userStore = inject<UserStore<User>>(UserStore);\n\n  /**\n   * Show condition to check\n   * \n   */\n  public readonly condition = input<UserCondition | null | undefined>('', { alias: 'ng1User' });\n\n  constructor() {\n    effect(() => {\n      let condition = this.condition();\n      let user = this._userStore.user();\n      let show: boolean;\n\n      if (condition === null || condition === undefined) {\n        show = true;\n      } else {\n        if (user) {\n          if (condition === true) {\n            show = true;\n          } else if (condition === false) {\n            show = false;\n          } else {\n            show = user.hasClaim(condition);\n          }\n        } else {\n          show = condition === false;\n        }\n      }\n\n      if (show && !this._viewCreated) {\n        this._viewContainer.createEmbeddedView(this._templateRef);\n        this._viewCreated = true;\n      } else if (!show && this._viewCreated) {\n        this._viewContainer.clear();\n        this._viewCreated = false;\n      }\n    })\n  }\n}\n","// export  *  from './types';\nexport * from './user';\nexport * from './user-store';\nexport * from './claim.directive';\nexport * from './guest-user.directive';\nexport * from './security.module';\nexport * from './user.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UserStore"],"mappings":"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"}