@zssz-soft/core-api 0.7.0 → 0.7.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"zssz-soft-core-api.mjs","sources":["../../../projects/core-api/src/lib/audit/audit-log.models.ts","../../../projects/core-api/src/lib/audit/audit.service.ts","../../../projects/core-api/src/lib/authentication/authentication-store.service.ts","../../../projects/core-api/src/lib/authentication/authentication.model.ts","../../../projects/core-api/src/lib/authentication/authentication.service.ts","../../../projects/core-api/src/lib/authentication/firebase.config.ts","../../../projects/core-api/src/lib/cloud/cloud.service.ts","../../../projects/core-api/src/lib/config/app-bootstrap.config.ts","../../../projects/core-api/src/lib/config/document.config.ts","../../../projects/core-api/src/lib/config/notification-config.ts","../../../projects/core-api/src/lib/email/email.service.ts","../../../projects/core-api/src/lib/email/email.models.ts","../../../projects/core-api/src/lib/entity/form/entity-form.logic.ts","../../../projects/core-api/src/lib/entity/entity.adapter.ts","../../../projects/core-api/src/lib/entity/entity.effect.ts","../../../projects/core-api/src/lib/repository/repository.models.ts","../../../projects/core-api/src/lib/repository/repository.engine.ts","../../../projects/core-api/src/lib/repository/repository-engine.tokens.ts","../../../projects/core-api/src/lib/entity/entity.repository.ts","../../../projects/core-api/src/lib/error/error.models.ts","../../../projects/core-api/src/lib/error/error-util.service.ts","../../../projects/core-api/src/lib/i18n/date-time.pipe.base.ts","../../../projects/core-api/src/lib/i18n/date-util.ts","../../../projects/core-api/src/lib/i18n/i18n.service.ts","../../../projects/core-api/src/lib/i18n/i18n.util.ts","../../../projects/core-api/src/lib/i18n/languages.enum.ts","../../../projects/core-api/src/lib/icon/icon.ts","../../../projects/core-api/src/lib/logger/logger.ts","../../../projects/core-api/src/lib/logger/logger.models.ts","../../../projects/core-api/src/lib/storage/storage.engine.ts","../../../projects/core-api/src/lib/workflow/workflow.models.ts","../../../projects/core-api/src/lib/workflow/workflow-engine.ts","../../../projects/core-api/src/public-api.ts","../../../projects/core-api/src/zssz-soft-core-api.ts"],"sourcesContent":["import { User } from '@zssz-soft/common-api';\nimport { Entity, EntityModel } from '../entity';\n\nexport const AUDIT_FEATURE_KEY = 'audit_logs';\n\n/**\n * Audit log entry for tracking user actions\n */\nexport interface AuditLog {\n /** Unique audit log ID */\n id?: string;\n\n /** User who performed the action */\n user: User | string; // Can be User object or UID\n\n /** Action performed */\n action: AuditAction;\n\n /** Resource affected by the action */\n resource: AuditResource;\n\n /** Timestamp when action occurred */\n timestamp: Date;\n\n /** Session information */\n sessionId?: string;\n\n /** Request metadata */\n metadata: AuditMetadata;\n\n /** Action result */\n result: AuditResult;\n\n /** Additional context data */\n context?: Record<string, any>;\n}\n\n/**\n * Types of actions that can be audited\n */\nexport type AuditAction =\n // Authentication actions\n | 'auth.login'\n | 'auth.logout'\n | 'auth.register'\n | 'auth.password_reset'\n | 'auth.email_verification'\n\n // User management actions\n | 'user.create'\n | 'user.update'\n | 'user.delete'\n | 'user.role_change'\n | 'user.status_change'\n\n // Data actions\n | 'data.create'\n | 'data.read'\n | 'data.update'\n | 'data.delete'\n | 'data.export'\n | 'data.import'\n\n // System actions\n | 'system.configuration_change'\n | 'system.backup'\n | 'system.restore'\n\n // UI actions\n | 'ui.page_view'\n | 'ui.button_click'\n | 'ui.form_submit'\n | 'ui.theme_change'\n | 'ui.search'\n | 'ui.filter'\n | 'ui.download'\n | 'ui.upload'\n\n // Security actions\n | 'security.unauthorized_access'\n | 'security.permission_denied'\n | 'security.suspicious_activity'\n\n // Custom actions\n | string;\n\n/**\n * Resource types that can be audited\n */\nexport interface AuditResource {\n /** Type of resource */\n type: string;\n\n /** Resource identifier */\n id?: string;\n\n /** Resource name or description */\n name?: string;\n\n /** Parent resource if applicable */\n parent?: AuditResource;\n\n /** Additional resource metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Metadata associated with an audit action\n */\nexport interface AuditMetadata {\n /** IP address of the request */\n ipAddress?: string;\n\n /** User agent string */\n userAgent?: string;\n\n /** Geographic location */\n location?: {\n country?: string;\n region?: string;\n city?: string;\n coordinates?: {\n latitude: number;\n longitude: number;\n };\n };\n\n /** Request information */\n request?: {\n method?: string;\n url?: string;\n headers?: Record<string, string>;\n body?: any;\n };\n\n /** Response information */\n response?: {\n statusCode?: number;\n headers?: Record<string, string>;\n body?: any;\n };\n\n /** Performance metrics */\n performance?: {\n duration?: number;\n memoryUsage?: number;\n cpuUsage?: number;\n };\n\n /** Additional custom metadata */\n [key: string]: any;\n}\n\n/**\n * Result of an audited action\n */\nexport interface AuditResult {\n /** Whether the action was successful */\n success: boolean;\n\n /** Status code or error code */\n code?: string | number;\n\n /** Human-readable message */\n message?: string;\n\n /** Error details if action failed */\n error?: {\n type: string;\n message: string;\n stack?: string;\n };\n\n /** Changes made (for update actions) */\n changes?: {\n before?: any;\n after?: any;\n fields?: string[];\n };\n\n /** Additional result data */\n data?: any;\n}\n\n/**\n * Audit log query filters\n */\nexport interface AuditLogQuery {\n /** Filter by user */\n userId?: string;\n\n /** Filter by action */\n action?: AuditAction | AuditAction[];\n\n /** Filter by resource type */\n resourceType?: string;\n\n /** Filter by date range */\n dateRange?: {\n start: Date;\n end: Date;\n };\n\n /** Filter by success/failure */\n success?: boolean;\n\n /** Filter by session ID */\n sessionId?: string;\n\n /** Filter by IP address */\n ipAddress?: string;\n\n /** Pagination */\n limit?: number;\n offset?: number;\n\n /** Sorting */\n sortBy?: 'timestamp' | 'action' | 'user';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Audit log summary statistics\n */\nexport interface AuditLogStats {\n /** Total number of logs */\n totalLogs: number;\n\n /** Actions by type */\n actionCounts: Record<string, number>;\n\n /** Success rate */\n successRate: number;\n\n /** Most active users */\n topUsers: Array<{\n userId: string;\n actionCount: number;\n }>;\n\n /** Most common actions */\n topActions: Array<{\n action: string;\n count: number;\n }>;\n\n /** Date range covered */\n dateRange: {\n start: Date;\n end: Date;\n };\n}\n\nexport interface Audit {\n /** User who performed the action */\n user: User | string;\n /** Action performed */\n action: AuditAction;\n /** Resource affected by the action */\n resource: AuditResource;\n /** Timestamp when action occurred */\n timestamp: Date;\n /** Session information */\n sessionId?: string;\n /** Request metadata */\n metadata: AuditMetadata;\n /** Action result */\n result: AuditResult;\n /** Additional context data */\n context?: Record<string, any>;\n}\n\nexport type AuditEntity = Audit & Entity;\nexport type AuditEntityAdd = Omit<AuditEntity, 'uid'>;\nexport type AuditEntityUpdate = Partial<AuditEntity> & Entity;\nexport type AuditModel = Audit & EntityModel;\nexport type AuditModelAdd = Omit<AuditModel, 'uid'>;\nexport type AuditModelUpdate = Partial<AuditModel> & EntityModel;\n","import { Observable } from 'rxjs';\nimport {\n AuditLog,\n AuditAction,\n AuditResource,\n AuditLogQuery,\n AuditLogStats,\n} from './audit-log.models';\nimport { User } from '@zssz-soft/common-api';\n\n/**\n * Abstract interface for audit logging operations\n * This defines the contract for audit logging without implementation details\n */\nexport abstract class AuditService {\n /**\n * Log a user action with result\n * @param user User performing the action\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param result Action result (success/failure)\n * @param context Additional context data\n * @returns Observable with the audit log ID\n */\n abstract logAction(\n user: User,\n action: AuditAction,\n resource: AuditResource,\n result: 'success' | 'failure',\n context?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Log a successful action\n * @param user User performing the action\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param data Additional data about the action\n * @param context Additional context data\n * @returns Observable with the audit log ID\n */\n abstract logSuccess(\n user: User,\n action: AuditAction,\n resource: AuditResource,\n data?: any,\n context?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Log a failed action\n * @param user User performing the action\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param error Error that occurred\n * @param context Additional context data\n * @returns Observable with the audit log ID\n */\n abstract logFailure(\n user: User,\n action: AuditAction,\n resource: AuditResource,\n error: Error,\n context?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Log authentication events\n * @param user User involved in auth event\n * @param action Auth action performed\n * @param success Whether the auth action was successful\n * @param additionalData Additional auth-related data\n * @returns Observable with the audit log ID\n */\n abstract logAuthEvent(\n user: User,\n action: AuditAction,\n success: boolean,\n additionalData?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Query audit logs with filters\n * @param query Query filters\n * @returns Observable with array of audit logs\n */\n abstract queryLogs(query: AuditLogQuery): Observable<AuditLog[]>;\n\n /**\n * Get audit log statistics\n * @param timeRange Optional time range for statistics\n * @returns Observable with audit statistics\n */\n abstract getStats(timeRange?: { start: Date; end: Date }): Observable<AuditLogStats>;\n\n /**\n * Get audit logs for a specific user\n * @param userId User ID\n * @param limit Optional limit on number of logs\n * @returns Observable with array of user's audit logs\n */\n abstract getUserLogs(userId: string, limit?: number): Observable<AuditLog[]>;\n\n /**\n * Get recent audit logs\n * @param limit Number of recent logs to retrieve\n * @returns Observable with array of recent audit logs\n */\n abstract getRecentLogs(limit?: number): Observable<AuditLog[]>;\n}\n","import { InjectionToken, Signal } from '@angular/core';\n\nimport { AuthResult, AuthUser, UserRegistrationData } from './authentication.model';\n\nexport abstract class AuthenticationStoreService {\n abstract signOut(): Promise<AuthResult<void>>;\n\n abstract signInWithEmailAndPassword(email: string, password: string): Promise<void>;\n\n abstract signInWithGoogle(): Promise<AuthResult<AuthUser>>;\n\n abstract createUserWithEmailAndPassword(\n userData: UserRegistrationData,\n ): Promise<AuthResult<AuthUser>>;\n\n abstract sendPasswordResetEmail(email: string): Promise<void>;\n\n abstract updatePassword(newPassword: string): Promise<AuthResult<void>>;\n\n abstract updateEmail(newEmail: string): Promise<AuthResult<void>>;\n\n abstract getIdToken(forceRefresh: boolean): Promise<string | null>;\n\n abstract getStore(): AuthenticationStoreView;\n}\n\nexport interface AuthenticationStoreView {\n user: Signal<AuthUser | null>;\n isAuthenticated: Signal<boolean>;\n isLoading: Signal<boolean>;\n error: Signal<string | null>;\n isLoggedIn: Signal<boolean>;\n userDisplayName: Signal<string>;\n userInitials: Signal<string>;\n setUser(user: AuthUser | null): void;\n setLoading(isLoading: boolean): void;\n setError(error: string | null): void;\n clearError(): void;\n clearUser(): void;\n setInitialized(): void;\n}\n\nexport const AUTHENTICATION_STORE_SERVICE_TOKEN = new InjectionToken<AuthenticationStoreService>(\n 'AuthenticationStoreService',\n);\n\nexport const AUTHENTICATION_STORE_VIEW_TOKEN = new InjectionToken<AuthenticationStoreView>(\n 'AuthenticationStoreView',\n);\n","export interface AuthResult<T = any> {\n data?: T;\n error?: {\n code: AuthErrorCode;\n message: string;\n };\n success: boolean;\n}\n\nexport interface AuthState {\n error: string | null;\n isAuthenticated: boolean;\n loading: boolean;\n user: AuthUser | null;\n}\n\nexport interface AuthUser {\n createdAt?: string;\n customClaims?: Record<string, any>;\n displayName: string | null;\n email: string | null;\n emailVerified: boolean;\n lastSignInAt?: string;\n phoneNumber: string | null;\n photoURL: string | null;\n uid: string;\n}\n\nexport interface EmailPasswordCredentials {\n email: string;\n password: string;\n}\n\nexport interface UserRegistrationData extends EmailPasswordCredentials {\n displayName?: string;\n phoneNumber?: string;\n}\n\nexport type AuthCredentials = EmailPasswordCredentials;\n\nexport type AuthErrorCode =\n | 'auth/user-not-found'\n | 'auth/wrong-password'\n | 'auth/email-already-in-use'\n | 'auth/weak-password'\n | 'auth/invalid-email'\n | 'auth/user-disabled'\n | 'auth/too-many-requests'\n | 'auth/network-request-failed'\n | 'auth/popup-closed-by-user'\n | 'auth/popup-blocked'\n | 'auth/cancelled-popup-request'\n | 'auth/account-exists-with-different-credential'\n | 'unknown-error';\n\nexport type AuthMethod = 'signIn' | 'signUp' | 'signOut' | 'resetPassword' | 'verifyEmail';\n\nexport type AuthProvider = 'email' | 'google' | 'facebook';\n\nexport const initialAuthState: AuthState = {\n user: null,\n loading: true,\n isAuthenticated: false,\n error: null,\n};\n","import { Injectable, signal } from '@angular/core';\n\nimport {\n AuthResult,\n AuthState,\n AuthUser,\n EmailPasswordCredentials,\n initialAuthState,\n UserRegistrationData,\n} from './authentication.model';\n\n@Injectable()\nexport abstract class AuthenticationService {\n private readonly _authState = signal<AuthState>(initialAuthState);\n\n public readonly authState = this._authState.asReadonly();\n\n public readonly currentUser = this.authState;\n\n public readonly isAuthenticated = this.authState;\n\n public abstract createUserWithEmailAndPassword(\n userData: UserRegistrationData,\n ): Promise<AuthResult<AuthUser>>;\n\n public abstract generateUserWithUID(\n email: string,\n displayName?: string,\n ): Promise<AuthResult<AuthUser>>;\n\n public abstract generateUserWithUIDAndSendReset(\n email: string,\n displayName?: string,\n ): Promise<AuthResult<AuthUser>>;\n\n public abstract getIdToken(forceRefresh: boolean): Promise<string | null>;\n\n public abstract getIdTokenResult(forceRefresh: boolean): Promise<any>;\n\n public abstract sendEmailVerification(): Promise<AuthResult<void>>;\n\n public abstract sendPasswordResetEmail(email: string): Promise<void>;\n\n public abstract signInWithEmailAndPassword(credentials: EmailPasswordCredentials): Promise<void>;\n\n public abstract signInWithGoogle(): Promise<AuthResult<AuthUser>>;\n\n public abstract signOut(): Promise<AuthResult<void>>;\n\n public abstract updateEmail(newEmail: string): Promise<AuthResult<void>>;\n\n public abstract updatePassword(newPassword: string): Promise<AuthResult<void>>;\n\n public abstract updateProfile(\n profile: Partial<Pick<AuthUser, 'displayName' | 'photoURL'>>,\n ): Promise<AuthResult<void>>;\n}\n","import { InjectionToken, Provider } from '@angular/core';\n\nexport const DEFAULT_FIREBASE_CONFIG: FirebaseConfig = {\n apiKey: 'your-api-key',\n authDomain: 'your-project.firebaseapp.com',\n projectId: 'your-project-id',\n storageBucket: 'your-project.appspot.com',\n messagingSenderId: '123456789',\n appId: '1:123456789:web:abcdef123456',\n measurementId: 'G-XXXXXXXXXX',\n};\n\nexport const DEFAULT_FIREBASE_AUTH_CONFIG: FirebaseAuthConfig = {\n firebase: DEFAULT_FIREBASE_CONFIG,\n enableRegistration: true,\n enableSocialLogin: false,\n};\n\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\nexport interface SessionConfig {\n /** Inactivity timeout in milliseconds (default: 30 minutes) */\n inactivityTimeout: number;\n /** Warning before timeout in milliseconds (default: 5 minutes before timeout) */\n warningBeforeTimeout?: number;\n /** Events to track for activity (default: ['click', 'keypress', 'mousemove', 'touchstart']) */\n events?: string[];\n /** Whether to show warning dialog before logout */\n showWarningDialog?: boolean;\n}\n\nexport interface UserConfig {\n /** Firestore collection name for user documents (default: 'user') */\n collection?: string;\n /** Default role ID to assign to new OAuth users */\n defaultRoleId: string;\n /** Whether to automatically create user document on OAuth login (default: true) */\n autoCreate?: boolean;\n}\n\nexport interface FirebaseAuthConfig {\n firebase: FirebaseConfig;\n enableRegistration?: boolean;\n enableSocialLogin?: boolean;\n enabledProviders?: ('email' | 'google' | 'facebook')[];\n session?: SessionConfig;\n /** Configuration for automatic user document creation on OAuth login */\n userDocument?: UserConfig;\n}\n\nexport const FIREBASE_CONFIG = new InjectionToken<FirebaseConfig>('FIREBASE_CONFIG');\n\nexport const FIREBASE_AUTH_CONFIG = new InjectionToken<FirebaseAuthConfig>('FIREBASE_AUTH_CONFIG');\n\nexport function provideFirebaseAuthConfig(config: FirebaseAuthConfig): Provider {\n return { provide: FIREBASE_AUTH_CONFIG, useValue: config || DEFAULT_FIREBASE_AUTH_CONFIG };\n}\n","import { InjectionToken } from '@angular/core';\n\nimport {\n BootstrapStatusResult,\n CloudFunctionResult,\n CreateUserAndSendPasswordResetResult,\n CreateUserResponse,\n} from './cloud.models';\n\nexport abstract class CloudService {\n abstract checkBootstrapStatus(): Promise<BootstrapStatusResult>;\n\n abstract createUserAndSendPasswordReset(\n email: string,\n displayName: string,\n sendEmail: boolean,\n ): Promise<CreateUserAndSendPasswordResetResult>;\n\n abstract sendPasswordResetEmail(email: string): Promise<CloudFunctionResult>;\n\n abstract sendWelcomeEmail(\n email: string,\n displayName: string,\n firstName?: string,\n lastName?: string,\n roles?: string[],\n ): Promise<CloudFunctionResult>;\n\n abstract systemBootstrap(\n adminEmail: string,\n adminDisplayName?: string,\n adminPassword?: string,\n ): Promise<CloudFunctionResult>;\n\n abstract registerUserWithWelcomeEmail(\n email: string,\n password: string,\n firstName: string,\n lastName: string,\n options?: {\n displayName?: string;\n phoneNumber?: string;\n photoURL?: string;\n disabled?: boolean;\n loginUrl?: string;\n },\n ): Promise<CreateUserResponse>;\n\n abstract registerUserWithoutEmail(\n email: string,\n password: string,\n firstName: string,\n lastName: string,\n options?: {\n displayName?: string;\n phoneNumber?: string;\n photoURL?: string;\n disabled?: boolean;\n },\n ): Promise<CreateUserResponse>;\n\n abstract generateThumbnail(params: {\n path: string;\n documentId?: string;\n maxWidth?: number;\n maxHeight?: number;\n force?: boolean;\n }): Promise<\n CloudFunctionResult & {\n thumbPath?: string;\n documentUpdated?: boolean;\n originalFilePath?: string;\n }\n >;\n}\n\nexport const CLOUD_SERVICE_TOKEN = new InjectionToken<CloudService>('CloudService');\n","import { InjectionToken, Provider } from '@angular/core';\n\nexport type AppBootstrapConfig = {\n bootstrapAdmin: {\n email: string;\n displayName: string;\n firstName: string;\n lastName: string;\n language: string;\n roles: string[];\n };\n};\n\nexport const APP_BOOTSTRAP_CONFIG = new InjectionToken<AppBootstrapConfig>('APP_BOOTSTRAP_CONFIG');\n\nexport function provideAppBootstrapConfig(config: AppBootstrapConfig): Provider {\n return { provide: APP_BOOTSTRAP_CONFIG, useValue: config };\n}\n\nexport const DEFAULT_APP_BOOTSTRAP_CONFIG: AppBootstrapConfig = {\n bootstrapAdmin: {\n email: 'zsagia@gmail.com',\n displayName: 'Bootstrap Admin',\n firstName: 'Bootstrap',\n lastName: 'Admin',\n language: 'en',\n roles: ['ADMIN', 'USER'],\n },\n};\n","export const DOCUMENTS_KEYS = {\n ház: 'ház',\n hálószoba: 'hálószoba',\n földszint: 'földszint',\n emelet: 'emelet',\n nappali: 'nappali',\n étkező: 'étkező',\n konyha: 'konyha',\n fürdőszoba: 'fürdőszoba',\n kültér: 'kültér',\n stég: 'stég',\n parkoló: 'parkoló',\n bográcsozó: 'bográcsozó',\n terasz: 'terasz',\n wc: 'wc',\n};\n","import { InjectionToken } from '@angular/core';\n\nexport interface NotificationConfig {\n closable?: boolean;\n life?: number;\n sticky?: boolean;\n}\n\nexport const NOTIFICATION_CONFIG_TOKEN = new InjectionToken<NotificationConfig>(\n 'NotificationConfig',\n);\n\nexport function provideNotificationConfig(config?: NotificationConfig) {\n return { provide: NOTIFICATION_CONFIG_TOKEN, useValue: config || DEFAULT_NOTIFICATION_CONFIG };\n}\n\nexport const DEFAULT_NOTIFICATION_CONFIG: NotificationConfig = {\n closable: true,\n life: 5000,\n sticky: false,\n};\n","import { WelcomeEmailData } from './email.models';\n\n/**\n * Email service for sending welcome and notification emails\n * This can be implemented with different providers\n */\nexport abstract class EmailService {\n /**\n * Send custom notification email\n * @param to Recipient email\n * @param subject Email subject\n * @param body Email body (HTML or text)\n * @param data Optional template data\n * @returns Promise that resolves when email is sent\n */\n public abstract sendNotificationEmail(\n to: string,\n subject: string,\n body: string,\n data?: Record<string, any>,\n ): Promise<void>;\n\n /**\n * Send welcome email to newly created user\n * @param userData User data for the email\n * @returns Promise that resolves when email is sent\n */\n public abstract sendWelcomeEmail(userData: WelcomeEmailData): Promise<void>;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { User } from '@zssz-soft/common-api';\n\nexport interface EmailConfig {\n fromEmail: string;\n fromName: string;\n mailersendApiKey: string;\n}\n\nexport interface SendPasswordResetEmailData {\n customMessage?: string;\n email: string;\n}\n\nexport type CreateUserData = Omit<WelcomeEmailData, 'firstName' | 'lastName'> & {\n sendEmail?: boolean;\n};\n\nexport type WelcomeEmailData = Omit<User, 'language' | 'phone' | 'photoUrl' | 'uid'> & {\n roles?: string[];\n temporaryPassword?: string;\n};\n\nexport type WelcomeEmailDataWithConfig = WelcomeEmailData & Omit<EmailConfig, 'mailersendApiKey'>;\n\nexport const EMAIL_CONFIG = new InjectionToken<EmailConfig>('EMAIL_CONFIG');\n","import { FormGroup } from '@angular/forms';\n\nimport { Entity, EntityAdd, EntityUpdate } from '../entity.models';\n\nexport abstract class EntityFormLogic<\n E extends Entity,\n EA extends EntityAdd,\n EU extends EntityUpdate,\n> {\n public abstract cancel(): void;\n\n public abstract createEntity(formValue: any): void;\n\n public abstract createFormGroup(entity?: E): FormGroup;\n\n public abstract getEntityById(entityId: string): E | undefined;\n\n public abstract updateEntity(entityId: string, formValue: any): void;\n\n public abstract validateAndProcessForm(\n form: FormGroup | null,\n entityId: string | null,\n ): { isValid: boolean; formValue?: any; entityId?: string | null };\n}\n","import { Signal } from '@angular/core';\n\nimport { User } from '@zssz-soft/common-api';\nimport {\n Entity,\n EntityAdd,\n EntityModel,\n EntityModelAdd,\n EntityModelUpdate,\n EntityUpdate,\n} from './entity.models';\n\nexport abstract class EntityAdapter<\n E extends Entity,\n EA extends EntityAdd,\n EU extends EntityUpdate,\n EM extends EntityModel,\n EMA extends EntityModelAdd,\n EMU extends EntityModelUpdate,\n> {\n public user!: Signal<User | undefined>;\n\n public abstract _sort(a: E, b: E): number;\n\n public abstract convertEntityAddToModelAdd(entityAdd: EA): EMA;\n\n public abstract convertEntityToModel(entity: E): EM;\n\n public abstract convertEntityUpdateToModelUpdate(entity: EU): EMU;\n\n public abstract convertModelToEntity(model: EM): E;\n\n public abstract convertModelUpdateToEntityUpdate(model: EMU): EU;\n}\n","import { Observable } from 'rxjs';\n\nimport { KeyValue } from '@angular/common';\nimport { CursorPaginatedResult, QueryOptions } from '@zssz-soft/common-api';\nimport { Entity, EntityAdd, EntityUpdate } from './entity.models';\n\n/**\n * Abstract base class for entity effects\n *\n * Design Pattern: Template Method Pattern\n * - Definiálja az entity műveletek absztrakt szerződését\n * - A konkrét implementációk a domain-specifikus logikát adják\n *\n * Effects felelősségei:\n * - Adapter hívások koordinálása (Entity <-> Model konverzió)\n * - Error handling és logging\n * - Repository művelet delegálás\n */\nexport abstract class EntityEffect<\n E extends Entity,\n EA extends EntityAdd,\n EU extends EntityUpdate,\n> {\n public abstract createEntity$(entityAdd: EA): Observable<E>;\n public abstract deleteEntity$(entity: E): Observable<E>;\n public abstract listEntities$(\n pathParams: string[],\n queryParams: KeyValue<string, string>[],\n ): Observable<E[]>;\n public abstract loadEntity$(entityId: string): Observable<E>;\n public abstract updateEntity$(entityUpdate: EU): Observable<EU>;\n\n /**\n * Query entities with cursor-based pagination\n * Optional method - can be overridden by domain effects for optimized queries\n *\n * @param options Query options including filters, sorting, and pagination\n * @returns Observable of cursor-paginated result\n */\n public queryCursorPaginated$(_options: QueryOptions): Observable<CursorPaginatedResult<E>> {\n throw new Error('queryCursorPaginated$ not implemented. Override in domain effect.');\n }\n\n /**\n * Query entities by parent ID (for subcollections)\n * Optional method - can be overridden by effects that handle subcollections\n *\n * @param parentId The ID of the parent entity\n * @param options Optional query options\n * @returns Observable of entities belonging to parent\n */\n public queryByParentId$(_parentId: string, _options?: QueryOptions): Observable<E[]> {\n throw new Error('queryByParentId$ not implemented. Override in domain effect.');\n }\n}\n","import { Observable } from 'rxjs';\n\nimport { KeyValue } from '@angular/common';\n\nimport { PaginatedResult, QueryOptions, SearchParam } from '@zssz-soft/common-api';\nimport { EntityModel, EntityModelAdd, EntityModelUpdate } from '../entity/entity.models';\n\n/**\n * Batch operation interface\n */\nexport interface BatchOperation<T> {\n type: 'create' | 'update' | 'delete';\n uid?: string;\n data?: Partial<T>;\n}\n\n/**\n * Context for resolving subcollection paths in Firestore\n * Enables repositories to work with nested collections (e.g., apartments/{id}/rules)\n */\nexport interface SubcollectionContext {\n /**\n * Name of parent collection (e.g., 'apartments')\n */\n parentCollection: string;\n\n /**\n * Field name on the entity that contains parent ID (e.g., 'entityId', 'apartmentId')\n */\n parentIdField: string;\n\n /**\n * Name of subcollection (e.g., 'rules')\n */\n subcollection: string;\n}\n\n/**\n * Builder function type for dynamic collection paths\n * Takes optional entity data and returns the resolved collection path\n */\nexport type CollectionPathBuilder = (entityData?: Partial<EntityModel>) => string;\n\n/**\n * Abstract base repository interface for database operations\n * This interface defines the contract that all data repositories must implement\n */\nexport abstract class Repository<\n EM extends EntityModel,\n EMA extends EntityModelAdd,\n EMU extends EntityModelUpdate,\n> {\n abstract create$(modelAdd: EMA): Observable<EM>;\n\n abstract list$(pathParams: string[], queryParams: KeyValue<string, string>[]): Observable<EM[]>;\n\n abstract listByIds$(ids: string[]): Observable<EM[]>;\n\n abstract load$(uid: string): Observable<EM | undefined>;\n\n abstract update$(modelUpdate: EMU): Observable<EMU>;\n\n abstract delete$(model: EM): Observable<EM>;\n\n abstract query(options: QueryOptions): Observable<EM[]>;\n\n abstract queryPaginated(\n options: QueryOptions,\n pageSize: number,\n lastDocument?: EM,\n ): Observable<PaginatedResult<EM>>;\n\n abstract count(options?: QueryOptions): Observable<number>;\n\n abstract exists(uid: string): Observable<boolean>;\n\n abstract batch(operations: BatchOperation<EM>[]): Observable<void>;\n\n abstract search$(params: SearchParam[]): Observable<EM[]>;\n\n /**\n * Query entities by parent ID (for subcollections)\n * Optional - only implemented for repositories with subcollection context\n * @param parentId The ID of the parent entity\n * @param options Optional query options for filtering/sorting\n */\n queryByParentId?(parentId: string, options?: QueryOptions): Observable<EM[]>;\n}\n","import { EntityModel, EntityModelAdd, EntityModelUpdate } from '../entity/entity.models';\nimport { Repository } from './repository.models';\n\nexport abstract class RepositoryEngine<\n E extends EntityModel,\n EA extends EntityModelAdd,\n EU extends EntityModelUpdate,\n> extends Repository<E, EA, EU> {}\n","import { InjectionToken } from '@angular/core';\n\nimport { EntityModel, EntityModelAdd, EntityModelUpdate } from '../entity/entity.models';\nimport { RepositoryEngine } from './repository.engine';\nimport { SubcollectionContext } from './repository.models';\n\n/**\n * Type for a factory function that creates a repository engine\n */\nexport type RepositoryEngineCreator = <\n R extends EntityModel,\n S extends EntityModelAdd,\n T extends EntityModelUpdate,\n>(\n featureKey: string,\n subcollectionContext?: SubcollectionContext,\n) => RepositoryEngine<R, S, T>;\n\n/**\n * Injection token for the Firestore engine creator function\n * This allows the actual Firebase implementation to be provided at the app level\n * while keeping the factory testable\n */\nexport const FIRESTORE_ENGINE_CREATOR = new InjectionToken<RepositoryEngineCreator>(\n 'FirestoreEngineCreator',\n);\n","import { Repository } from '../repository';\nimport { EntityModel, EntityModelAdd, EntityModelUpdate } from './entity.models';\n\nexport abstract class EntityRepository<\n EM extends EntityModel,\n EMA extends EntityModelAdd,\n EU extends EntityModelUpdate,\n> extends Repository<EM, EMA, EU> {}\n","export enum ErrorType {\n HttpError = 'http-error',\n}\n\nexport interface ErrorOptions {\n type: ErrorType;\n viewable?: boolean;\n}\n\nexport class KError extends Error {\n public options: ErrorOptions;\n\n constructor(message: string, error: Error, options: ErrorOptions) {\n super(message);\n\n this.stack = error.stack;\n this.options = options;\n }\n}\n","import { Message } from '@zssz-soft/common-api';\nimport { KError } from './error.models';\n\nexport abstract class ErrorUtilService {\n public abstract createErrorMessage(error: KError): Message;\n\n public abstract throwEffectError(message: string, error: unknown, viewable?: boolean): KError;\n}\n","import { PipeTransform } from '@angular/core';\n\nexport abstract class DateTimePipeBase implements PipeTransform {\n public abstract transform(value: any, ...args: unknown[]): string;\n}\n","export abstract class DateUtil {\n public abstract createActionTime(minute: number, second: number): number;\n public abstract createFullTime(startTime: number, minute: number, second: number): number;\n public abstract getDateRange(firstDate: Date, lastDate: Date): Date[];\n public abstract getDateRangeWithoutBorder(firstDate: Date, lastDate: Date): Date[];\n public abstract getDateRangeAsString(dates: Date[], format: string): string[];\n public abstract getDateRangeLength(firstDate: Date, lastDate: Date): number;\n public abstract getFormattedDate(date: Date, format: string): string;\n public abstract getNextDay(baseDate: Date): Date;\n public abstract getNow(): number;\n public abstract getPreviousDay(baseDate: Date): Date;\n public abstract getToday(): Date;\n public abstract getTomorrow(): Date;\n}\n","import { Observable } from 'rxjs';\n\nimport { HttpClient } from '@angular/common/http';\nimport { Translation } from '@jsverse/transloco';\nimport { DateFormatOptions } from '@jsverse/transloco-locale';\n\nimport { HashMapModel } from './hash-map.model';\nimport { I18nText } from './i18-text';\nimport { LanguagesEnum } from './languages.enum';\n\nexport abstract class I18nService {\n protected defaultPath!: string;\n\n public constructor(protected httpClient: HttpClient) {}\n\n public abstract activeLanguageChanges$(): Observable<string>;\n\n public abstract getActiveLang(): LanguagesEnum;\n\n public abstract getActiveLangAsString(): string;\n\n public abstract getAvailableLanguages(): string[];\n\n public abstract getActiveLocale(): string;\n\n public abstract getDefaultI18nText(): I18nText;\n\n public abstract getValue(property: any, locale?: string): string;\n\n public abstract getValueByLanguage(i18nText: I18nText, language?: string): string;\n\n public abstract init(language: string): void;\n\n public abstract load(): Observable<Translation>;\n\n public abstract localizeDate(\n date: string | Date,\n locale: string,\n format: DateFormatOptions,\n ): string;\n\n public abstract nameComponentShorter(firstName: string, lastName: string): string[];\n\n public abstract translate<T>(\n key: string | string[],\n params?: HashMapModel<unknown>,\n lang?: string,\n ): string;\n\n public abstract selectTranslate$(\n key: string,\n params?: HashMapModel<unknown>,\n lang?: string,\n ): Observable<string>;\n}\n","import { I18nText } from './i18-text';\nimport { LanguagesEnum } from './languages.enum';\n\nexport abstract class I18nUtil {\n public abstract getActiveLang(): LanguagesEnum;\n public abstract getDefaultI18nText(): I18nText;\n public abstract updateLanguage(language: string): void;\n public abstract getValueByLanguage(i18nText: I18nText, language?: string): string;\n public abstract getCurrentLocale(): string;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport enum LanguagesEnum {\n de = 'de',\n en = 'en',\n hu = 'hu',\n hr = 'hr',\n ro = 'ro',\n sk = 'sk',\n sl = 'sl',\n sr = 'sr',\n uk = 'uk',\n}\n\nexport const LANGUAGES_TOKEN = new InjectionToken<string[]>('LANGUAGES');\n\nexport const DEFAULT_LANGUAGE_TOKEN = new InjectionToken<string>('DEFAULT_LANGUAGE');\n","export type IconType = 'material' | 'svg' | 'primeicons';\n\nexport type Icon = {\n name: string;\n class: string;\n type?: IconType;\n svgContent?: string;\n};\n\n/**\n * Helper function to create a PrimeIcons icon\n * @param name - PrimeIcons icon name without 'pi-' prefix (e.g., 'search', 'user', 'home')\n */\nexport function primeIcon(name: string): Icon {\n return {\n name,\n class: `pi pi-${name}`,\n type: 'primeicons',\n };\n}\n\nexport const materialIcons: Icon[] = [\n { name: 'ac_unit', class: 'material-symbols-outlined' },\n { name: 'airport_shuttle', class: 'material-symbols-outlined' },\n { name: 'apartment', class: 'material-symbols-outlined' },\n { name: 'balcony', class: 'material-symbols-outlined' },\n { name: 'bathroom', class: 'material-symbols-outlined' },\n { name: 'bathtub', class: 'material-symbols-outlined' },\n { name: 'bed', class: 'material-symbols-outlined' },\n { name: 'bedroom_parent', class: 'material-symbols-outlined' },\n { name: 'bedroom_child', class: 'material-symbols-outlined' },\n { name: 'cable', class: 'material-symbols-outlined' },\n { name: 'camera_outdoor', class: 'material-symbols-outlined' },\n { name: 'chair', class: 'material-symbols-outlined' },\n { name: 'chair_alt', class: 'material-symbols-outlined' },\n { name: 'child_friendly', class: 'material-symbols-outlined' },\n { name: 'coffee', class: 'material-symbols-outlined' },\n { name: 'cooking', class: 'material-symbols-outlined' },\n { name: 'coffee_maker', class: 'material-symbols-outlined' },\n { name: 'countertops', class: 'material-symbols-outlined' },\n { name: 'cottage', class: 'material-symbols-outlined' },\n { name: 'curtains', class: 'material-symbols-outlined' },\n { name: 'deck', class: 'material-symbols-outlined' },\n { name: 'dining', class: 'material-symbols-outlined' },\n { name: 'dresser', class: 'material-symbols-outlined' },\n { name: 'dry_cleaning', class: 'material-symbols-outlined' },\n { name: 'flatware', class: 'material-symbols-outlined' },\n { name: 'gamepad', class: 'material-symbols-outlined' },\n { name: 'garden', class: 'material-symbols-outlined' },\n { name: 'grass', class: 'material-symbols-outlined' },\n { name: 'holiday_village', class: 'material-symbols-outlined' },\n { name: 'home', class: 'material-symbols-outlined' },\n { name: 'hotel', class: 'material-symbols-outlined' },\n { name: 'house', class: 'material-symbols-outlined' },\n { name: 'iron', class: 'material-symbols-outlined' },\n { name: 'kettle', class: 'material-symbols-outlined' },\n { name: 'key', class: 'material-symbols-outlined' },\n { name: 'king_bed', class: 'material-symbols-outlined' },\n { name: 'kitchen', class: 'material-symbols-outlined' },\n { name: 'language', class: 'material-symbols-outlined' },\n { name: 'lease', class: 'material-symbols-outlined' },\n { name: 'live_tv', class: 'material-symbols-outlined' },\n { name: 'living', class: 'material-symbols-outlined' },\n { name: 'local_gas_station', class: 'material-symbols-outlined' },\n { name: 'local_laundry_service', class: 'material-symbols-outlined' },\n { name: 'local_parking', class: 'material-symbols-outlined' },\n { name: 'location_city', class: 'material-symbols-outlined' },\n { name: 'login', class: 'material-symbols-outlined' },\n { name: 'logout', class: 'material-symbols-outlined' },\n { name: 'medical_services', class: 'material-symbols-outlined' },\n { name: 'microwave', class: 'material-symbols-outlined' },\n { name: 'mop', class: 'material-symbols-outlined' },\n { name: 'other_houses', class: 'material-symbols-outlined' },\n { name: 'outdoor_grill', class: 'material-symbols-outlined' },\n { name: 'oven', class: 'material-symbols-outlined' },\n { name: 'pets', class: 'material-symbols-outlined' },\n { name: 'phishing', class: 'material-symbols-outlined' },\n { name: 'pool', class: 'material-symbols-outlined' },\n { name: 'rent', class: 'material-symbols-outlined' },\n { name: 'restaurant', class: 'material-symbols-outlined' },\n { name: 'roller_shades', class: 'material-symbols-outlined' },\n { name: 'shower', class: 'material-symbols-outlined' },\n { name: 'single_bed', class: 'material-symbols-outlined' },\n { name: 'skillet', class: 'material-symbols-outlined' },\n { name: 'skillet_cooktop', class: 'material-symbols-outlined' },\n { name: 'smoke_free', class: 'material-symbols-outlined' },\n { name: 'soap', class: 'material-symbols-outlined' },\n { name: 'sports_esports', class: 'material-symbols-outlined' },\n { name: 'stairs', class: 'material-symbols-outlined' },\n { name: 'table_bar', class: 'material-symbols-outlined' },\n { name: 'table_lamp', class: 'material-symbols-outlined' },\n { name: 'table_restaurant', class: 'material-symbols-outlined' },\n { name: 'toys', class: 'material-symbols-outlined' },\n { name: 'tv', class: 'material-symbols-outlined' },\n { name: 'tv_guide', class: 'material-symbols-outlined' },\n { name: 'unpaved_road', class: 'material-symbols-outlined' },\n { name: 'yard', class: 'material-symbols-outlined' },\n { name: 'vacuum', class: 'material-symbols-outlined' },\n { name: 'wall_art', class: 'material-symbols-outlined' },\n { name: 'warehouse', class: 'material-symbols-outlined' },\n { name: 'wash', class: 'material-symbols-outlined' },\n { name: 'water', class: 'material-symbols-outlined' },\n { name: 'water_drop', class: 'material-symbols-outlined' },\n { name: 'waves', class: 'material-symbols-outlined' },\n { name: 'wc', class: 'material-symbols-outlined' },\n { name: 'wifi', class: 'material-symbols-outlined' },\n { name: 'wine_bar', class: 'material-symbols-outlined' },\n { name: 'window', class: 'material-symbols-outlined' },\n];\n\n/**\n * Custom SVG icons for items not available in Material Symbols\n */\nexport const customSvgIcons: Icon[] = [\n {\n name: 'towel',\n class: 'custom-svg-icon',\n type: 'svg',\n svgContent: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1v-1h14v1c0 .55-.45 1-1 1zm1-4H5V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v9z\"/><path d=\"M7 8h10v2H7zm0 3h10v2H7z\"/></svg>`,\n },\n {\n name: 'bathrobe',\n class: 'custom-svg-icon',\n type: 'svg',\n svgContent: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M21.6 18.2L13 11.75v-.91c1.65-.49 3-1.9 3-3.59 0-2.07-1.79-3.75-4-3.75S8 5.18 8 7.25c0 1.69 1.35 3.1 3 3.59v.91l-8.6 6.45c-.25.19-.4.49-.4.8v2c0 .55.45 1 1 1h2v-2.5l5-3.75v6.25H8v2h8v-2h-2V13.5l5 3.75V20h2v-1c0-.31-.15-.61-.4-.8zM12 8c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></svg>`,\n },\n {\n name: 'slippers',\n class: 'custom-svg-icon',\n type: 'svg',\n svgContent: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4 16c0 1.1.9 2 2 2h5v-2H6v-4H4v4zm14-4v4h-5v2h5c1.1 0 2-.9 2-2v-4h-2zM12 4C9.79 4 8 5.79 8 8h2c0-1.1.9-2 2-2s2 .9 2 2h2c0-2.21-1.79-4-4-4z\"/><circle cx=\"9\" cy=\"13\" r=\"1\"/><circle cx=\"15\" cy=\"13\" r=\"1\"/></svg>`,\n },\n];\n\n/**\n * All available icons (Material + Custom SVG)\n */\nexport const allIcons: Icon[] = [...materialIcons, ...customSvgIcons];\n","import { User } from '@zssz-soft/common-api';\nimport { AuditAction, AuditResource } from '../audit/audit-log.models';\n\n/**\n * Abstract interface for logging operations\n * This defines the contract for logging without implementation details\n */\nexport abstract class Logger {\n /**\n * Set the current user for audit logging\n * @param user Current authenticated user\n */\n abstract setCurrentUser(user: User | null): void;\n\n /**\n * Get the current user\n * @returns Current user or null\n */\n abstract getCurrentUser(): User | null;\n\n /**\n * Log trace level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract trace(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log debug level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract debug(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log info level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract info(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log warning level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract warn(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log error level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract error(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log fatal level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract fatal(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Audit user actions with automatic success/failure logging\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param success Whether the action was successful\n * @param data Additional action data\n * @param context Additional context\n */\n abstract auditUserAction(\n action: AuditAction,\n resource: AuditResource,\n success: boolean,\n data?: any,\n context?: Record<string, any>,\n ): void;\n\n /**\n * Audit authentication events\n * @param user User involved in auth event\n * @param action Auth action performed\n * @param success Whether the auth action was successful\n * @param additionalData Additional auth-related data\n */\n abstract auditAuthEvent(\n user: User,\n action: AuditAction,\n success: boolean,\n additionalData?: Record<string, any>,\n ): void;\n\n /**\n * Audit UI interactions\n * @param action UI action performed\n * @param component Component where action occurred\n * @param data Additional UI data\n * @param context Additional context\n */\n abstract auditUIAction(\n action: string,\n component: string,\n data?: any,\n context?: Record<string, any>,\n ): void;\n\n /**\n * Audit data operations\n * @param operation Type of data operation\n * @param resourceType Type of resource\n * @param resourceId Resource identifier\n * @param success Whether operation was successful\n * @param data Additional operation data\n * @param context Additional context\n */\n abstract auditDataOperation(\n operation: 'create' | 'read' | 'update' | 'delete',\n resourceType: string,\n resourceId?: string,\n success?: boolean,\n data?: any,\n context?: Record<string, any>,\n ): void;\n\n /**\n * Log user action for tracking\n * @param component Component where action occurred\n * @param action Action performed\n * @param data Additional action data\n */\n abstract logUserAction(component: string, action: string, data?: any): void;\n\n /**\n * Log performance metrics\n * @param operation Operation being measured\n * @param duration Duration in milliseconds\n * @param component Component where operation occurred\n */\n abstract logPerformance(operation: string, duration: number, component?: string): void;\n\n /**\n * Log HTTP requests\n * @param method HTTP method\n * @param url Request URL\n * @param status Response status code\n * @param duration Request duration in milliseconds\n */\n abstract logHttpRequest(method: string, url: string, status: number, duration: number): void;\n\n abstract logComponentLifecycle(component: string, lifecycle: string): void;\n abstract logThemeChangeAudit(from: string, to: string): void;\n}\n","export interface LoggerEnvironmentConfig {\n production: boolean;\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n enableConsoleLogging?: boolean;\n enableStorageLogging?: boolean;\n maxStoredLogs?: number;\n}\n\n/**\n * Log levels for the logger\n */\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport interface LoggerConfig {\n level: LogLevel;\n environment: 'development' | 'production' | 'test';\n enableConsole: boolean;\n}\n\nexport interface LogEntry {\n timestamp: string;\n level: string;\n message: string;\n data?: any;\n component?: string;\n action?: string;\n}\n\n// Injection token for environment configuration\nexport const LOGGER_ENVIRONMENT = 'LOGGER_ENVIRONMENT';\n\n/**\n * Decorator options for method logging\n */\nexport interface LogMethodOptions {\n /** Component name for logging context */\n component?: string;\n /** Log level to use */\n level?: 'trace' | 'debug' | 'info' | 'warn' | 'error';\n /** Whether to log method entry */\n logEntry?: boolean;\n /** Whether to log method exit */\n logExit?: boolean;\n /** Whether to log method duration */\n logDuration?: boolean;\n /** Additional context data */\n context?: Record<string, any>;\n}\n\n/**\n * Decorator options for user action logging\n */\nexport interface LogUserActionOptions {\n /** Component name */\n component: string;\n /** Action name - if not provided, method name will be used */\n action?: string;\n /** Additional data extractor function */\n dataExtractor?: (args: any[]) => any;\n}\n\n/**\n * Decorator options for data operation auditing\n */\nexport interface LogDataOperationOptions {\n /** Operation type */\n operation: 'create' | 'read' | 'update' | 'delete';\n /** Resource type */\n resourceType: string;\n /** Function to extract resource ID from method arguments */\n resourceIdExtractor?: (args: any[]) => string | undefined;\n /** Function to extract operation data from method arguments */\n dataExtractor?: (args: any[]) => any;\n /** Component name for context */\n component?: string;\n}\n\n/**\n * Decorator options for UI action auditing\n */\nexport interface LogUIActionOptions {\n /** Component name */\n component: string;\n /** Action name - if not provided, method name will be used */\n action?: string;\n /** Function to extract UI data from method arguments */\n dataExtractor?: (args: any[]) => any;\n}\n","import { Observable } from 'rxjs';\nimport type {\n StorageFile,\n StorageUploadOptions,\n StorageListOptions,\n StorageListResult,\n StorageDeleteOptions,\n} from './storage.models';\n\nexport abstract class StorageEngine {\n /**\n * Upload a file to storage\n */\n abstract upload(\n path: string,\n file: File | Blob,\n options?: StorageUploadOptions,\n ): Observable<StorageFile>;\n\n /**\n * Download a file as blob\n */\n abstract download(path: string): Observable<Blob>;\n\n /**\n * Get download URL for a file\n */\n abstract getDownloadUrl(path: string): Observable<string>;\n\n /**\n * Get file metadata\n */\n abstract getMetadata(path: string): Observable<StorageFile>;\n\n /**\n * List files in a directory\n */\n abstract list(path: string, options?: StorageListOptions): Observable<StorageListResult>;\n\n /**\n * Delete a file or directory\n */\n abstract delete(path: string, options?: StorageDeleteOptions): Observable<void>;\n\n /**\n * Check if file exists\n */\n abstract exists(path: string): Observable<boolean>;\n\n /**\n * Copy a file\n */\n abstract copy(sourcePath: string, destinationPath: string): Observable<StorageFile>;\n\n /**\n * Move a file\n */\n abstract move(sourcePath: string, destinationPath: string): Observable<StorageFile>;\n}\n","/**\n * Workflow Type Definitions\n *\n * These are the core workflow types used by entities that participate in workflows.\n * The actual workflow engine and services are in the 'workflow' library.\n */\n\nimport type { Entity, EntityAdd, EntityUpdate } from '../entity/entity.models';\n\nexport type WorkflowId = string;\nexport type StateId = string;\nexport type TransitionId = string;\n\n/**\n * Workflow summary stored in the parent entity (e.g., BookingEntity).\n * Contains only the current state and metadata for efficient queries.\n * The full history is stored in the workflow_history subcollection.\n */\nexport interface WorkflowSummary {\n workflowDefinitionId: WorkflowId;\n currentState: StateId;\n initialState: StateId;\n stateCount: number;\n lastTransitionAt: string;\n lastTransitionBy: string;\n}\n\n/**\n * Interface for entities that can participate in workflows.\n * Extend your entity with this interface to make it workflowable.\n *\n * @example\n * ```typescript\n * interface BookingEntity extends Entity, Workflowable {\n * // ... booking fields\n * }\n * ```\n */\nexport interface Workflowable {\n workflow?: WorkflowSummary;\n}\n\n/**\n * Type helper for entities that require workflow to be present.\n */\nexport type WithWorkflow<T extends Workflowable> = T & { workflow: WorkflowSummary };\n\n/**\n * Core data fields for a workflow history entry (without Entity base fields).\n */\nexport interface WorkflowHistoryEntryData {\n bookingId: string;\n sequence: number;\n from: StateId;\n to: StateId;\n transitionId: TransitionId;\n changedBy: string;\n changedAt: string;\n comment?: string;\n payload?: unknown;\n}\n\nexport const WORKFLOW_HISTORY_FEATURE_KEY = 'workflow_history';\n\n/**\n * Workflow history entry entity stored in the subcollection.\n * Extends Entity to include uid and meta for Firestore compatibility.\n */\nexport interface WorkflowHistoryEntry extends Entity, WorkflowHistoryEntryData {}\n\n/**\n * Type for adding a new workflow history entry.\n * uid is auto-generated, meta is provided by the caller.\n */\nexport type WorkflowHistoryEntryAdd = EntityAdd & WorkflowHistoryEntryData;\n\n/**\n * Type for updating workflow history entries.\n * NOTE: Updates are NOT allowed - this type exists only for type system compatibility.\n */\nexport type WorkflowHistoryEntryUpdate = EntityUpdate & Partial<WorkflowHistoryEntryData>;\n\n/**\n * Model types for Firestore storage.\n */\nexport type WorkflowHistoryModel = WorkflowHistoryEntry;\nexport type WorkflowHistoryModelAdd = WorkflowHistoryEntryAdd;\n","/**\n * Abstract WorkflowEngine - defines the contract for workflow operations\n *\n * Implementations should handle:\n * - Transition execution with guards and actions\n * - Permission and role checking\n * - Workflow history management\n */\n\nimport {\n StateId,\n TransitionId,\n Workflowable,\n WithWorkflow,\n WorkflowSummary,\n WorkflowHistoryEntryData,\n} from './workflow.models';\n\n/**\n * Current user context for workflow operations\n */\nexport interface WorkflowCurrentUser {\n id: string;\n roles: string[];\n permissions: string[];\n}\n\n/**\n * Result of checking if a transition can be executed\n */\nexport interface CanExecuteTransitionResult {\n allowed: boolean;\n reason?: string;\n failedCheck?: 'state' | 'permission' | 'role' | 'guard';\n}\n\n/**\n * Result of bulk transition execution\n */\nexport interface BulkTransitionResult<T extends Workflowable> {\n succeeded: WithWorkflow<T>[];\n failed: Array<{\n entity: WithWorkflow<T>;\n error: string;\n }>;\n stats: {\n total: number;\n succeeded: number;\n failed: number;\n };\n}\n\n/**\n * Workflow state definition\n */\nexport interface WorkflowState {\n id: string;\n label: string;\n description?: string;\n isInitial?: boolean;\n isFinal?: boolean;\n color?: string;\n icon?: string;\n requiredFields?: string[];\n editableFields?: string[];\n readonlyFields?: string[];\n}\n\n/**\n * Workflow transition context passed to guards and actions\n */\nexport interface WorkflowTransitionContext<T = unknown> {\n entity: T;\n currentUserId: string;\n currentUserRoles: string[];\n currentUserPermissions: string[];\n payload?: unknown;\n}\n\n/**\n * Guard function type - returns true if transition is allowed\n */\nexport type WorkflowGuardFn<T = unknown> = (\n ctx: WorkflowTransitionContext<T>,\n) => boolean | Promise<boolean>;\n\n/**\n * Action function type - executed after successful transition\n */\nexport type WorkflowActionFn<T = unknown> = (\n ctx: WorkflowTransitionContext<T>,\n) => void | Promise<void>;\n\n/**\n * Workflow transition definition\n */\nexport interface WorkflowTransition<T = unknown> {\n id: string;\n from: string;\n to: string;\n label: string;\n description?: string;\n requiredPermissions?: string[];\n requiredRoles?: string[];\n guards?: WorkflowGuardFn<T>[];\n actions?: WorkflowActionFn<T>[];\n icon?: string;\n severity?: 'primary' | 'secondary' | 'success' | 'info' | 'warn' | 'danger' | 'help';\n}\n\n/**\n * Complete workflow definition\n */\nexport interface WorkflowDefinition<T = unknown> {\n id: string;\n entityType: string;\n label: string;\n description?: string;\n states: WorkflowState[];\n transitions: WorkflowTransition<T>[];\n}\n\n/**\n * Result of executing a transition - contains updated entity and history entry\n */\nexport interface TransitionExecutionResult<T extends Workflowable> {\n entity: WithWorkflow<T>;\n historyEntry: WorkflowHistoryEntryData;\n}\n\n/**\n * Abstract WorkflowEngine class\n *\n * Defines the contract for workflow operations.\n * Implementations should be provided via dependency injection.\n *\n * @typeParam T - The entity type that extends Workflowable\n */\nexport abstract class WorkflowEngine<T extends Workflowable> {\n /**\n * Check if a transition can be executed\n */\n abstract canExecuteTransition(\n definition: WorkflowDefinition<T>,\n transitionId: TransitionId,\n entity: WithWorkflow<T>,\n currentUser: WorkflowCurrentUser,\n ): CanExecuteTransitionResult;\n\n /**\n * Execute a workflow transition\n * Returns both the updated entity and the history entry to be persisted\n */\n abstract executeTransition(\n definition: WorkflowDefinition<T>,\n transitionId: TransitionId,\n entity: WithWorkflow<T>,\n currentUser: WorkflowCurrentUser,\n payload?: unknown,\n comment?: string,\n ): Promise<TransitionExecutionResult<T>>;\n\n /**\n * Execute transition on multiple entities\n */\n abstract executeBulkTransition(\n definition: WorkflowDefinition<T>,\n transitionId: TransitionId,\n entities: WithWorkflow<T>[],\n currentUser: WorkflowCurrentUser,\n payload?: unknown,\n ): Promise<BulkTransitionResult<T>>;\n\n /**\n * Get available transitions from the current state\n */\n abstract getAvailableTransitions(\n definition: WorkflowDefinition<T>,\n entity: WithWorkflow<T>,\n currentUser: WorkflowCurrentUser,\n ): WorkflowTransition<T>[];\n\n /**\n * Get the current state definition for an entity\n */\n abstract getCurrentState(\n definition: WorkflowDefinition<T>,\n entity: WithWorkflow<T>,\n ): WorkflowState | undefined;\n\n /**\n * Get a state definition by ID\n */\n abstract getState(definition: WorkflowDefinition<T>, stateId: StateId): WorkflowState | undefined;\n\n /**\n * Get the initial state for a workflow\n */\n abstract getInitialState(definition: WorkflowDefinition<T>): WorkflowState | undefined;\n\n /**\n * Create initial workflow summary for a new entity\n */\n abstract createInitialSummary(definition: WorkflowDefinition<T>, userId: string): WorkflowSummary;\n\n /**\n * Check if entity is in a final state\n */\n abstract isFinalState(definition: WorkflowDefinition<T>, entity: WithWorkflow<T>): boolean;\n}\n","/*\n * Public API Surface of core-api\n */\n\nexport * from './lib/audit';\nexport * from './lib/authentication';\nexport * from './lib/authorization';\nexport * from './lib/cloud';\nexport * from './lib/config';\nexport * from './lib/email';\nexport * from './lib/entity';\nexport * from './lib/error';\nexport * from './lib/i18n';\nexport * from './lib/icon';\nexport * from './lib/logger';\nexport * from './lib/repository';\nexport * from './lib/storage';\nexport * from './lib/rule';\nexport * from './lib/workflow';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zssz-soft-core-api.mjs","sources":["../../../projects/core-api/src/lib/audit/audit-log.models.ts","../../../projects/core-api/src/lib/audit/audit.service.ts","../../../projects/core-api/src/lib/authentication/authentication-store.service.ts","../../../projects/core-api/src/lib/authentication/authentication.model.ts","../../../projects/core-api/src/lib/authentication/authentication.service.ts","../../../projects/core-api/src/lib/authentication/firebase.config.ts","../../../projects/core-api/src/lib/cloud/cloud.service.ts","../../../projects/core-api/src/lib/config/app-bootstrap.config.ts","../../../projects/core-api/src/lib/config/document.config.ts","../../../projects/core-api/src/lib/config/notification-config.ts","../../../projects/core-api/src/lib/email/email.service.ts","../../../projects/core-api/src/lib/email/email.models.ts","../../../projects/core-api/src/lib/entity/form/entity-form.logic.ts","../../../projects/core-api/src/lib/entity/entity.adapter.ts","../../../projects/core-api/src/lib/entity/entity.effect.ts","../../../projects/core-api/src/lib/repository/repository.models.ts","../../../projects/core-api/src/lib/repository/repository.engine.ts","../../../projects/core-api/src/lib/repository/repository-engine.tokens.ts","../../../projects/core-api/src/lib/entity/entity.repository.ts","../../../projects/core-api/src/lib/error/error.models.ts","../../../projects/core-api/src/lib/error/error-util.service.ts","../../../projects/core-api/src/lib/i18n/date-time.pipe.base.ts","../../../projects/core-api/src/lib/i18n/date-util.ts","../../../projects/core-api/src/lib/i18n/i18n.service.ts","../../../projects/core-api/src/lib/i18n/i18n.util.ts","../../../projects/core-api/src/lib/i18n/languages.enum.ts","../../../projects/core-api/src/lib/icon/icon.ts","../../../projects/core-api/src/lib/logger/logger.ts","../../../projects/core-api/src/lib/logger/logger.models.ts","../../../projects/core-api/src/lib/storage/storage.engine.ts","../../../projects/core-api/src/lib/workflow/workflow.models.ts","../../../projects/core-api/src/lib/workflow/workflow-engine.ts","../../../projects/core-api/src/public-api.ts","../../../projects/core-api/src/zssz-soft-core-api.ts"],"sourcesContent":["import { User } from '@zssz-soft/common-api';\nimport { Entity, EntityModel } from '../entity';\n\nexport const AUDIT_FEATURE_KEY = 'audit_logs';\n\n/**\n * Audit log entry for tracking user actions\n */\nexport interface AuditLog {\n /** Unique audit log ID */\n id?: string;\n\n /** User who performed the action */\n user: User | string; // Can be User object or UID\n\n /** Action performed */\n action: AuditAction;\n\n /** Resource affected by the action */\n resource: AuditResource;\n\n /** Timestamp when action occurred */\n timestamp: Date;\n\n /** Session information */\n sessionId?: string;\n\n /** Request metadata */\n metadata: AuditMetadata;\n\n /** Action result */\n result: AuditResult;\n\n /** Additional context data */\n context?: Record<string, any>;\n}\n\n/**\n * Types of actions that can be audited\n */\nexport type AuditAction =\n // Authentication actions\n | 'auth.login'\n | 'auth.logout'\n | 'auth.register'\n | 'auth.password_reset'\n | 'auth.email_verification'\n\n // User management actions\n | 'user.create'\n | 'user.update'\n | 'user.delete'\n | 'user.role_change'\n | 'user.status_change'\n\n // Data actions\n | 'data.create'\n | 'data.read'\n | 'data.update'\n | 'data.delete'\n | 'data.export'\n | 'data.import'\n\n // System actions\n | 'system.configuration_change'\n | 'system.backup'\n | 'system.restore'\n\n // UI actions\n | 'ui.page_view'\n | 'ui.button_click'\n | 'ui.form_submit'\n | 'ui.theme_change'\n | 'ui.search'\n | 'ui.filter'\n | 'ui.download'\n | 'ui.upload'\n\n // Security actions\n | 'security.unauthorized_access'\n | 'security.permission_denied'\n | 'security.suspicious_activity'\n\n // Custom actions\n | string;\n\n/**\n * Resource types that can be audited\n */\nexport interface AuditResource {\n /** Type of resource */\n type: string;\n\n /** Resource identifier */\n id?: string;\n\n /** Resource name or description */\n name?: string;\n\n /** Parent resource if applicable */\n parent?: AuditResource;\n\n /** Additional resource metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Metadata associated with an audit action\n */\nexport interface AuditMetadata {\n /** IP address of the request */\n ipAddress?: string;\n\n /** User agent string */\n userAgent?: string;\n\n /** Geographic location */\n location?: {\n country?: string;\n region?: string;\n city?: string;\n coordinates?: {\n latitude: number;\n longitude: number;\n };\n };\n\n /** Request information */\n request?: {\n method?: string;\n url?: string;\n headers?: Record<string, string>;\n body?: any;\n };\n\n /** Response information */\n response?: {\n statusCode?: number;\n headers?: Record<string, string>;\n body?: any;\n };\n\n /** Performance metrics */\n performance?: {\n duration?: number;\n memoryUsage?: number;\n cpuUsage?: number;\n };\n\n /** Additional custom metadata */\n [key: string]: any;\n}\n\n/**\n * Result of an audited action\n */\nexport interface AuditResult {\n /** Whether the action was successful */\n success: boolean;\n\n /** Status code or error code */\n code?: string | number;\n\n /** Human-readable message */\n message?: string;\n\n /** Error details if action failed */\n error?: {\n type: string;\n message: string;\n stack?: string;\n };\n\n /** Changes made (for update actions) */\n changes?: {\n before?: any;\n after?: any;\n fields?: string[];\n };\n\n /** Additional result data */\n data?: any;\n}\n\n/**\n * Audit log query filters\n */\nexport interface AuditLogQuery {\n /** Filter by user */\n userId?: string;\n\n /** Filter by action */\n action?: AuditAction | AuditAction[];\n\n /** Filter by resource type */\n resourceType?: string;\n\n /** Filter by date range */\n dateRange?: {\n start: Date;\n end: Date;\n };\n\n /** Filter by success/failure */\n success?: boolean;\n\n /** Filter by session ID */\n sessionId?: string;\n\n /** Filter by IP address */\n ipAddress?: string;\n\n /** Pagination */\n limit?: number;\n offset?: number;\n\n /** Sorting */\n sortBy?: 'timestamp' | 'action' | 'user';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Audit log summary statistics\n */\nexport interface AuditLogStats {\n /** Total number of logs */\n totalLogs: number;\n\n /** Actions by type */\n actionCounts: Record<string, number>;\n\n /** Success rate */\n successRate: number;\n\n /** Most active users */\n topUsers: Array<{\n userId: string;\n actionCount: number;\n }>;\n\n /** Most common actions */\n topActions: Array<{\n action: string;\n count: number;\n }>;\n\n /** Date range covered */\n dateRange: {\n start: Date;\n end: Date;\n };\n}\n\nexport interface Audit {\n /** User who performed the action */\n user: User | string;\n /** Action performed */\n action: AuditAction;\n /** Resource affected by the action */\n resource: AuditResource;\n /** Timestamp when action occurred */\n timestamp: Date;\n /** Session information */\n sessionId?: string;\n /** Request metadata */\n metadata: AuditMetadata;\n /** Action result */\n result: AuditResult;\n /** Additional context data */\n context?: Record<string, any>;\n}\n\nexport type AuditEntity = Audit & Entity;\nexport type AuditEntityAdd = Omit<AuditEntity, 'uid'>;\nexport type AuditEntityUpdate = Partial<AuditEntity> & Entity;\nexport type AuditModel = Audit & EntityModel;\nexport type AuditModelAdd = Omit<AuditModel, 'uid'>;\nexport type AuditModelUpdate = Partial<AuditModel> & EntityModel;\n","import { Observable } from 'rxjs';\nimport {\n AuditLog,\n AuditAction,\n AuditResource,\n AuditLogQuery,\n AuditLogStats,\n} from './audit-log.models';\nimport { User } from '@zssz-soft/common-api';\n\n/**\n * Abstract interface for audit logging operations\n * This defines the contract for audit logging without implementation details\n */\nexport abstract class AuditService {\n /**\n * Log a user action with result\n * @param user User performing the action\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param result Action result (success/failure)\n * @param context Additional context data\n * @returns Observable with the audit log ID\n */\n abstract logAction(\n user: User,\n action: AuditAction,\n resource: AuditResource,\n result: 'success' | 'failure',\n context?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Log a successful action\n * @param user User performing the action\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param data Additional data about the action\n * @param context Additional context data\n * @returns Observable with the audit log ID\n */\n abstract logSuccess(\n user: User,\n action: AuditAction,\n resource: AuditResource,\n data?: any,\n context?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Log a failed action\n * @param user User performing the action\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param error Error that occurred\n * @param context Additional context data\n * @returns Observable with the audit log ID\n */\n abstract logFailure(\n user: User,\n action: AuditAction,\n resource: AuditResource,\n error: Error,\n context?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Log authentication events\n * @param user User involved in auth event\n * @param action Auth action performed\n * @param success Whether the auth action was successful\n * @param additionalData Additional auth-related data\n * @returns Observable with the audit log ID\n */\n abstract logAuthEvent(\n user: User,\n action: AuditAction,\n success: boolean,\n additionalData?: Record<string, any>,\n ): Observable<string>;\n\n /**\n * Query audit logs with filters\n * @param query Query filters\n * @returns Observable with array of audit logs\n */\n abstract queryLogs(query: AuditLogQuery): Observable<AuditLog[]>;\n\n /**\n * Get audit log statistics\n * @param timeRange Optional time range for statistics\n * @returns Observable with audit statistics\n */\n abstract getStats(timeRange?: { start: Date; end: Date }): Observable<AuditLogStats>;\n\n /**\n * Get audit logs for a specific user\n * @param userId User ID\n * @param limit Optional limit on number of logs\n * @returns Observable with array of user's audit logs\n */\n abstract getUserLogs(userId: string, limit?: number): Observable<AuditLog[]>;\n\n /**\n * Get recent audit logs\n * @param limit Number of recent logs to retrieve\n * @returns Observable with array of recent audit logs\n */\n abstract getRecentLogs(limit?: number): Observable<AuditLog[]>;\n}\n","import { InjectionToken, Signal } from '@angular/core';\n\nimport { AuthResult, AuthUser, UserRegistrationData } from './authentication.model';\n\nexport abstract class AuthenticationStoreService {\n abstract signOut(): Promise<AuthResult<void>>;\n\n abstract signInWithEmailAndPassword(email: string, password: string): Promise<void>;\n\n abstract signInWithGoogle(): Promise<AuthResult<AuthUser>>;\n\n abstract createUserWithEmailAndPassword(\n userData: UserRegistrationData,\n ): Promise<AuthResult<AuthUser>>;\n\n abstract sendPasswordResetEmail(email: string): Promise<void>;\n\n abstract updatePassword(newPassword: string): Promise<AuthResult<void>>;\n\n abstract updateEmail(newEmail: string): Promise<AuthResult<void>>;\n\n abstract getIdToken(forceRefresh: boolean): Promise<string | null>;\n\n abstract getStore(): AuthenticationStoreView;\n}\n\nexport interface AuthenticationStoreView {\n user: Signal<AuthUser | null>;\n isAuthenticated: Signal<boolean>;\n isLoading: Signal<boolean>;\n error: Signal<string | null>;\n isLoggedIn: Signal<boolean>;\n userDisplayName: Signal<string>;\n userInitials: Signal<string>;\n setUser(user: AuthUser | null): void;\n setLoading(isLoading: boolean): void;\n setError(error: string | null): void;\n clearError(): void;\n clearUser(): void;\n setInitialized(): void;\n}\n\nexport const AUTHENTICATION_STORE_SERVICE_TOKEN = new InjectionToken<AuthenticationStoreService>(\n 'AuthenticationStoreService',\n);\n\nexport const AUTHENTICATION_STORE_VIEW_TOKEN = new InjectionToken<AuthenticationStoreView>(\n 'AuthenticationStoreView',\n);\n","export interface AuthResult<T = any> {\n data?: T;\n error?: {\n code: AuthErrorCode;\n message: string;\n };\n success: boolean;\n}\n\nexport interface AuthState {\n error: string | null;\n isAuthenticated: boolean;\n loading: boolean;\n user: AuthUser | null;\n}\n\nexport interface AuthUser {\n createdAt?: string;\n customClaims?: Record<string, any>;\n displayName: string | null;\n email: string | null;\n emailVerified: boolean;\n lastSignInAt?: string;\n phoneNumber: string | null;\n photoURL: string | null;\n uid: string;\n}\n\nexport interface EmailPasswordCredentials {\n email: string;\n password: string;\n}\n\nexport interface UserRegistrationData extends EmailPasswordCredentials {\n displayName?: string;\n phoneNumber?: string;\n}\n\nexport type AuthCredentials = EmailPasswordCredentials;\n\nexport type AuthErrorCode =\n | 'auth/user-not-found'\n | 'auth/wrong-password'\n | 'auth/email-already-in-use'\n | 'auth/weak-password'\n | 'auth/invalid-email'\n | 'auth/user-disabled'\n | 'auth/too-many-requests'\n | 'auth/network-request-failed'\n | 'auth/popup-closed-by-user'\n | 'auth/popup-blocked'\n | 'auth/cancelled-popup-request'\n | 'auth/account-exists-with-different-credential'\n | 'unknown-error';\n\nexport type AuthMethod = 'signIn' | 'signUp' | 'signOut' | 'resetPassword' | 'verifyEmail';\n\nexport type AuthProvider = 'email' | 'google' | 'facebook';\n\nexport const initialAuthState: AuthState = {\n user: null,\n loading: true,\n isAuthenticated: false,\n error: null,\n};\n","import { Injectable, signal } from '@angular/core';\n\nimport {\n AuthResult,\n AuthState,\n AuthUser,\n EmailPasswordCredentials,\n initialAuthState,\n UserRegistrationData,\n} from './authentication.model';\n\n@Injectable()\nexport abstract class AuthenticationService {\n private readonly _authState = signal<AuthState>(initialAuthState);\n\n public readonly authState = this._authState.asReadonly();\n\n public readonly currentUser = this.authState;\n\n public readonly isAuthenticated = this.authState;\n\n public abstract createUserWithEmailAndPassword(\n userData: UserRegistrationData,\n ): Promise<AuthResult<AuthUser>>;\n\n public abstract generateUserWithUID(\n email: string,\n displayName?: string,\n ): Promise<AuthResult<AuthUser>>;\n\n public abstract generateUserWithUIDAndSendReset(\n email: string,\n displayName?: string,\n ): Promise<AuthResult<AuthUser>>;\n\n public abstract getIdToken(forceRefresh: boolean): Promise<string | null>;\n\n public abstract getIdTokenResult(forceRefresh: boolean): Promise<any>;\n\n public abstract sendEmailVerification(): Promise<AuthResult<void>>;\n\n public abstract sendPasswordResetEmail(email: string): Promise<void>;\n\n public abstract signInWithEmailAndPassword(credentials: EmailPasswordCredentials): Promise<void>;\n\n public abstract signInWithGoogle(): Promise<AuthResult<AuthUser>>;\n\n public abstract signOut(): Promise<AuthResult<void>>;\n\n public abstract updateEmail(newEmail: string): Promise<AuthResult<void>>;\n\n public abstract updatePassword(newPassword: string): Promise<AuthResult<void>>;\n\n public abstract updateProfile(\n profile: Partial<Pick<AuthUser, 'displayName' | 'photoURL'>>,\n ): Promise<AuthResult<void>>;\n}\n","import { InjectionToken, Provider } from '@angular/core';\n\nexport const DEFAULT_FIREBASE_CONFIG: FirebaseConfig = {\n apiKey: 'your-api-key',\n authDomain: 'your-project.firebaseapp.com',\n projectId: 'your-project-id',\n storageBucket: 'your-project.appspot.com',\n messagingSenderId: '123456789',\n appId: '1:123456789:web:abcdef123456',\n measurementId: 'G-XXXXXXXXXX',\n};\n\nexport const DEFAULT_FIREBASE_AUTH_CONFIG: FirebaseAuthConfig = {\n firebase: DEFAULT_FIREBASE_CONFIG,\n enableRegistration: true,\n enableSocialLogin: false,\n};\n\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\nexport interface SessionConfig {\n /** Inactivity timeout in milliseconds (default: 30 minutes) */\n inactivityTimeout: number;\n /** Warning before timeout in milliseconds (default: 5 minutes before timeout) */\n warningBeforeTimeout?: number;\n /** Events to track for activity (default: ['click', 'keypress', 'mousemove', 'touchstart']) */\n events?: string[];\n /** Whether to show warning dialog before logout */\n showWarningDialog?: boolean;\n}\n\nexport interface UserConfig {\n /** Firestore collection name for user documents (default: 'user') */\n collection?: string;\n /** Default role ID to assign to new OAuth users */\n defaultRoleId: string;\n /** Whether to automatically create user document on OAuth login (default: true) */\n autoCreate?: boolean;\n}\n\nexport interface FirebaseAuthConfig {\n firebase: FirebaseConfig;\n enableRegistration?: boolean;\n enableSocialLogin?: boolean;\n enabledProviders?: ('email' | 'google' | 'facebook')[];\n session?: SessionConfig;\n /** Configuration for automatic user document creation on OAuth login */\n userDocument?: UserConfig;\n}\n\nexport const FIREBASE_CONFIG = new InjectionToken<FirebaseConfig>('FIREBASE_CONFIG');\n\nexport const FIREBASE_AUTH_CONFIG = new InjectionToken<FirebaseAuthConfig>('FIREBASE_AUTH_CONFIG');\n\nexport function provideFirebaseAuthConfig(config: FirebaseAuthConfig): Provider {\n return { provide: FIREBASE_AUTH_CONFIG, useValue: config || DEFAULT_FIREBASE_AUTH_CONFIG };\n}\n","import { InjectionToken } from '@angular/core';\n\nimport {\n BootstrapStatusResult,\n CloudFunctionResult,\n CreateAppConfigRequest,\n CreateAppConfigResult,\n CreateUserAndSendPasswordResetResult,\n CreateUserResponse,\n} from './cloud.models';\n\nexport abstract class CloudService {\n abstract checkBootstrapStatus(): Promise<BootstrapStatusResult>;\n\n abstract createUserAndSendPasswordReset(\n email: string,\n displayName: string,\n sendEmail: boolean,\n ): Promise<CreateUserAndSendPasswordResetResult>;\n\n abstract sendPasswordResetEmail(email: string): Promise<CloudFunctionResult>;\n\n abstract sendWelcomeEmail(\n email: string,\n displayName: string,\n firstName?: string,\n lastName?: string,\n roles?: string[],\n ): Promise<CloudFunctionResult>;\n\n abstract systemBootstrap(\n adminEmail: string,\n adminDisplayName?: string,\n adminPassword?: string,\n ): Promise<CloudFunctionResult>;\n\n abstract registerUserWithWelcomeEmail(\n email: string,\n password: string,\n firstName: string,\n lastName: string,\n options?: {\n displayName?: string;\n phoneNumber?: string;\n photoURL?: string;\n disabled?: boolean;\n loginUrl?: string;\n },\n ): Promise<CreateUserResponse>;\n\n abstract registerUserWithoutEmail(\n email: string,\n password: string,\n firstName: string,\n lastName: string,\n options?: {\n displayName?: string;\n phoneNumber?: string;\n photoURL?: string;\n disabled?: boolean;\n },\n ): Promise<CreateUserResponse>;\n\n abstract generateThumbnail(params: {\n path: string;\n documentId?: string;\n maxWidth?: number;\n maxHeight?: number;\n force?: boolean;\n }): Promise<\n CloudFunctionResult & {\n thumbPath?: string;\n documentUpdated?: boolean;\n originalFilePath?: string;\n }\n >;\n\n abstract createAppConfig(request: CreateAppConfigRequest): Promise<CreateAppConfigResult>;\n}\n\nexport const CLOUD_SERVICE_TOKEN = new InjectionToken<CloudService>('CloudService');\n","import { InjectionToken, Provider } from '@angular/core';\n\nexport type AppBootstrapConfig = {\n bootstrapAdmin: {\n email: string;\n displayName: string;\n firstName: string;\n lastName: string;\n language: string;\n roles: string[];\n };\n};\n\nexport const APP_BOOTSTRAP_CONFIG = new InjectionToken<AppBootstrapConfig>('APP_BOOTSTRAP_CONFIG');\n\nexport function provideAppBootstrapConfig(config: AppBootstrapConfig): Provider {\n return { provide: APP_BOOTSTRAP_CONFIG, useValue: config };\n}\n\nexport const DEFAULT_APP_BOOTSTRAP_CONFIG: AppBootstrapConfig = {\n bootstrapAdmin: {\n email: 'zsagia@gmail.com',\n displayName: 'Bootstrap Admin',\n firstName: 'Bootstrap',\n lastName: 'Admin',\n language: 'en',\n roles: ['ADMIN', 'USER'],\n },\n};\n","export const DOCUMENTS_KEYS = {\n ház: 'ház',\n hálószoba: 'hálószoba',\n földszint: 'földszint',\n emelet: 'emelet',\n nappali: 'nappali',\n étkező: 'étkező',\n konyha: 'konyha',\n fürdőszoba: 'fürdőszoba',\n kültér: 'kültér',\n stég: 'stég',\n parkoló: 'parkoló',\n bográcsozó: 'bográcsozó',\n terasz: 'terasz',\n wc: 'wc',\n};\n","import { InjectionToken } from '@angular/core';\n\nexport interface NotificationConfig {\n closable?: boolean;\n life?: number;\n sticky?: boolean;\n}\n\nexport const NOTIFICATION_CONFIG_TOKEN = new InjectionToken<NotificationConfig>(\n 'NotificationConfig',\n);\n\nexport function provideNotificationConfig(config?: NotificationConfig) {\n return { provide: NOTIFICATION_CONFIG_TOKEN, useValue: config || DEFAULT_NOTIFICATION_CONFIG };\n}\n\nexport const DEFAULT_NOTIFICATION_CONFIG: NotificationConfig = {\n closable: true,\n life: 5000,\n sticky: false,\n};\n","import { WelcomeEmailData } from './email.models';\n\n/**\n * Email service for sending welcome and notification emails\n * This can be implemented with different providers\n */\nexport abstract class EmailService {\n /**\n * Send custom notification email\n * @param to Recipient email\n * @param subject Email subject\n * @param body Email body (HTML or text)\n * @param data Optional template data\n * @returns Promise that resolves when email is sent\n */\n public abstract sendNotificationEmail(\n to: string,\n subject: string,\n body: string,\n data?: Record<string, any>,\n ): Promise<void>;\n\n /**\n * Send welcome email to newly created user\n * @param userData User data for the email\n * @returns Promise that resolves when email is sent\n */\n public abstract sendWelcomeEmail(userData: WelcomeEmailData): Promise<void>;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { User } from '@zssz-soft/common-api';\n\nexport interface EmailConfig {\n fromEmail: string;\n fromName: string;\n mailersendApiKey: string;\n}\n\nexport interface SendPasswordResetEmailData {\n customMessage?: string;\n email: string;\n}\n\nexport type CreateUserData = Omit<WelcomeEmailData, 'firstName' | 'lastName'> & {\n sendEmail?: boolean;\n};\n\nexport type WelcomeEmailData = Omit<User, 'language' | 'phone' | 'photoUrl' | 'uid'> & {\n roles?: string[];\n temporaryPassword?: string;\n};\n\nexport type WelcomeEmailDataWithConfig = WelcomeEmailData & Omit<EmailConfig, 'mailersendApiKey'>;\n\nexport const EMAIL_CONFIG = new InjectionToken<EmailConfig>('EMAIL_CONFIG');\n","import { FormGroup } from '@angular/forms';\n\nimport { Entity, EntityAdd, EntityUpdate } from '../entity.models';\n\nexport abstract class EntityFormLogic<\n E extends Entity,\n EA extends EntityAdd,\n EU extends EntityUpdate,\n> {\n public abstract cancel(): void;\n\n public abstract createEntity(formValue: any): void;\n\n public abstract createFormGroup(entity?: E): FormGroup;\n\n public abstract getEntityById(entityId: string): E | undefined;\n\n public abstract updateEntity(entityId: string, formValue: any): void;\n\n public abstract validateAndProcessForm(\n form: FormGroup | null,\n entityId: string | null,\n ): { isValid: boolean; formValue?: any; entityId?: string | null };\n}\n","import { Signal } from '@angular/core';\n\nimport { User } from '@zssz-soft/common-api';\nimport {\n Entity,\n EntityAdd,\n EntityModel,\n EntityModelAdd,\n EntityModelUpdate,\n EntityUpdate,\n} from './entity.models';\n\nexport abstract class EntityAdapter<\n E extends Entity,\n EA extends EntityAdd,\n EU extends EntityUpdate,\n EM extends EntityModel,\n EMA extends EntityModelAdd,\n EMU extends EntityModelUpdate,\n> {\n public user!: Signal<User | undefined>;\n\n public abstract _sort(a: E, b: E): number;\n\n public abstract convertEntityAddToModelAdd(entityAdd: EA): EMA;\n\n public abstract convertEntityToModel(entity: E): EM;\n\n public abstract convertEntityUpdateToModelUpdate(entity: EU): EMU;\n\n public abstract convertModelToEntity(model: EM): E;\n\n public abstract convertModelUpdateToEntityUpdate(model: EMU): EU;\n}\n","import { Observable } from 'rxjs';\n\nimport { KeyValue } from '@angular/common';\nimport { CursorPaginatedResult, QueryOptions } from '@zssz-soft/common-api';\nimport { Entity, EntityAdd, EntityUpdate } from './entity.models';\n\n/**\n * Abstract base class for entity effects\n *\n * Design Pattern: Template Method Pattern\n * - Definiálja az entity műveletek absztrakt szerződését\n * - A konkrét implementációk a domain-specifikus logikát adják\n *\n * Effects felelősségei:\n * - Adapter hívások koordinálása (Entity <-> Model konverzió)\n * - Error handling és logging\n * - Repository művelet delegálás\n */\nexport abstract class EntityEffect<\n E extends Entity,\n EA extends EntityAdd,\n EU extends EntityUpdate,\n> {\n public abstract createEntity$(entityAdd: EA): Observable<E>;\n public abstract deleteEntity$(entity: E): Observable<E>;\n public abstract listEntities$(\n pathParams: string[],\n queryParams: KeyValue<string, string>[],\n ): Observable<E[]>;\n public abstract loadEntity$(entityId: string): Observable<E>;\n public abstract updateEntity$(entityUpdate: EU): Observable<EU>;\n\n /**\n * Query entities with cursor-based pagination\n * Optional method - can be overridden by domain effects for optimized queries\n *\n * @param options Query options including filters, sorting, and pagination\n * @returns Observable of cursor-paginated result\n */\n public queryCursorPaginated$(_options: QueryOptions): Observable<CursorPaginatedResult<E>> {\n throw new Error('queryCursorPaginated$ not implemented. Override in domain effect.');\n }\n\n /**\n * Query entities by parent ID (for subcollections)\n * Optional method - can be overridden by effects that handle subcollections\n *\n * @param parentId The ID of the parent entity\n * @param options Optional query options\n * @returns Observable of entities belonging to parent\n */\n public queryByParentId$(_parentId: string, _options?: QueryOptions): Observable<E[]> {\n throw new Error('queryByParentId$ not implemented. Override in domain effect.');\n }\n}\n","import { Observable } from 'rxjs';\n\nimport { KeyValue } from '@angular/common';\n\nimport { PaginatedResult, QueryOptions, SearchParam } from '@zssz-soft/common-api';\nimport { EntityModel, EntityModelAdd, EntityModelUpdate } from '../entity/entity.models';\n\n/**\n * Batch operation interface\n */\nexport interface BatchOperation<T> {\n type: 'create' | 'update' | 'delete';\n uid?: string;\n data?: Partial<T>;\n}\n\n/**\n * Context for resolving subcollection paths in Firestore\n * Enables repositories to work with nested collections (e.g., apartments/{id}/rules)\n */\nexport interface SubcollectionContext {\n /**\n * Name of parent collection (e.g., 'apartments')\n */\n parentCollection: string;\n\n /**\n * Field name on the entity that contains parent ID (e.g., 'entityId', 'apartmentId')\n */\n parentIdField: string;\n\n /**\n * Name of subcollection (e.g., 'rules')\n */\n subcollection: string;\n}\n\n/**\n * Builder function type for dynamic collection paths\n * Takes optional entity data and returns the resolved collection path\n */\nexport type CollectionPathBuilder = (entityData?: Partial<EntityModel>) => string;\n\n/**\n * Abstract base repository interface for database operations\n * This interface defines the contract that all data repositories must implement\n */\nexport abstract class Repository<\n EM extends EntityModel,\n EMA extends EntityModelAdd,\n EMU extends EntityModelUpdate,\n> {\n abstract create$(modelAdd: EMA): Observable<EM>;\n\n abstract list$(pathParams: string[], queryParams: KeyValue<string, string>[]): Observable<EM[]>;\n\n abstract listByIds$(ids: string[]): Observable<EM[]>;\n\n abstract load$(uid: string): Observable<EM | undefined>;\n\n abstract update$(modelUpdate: EMU): Observable<EMU>;\n\n abstract delete$(model: EM): Observable<EM>;\n\n abstract query(options: QueryOptions): Observable<EM[]>;\n\n abstract queryPaginated(\n options: QueryOptions,\n pageSize: number,\n lastDocument?: EM,\n ): Observable<PaginatedResult<EM>>;\n\n abstract count(options?: QueryOptions): Observable<number>;\n\n abstract exists(uid: string): Observable<boolean>;\n\n abstract batch(operations: BatchOperation<EM>[]): Observable<void>;\n\n abstract search$(params: SearchParam[]): Observable<EM[]>;\n\n /**\n * Query entities by parent ID (for subcollections)\n * Optional - only implemented for repositories with subcollection context\n * @param parentId The ID of the parent entity\n * @param options Optional query options for filtering/sorting\n */\n queryByParentId?(parentId: string, options?: QueryOptions): Observable<EM[]>;\n}\n","import { EntityModel, EntityModelAdd, EntityModelUpdate } from '../entity/entity.models';\nimport { Repository } from './repository.models';\n\nexport abstract class RepositoryEngine<\n E extends EntityModel,\n EA extends EntityModelAdd,\n EU extends EntityModelUpdate,\n> extends Repository<E, EA, EU> {}\n","import { InjectionToken } from '@angular/core';\n\nimport { EntityModel, EntityModelAdd, EntityModelUpdate } from '../entity/entity.models';\nimport { RepositoryEngine } from './repository.engine';\nimport { SubcollectionContext } from './repository.models';\n\n/**\n * Type for a factory function that creates a repository engine\n */\nexport type RepositoryEngineCreator = <\n R extends EntityModel,\n S extends EntityModelAdd,\n T extends EntityModelUpdate,\n>(\n featureKey: string,\n subcollectionContext?: SubcollectionContext,\n) => RepositoryEngine<R, S, T>;\n\n/**\n * Injection token for the Firestore engine creator function\n * This allows the actual Firebase implementation to be provided at the app level\n * while keeping the factory testable\n */\nexport const FIRESTORE_ENGINE_CREATOR = new InjectionToken<RepositoryEngineCreator>(\n 'FirestoreEngineCreator',\n);\n","import { Repository } from '../repository';\nimport { EntityModel, EntityModelAdd, EntityModelUpdate } from './entity.models';\n\nexport abstract class EntityRepository<\n EM extends EntityModel,\n EMA extends EntityModelAdd,\n EU extends EntityModelUpdate,\n> extends Repository<EM, EMA, EU> {}\n","export enum ErrorType {\n HttpError = 'http-error',\n}\n\nexport interface ErrorOptions {\n type: ErrorType;\n viewable?: boolean;\n}\n\nexport class KError extends Error {\n public options: ErrorOptions;\n\n constructor(message: string, error: Error, options: ErrorOptions) {\n super(message);\n\n this.stack = error.stack;\n this.options = options;\n }\n}\n","import { Message } from '@zssz-soft/common-api';\nimport { KError } from './error.models';\n\nexport abstract class ErrorUtilService {\n public abstract createErrorMessage(error: KError): Message;\n\n public abstract throwEffectError(message: string, error: unknown, viewable?: boolean): KError;\n}\n","import { PipeTransform } from '@angular/core';\n\nexport abstract class DateTimePipeBase implements PipeTransform {\n public abstract transform(value: any, ...args: unknown[]): string;\n}\n","export abstract class DateUtil {\n public abstract createActionTime(minute: number, second: number): number;\n public abstract createFullTime(startTime: number, minute: number, second: number): number;\n public abstract getDateRange(firstDate: Date, lastDate: Date): Date[];\n public abstract getDateRangeWithoutBorder(firstDate: Date, lastDate: Date): Date[];\n public abstract getDateRangeAsString(dates: Date[], format: string): string[];\n public abstract getDateRangeLength(firstDate: Date, lastDate: Date): number;\n public abstract getFormattedDate(date: Date, format: string): string;\n public abstract getNextDay(baseDate: Date): Date;\n public abstract getNow(): number;\n public abstract getPreviousDay(baseDate: Date): Date;\n public abstract getToday(): Date;\n public abstract getTomorrow(): Date;\n}\n","import { Observable } from 'rxjs';\n\nimport { HttpClient } from '@angular/common/http';\nimport { Translation } from '@jsverse/transloco';\nimport { DateFormatOptions } from '@jsverse/transloco-locale';\n\nimport { HashMapModel } from './hash-map.model';\nimport { I18nText } from './i18-text';\nimport { LanguagesEnum } from './languages.enum';\n\nexport abstract class I18nService {\n protected defaultPath!: string;\n\n public constructor(protected httpClient: HttpClient) {}\n\n public abstract activeLanguageChanges$(): Observable<string>;\n\n public abstract getActiveLang(): LanguagesEnum;\n\n public abstract getActiveLangAsString(): string;\n\n public abstract getAvailableLanguages(): string[];\n\n public abstract getActiveLocale(): string;\n\n public abstract getDefaultI18nText(): I18nText;\n\n public abstract getValue(property: any, locale?: string): string;\n\n public abstract getValueByLanguage(i18nText: I18nText, language?: string): string;\n\n public abstract init(language: string): void;\n\n public abstract load(): Observable<Translation>;\n\n public abstract localizeDate(\n date: string | Date,\n locale: string,\n format: DateFormatOptions,\n ): string;\n\n public abstract nameComponentShorter(firstName: string, lastName: string): string[];\n\n public abstract translate<T>(\n key: string | string[],\n params?: HashMapModel<unknown>,\n lang?: string,\n ): string;\n\n public abstract selectTranslate$(\n key: string,\n params?: HashMapModel<unknown>,\n lang?: string,\n ): Observable<string>;\n}\n","import { I18nText } from './i18-text';\nimport { LanguagesEnum } from './languages.enum';\n\nexport abstract class I18nUtil {\n public abstract getActiveLang(): LanguagesEnum;\n public abstract getDefaultI18nText(): I18nText;\n public abstract updateLanguage(language: string): void;\n public abstract getValueByLanguage(i18nText: I18nText, language?: string): string;\n public abstract getCurrentLocale(): string;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport enum LanguagesEnum {\n de = 'de',\n en = 'en',\n hu = 'hu',\n hr = 'hr',\n ro = 'ro',\n sk = 'sk',\n sl = 'sl',\n sr = 'sr',\n uk = 'uk',\n}\n\nexport const LANGUAGES_TOKEN = new InjectionToken<string[]>('LANGUAGES');\n\nexport const DEFAULT_LANGUAGE_TOKEN = new InjectionToken<string>('DEFAULT_LANGUAGE');\n","export type IconType = 'material' | 'svg' | 'primeicons';\n\nexport type Icon = {\n name: string;\n class: string;\n type?: IconType;\n svgContent?: string;\n};\n\n/**\n * Helper function to create a PrimeIcons icon\n * @param name - PrimeIcons icon name without 'pi-' prefix (e.g., 'search', 'user', 'home')\n */\nexport function primeIcon(name: string): Icon {\n return {\n name,\n class: `pi pi-${name}`,\n type: 'primeicons',\n };\n}\n\nexport const materialIcons: Icon[] = [\n { name: 'ac_unit', class: 'material-symbols-outlined' },\n { name: 'airport_shuttle', class: 'material-symbols-outlined' },\n { name: 'apartment', class: 'material-symbols-outlined' },\n { name: 'balcony', class: 'material-symbols-outlined' },\n { name: 'bathroom', class: 'material-symbols-outlined' },\n { name: 'bathtub', class: 'material-symbols-outlined' },\n { name: 'bed', class: 'material-symbols-outlined' },\n { name: 'bedroom_parent', class: 'material-symbols-outlined' },\n { name: 'bedroom_child', class: 'material-symbols-outlined' },\n { name: 'cable', class: 'material-symbols-outlined' },\n { name: 'camera_outdoor', class: 'material-symbols-outlined' },\n { name: 'chair', class: 'material-symbols-outlined' },\n { name: 'chair_alt', class: 'material-symbols-outlined' },\n { name: 'child_friendly', class: 'material-symbols-outlined' },\n { name: 'coffee', class: 'material-symbols-outlined' },\n { name: 'cooking', class: 'material-symbols-outlined' },\n { name: 'coffee_maker', class: 'material-symbols-outlined' },\n { name: 'countertops', class: 'material-symbols-outlined' },\n { name: 'cottage', class: 'material-symbols-outlined' },\n { name: 'curtains', class: 'material-symbols-outlined' },\n { name: 'deck', class: 'material-symbols-outlined' },\n { name: 'dining', class: 'material-symbols-outlined' },\n { name: 'dresser', class: 'material-symbols-outlined' },\n { name: 'dry_cleaning', class: 'material-symbols-outlined' },\n { name: 'flatware', class: 'material-symbols-outlined' },\n { name: 'gamepad', class: 'material-symbols-outlined' },\n { name: 'garden', class: 'material-symbols-outlined' },\n { name: 'grass', class: 'material-symbols-outlined' },\n { name: 'holiday_village', class: 'material-symbols-outlined' },\n { name: 'home', class: 'material-symbols-outlined' },\n { name: 'hotel', class: 'material-symbols-outlined' },\n { name: 'house', class: 'material-symbols-outlined' },\n { name: 'iron', class: 'material-symbols-outlined' },\n { name: 'kettle', class: 'material-symbols-outlined' },\n { name: 'key', class: 'material-symbols-outlined' },\n { name: 'king_bed', class: 'material-symbols-outlined' },\n { name: 'kitchen', class: 'material-symbols-outlined' },\n { name: 'language', class: 'material-symbols-outlined' },\n { name: 'lease', class: 'material-symbols-outlined' },\n { name: 'live_tv', class: 'material-symbols-outlined' },\n { name: 'living', class: 'material-symbols-outlined' },\n { name: 'local_gas_station', class: 'material-symbols-outlined' },\n { name: 'local_laundry_service', class: 'material-symbols-outlined' },\n { name: 'local_parking', class: 'material-symbols-outlined' },\n { name: 'location_city', class: 'material-symbols-outlined' },\n { name: 'login', class: 'material-symbols-outlined' },\n { name: 'logout', class: 'material-symbols-outlined' },\n { name: 'medical_services', class: 'material-symbols-outlined' },\n { name: 'microwave', class: 'material-symbols-outlined' },\n { name: 'mop', class: 'material-symbols-outlined' },\n { name: 'other_houses', class: 'material-symbols-outlined' },\n { name: 'outdoor_grill', class: 'material-symbols-outlined' },\n { name: 'oven', class: 'material-symbols-outlined' },\n { name: 'pets', class: 'material-symbols-outlined' },\n { name: 'phishing', class: 'material-symbols-outlined' },\n { name: 'pool', class: 'material-symbols-outlined' },\n { name: 'rent', class: 'material-symbols-outlined' },\n { name: 'restaurant', class: 'material-symbols-outlined' },\n { name: 'roller_shades', class: 'material-symbols-outlined' },\n { name: 'shower', class: 'material-symbols-outlined' },\n { name: 'single_bed', class: 'material-symbols-outlined' },\n { name: 'skillet', class: 'material-symbols-outlined' },\n { name: 'skillet_cooktop', class: 'material-symbols-outlined' },\n { name: 'smoke_free', class: 'material-symbols-outlined' },\n { name: 'soap', class: 'material-symbols-outlined' },\n { name: 'sports_esports', class: 'material-symbols-outlined' },\n { name: 'stairs', class: 'material-symbols-outlined' },\n { name: 'table_bar', class: 'material-symbols-outlined' },\n { name: 'table_lamp', class: 'material-symbols-outlined' },\n { name: 'table_restaurant', class: 'material-symbols-outlined' },\n { name: 'toys', class: 'material-symbols-outlined' },\n { name: 'tv', class: 'material-symbols-outlined' },\n { name: 'tv_guide', class: 'material-symbols-outlined' },\n { name: 'unpaved_road', class: 'material-symbols-outlined' },\n { name: 'yard', class: 'material-symbols-outlined' },\n { name: 'vacuum', class: 'material-symbols-outlined' },\n { name: 'wall_art', class: 'material-symbols-outlined' },\n { name: 'warehouse', class: 'material-symbols-outlined' },\n { name: 'wash', class: 'material-symbols-outlined' },\n { name: 'water', class: 'material-symbols-outlined' },\n { name: 'water_drop', class: 'material-symbols-outlined' },\n { name: 'waves', class: 'material-symbols-outlined' },\n { name: 'wc', class: 'material-symbols-outlined' },\n { name: 'wifi', class: 'material-symbols-outlined' },\n { name: 'wine_bar', class: 'material-symbols-outlined' },\n { name: 'window', class: 'material-symbols-outlined' },\n];\n\n/**\n * Custom SVG icons for items not available in Material Symbols\n */\nexport const customSvgIcons: Icon[] = [\n {\n name: 'towel',\n class: 'custom-svg-icon',\n type: 'svg',\n svgContent: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1v-1h14v1c0 .55-.45 1-1 1zm1-4H5V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v9z\"/><path d=\"M7 8h10v2H7zm0 3h10v2H7z\"/></svg>`,\n },\n {\n name: 'bathrobe',\n class: 'custom-svg-icon',\n type: 'svg',\n svgContent: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M21.6 18.2L13 11.75v-.91c1.65-.49 3-1.9 3-3.59 0-2.07-1.79-3.75-4-3.75S8 5.18 8 7.25c0 1.69 1.35 3.1 3 3.59v.91l-8.6 6.45c-.25.19-.4.49-.4.8v2c0 .55.45 1 1 1h2v-2.5l5-3.75v6.25H8v2h8v-2h-2V13.5l5 3.75V20h2v-1c0-.31-.15-.61-.4-.8zM12 8c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\"/></svg>`,\n },\n {\n name: 'slippers',\n class: 'custom-svg-icon',\n type: 'svg',\n svgContent: `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M4 16c0 1.1.9 2 2 2h5v-2H6v-4H4v4zm14-4v4h-5v2h5c1.1 0 2-.9 2-2v-4h-2zM12 4C9.79 4 8 5.79 8 8h2c0-1.1.9-2 2-2s2 .9 2 2h2c0-2.21-1.79-4-4-4z\"/><circle cx=\"9\" cy=\"13\" r=\"1\"/><circle cx=\"15\" cy=\"13\" r=\"1\"/></svg>`,\n },\n];\n\n/**\n * All available icons (Material + Custom SVG)\n */\nexport const allIcons: Icon[] = [...materialIcons, ...customSvgIcons];\n","import { User } from '@zssz-soft/common-api';\nimport { AuditAction, AuditResource } from '../audit/audit-log.models';\n\n/**\n * Abstract interface for logging operations\n * This defines the contract for logging without implementation details\n */\nexport abstract class Logger {\n /**\n * Set the current user for audit logging\n * @param user Current authenticated user\n */\n abstract setCurrentUser(user: User | null): void;\n\n /**\n * Get the current user\n * @returns Current user or null\n */\n abstract getCurrentUser(): User | null;\n\n /**\n * Log trace level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract trace(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log debug level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract debug(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log info level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract info(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log warning level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract warn(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log error level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract error(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Log fatal level message\n * @param message Log message\n * @param data Additional data\n * @param context Context information\n */\n abstract fatal(message: string, data?: any, context?: Record<string, any>): void;\n\n /**\n * Audit user actions with automatic success/failure logging\n * @param action Action being performed\n * @param resource Resource being acted upon\n * @param success Whether the action was successful\n * @param data Additional action data\n * @param context Additional context\n */\n abstract auditUserAction(\n action: AuditAction,\n resource: AuditResource,\n success: boolean,\n data?: any,\n context?: Record<string, any>,\n ): void;\n\n /**\n * Audit authentication events\n * @param user User involved in auth event\n * @param action Auth action performed\n * @param success Whether the auth action was successful\n * @param additionalData Additional auth-related data\n */\n abstract auditAuthEvent(\n user: User,\n action: AuditAction,\n success: boolean,\n additionalData?: Record<string, any>,\n ): void;\n\n /**\n * Audit UI interactions\n * @param action UI action performed\n * @param component Component where action occurred\n * @param data Additional UI data\n * @param context Additional context\n */\n abstract auditUIAction(\n action: string,\n component: string,\n data?: any,\n context?: Record<string, any>,\n ): void;\n\n /**\n * Audit data operations\n * @param operation Type of data operation\n * @param resourceType Type of resource\n * @param resourceId Resource identifier\n * @param success Whether operation was successful\n * @param data Additional operation data\n * @param context Additional context\n */\n abstract auditDataOperation(\n operation: 'create' | 'read' | 'update' | 'delete',\n resourceType: string,\n resourceId?: string,\n success?: boolean,\n data?: any,\n context?: Record<string, any>,\n ): void;\n\n /**\n * Log user action for tracking\n * @param component Component where action occurred\n * @param action Action performed\n * @param data Additional action data\n */\n abstract logUserAction(component: string, action: string, data?: any): void;\n\n /**\n * Log performance metrics\n * @param operation Operation being measured\n * @param duration Duration in milliseconds\n * @param component Component where operation occurred\n */\n abstract logPerformance(operation: string, duration: number, component?: string): void;\n\n /**\n * Log HTTP requests\n * @param method HTTP method\n * @param url Request URL\n * @param status Response status code\n * @param duration Request duration in milliseconds\n */\n abstract logHttpRequest(method: string, url: string, status: number, duration: number): void;\n\n abstract logComponentLifecycle(component: string, lifecycle: string): void;\n abstract logThemeChangeAudit(from: string, to: string): void;\n}\n","export interface LoggerEnvironmentConfig {\n production: boolean;\n logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n enableConsoleLogging?: boolean;\n enableStorageLogging?: boolean;\n maxStoredLogs?: number;\n}\n\n/**\n * Log levels for the logger\n */\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport interface LoggerConfig {\n level: LogLevel;\n environment: 'development' | 'production' | 'test';\n enableConsole: boolean;\n}\n\nexport interface LogEntry {\n timestamp: string;\n level: string;\n message: string;\n data?: any;\n component?: string;\n action?: string;\n}\n\n// Injection token for environment configuration\nexport const LOGGER_ENVIRONMENT = 'LOGGER_ENVIRONMENT';\n\n/**\n * Decorator options for method logging\n */\nexport interface LogMethodOptions {\n /** Component name for logging context */\n component?: string;\n /** Log level to use */\n level?: 'trace' | 'debug' | 'info' | 'warn' | 'error';\n /** Whether to log method entry */\n logEntry?: boolean;\n /** Whether to log method exit */\n logExit?: boolean;\n /** Whether to log method duration */\n logDuration?: boolean;\n /** Additional context data */\n context?: Record<string, any>;\n}\n\n/**\n * Decorator options for user action logging\n */\nexport interface LogUserActionOptions {\n /** Component name */\n component: string;\n /** Action name - if not provided, method name will be used */\n action?: string;\n /** Additional data extractor function */\n dataExtractor?: (args: any[]) => any;\n}\n\n/**\n * Decorator options for data operation auditing\n */\nexport interface LogDataOperationOptions {\n /** Operation type */\n operation: 'create' | 'read' | 'update' | 'delete';\n /** Resource type */\n resourceType: string;\n /** Function to extract resource ID from method arguments */\n resourceIdExtractor?: (args: any[]) => string | undefined;\n /** Function to extract operation data from method arguments */\n dataExtractor?: (args: any[]) => any;\n /** Component name for context */\n component?: string;\n}\n\n/**\n * Decorator options for UI action auditing\n */\nexport interface LogUIActionOptions {\n /** Component name */\n component: string;\n /** Action name - if not provided, method name will be used */\n action?: string;\n /** Function to extract UI data from method arguments */\n dataExtractor?: (args: any[]) => any;\n}\n","import { Observable } from 'rxjs';\nimport type {\n StorageFile,\n StorageUploadOptions,\n StorageListOptions,\n StorageListResult,\n StorageDeleteOptions,\n} from './storage.models';\n\nexport abstract class StorageEngine {\n /**\n * Upload a file to storage\n */\n abstract upload(\n path: string,\n file: File | Blob,\n options?: StorageUploadOptions,\n ): Observable<StorageFile>;\n\n /**\n * Download a file as blob\n */\n abstract download(path: string): Observable<Blob>;\n\n /**\n * Get download URL for a file\n */\n abstract getDownloadUrl(path: string): Observable<string>;\n\n /**\n * Get file metadata\n */\n abstract getMetadata(path: string): Observable<StorageFile>;\n\n /**\n * List files in a directory\n */\n abstract list(path: string, options?: StorageListOptions): Observable<StorageListResult>;\n\n /**\n * Delete a file or directory\n */\n abstract delete(path: string, options?: StorageDeleteOptions): Observable<void>;\n\n /**\n * Check if file exists\n */\n abstract exists(path: string): Observable<boolean>;\n\n /**\n * Copy a file\n */\n abstract copy(sourcePath: string, destinationPath: string): Observable<StorageFile>;\n\n /**\n * Move a file\n */\n abstract move(sourcePath: string, destinationPath: string): Observable<StorageFile>;\n}\n","/**\n * Workflow Type Definitions\n *\n * These are the core workflow types used by entities that participate in workflows.\n * The actual workflow engine and services are in the 'workflow' library.\n */\n\nimport type { Entity, EntityAdd, EntityUpdate } from '../entity/entity.models';\n\nexport type WorkflowId = string;\nexport type StateId = string;\nexport type TransitionId = string;\n\n/**\n * Workflow summary stored in the parent entity (e.g., BookingEntity).\n * Contains only the current state and metadata for efficient queries.\n * The full history is stored in the workflow_history subcollection.\n */\nexport interface WorkflowSummary {\n workflowDefinitionId: WorkflowId;\n currentState: StateId;\n initialState: StateId;\n stateCount: number;\n lastTransitionAt: string;\n lastTransitionBy: string;\n}\n\n/**\n * Interface for entities that can participate in workflows.\n * Extend your entity with this interface to make it workflowable.\n *\n * @example\n * ```typescript\n * interface BookingEntity extends Entity, Workflowable {\n * // ... booking fields\n * }\n * ```\n */\nexport interface Workflowable {\n workflow?: WorkflowSummary;\n}\n\n/**\n * Type helper for entities that require workflow to be present.\n */\nexport type WithWorkflow<T extends Workflowable> = T & { workflow: WorkflowSummary };\n\n/**\n * Core data fields for a workflow history entry (without Entity base fields).\n */\nexport interface WorkflowHistoryEntryData {\n bookingId: string;\n sequence: number;\n from: StateId;\n to: StateId;\n transitionId: TransitionId;\n changedBy: string;\n changedAt: string;\n comment?: string;\n payload?: unknown;\n}\n\nexport const WORKFLOW_HISTORY_FEATURE_KEY = 'workflow_history';\n\n/**\n * Workflow history entry entity stored in the subcollection.\n * Extends Entity to include uid and meta for Firestore compatibility.\n */\nexport interface WorkflowHistoryEntry extends Entity, WorkflowHistoryEntryData {}\n\n/**\n * Type for adding a new workflow history entry.\n * uid is auto-generated, meta is provided by the caller.\n */\nexport type WorkflowHistoryEntryAdd = EntityAdd & WorkflowHistoryEntryData;\n\n/**\n * Type for updating workflow history entries.\n * NOTE: Updates are NOT allowed - this type exists only for type system compatibility.\n */\nexport type WorkflowHistoryEntryUpdate = EntityUpdate & Partial<WorkflowHistoryEntryData>;\n\n/**\n * Model types for Firestore storage.\n */\nexport type WorkflowHistoryModel = WorkflowHistoryEntry;\nexport type WorkflowHistoryModelAdd = WorkflowHistoryEntryAdd;\n","/**\n * Abstract WorkflowEngine - defines the contract for workflow operations\n *\n * Implementations should handle:\n * - Transition execution with guards and actions\n * - Permission and role checking\n * - Workflow history management\n */\n\nimport {\n StateId,\n TransitionId,\n Workflowable,\n WithWorkflow,\n WorkflowSummary,\n WorkflowHistoryEntryData,\n} from './workflow.models';\n\n/**\n * Current user context for workflow operations\n */\nexport interface WorkflowCurrentUser {\n id: string;\n roles: string[];\n permissions: string[];\n}\n\n/**\n * Result of checking if a transition can be executed\n */\nexport interface CanExecuteTransitionResult {\n allowed: boolean;\n reason?: string;\n failedCheck?: 'state' | 'permission' | 'role' | 'guard';\n}\n\n/**\n * Result of bulk transition execution\n */\nexport interface BulkTransitionResult<T extends Workflowable> {\n succeeded: WithWorkflow<T>[];\n failed: Array<{\n entity: WithWorkflow<T>;\n error: string;\n }>;\n stats: {\n total: number;\n succeeded: number;\n failed: number;\n };\n}\n\n/**\n * Workflow state definition\n */\nexport interface WorkflowState {\n id: string;\n label: string;\n description?: string;\n isInitial?: boolean;\n isFinal?: boolean;\n color?: string;\n icon?: string;\n requiredFields?: string[];\n editableFields?: string[];\n readonlyFields?: string[];\n}\n\n/**\n * Workflow transition context passed to guards and actions\n */\nexport interface WorkflowTransitionContext<T = unknown> {\n entity: T;\n currentUserId: string;\n currentUserRoles: string[];\n currentUserPermissions: string[];\n payload?: unknown;\n}\n\n/**\n * Guard function type - returns true if transition is allowed\n */\nexport type WorkflowGuardFn<T = unknown> = (\n ctx: WorkflowTransitionContext<T>,\n) => boolean | Promise<boolean>;\n\n/**\n * Action function type - executed after successful transition\n */\nexport type WorkflowActionFn<T = unknown> = (\n ctx: WorkflowTransitionContext<T>,\n) => void | Promise<void>;\n\n/**\n * Workflow transition definition\n */\nexport interface WorkflowTransition<T = unknown> {\n id: string;\n from: string;\n to: string;\n label: string;\n description?: string;\n requiredPermissions?: string[];\n requiredRoles?: string[];\n guards?: WorkflowGuardFn<T>[];\n actions?: WorkflowActionFn<T>[];\n icon?: string;\n severity?: 'primary' | 'secondary' | 'success' | 'info' | 'warn' | 'danger' | 'help';\n}\n\n/**\n * Complete workflow definition\n */\nexport interface WorkflowDefinition<T = unknown> {\n id: string;\n entityType: string;\n label: string;\n description?: string;\n states: WorkflowState[];\n transitions: WorkflowTransition<T>[];\n}\n\n/**\n * Result of executing a transition - contains updated entity and history entry\n */\nexport interface TransitionExecutionResult<T extends Workflowable> {\n entity: WithWorkflow<T>;\n historyEntry: WorkflowHistoryEntryData;\n}\n\n/**\n * Abstract WorkflowEngine class\n *\n * Defines the contract for workflow operations.\n * Implementations should be provided via dependency injection.\n *\n * @typeParam T - The entity type that extends Workflowable\n */\nexport abstract class WorkflowEngine<T extends Workflowable> {\n /**\n * Check if a transition can be executed\n */\n abstract canExecuteTransition(\n definition: WorkflowDefinition<T>,\n transitionId: TransitionId,\n entity: WithWorkflow<T>,\n currentUser: WorkflowCurrentUser,\n ): CanExecuteTransitionResult;\n\n /**\n * Execute a workflow transition\n * Returns both the updated entity and the history entry to be persisted\n */\n abstract executeTransition(\n definition: WorkflowDefinition<T>,\n transitionId: TransitionId,\n entity: WithWorkflow<T>,\n currentUser: WorkflowCurrentUser,\n payload?: unknown,\n comment?: string,\n ): Promise<TransitionExecutionResult<T>>;\n\n /**\n * Execute transition on multiple entities\n */\n abstract executeBulkTransition(\n definition: WorkflowDefinition<T>,\n transitionId: TransitionId,\n entities: WithWorkflow<T>[],\n currentUser: WorkflowCurrentUser,\n payload?: unknown,\n ): Promise<BulkTransitionResult<T>>;\n\n /**\n * Get available transitions from the current state\n */\n abstract getAvailableTransitions(\n definition: WorkflowDefinition<T>,\n entity: WithWorkflow<T>,\n currentUser: WorkflowCurrentUser,\n ): WorkflowTransition<T>[];\n\n /**\n * Get the current state definition for an entity\n */\n abstract getCurrentState(\n definition: WorkflowDefinition<T>,\n entity: WithWorkflow<T>,\n ): WorkflowState | undefined;\n\n /**\n * Get a state definition by ID\n */\n abstract getState(definition: WorkflowDefinition<T>, stateId: StateId): WorkflowState | undefined;\n\n /**\n * Get the initial state for a workflow\n */\n abstract getInitialState(definition: WorkflowDefinition<T>): WorkflowState | undefined;\n\n /**\n * Create initial workflow summary for a new entity\n */\n abstract createInitialSummary(definition: WorkflowDefinition<T>, userId: string): WorkflowSummary;\n\n /**\n * Check if entity is in a final state\n */\n abstract isFinalState(definition: WorkflowDefinition<T>, entity: WithWorkflow<T>): boolean;\n}\n","/*\n * Public API Surface of core-api\n */\n\nexport * from './lib/audit';\nexport * from './lib/authentication';\nexport * from './lib/authorization';\nexport * from './lib/cloud';\nexport * from './lib/config';\nexport * from './lib/email';\nexport * from './lib/entity';\nexport * from './lib/error';\nexport * from './lib/i18n';\nexport * from './lib/icon';\nexport * from './lib/logger';\nexport * from './lib/repository';\nexport * from './lib/storage';\nexport * from './lib/rule';\nexport * from './lib/workflow';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAGO,MAAM,iBAAiB,GAAG;;ACOjC;;;AAGG;MACmB,YAAY,CAAA;AA+FjC;;MCzGqB,0BAA0B,CAAA;AAoB/C;MAkBY,kCAAkC,GAAG,IAAI,cAAc,CAClE,4BAA4B;MAGjB,+BAA+B,GAAG,IAAI,cAAc,CAC/D,yBAAyB;;ACYpB,MAAM,gBAAgB,GAAc;AACzC,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,eAAe,EAAE,KAAK;AACtB,IAAA,KAAK,EAAE,IAAI;;;MCnDS,qBAAqB,CAAA;AACxB,IAAA,UAAU,GAAG,MAAM,CAAY,gBAAgB,sDAAC;AAEjD,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAExC,IAAA,WAAW,GAAG,IAAI,CAAC,SAAS;AAE5B,IAAA,eAAe,GAAG,IAAI,CAAC,SAAS;uGAP5B,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAArB,qBAAqB,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAD1C;;;ACTM,MAAM,uBAAuB,GAAmB;AACrD,IAAA,MAAM,EAAE,cAAc;AACtB,IAAA,UAAU,EAAE,8BAA8B;AAC1C,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,aAAa,EAAE,0BAA0B;AACzC,IAAA,iBAAiB,EAAE,WAAW;AAC9B,IAAA,KAAK,EAAE,8BAA8B;AACrC,IAAA,aAAa,EAAE,cAAc;;AAGxB,MAAM,4BAA4B,GAAuB;AAC9D,IAAA,QAAQ,EAAE,uBAAuB;AACjC,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,iBAAiB,EAAE,KAAK;;MA2Cb,eAAe,GAAG,IAAI,cAAc,CAAiB,iBAAiB;MAEtE,oBAAoB,GAAG,IAAI,cAAc,CAAqB,sBAAsB;AAE3F,SAAU,yBAAyB,CAAC,MAA0B,EAAA;IAClE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,4BAA4B,EAAE;AAC5F;;MCrDsB,YAAY,CAAA;AAmEjC;MAEY,mBAAmB,GAAG,IAAI,cAAc,CAAe,cAAc;;MCnErE,oBAAoB,GAAG,IAAI,cAAc,CAAqB,sBAAsB;AAE3F,SAAU,yBAAyB,CAAC,MAA0B,EAAA;IAClE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC5D;AAEO,MAAM,4BAA4B,GAAuB;AAC9D,IAAA,cAAc,EAAE;AACd,QAAA,KAAK,EAAE,kBAAkB;AACzB,QAAA,WAAW,EAAE,iBAAiB;AAC9B,QAAA,SAAS,EAAE,WAAW;AACtB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;AACzB,KAAA;;;AC3BI,MAAM,cAAc,GAAG;AAC5B,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,EAAE,EAAE,IAAI;;;MCNG,yBAAyB,GAAG,IAAI,cAAc,CACzD,oBAAoB;AAGhB,SAAU,yBAAyB,CAAC,MAA2B,EAAA;IACnE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,IAAI,2BAA2B,EAAE;AAChG;AAEO,MAAM,2BAA2B,GAAuB;AAC7D,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,MAAM,EAAE,KAAK;;;ACjBf;;;AAGG;MACmB,YAAY,CAAA;AAsBjC;;MCFY,YAAY,GAAG,IAAI,cAAc,CAAc,cAAc;;MCtBpD,eAAe,CAAA;AAmBpC;;MCXqB,aAAa,CAAA;AAQ1B,IAAA,IAAI;AAaZ;;AC3BD;;;;;;;;;;;AAWG;MACmB,YAAY,CAAA;AAchC;;;;;;AAMG;AACI,IAAA,qBAAqB,CAAC,QAAsB,EAAA;AACjD,QAAA,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC;IACtF;AAEA;;;;;;;AAOG;IACI,gBAAgB,CAAC,SAAiB,EAAE,QAAuB,EAAA;AAChE,QAAA,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC;IACjF;AACD;;ACXD;;;AAGG;MACmB,UAAU,CAAA;AAwC/B;;ACpFK,MAAgB,gBAIpB,SAAQ,UAAqB,CAAA;AAAG;;ACWlC;;;;AAIG;MACU,wBAAwB,GAAG,IAAI,cAAc,CACxD,wBAAwB;;ACrBpB,MAAgB,gBAIpB,SAAQ,UAAuB,CAAA;AAAG;;ICPxB;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,WAAA,CAAA,GAAA,YAAwB;AAC1B,CAAC,EAFW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;AASf,MAAO,MAAO,SAAQ,KAAK,CAAA;AACxB,IAAA,OAAO;AAEd,IAAA,WAAA,CAAY,OAAe,EAAE,KAAY,EAAE,OAAqB,EAAA;QAC9D,KAAK,CAAC,OAAO,CAAC;AAEd,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;IACxB;AACD;;MCfqB,gBAAgB,CAAA;AAIrC;;MCLqB,gBAAgB,CAAA;AAErC;;MCJqB,QAAQ,CAAA;AAa7B;;MCHqB,WAAW,CAAA;AAGF,IAAA,UAAA;AAFnB,IAAA,WAAW;AAErB,IAAA,WAAA,CAA6B,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAAe;AAyCvD;;MCnDqB,QAAQ,CAAA;AAM7B;;ICPW;AAAZ,CAAA,UAAY,aAAa,EAAA;AACvB,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,aAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACX,CAAC,EAVW,aAAa,KAAb,aAAa,GAAA,EAAA,CAAA,CAAA;MAYZ,eAAe,GAAG,IAAI,cAAc,CAAW,WAAW;MAE1D,sBAAsB,GAAG,IAAI,cAAc,CAAS,kBAAkB;;ACPnF;;;AAGG;AACG,SAAU,SAAS,CAAC,IAAY,EAAA;IACpC,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE;AACtB,QAAA,IAAI,EAAE,YAAY;KACnB;AACH;AAEO,MAAM,aAAa,GAAW;AACnC,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC/D,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACzD,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACnD,IAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC9D,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC7D,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC9D,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACzD,IAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC9D,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC5D,IAAA,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC3D,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC5D,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC/D,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACnD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACjE,IAAA,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrE,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC7D,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC7D,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAChE,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACzD,IAAA,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACnD,IAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC5D,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC7D,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC1D,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC7D,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC1D,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACvD,IAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC/D,IAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC1D,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC9D,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACzD,IAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC1D,IAAA,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAChE,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAClD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC5D,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACtD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACzD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC1D,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAClD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,EAAE;AACxD,IAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE;;AAGxD;;AAEG;AACI,MAAM,cAAc,GAAW;AACpC,IAAA;AACE,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,iBAAiB;AACxB,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,UAAU,EAAE,CAAA,8QAAA,CAAgR;AAC7R,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,KAAK,EAAE,iBAAiB;AACxB,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,UAAU,EAAE,CAAA,yVAAA,CAA2V;AACxW,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,KAAK,EAAE,iBAAiB;AACxB,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,UAAU,EAAE,CAAA,uQAAA,CAAyQ;AACtR,KAAA;;AAGH;;AAEG;AACI,MAAM,QAAQ,GAAW,CAAC,GAAG,aAAa,EAAE,GAAG,cAAc;;ACtIpE;;;AAGG;MACmB,MAAM,CAAA;AAsJ3B;;ACjID;AACO,MAAM,kBAAkB,GAAG;;MCpBZ,aAAa,CAAA;AAiDlC;;AC1DD;;;;;AAKG;AAyDI,MAAM,4BAA4B,GAAG;;AC9D5C;;;;;;;AAOG;AA2HH;;;;;;;AAOG;MACmB,cAAc,CAAA;AAuEnC;;ACjND;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zssz-soft/core-api",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Core API types and abstract classes for the @zssz-soft library ecosystem",
5
5
  "author": "zssz-soft",
6
6
  "license": "MIT",
@@ -789,6 +789,14 @@ interface CreateUserResponse {
789
789
  emailSent?: boolean;
790
790
  error?: string;
791
791
  }
792
+ interface CreateAppConfigRequest {
793
+ appId: string;
794
+ config: Record<string, unknown>;
795
+ }
796
+ type CreateAppConfigResult = CloudFunctionResult<{
797
+ appId: string;
798
+ created: boolean;
799
+ }>;
792
800
 
793
801
  declare abstract class CloudService {
794
802
  abstract checkBootstrapStatus(): Promise<BootstrapStatusResult>;
@@ -820,6 +828,7 @@ declare abstract class CloudService {
820
828
  documentUpdated?: boolean;
821
829
  originalFilePath?: string;
822
830
  }>;
831
+ abstract createAppConfig(request: CreateAppConfigRequest): Promise<CreateAppConfigResult>;
823
832
  }
824
833
  declare const CLOUD_SERVICE_TOKEN: InjectionToken<CloudService>;
825
834
 
@@ -1630,4 +1639,4 @@ declare abstract class WorkflowEngine<T extends Workflowable> {
1630
1639
  }
1631
1640
 
1632
1641
  export { APP_BOOTSTRAP_CONFIG, AUDIT_FEATURE_KEY, AUTHENTICATION_STORE_SERVICE_TOKEN, AUTHENTICATION_STORE_VIEW_TOKEN, AuditService, AuthenticationService, AuthenticationStoreService, CLOUD_SERVICE_TOKEN, CloudService, DEFAULT_APP_BOOTSTRAP_CONFIG, DEFAULT_FIREBASE_AUTH_CONFIG, DEFAULT_FIREBASE_CONFIG, DEFAULT_LANGUAGE_TOKEN, DEFAULT_NOTIFICATION_CONFIG, DOCUMENTS_KEYS, DateTimePipeBase, DateUtil, EMAIL_CONFIG, EmailService, EntityAdapter, EntityEffect, EntityFormLogic, EntityRepository, ErrorType, ErrorUtilService, FIREBASE_AUTH_CONFIG, FIREBASE_CONFIG, FIRESTORE_ENGINE_CREATOR, I18nService, I18nUtil, KError, LANGUAGES_TOKEN, LOGGER_ENVIRONMENT, LanguagesEnum, Logger, NOTIFICATION_CONFIG_TOKEN, Repository, RepositoryEngine, StorageEngine, WORKFLOW_HISTORY_FEATURE_KEY, WorkflowEngine, allIcons, customSvgIcons, initialAuthState, materialIcons, primeIcon, provideAppBootstrapConfig, provideFirebaseAuthConfig, provideNotificationConfig };
1633
- export type { AppBootstrapConfig, Audit, AuditAction, AuditEntity, AuditEntityAdd, AuditEntityUpdate, AuditLog, AuditLogQuery, AuditLogStats, AuditMetadata, AuditModel, AuditModelAdd, AuditModelUpdate, AuditResource, AuditResult, AuthCredentials, AuthErrorCode, AuthMethod, AuthProvider, AuthResult, AuthState, AuthUser, AuthenticationStoreView, AuthorizationContext, AuthorizationOptions, BatchOperation, BootstrapStatusResult, BulkTransitionResult, CanExecuteTransitionResult, CloudFunctionResult, CollectionPathBuilder, CreateUserAndSendPasswordResetResult, CreateUserData, CreateUserRequest, CreateUserResponse, CustomEntityState, EmailConfig, EmailPasswordCredentials, Entity, EntityActions, EntityAdd, EntityCollectionStoreView, EntityConfig, EntityFormStoreView, EntityHelper, EntityModel, EntityModelAdd, EntityModelUpdate, EntitySignals, EntityStore, EntityStoreView, EntityTableResourceStoreView, EntityTableStoreView, EntityType, EntityUpdate, ErrorOptions, FirebaseAuthConfig, FirebaseConfig, HashMapModel, I18nConfig, I18nText, Icon, IconType, LoaderData, Localizable, LogDataOperationOptions, LogEntry, LogLevel, LogMethodOptions, LogUIActionOptions, LogUserActionOptions, LoggerConfig, LoggerEnvironmentConfig, NotificationConfig, Permission, RepositoryEngineCreator, Role, Rule, RuleCondition, RuleConflict, RuleEffectBase, RuleEvaluationContext, RuleEvaluationResult, RuleTarget, RuleValidationError, RuleValidationResult, RuleWhen, RxEntityActions, SendPasswordResetEmailData, SessionConfig, StateId, StorageDeleteOptions, StorageError, StorageFile, StorageListOptions, StorageListResult, StorageUploadOptions, StorageUploadProgress, SubcollectionContext, TimeAsDateRange, TimeAsString, TransitionExecutionResult, TransitionId, UserConfig, UserRegistrationData, WelcomeEmailData, WelcomeEmailDataWithConfig, WithWorkflow, WorkflowActionFn, WorkflowCurrentUser, WorkflowDefinition, WorkflowGuardFn, WorkflowHistoryEntry, WorkflowHistoryEntryAdd, WorkflowHistoryEntryData, WorkflowHistoryEntryUpdate, WorkflowHistoryModel, WorkflowHistoryModelAdd, WorkflowId, WorkflowState, WorkflowSummary, WorkflowTransition, WorkflowTransitionContext, Workflowable };
1642
+ export type { AppBootstrapConfig, Audit, AuditAction, AuditEntity, AuditEntityAdd, AuditEntityUpdate, AuditLog, AuditLogQuery, AuditLogStats, AuditMetadata, AuditModel, AuditModelAdd, AuditModelUpdate, AuditResource, AuditResult, AuthCredentials, AuthErrorCode, AuthMethod, AuthProvider, AuthResult, AuthState, AuthUser, AuthenticationStoreView, AuthorizationContext, AuthorizationOptions, BatchOperation, BootstrapStatusResult, BulkTransitionResult, CanExecuteTransitionResult, CloudFunctionResult, CollectionPathBuilder, CreateAppConfigRequest, CreateAppConfigResult, CreateUserAndSendPasswordResetResult, CreateUserData, CreateUserRequest, CreateUserResponse, CustomEntityState, EmailConfig, EmailPasswordCredentials, Entity, EntityActions, EntityAdd, EntityCollectionStoreView, EntityConfig, EntityFormStoreView, EntityHelper, EntityModel, EntityModelAdd, EntityModelUpdate, EntitySignals, EntityStore, EntityStoreView, EntityTableResourceStoreView, EntityTableStoreView, EntityType, EntityUpdate, ErrorOptions, FirebaseAuthConfig, FirebaseConfig, HashMapModel, I18nConfig, I18nText, Icon, IconType, LoaderData, Localizable, LogDataOperationOptions, LogEntry, LogLevel, LogMethodOptions, LogUIActionOptions, LogUserActionOptions, LoggerConfig, LoggerEnvironmentConfig, NotificationConfig, Permission, RepositoryEngineCreator, Role, Rule, RuleCondition, RuleConflict, RuleEffectBase, RuleEvaluationContext, RuleEvaluationResult, RuleTarget, RuleValidationError, RuleValidationResult, RuleWhen, RxEntityActions, SendPasswordResetEmailData, SessionConfig, StateId, StorageDeleteOptions, StorageError, StorageFile, StorageListOptions, StorageListResult, StorageUploadOptions, StorageUploadProgress, SubcollectionContext, TimeAsDateRange, TimeAsString, TransitionExecutionResult, TransitionId, UserConfig, UserRegistrationData, WelcomeEmailData, WelcomeEmailDataWithConfig, WithWorkflow, WorkflowActionFn, WorkflowCurrentUser, WorkflowDefinition, WorkflowGuardFn, WorkflowHistoryEntry, WorkflowHistoryEntryAdd, WorkflowHistoryEntryData, WorkflowHistoryEntryUpdate, WorkflowHistoryModel, WorkflowHistoryModelAdd, WorkflowId, WorkflowState, WorkflowSummary, WorkflowTransition, WorkflowTransitionContext, Workflowable };