@honuware/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"honuware-ui-auth.mjs","sources":["../../../projects/honuware-ui/auth/src/auth.types.ts","../../../projects/honuware-ui/auth/src/auth.service.ts","../../../projects/honuware-ui/auth/src/auth-routes.ts","../../../projects/honuware-ui/auth/src/auth-guards.ts","../../../projects/honuware-ui/auth/src/error.interceptor.ts","../../../projects/honuware-ui/auth/src/login/login.component.ts","../../../projects/honuware-ui/auth/src/login/login.component.html","../../../projects/honuware-ui/auth/src/register/register.component.ts","../../../projects/honuware-ui/auth/src/register/register.component.html","../../../projects/honuware-ui/auth/src/verify/verify.component.ts","../../../projects/honuware-ui/auth/src/verify/verify.component.html","../../../projects/honuware-ui/auth/src/try-token-login.ts","../../../projects/honuware-ui/auth/src/public-api.ts","../../../projects/honuware-ui/auth/src/honuware-ui-auth.ts"],"sourcesContent":["export type AuthData =\n | {\n isAuth: false;\n }\n | {\n isAuth: true;\n personId: number;\n firstName: string;\n lastName: string;\n email: string;\n createdAt: string;\n isAdmin: boolean;\n roles: string[];\n permissions: string[];\n mustChangePassword: boolean;\n };\n\nexport const DEFAULT_NON_AUTH_DATA: AuthData = {\n isAuth: false,\n};\n\nexport function hasPermission(authData: AuthData, permission: string): boolean {\n return authData.isAuth && authData.permissions.includes(permission);\n}\n\nexport function hasManageProducts(authData: AuthData): boolean {\n return (authData.isAuth && authData.isAdmin) || hasPermission(authData, 'manage_products');\n}\n\nexport function hasStaffAccess(authData: AuthData): boolean {\n return (authData.isAuth && authData.isAdmin)\n || hasPermission(authData, 'instructor')\n || hasPermission(authData, 'admin_portal')\n || hasPermission(authData, 'provider');\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { catchError, map, mergeMap, tap } from 'rxjs/operators';\nimport {\n AuthData,\n DEFAULT_NON_AUTH_DATA,\n} from './auth.types';\nimport { AuthAccess, LoginInfo, UserInfo, SetUserInfo, UpdateUserPasswordInfo, HONUWARE_AUTH_ACCESS } from '@honuware/ui/access';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n private _authDataSubject = new BehaviorSubject<AuthData>(\n DEFAULT_NON_AUTH_DATA\n );\n public get authData$(): Observable<AuthData> {\n return this._authDataSubject.asObservable();\n }\n public get authData(): AuthData {\n return this._authDataSubject.value;\n }\n\n constructor(\n @Inject(HONUWARE_AUTH_ACCESS) private authAccess: AuthAccess,\n ) {}\n\n public updateAuthData(userInfo: UserInfo): void {\n const isAdmin = (userInfo.roles || []).includes('admin');\n const updated: AuthData = {\n isAuth: true,\n personId: userInfo.person_id,\n firstName: userInfo.first_name,\n lastName: userInfo.last_name,\n email: userInfo.email,\n createdAt: userInfo.created_at,\n roles: userInfo.roles,\n permissions: userInfo.permissions,\n isAdmin: isAdmin,\n mustChangePassword: userInfo.must_change_password ?? false,\n };\n this._authDataSubject.next(updated);\n }\n\n public setUserInfo(firstName: string, lastName: string, email: string): Observable<void> {\n const body: SetUserInfo = {\n first_name: firstName,\n last_name: lastName,\n email: email\n };\n\n return this.authAccess.setUserInfo(body).pipe(\n mergeMap(() => this.authAccess.getUserInfo()),\n tap((ui: UserInfo) => this.updateAuthData(ui)),\n map(() => void 0)\n );\n }\n\n public doSetUserInfo(firstName: string, lastName: string, email: string): void {\n this.setUserInfo(firstName, lastName, email).subscribe();\n }\n\n public updateUserPassword(oldPassword: string, newPassword: string): Observable<void> {\n const body: UpdateUserPasswordInfo = {\n old_password: oldPassword,\n new_password: newPassword,\n };\n return this.authAccess.updateUserPassword(body);\n }\n\n public doUpdateUserPassword(oldPassword: string, newPassword: string): void {\n this.updateUserPassword(oldPassword, newPassword).subscribe();\n }\n\n public tryTokenLogin(): Observable<boolean> {\n // Path A: session token valid -> get user info\n return this.authAccess.me().pipe(\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => true)\n )\n ),\n catchError((err) => {\n // If 401, attempt device remember token flow\n if (err?.status === 401) {\n return this.authAccess.remember().pipe(\n mergeMap(() => this.authAccess.me()),\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => true)\n )\n ),\n catchError(() => of(false))\n );\n }\n return of(false);\n })\n );\n }\n\n public login(\n email: string,\n password: string,\n remember: boolean\n ): Observable<void> {\n const body: LoginInfo = { email, password, remember };\n return this.authAccess.login(body).pipe(\n mergeMap(() =>\n this.authAccess.getUserInfo().pipe(\n tap((ui) => this.updateAuthData(ui)),\n map(() => void 0)\n )\n )\n );\n }\n\n public logout(): Observable<void> {\n return this.authAccess.logout().pipe(\n tap(() => this._authDataSubject.next(DEFAULT_NON_AUTH_DATA))\n );\n }\n\n public register(\n firstName: string,\n lastName: string,\n email: string,\n password: string\n ): Observable<void> {\n return this.authAccess.register(firstName, lastName, email, password);\n }\n\n // Phase 3.3 of the security review: the SPA's /verify route lands\n // here. The verification email's link points at the SPA, which calls\n // this and then immediately scrubs the URL via history.replaceState.\n public verify(email: string, secret: string): Observable<void> {\n return this.authAccess.verify(email, secret);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n// Route literals the auth layer (guards, ErrorInterceptor, auth pages) would\n// otherwise hardcode. Injected so a honuware consumer can remap them without\n// forking the components — the seam that lets @honuware/ui/auth ship working\n// auth screens + guards a new site *configures* rather than rewrites.\nexport interface AuthRoutes {\n /** Where the login page lives. */\n loginPath: string;\n /** Where the register page lives. */\n registerPath: string;\n /**\n * Home path — used both after logout and as the \"access denied\" fallback\n * for guard checks that reject the current user.\n */\n postLogoutPath: string;\n /** Forced-password-change page (users with must_change_password). */\n mustChangePasswordPath: string;\n /**\n * Same-origin path prefixes a post-login returnUrl may target. Anything\n * outside this list (or off-origin) is rejected to '/' by sanitizeReturnUrl.\n */\n returnUrlAllowlist: ReadonlyArray<string>;\n}\n\nexport const DEFAULT_AUTH_ROUTES: AuthRoutes = {\n loginPath: '/login',\n registerPath: '/register',\n postLogoutPath: '/',\n mustChangePasswordPath: '/my/update-user-password',\n returnUrlAllowlist: ['/my', '/admin', '/manage', '/staff', '/calendar', '/shop'],\n};\n\n// Root-provided with the knottyyoga defaults, so nothing needs wiring today.\n// When the auth layer moves into @honuware/ui/auth the library token drops the\n// app default and each consumer provides its own AuthRoutes.\nexport const AUTH_ROUTES = new InjectionToken<AuthRoutes>('AUTH_ROUTES', {\n providedIn: 'root',\n factory: () => DEFAULT_AUTH_ROUTES,\n});\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateChildFn, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthService } from './auth.service';\nimport { hasManageProducts, hasStaffAccess } from './auth.types';\nimport { AUTH_ROUTES } from './auth-routes';\n\nexport const AdminGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!authService.authData.isAuth || !authService.authData.isAdmin) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const AuthGuard: CanActivateFn | CanActivateChildFn = (\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n) => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n const url = state.url;\n // Allow access to login and register without auth\n if (url.startsWith(routes.loginPath) || url.startsWith(routes.registerPath)) {\n return true;\n }\n\n if (!authService.authData.isAuth) {\n const returnUrl = encodeURIComponent(url);\n return router.parseUrl(`${routes.loginPath}?returnUrl=${returnUrl}`);\n }\n\n // Force password change if required (allow access to the change password page itself)\n if (authService.authData.mustChangePassword &&\n !url.startsWith(routes.mustChangePasswordPath)) {\n return router.parseUrl(routes.mustChangePasswordPath);\n }\n\n return true;\n};\n\nexport const ManageProductsGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!hasManageProducts(authService.authData)) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const StaffGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (!hasStaffAccess(authService.authData)) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n\nexport const NoAuthGuard: CanActivateFn | CanActivateChildFn = () => {\n const router: Router = inject(Router);\n const authService: AuthService = inject(AuthService);\n const routes = inject(AUTH_ROUTES);\n\n if (authService.authData.isAuth) {\n return router.parseUrl(routes.postLogoutPath);\n }\n\n return true;\n};\n","import { Injectable, Inject } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Router } from '@angular/router';\nimport { ErrorService, ErrorTypes, ProblemDetails } from '@honuware/ui/access';\nimport { AUTH_ROUTES, AuthRoutes } from './auth-routes';\n\n/**\n * Extended HttpErrorResponse that includes parsed ProblemDetails\n */\nexport interface ParsedHttpErrorResponse extends HttpErrorResponse {\n problemDetails: ProblemDetails;\n}\n\n@Injectable()\nexport class ErrorInterceptor implements HttpInterceptor {\n constructor(\n private errorService: ErrorService,\n private router: Router,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {}\n\n intercept(\n request: HttpRequest<unknown>,\n next: HttpHandler\n ): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n catchError((error: HttpErrorResponse) => {\n const problemDetails = this.errorService.parseError(error);\n\n // Handle session expired globally - redirect to login\n if (\n problemDetails.type === ErrorTypes.SESSION_EXPIRED ||\n (problemDetails.type === ErrorTypes.NOT_AUTHENTICATED &&\n !this.isAuthEndpoint(request.url))\n ) {\n this.router.navigate([this.authRoutes.loginPath]);\n }\n\n // Create extended error with parsed problem details\n const parsedError = Object.assign(error, {\n problemDetails,\n }) as ParsedHttpErrorResponse;\n\n return throwError(() => parsedError);\n })\n );\n }\n\n private isAuthEndpoint(url: string): boolean {\n const authEndpoints = ['/api/login', '/api/register', '/api/me', '/api/remember'];\n return authEndpoints.some((endpoint) => url.includes(endpoint));\n }\n}\n","import { Component, Inject } from '@angular/core';\n\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n Validators,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { sanitizeReturnUrl, ToastService } from '@honuware/ui/foundation';\nimport { ErrorService } from '@honuware/ui/access';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'hw-login',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatCheckboxModule,\n MatIcon,\n RouterLink\n],\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n})\nexport class LoginComponent {\n form: FormGroup;\n hidePassword = true;\n private returnUrl: string;\n\n constructor(\n private fb: FormBuilder,\n private authService: AuthService,\n private router: Router,\n private route: ActivatedRoute,\n private toastService: ToastService,\n private errorService: ErrorService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {\n this.form = this.fb.group({\n email: ['', [Validators.required]],\n password: ['', [Validators.required]],\n remember: [false],\n });\n // Phase 10.2: never trust the raw query parameter — see\n // sanitizeReturnUrl above for the threat model.\n this.returnUrl = sanitizeReturnUrl(\n this.route.snapshot.queryParamMap.get('returnUrl'),\n this.authRoutes.returnUrlAllowlist,\n );\n }\n\n togglePasswordVisibility(): void {\n this.hidePassword = !this.hidePassword;\n }\n\n onSignIn(): void {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n const email = this.form.get('email')?.value ?? '';\n const password = this.form.get('password')?.value ?? '';\n const remember = !!this.form.get('remember')?.value;\n\n this.authService.login(email, password, remember).subscribe({\n next: () => {\n if (this.authService.authData.isAuth && this.authService.authData.mustChangePassword) {\n this.router.navigateByUrl(this.authRoutes.mustChangePasswordPath);\n } else {\n this.router.navigateByUrl(this.returnUrl);\n }\n },\n error: (err: HttpErrorResponse) => {\n const problem = this.errorService.parseError(err);\n this.toastService.error(this.errorService.getUserFriendlyMessage(problem));\n },\n });\n }\n}\n","<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n>\n <h1 class=\"text-center text-2xl\">Log In</h1>\n\n <form [formGroup]=\"form\" (submit)=\"onSignIn()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"text\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\"\n matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-checkbox id=\"remember\" formControlName=\"remember\">Remember Me</mat-checkbox>\n\n <button mat-raised-button id=\"signIn\" color=\"primary\" type=\"submit\">Sign in</button>\n </form>\n\n <a\n id=\"create-account-link\"\n [routerLink]=\"'/register'\"\n color=\"primary\"\n class=\"text-center\"\n >\n Create an account\n </a>\n</div>\n","import { Component, Inject } from '@angular/core';\n\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { Router } from '@angular/router';\nimport { ToastService } from '@honuware/ui/foundation';\nimport { ErrorService } from '@honuware/ui/access';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'hw-register',\n standalone: true,\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIcon],\n templateUrl: './register.component.html',\n styleUrls: ['./register.component.scss']\n})\nexport class RegisterComponent {\n form: FormGroup;\n hidePassword = true;\n\n constructor(\n private fb: FormBuilder,\n private authService: AuthService,\n private router: Router,\n private toastService: ToastService,\n private errorService: ErrorService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes\n ) {\n this.form = this.fb.group(\n {\n email: ['', [Validators.required, Validators.email]],\n first_name: ['', [Validators.required]],\n last_name: ['', [Validators.required]],\n password: ['', [Validators.required]],\n password2: ['', [Validators.required]],\n },\n { validators: this.passwordsMatchValidator }\n );\n }\n\n togglePasswordVisibility(): void {\n this.hidePassword = !this.hidePassword;\n }\n\n // Custom validator that flags mismatch only when both fields are dirty and values differ\n private passwordsMatchValidator(group: AbstractControl): ValidationErrors | null {\n const password = group.get('password');\n const password2 = group.get('password2');\n if (!password || !password2) return null;\n\n const bothDirty = password.dirty && password2.dirty;\n const mismatch = password.value !== password2.value;\n\n if (bothDirty && mismatch) {\n password2.setErrors({ mismatch: true });\n return { mismatch: true };\n } else {\n // Clear mismatch error when aligned or not both dirty\n if (password2.hasError('mismatch')) {\n const otherErrors = { ...password2.errors };\n delete otherErrors['mismatch'];\n password2.setErrors(Object.keys(otherErrors).length ? otherErrors : null);\n }\n return null;\n }\n }\n\n onRegister(): void {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n const email = this.form.get('email')?.value ?? '';\n const firstName = this.form.get('first_name')?.value ?? '';\n const lastName = this.form.get('last_name')?.value ?? '';\n const password = this.form.get('password')?.value ?? '';\n\n this.authService.register(firstName, lastName, email, password).subscribe({\n next: () => this.router.navigate([this.authRoutes.loginPath]),\n error: (err: HttpErrorResponse) => {\n const problem = this.errorService.parseError(err);\n this.toastService.error(this.errorService.getUserFriendlyMessage(problem));\n }\n });\n }\n\n showPasswordMismatch(): boolean {\n const password = this.form.get('password');\n const password2 = this.form.get('password2');\n if (!password || !password2) return false;\n return !!password.dirty && !!password2.dirty && password.value !== password2.value;\n }\n}\n","<div\n class=\"max-w-[420px] p-6 flex flex-col gap-8 mx-auto my-8 border border-gray-300 rounded-lg\"\n >\n <h1 class=\"text-center text-2xl\">Create Account</h1>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onRegister()\" class=\"flex flex-col gap-4\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Email</mat-label>\n <input id=\"email\" matInput type=\"email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>First name</mat-label>\n <input id=\"first_name\" matInput type=\"text\" formControlName=\"first_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Last name</mat-label>\n <input id=\"last_name\" matInput type=\"text\" formControlName=\"last_name\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Password</mat-label>\n <input id=\"password\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Reenter password</mat-label>\n <input id=\"password2\" matInput [type]=\"hidePassword ? 'password' : 'text'\" formControlName=\"password2\" />\n <button type=\"button\"\n matSuffix\n (click)=\"togglePasswordVisibility()\"\n class=\"mr-2\">\n <mat-icon>\n {{\n hidePassword ? \"visibility_off\" : \"visibility\"\n }}\n </mat-icon>\n </button>\n @if (showPasswordMismatch()) {\n <mat-error>\n Passwords do not match.\n </mat-error>\n }\n </mat-form-field>\n\n <button id=\"Register\" mat-raised-button color=\"primary\" type=\"submit\">\n Register\n </button>\n </form>\n</div>\n","import { Component, Inject, OnInit } from '@angular/core';\n\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { AuthService } from '../auth.service';\nimport { AUTH_ROUTES, AuthRoutes } from '../auth-routes';\nimport { ToastService } from '@honuware/ui/foundation';\n\n/**\n * Phase 3.3 of the security review.\n *\n * The verification email links at this SPA route — `/verify?email=…&secret=…` —\n * rather than at the API. The component:\n *\n * 1. Reads `email` and `secret` from the query string.\n * 2. Immediately calls `AuthService.verify(email, secret)` (POST /api/verify).\n * 3. Right after firing the request, scrubs the URL via\n * `history.replaceState({}, '', '/verify-success')` so the secret\n * stops appearing in the URL bar / browser history. We do this\n * synchronously, NOT inside the response callback, so the URL is\n * sanitized whether the request succeeds, fails, or is delayed.\n * 4. On success or failure, routes to `/login` with a toast. The two\n * paths use different toasts but the toast text never echoes the\n * server's error detail — failed verifications all collapse to one\n * generic message to avoid distinguishing \"wrong secret\" from\n * \"expired\" from \"already verified\".\n */\n@Component({\n selector: 'hw-verify',\n standalone: true,\n imports: [],\n templateUrl: './verify.component.html',\n styleUrls: ['./verify.component.scss']\n})\nexport class VerifyComponent implements OnInit {\n constructor(\n private route: ActivatedRoute,\n private router: Router,\n private authService: AuthService,\n private toastService: ToastService,\n @Inject(AUTH_ROUTES) private authRoutes: AuthRoutes,\n ) {}\n\n ngOnInit(): void {\n const email = this.route.snapshot.queryParamMap.get('email') ?? '';\n const secret = this.route.snapshot.queryParamMap.get('secret') ?? '';\n\n if (!email || !secret) {\n this.scrubUrl();\n this.toastService.error(\n 'Verification link is missing required parameters.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n return;\n }\n\n // Fire the verification request first, THEN scrub the URL. The\n // secret is in memory either way; the goal of the scrub is to keep\n // it out of the browser's URL bar and history. Doing it before\n // we're sure about the response means even a slow / failed request\n // doesn't leave the secret visible.\n const verify$ = this.authService.verify(email, secret);\n this.scrubUrl();\n\n verify$.subscribe({\n next: () => {\n this.toastService.success(\n 'Email verified — please log in.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n },\n error: () => {\n // Phase 3.3: don't echo the server error detail. All failure\n // modes (wrong secret, expired, already-used) collapse to a\n // single generic message.\n this.toastService.error(\n 'Verification failed or expired. Please try again.'\n );\n this.router.navigate([this.authRoutes.loginPath]);\n },\n });\n }\n\n private scrubUrl(): void {\n // We can't replace the path via Router.navigate without triggering\n // a route change here — `history.replaceState` mutates only the URL\n // bar / history entry. The `/verify-success` path doesn't need to\n // be a real route; we navigate to /login on the next tick anyway.\n window.history.replaceState({}, '', '/verify-success');\n }\n}\n","<div class=\"verify-container\">\n <p>Verifying your email...</p>\n</div>\n","import { firstValueFrom } from 'rxjs';\nimport { AuthService } from './auth.service';\n\n// Phase 10.1 of the security review: try silent re-auth at bootstrap so\n// the SPA hydrates `authData$` BEFORE the first route activates. Without\n// this an authenticated user lands on a public-looking shell, sees the\n// guarded route bounce them to /login, and only then gets logged in by\n// the device-token flow.\n//\n// Returns a thunk (factory) so Angular invokes it AFTER DI sets up the\n// AuthService graph. We resolve regardless of outcome — a network blip\n// or invalid cookie should not block app bootstrap. A consumer wires this\n// into an APP_INITIALIZER with `deps: [AuthService]`.\nexport function tryTokenLoginInitializer(authService: AuthService): () => Promise<void> {\n return () =>\n firstValueFrom(authService.tryTokenLogin())\n .then(() => void 0)\n .catch(() => void 0);\n}\n","/*\n * @honuware/ui/auth — the auth layer: AuthService + AuthData/permission\n * helpers, the five route guards, the ErrorInterceptor, the login/register/\n * verify pages (selectors `hw-`), the AUTH_ROUTES config token, and the\n * tryTokenLogin bootstrap initializer. Depends on foundation + access.\n */\nexport { AuthService } from './auth.service';\n\nexport { DEFAULT_NON_AUTH_DATA, hasPermission, hasManageProducts, hasStaffAccess } from './auth.types';\nexport type { AuthData } from './auth.types';\n\nexport { AUTH_ROUTES, DEFAULT_AUTH_ROUTES } from './auth-routes';\nexport type { AuthRoutes } from './auth-routes';\n\nexport { AdminGuard, AuthGuard, ManageProductsGuard, StaffGuard, NoAuthGuard } from './auth-guards';\n\nexport { ErrorInterceptor } from './error.interceptor';\nexport type { ParsedHttpErrorResponse } from './error.interceptor';\n\nexport { LoginComponent } from './login/login.component';\nexport { RegisterComponent } from './register/register.component';\nexport { VerifyComponent } from './verify/verify.component';\n\nexport { tryTokenLoginInitializer } from './try-token-login';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}