{"version":3,"file":"ngx-appwrite.mjs","sources":["../../../../libs/ngx-appwrite/src/lib/error-handler.ts","../../../../libs/ngx-appwrite/src/lib/helpers.ts","../../../../libs/ngx-appwrite/src/lib/setup.ts","../../../../libs/ngx-appwrite/src/lib/account.ts","../../../../libs/ngx-appwrite/src/lib/tablesdb.ts","../../../../libs/ngx-appwrite/src/lib/adapter-without-replication.ts","../../../../libs/ngx-appwrite/src/lib/avatars.ts","../../../../libs/ngx-appwrite/src/lib/databases.ts","../../../../libs/ngx-appwrite/src/lib/functions.ts","../../../../libs/ngx-appwrite/src/lib/localization.ts","../../../../libs/ngx-appwrite/src/lib/messaging.ts","../../../../libs/ngx-appwrite/src/lib/storage.ts","../../../../libs/ngx-appwrite/src/lib/teams.ts","../../../../libs/ngx-appwrite/src/ngx-appwrite.ts"],"sourcesContent":["import { Injectable, InjectionToken, Provider } from '@angular/core';\nimport { AppwriteException } from 'appwrite';\n\n/**\n * Configuration options for the AppwriteErrorHandler.\n */\nexport interface AppwriteErrorHandlerConfig {\n  /**\n   * Whether to log errors to console. Default: true\n   */\n  logErrors?: boolean;\n\n  /**\n   * Whether to rethrow non-Appwrite errors. Default: true\n   */\n  rethrowUnknownErrors?: boolean;\n\n  /**\n   * Custom error handler callback for Appwrite exceptions.\n   */\n  onAppwriteError?: (error: AppwriteException) => void;\n\n  /**\n   * Custom error handler callback for unknown errors.\n   */\n  onUnknownError?: (error: unknown) => void;\n}\n\n/**\n * Injection token for AppwriteErrorHandler configuration.\n */\nexport const APPWRITE_ERROR_HANDLER_CONFIG =\n  new InjectionToken<AppwriteErrorHandlerConfig>(\n    'APPWRITE_ERROR_HANDLER_CONFIG',\n  );\n\n/**\n * Centralized error handling service for Appwrite operations.\n *\n * This service provides consistent error handling across all Appwrite services.\n * It can be configured to log errors, rethrow unknown errors, and call custom\n * error handlers.\n *\n * @example\n * ```typescript\n * // In a service\n * private errorHandler = inject(AppwriteErrorHandler);\n *\n * async fetchData(): Promise<Data | null> {\n *   try {\n *     return await this.databases.listDocuments(...);\n *   } catch (error) {\n *     return this.errorHandler.handle(error, null);\n *   }\n * }\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class AppwriteErrorHandler {\n  private config: AppwriteErrorHandlerConfig = {\n    logErrors: true,\n    rethrowUnknownErrors: true,\n  };\n\n  /**\n   * Configure the error handler.\n   */\n  configure(config: AppwriteErrorHandlerConfig): void {\n    this.config = { ...this.config, ...config };\n  }\n\n  /**\n   * Handle an error from an Appwrite operation.\n   *\n   * @param error - The error to handle\n   * @param fallbackValue - The value to return if the error is handled\n   * @returns The fallback value if the error is an AppwriteException, otherwise throws\n   */\n  handle<T>(error: unknown, fallbackValue: T): T {\n    if (error instanceof AppwriteException) {\n      return this.handleAppwriteError(error, fallbackValue);\n    }\n    return this.handleUnknownError(error, fallbackValue);\n  }\n\n  /**\n   * Handle an AppwriteException.\n   */\n  private handleAppwriteError<T>(error: AppwriteException, fallbackValue: T): T {\n    if (this.config.logErrors) {\n      console.warn(`[ngx-appwrite] AppwriteException: ${error.message}`, {\n        code: error.code,\n        type: error.type,\n      });\n    }\n\n    if (this.config.onAppwriteError) {\n      this.config.onAppwriteError(error);\n    }\n\n    return fallbackValue;\n  }\n\n  /**\n   * Handle an unknown error.\n   */\n  private handleUnknownError<T>(error: unknown, fallbackValue: T): T {\n    if (this.config.logErrors) {\n      console.error('[ngx-appwrite] Unknown error:', error);\n    }\n\n    if (this.config.onUnknownError) {\n      this.config.onUnknownError(error);\n    }\n\n    if (this.config.rethrowUnknownErrors) {\n      throw error;\n    }\n\n    return fallbackValue;\n  }\n\n  /**\n   * Wrap a promise with error handling.\n   *\n   * @param promise - The promise to wrap\n   * @param fallbackValue - The value to return if an error occurs\n   * @returns The promise result or fallback value\n   */\n  async wrap<T>(promise: Promise<T>, fallbackValue: T): Promise<T> {\n    try {\n      return await promise;\n    } catch (error) {\n      return this.handle(error, fallbackValue);\n    }\n  }\n}\n\n/**\n * Provider for configuring the AppwriteErrorHandler.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     provideAppwrite({ ... }),\n *     provideAppwriteErrorHandler({\n *       logErrors: true,\n *       rethrowUnknownErrors: false,\n *       onAppwriteError: (error) => console.log('Appwrite error:', error),\n *     }),\n *   ],\n * };\n * ```\n */\nexport const provideAppwriteErrorHandler = (\n  config: AppwriteErrorHandlerConfig,\n): Provider => {\n  return {\n    provide: APPWRITE_ERROR_HANDLER_CONFIG,\n    useValue: config,\n  };\n};\n","import { Client, RealtimeResponseEvent } from 'appwrite';\nimport { Observable } from 'rxjs';\n\nexport const watch = <T>(\n  client: Client,\n  channel: string | string[],\n  events?: string | string[],\n): Observable<RealtimeResponseEvent<T>> => {\n  return new Observable<RealtimeResponseEvent<T>>((observer) => {\n    const handleResponse = (response: RealtimeResponseEvent<T>): void => {\n      if (!events) {\n        observer.next(response);\n        return;\n      }\n\n      const eventList = Array.isArray(events) ? events : [events];\n      const hasMatchingEvent = eventList.some((event) =>\n        response.events.includes(event),\n      );\n\n      if (hasMatchingEvent) {\n        observer.next(response);\n      }\n    };\n\n    try {\n      const unsubscribe = client.subscribe<T>(channel, handleResponse);\n\n      // Cleanup function\n      return () => {\n        try {\n          unsubscribe();\n        } catch (error) {\n          console.error('Error while unsubscribing:', error);\n        }\n      };\n    } catch (error) {\n      console.error('Error while watching channel:', channel, error);\n      observer.error(error);\n      return undefined;\n    }\n  });\n};\n\nexport const wait = (seconds: number): Promise<void> => {\n  return new Promise((resolve) => {\n    setTimeout(resolve, seconds * 1000);\n  });\n};\n\nexport const deepEqual = <T>(obj1: T, obj2: T): boolean => {\n  return JSON.stringify(obj1) === JSON.stringify(obj2);\n};\n\n","import {\n  EnvironmentProviders,\n  inject,\n  InjectionToken,\n  makeEnvironmentProviders,\n  provideAppInitializer,\n} from '@angular/core';\nimport { Client } from 'appwrite';\nimport { AppwriteConfig } from './config';\n\nexport { ID } from 'appwrite';\n\nlet __client: Client | undefined;\nlet __defaultDatabaseId: string | undefined;\n\n/**\n * Injection token for the Appwrite Client.\n * Can be used to inject the client directly into services.\n */\nexport const APPWRITE_CLIENT = new InjectionToken<Client>('APPWRITE_CLIENT', {\n  providedIn: 'root',\n  factory: () => {\n    if (!__client) {\n      throw new Error(\n        'Appwrite client not initialized, did you call provideAppwrite?',\n      );\n    }\n    return __client;\n  },\n});\n\n/**\n * Injection token for the default database ID.\n * Can be used to inject the default database ID directly into services.\n */\nexport const APPWRITE_DEFAULT_DATABASE = new InjectionToken<string | undefined>(\n  'APPWRITE_DEFAULT_DATABASE',\n  {\n    providedIn: 'root',\n    factory: () => __defaultDatabaseId,\n  },\n);\n\nconst ConfigToken = new InjectionToken<AppwriteConfig>('APPWRITE_USER_CONFIG');\n\nconst initializeAppwrite = (config: AppwriteConfig): void => {\n  __client = new Client();\n\n  __client.setEndpoint(config.endpoint).setProject(config.project);\n\n  if (config.defaultDatabase) {\n    __defaultDatabaseId = config.defaultDatabase;\n  }\n};\n\nexport const provideAppwrite = (\n  config: AppwriteConfig,\n): EnvironmentProviders => {\n  return makeEnvironmentProviders([\n    {\n      provide: ConfigToken,\n      useValue: config,\n    },\n    provideAppInitializer(() => {\n      const config = inject(ConfigToken);\n      initializeAppwrite(config);\n    }),\n  ]);\n};\n","import { inject, Injectable, Provider, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n  Account as AppwriteAccount,\n  AuthenticationFactor,\n  AuthenticatorType,\n  ID,\n  Models,\n  OAuthProvider,\n} from 'appwrite';\nimport {\n  BehaviorSubject,\n  catchError,\n  distinctUntilChanged,\n  exhaustMap,\n  from,\n  Observable,\n  of,\n  shareReplay,\n  Subscription,\n  switchMap,\n} from 'rxjs';\nimport { AppwriteErrorHandler } from './error-handler';\nimport { watch } from './helpers';\nimport { APPWRITE_CLIENT } from './setup';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Account {\n  /* -------------------------------------------------------------------------- */\n  /*                                    Setup                                   */\n  /* -------------------------------------------------------------------------- */\n\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _account = new AppwriteAccount(this._client);\n  private readonly _client$ = of(this._client).pipe(shareReplay(1));\n  private readonly _errorHandler = inject(AppwriteErrorHandler);\n\n  private _authWatchSubscription: Subscription | undefined;\n  private _auth$ = new BehaviorSubject<Models.User<Models.Preferences> | null>(\n    null,\n  );\n\n  /* -------------------------------------------------------------------------- */\n  /*                                  Reactive                                  */\n  /* -------------------------------------------------------------------------- */\n\n  constructor() {\n    this.initAuth();\n    this.updateAuthSubscription();\n  }\n\n  private async initAuth() {\n    try {\n      const user = await this.get();\n      this._auth$.next(user);\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    } catch (error) {\n      this._auth$.next(null);\n    }\n  }\n\n  /**\n   * Emits the currently logged in user, or null if no user is logged in.\n   *\n   * @template TPrefs - The type of the user's preferences.\n   * @returns An observable that emits the currently logged in user, or null.\n   */\n  public onAuth$<\n    TPrefs extends Models.Preferences,\n  >(): Observable<Models.User<TPrefs> | null> {\n    return this._auth$.asObservable() as Observable<Models.User<TPrefs> | null>;\n  }\n\n  public getAuthSignal<\n    TPrefs extends Models.Preferences,\n  >(): Signal<Models.User<TPrefs> | null> {\n    return toSignal(this.onAuth$<TPrefs>(), { initialValue: null });\n  }\n\n  /* -------------------------------------------------------------------------- */\n  /*    Default API - https://appwrite.io/docs/client/account?sdk=web-default   */\n  /* -------------------------------------------------------------------------- */\n\n  /**\n   * Get Account\n   *\n   * Get currently logged in user data as JSON object.\n   *\n   * @template TPrefs The type of the user's preferences.\n   * @returns The user's data.\n   */\n  async get<TPrefs extends Models.Preferences>(): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.get<TPrefs>(),\n      {} as Models.User<TPrefs>, // Default nulls are handled differently in auth, we fallback to object or let it throw based on config\n    );\n  }\n\n  /**\n   * Create Account\n   *\n   * Use this endpoint to allow a new user to register a new account in your project.\n   * After the user registration completes successfully, you can use the /account/verfication route\n   * to start verifying the user email address. To allow the new user to login to their new account,\n   * you need to create a new account session.\n   *\n   * @param email The user's email address.\n   * @param password The user's password.\n   * @param defaultPrefs The user's default preferences.\n   * @param name The user's name.\n   * @param userId The user's ID.\n   * @returns The newly created user.\n   */\n  async create<Preferences extends Models.Preferences>({\n    email,\n    password,\n    defaultPrefs,\n    name,\n    userId,\n  }: {\n    email: string;\n    password: string;\n    defaultPrefs: Preferences;\n    name?: string;\n    userId?: string;\n  }): Promise<Models.User<Preferences>> {\n    const account = await this._errorHandler.wrap(\n      this._account.create<Preferences>({\n        userId: userId ?? ID.unique(),\n        email,\n        password,\n        name,\n      }),\n      null,\n    );\n    if (account) {\n      this.updateAuthSubscription();\n      await this.updatePrefs({ prefs: defaultPrefs });\n    }\n\n    return account as Models.User<Preferences>;\n  }\n\n  /**\n   * Update Email\n   *\n   * Update currently logged in user account email address.\n   * After changing user address, the user confirmation status will get reset.\n   * A new confirmation email is not sent automatically however you can use the\n   * send confirmation email endpoint again to send the confirmation email.\n   * For security measures, user password is required to complete this request.\n   * This endpoint can also be used to convert an anonymous account to a normal one,\n   * by passing an email address and a new password.\n   *\n   *\n   * @param email The user's new email address.\n   * @param password The user's password.\n   * @returns The updated user.\n   */\n  updateEmail<TPrefs extends Models.Preferences>({\n    email,\n    password,\n  }: {\n    email: string;\n    password: string;\n  }): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.updateEmail({ email, password }),\n      {} as Models.User<TPrefs>,\n    );\n  }\n\n  /**\n   * List Identities\n   *\n   * Get the list of identities for the currently logged in user.\n   *\n   *\n   * @param queries An array of queries to filter the results.\n   * @returns The list of identities.\n   */\n  listIdentities({\n    queries,\n    total,\n  }: {\n    queries?: string[];\n    total?: boolean;\n  }): Promise<Models.IdentityList> {\n    return this._errorHandler.wrap(\n      this._account.listIdentities({ queries, total }),\n      {} as Models.IdentityList,\n    );\n  }\n\n  /**\n   * Delete Identity\n   *\n   * Delete a user identity by id.\n   *\n   * @param id The ID of the identity to delete.\n   * @returns An empty object.\n   */\n  async deleteIdentity({\n    identityId,\n  }: {\n    identityId: string;\n  }): Promise<Record<string, never>> {\n    const result = await this._errorHandler.wrap(\n      this._account.deleteIdentity({ identityId }),\n      undefined,\n    );\n\n    return result === undefined ? {} : (result as Record<string, never>);\n  }\n\n  /**\n   * Create JWT\n   *\n   * Use this endpoint to create a JSON Web Token. You can use the resulting JWT\n   * to authenticate on behalf of the current user when working with the\n   * Appwrite server-side API and SDKs. The JWT secret is valid for 15 minutes\n   * from its creation and will be invalid if the user will logout in that time\n   * frame.\n   *\n   * @returns A JSON Web Token.\n   */\n  createJWT(): Promise<Models.Jwt> {\n    return this._errorHandler.wrap(this._account.createJWT(), {} as Models.Jwt);\n  }\n\n  /**\n   * List Logs\n   *\n   * Get the list of latest security activity logs for the currently logged in user.\n   * Each log returns user IP address, location and date and time of log.\n   *\n   * @param queries An array of queries to filter the results.\n   * @returns A list of security logs.\n   */\n  listLogs({\n    queries,\n    total,\n  }: {\n    queries?: string[];\n    total?: boolean;\n  }): Promise<Models.LogList> {\n    return this._errorHandler.wrap(\n      this._account.listLogs({ queries, total }),\n      {} as Models.LogList,\n    );\n  }\n\n  /**\n   * Update MFA\n   *\n   * Enable or disable MFA on an account.\n   *\n   * @param mfa Whether to enable or disable MFA.\n   * @returns The updated user.\n   */\n  updateMFA<TPrefs extends Models.Preferences>({\n    mfa,\n  }: {\n    mfa: boolean;\n  }): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.updateMFA({ mfa }),\n      {} as Models.User<TPrefs>,\n    );\n  }\n\n  /**\n   * Add Authenticator\n   *\n   * Add an authenticator app to be used as an MFA factor.\n   * Verify the authenticator using the verify authenticator method.\n   *\n   * @returns The MFA type.\n   */\n  createMFAAuthenticator(): Promise<Models.MfaType> {\n    return this._errorHandler.wrap(\n      this._account.createMFAAuthenticator({\n        type: AuthenticatorType.Totp,\n      }),\n      {} as Models.MfaType,\n    );\n  }\n\n  /**\n   * Verify Authenticator\n   *\n   * Verify an authenticator app after adding it using the add authenticator method.\n   *\n   * @param otp The one-time password from the authenticator app.\n   * @returns An empty object.\n   */\n  updateMFAAuthenticator<TPrefs extends Models.Preferences>({\n    otp,\n  }: {\n    otp: string;\n  }): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.updateMFAAuthenticator({\n        type: AuthenticatorType.Totp,\n        otp,\n      }),\n      {} as Models.User<TPrefs>,\n    );\n  }\n\n  /**\n   * Delete Authenticator\n   *\n   * Delete an authenticator app.\n   *\n   * @returns An empty object.\n   */\n  async deleteMFAAuthenticator(): Promise<void> {\n    await this._errorHandler.wrap(\n      this._account.deleteMFAAuthenticator({\n        type: AuthenticatorType.Totp,\n      }),\n      undefined,\n    );\n  }\n\n  /**\n   * Create Challenge\n   *\n   * Create a challenge to be solved before continuing to a protected route.\n   *\n   * @param factor The authentication factor to use for the challenge.\n   * @returns The MFA challenge.\n   */\n  createMFAChallenge(\n    factor: AuthenticationFactor,\n  ): Promise<Models.MfaChallenge> {\n    return this._errorHandler.wrap(\n      this._account.createMFAChallenge({ factor }),\n      {} as Models.MfaChallenge,\n    );\n  }\n\n  /**\n   * Verify Challenge\n   *\n   * Verify a challenge to continue to a protected route.\n   *\n   * @param challengeId The ID of the challenge to verify.\n   * @param otp The one-time password from the authenticator app.\n   * @returns An empty object.\n   */\n  async updateMFAChallenge({\n    challengeId,\n    otp,\n  }: {\n    challengeId: string;\n    otp: string;\n  }): Promise<Models.Session> {\n    const session = await this._errorHandler.wrap(\n      this._account.updateMFAChallenge({ challengeId, otp }),\n      null,\n    );\n    if (session) this.updateAuthSubscription();\n    return session as Models.Session;\n  }\n\n  /**\n   * List Factors\n   *\n   * List the available MFA factors for the current user.\n   *\n   * @returns A list of MFA factors.\n   */\n  listMFAFactors(): Promise<Models.MfaFactors> {\n    return this._errorHandler.wrap(\n      this._account.listMFAFactors(),\n      {} as Models.MfaFactors,\n    );\n  }\n\n  /**\n   * Get Recovery Codes\n   *\n   * Get the recovery codes for the current user.\n   *\n   * @returns A list of MFA recovery codes.\n   */\n  getMFARecoveryCodes(): Promise<Models.MfaRecoveryCodes> {\n    return this._errorHandler.wrap(\n      this._account.getMFARecoveryCodes(),\n      {} as Models.MfaRecoveryCodes,\n    );\n  }\n\n  /**\n   * Create Recovery Codes\n   *\n   * Create a new set of recovery codes for the current user.\n   *\n   * @returns A list of MFA recovery codes.\n   */\n  createMFARecoveryCodes(): Promise<Models.MfaRecoveryCodes> {\n    return this._errorHandler.wrap(\n      this._account.createMFARecoveryCodes(),\n      {} as Models.MfaRecoveryCodes,\n    );\n  }\n\n  /**\n   * Update Recovery Codes\n   *\n   * Update the recovery codes for the current user.\n   *\n   * @returns A list of MFA recovery codes.\n   */\n  updateMFARecoveryCodes(): Promise<Models.MfaRecoveryCodes> {\n    return this._errorHandler.wrap(\n      this._account.updateMFARecoveryCodes(),\n      {} as Models.MfaRecoveryCodes,\n    );\n  }\n\n  /**\n   * Update Name\n   *\n   * Update currently logged in user account name.\n   *\n   * @param name The user's new name.\n   * @returns The updated user.\n   */\n  updateName<TPrefs extends Models.Preferences>({\n    name,\n  }: {\n    name: string;\n  }): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.updateName({ name }),\n      {} as Models.User<TPrefs>,\n    );\n  }\n\n  /**\n   * Update Password\n   *\n   * Update currently logged in user account password.\n   * For validation, user is required to pass the password twice.\n   *\n   * @param password The user's new password.\n   * @param oldPassword The user's old password.\n   * @returns The updated user.\n   */\n  updatePassword<TPrefs extends Models.Preferences>({\n    password,\n    oldPassword,\n  }: {\n    password: string;\n    oldPassword?: string;\n  }): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.updatePassword({ password, oldPassword }),\n      {} as Models.User<TPrefs>,\n    );\n  }\n\n  /**\n   * Update Phone\n   *\n   * Update currently logged in user account phone number.\n   *\n   * @param phone The user's new phone number.\n   * @param password The user's password.\n   * @returns The updated user.\n   */\n  updatePhone<TPrefs extends Models.Preferences>({\n    phone,\n    password,\n  }: {\n    phone: string;\n    password: string;\n  }): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.updatePhone({ phone, password }),\n      {} as Models.User<TPrefs>,\n    );\n  }\n\n  /**\n   * Get Preferences\n   *\n   * Get currently logged in user preferences as a JSON object.\n   *\n   * @returns The user's preferences.\n   */\n  getPrefs<TPrefs extends Models.Preferences>(): Promise<TPrefs> {\n    return this._errorHandler.wrap(\n      this._account.getPrefs<TPrefs>(),\n      {} as TPrefs,\n    );\n  }\n\n  /**\n   * Update Preferences\n   *\n   * Update currently logged in user preferences.\n   * You can pass only the specific settings you wish to update.\n   *\n   * @param prefs The user's new preferences.\n   * @returns The updated user.\n   */\n  updatePrefs<TPrefs extends Models.Preferences>({\n    prefs,\n  }: {\n    prefs: TPrefs;\n  }): Promise<Models.User<TPrefs>> {\n    return this._errorHandler.wrap(\n      this._account.updatePrefs<TPrefs>({ prefs }),\n      {} as Models.User<TPrefs>,\n    );\n  }\n\n  /**\n   * Create Recovery\n   *\n   * Sends the user an email with a temporary secret key for password reset.\n   *\n   * @param email The user's email address.\n   * @param url The URL to redirect the user to after the password reset.\n   * @returns A token object.\n   */\n  createRecovery({\n    email,\n    url,\n  }: {\n    email: string;\n    url: string;\n  }): Promise<Models.Token> {\n    return this._errorHandler.wrap(\n      this._account.createRecovery({ email, url }),\n      {} as Models.Token,\n    );\n  }\n\n  /**\n   * Update Recovery\n   *\n   * Use this endpoint to complete the user account password reset.\n   *\n   * @param userId The user's ID.\n   * @param secret The secret key from the recovery email.\n   * @param password The user's new password.\n   * @returns A token object.\n   */\n  updateRecovery({\n    userId,\n    secret,\n    password,\n  }: {\n    userId: string;\n    secret: string;\n    password: string;\n  }): Promise<Models.Token> {\n    return this._errorHandler.wrap(\n      this._account.updateRecovery({ userId, secret, password }),\n      {} as Models.Token,\n    );\n  }\n\n  /**\n   * List Sessions\n   *\n   * Get the list of all the user sessions.\n   *\n   * @returns A list of sessions.\n   */\n  listSessions(): Promise<Models.SessionList> {\n    return this._errorHandler.wrap(\n      this._account.listSessions(),\n      {} as Models.SessionList,\n    );\n  }\n\n  /**\n   * Delete Sessions\n   *\n   * Delete all the user sessions.\n   *\n   * @returns An empty object.\n   */\n  async deleteSessions(): Promise<Record<string, never>> {\n    const deleted = await this._errorHandler.wrap(\n      this._account.deleteSessions(),\n      undefined,\n    );\n    this.updateAuthSubscription();\n\n    return deleted === undefined ? {} : (deleted as Record<string, never>);\n  }\n\n  /**\n   * Create Anonymous Session\n   *\n   * Use this endpoint to create a new anonymous account.\n   * After the user registration completes successfully, you can use the\n   * /account/verfication route to start verifying the user email address.\n   * To allow the new user to login to their new account,\n   * you need to create a new account session.\n   *\n   * @returns A session object.\n   */\n  async createAnonymousSession(): Promise<Models.Session> {\n    const session = await this._errorHandler.wrap(\n      this._account.createAnonymousSession(),\n      null,\n    );\n    if (session) this.updateAuthSubscription();\n    return session as Models.Session;\n  }\n\n  /**\n   * Create Email/Password Session\n   *\n   * Allow the user to login into his account by providing his email and password.\n   *\n   * @param email The user's email address.\n   * @param password The user's password.\n   * @returns A session object.\n   */\n  async createEmailPasswordSession({\n    email,\n    password,\n  }: {\n    email: string;\n    password: string;\n  }): Promise<Models.Session> {\n    const session = await this._errorHandler.wrap(\n      this._account.createEmailPasswordSession({\n        email,\n        password,\n      }),\n      null,\n    );\n    if (session) this.updateAuthSubscription();\n    return session as Models.Session;\n  }\n\n  /**\n   * Create OAuth2 Session\n   *\n   * Allow the user to login to his account using the OAuth2 provider of his choice.\n   * Each OAuth2 provider should be enabled from the Appwrite console.\n   *\n   * @param provider The OAuth2 provider to use.\n   * @param success The URL to redirect the user to after a successful login.\n   * @param failure The URL to redirect the user to after a failed login.\n   * @param scopes An array of scopes to request.\n   * @returns The OAuth2 session.\n   */\n  async createOAuth2Session({\n    provider,\n    success,\n    failure,\n    scopes,\n  }: {\n    provider: OAuthProvider;\n    success?: string;\n    failure?: string;\n    scopes?: string[];\n  }): Promise<string | void> {\n    const res = this._account.createOAuth2Session({\n      provider,\n      success,\n      failure,\n      scopes,\n    });\n    this.updateAuthSubscription();\n    return res;\n  }\n\n  /**\n   * Create Session\n   *\n   * Use this endpoint to create a new session.\n   *\n   * @param userId The user's ID.\n   * @param secret The secret from the token.\n   * @returns A session object.\n   */\n  createSession({\n    userId,\n    secret,\n  }: {\n    userId: string;\n    secret: string;\n  }): Promise<Models.Session> {\n    const session = this._account.createSession({ userId, secret });\n    this.updateAuthSubscription();\n    return session;\n  }\n\n  /**\n   * Get Session\n   *\n   * Get the session for the current user.\n   *\n   * @param sessionId The ID of the session to get.\n   * @returns A session object.\n   */\n  getSession({\n    sessionId = 'current',\n  }: {\n    sessionId?: string;\n  }): Promise<Models.Session> {\n    return this._account.getSession({ sessionId });\n  }\n\n  /**\n   * Update Session\n   *\n   * Update the session for the current user.\n   *\n   * @param sessionId The ID of the session to update.\n   * @returns A session object.\n   */\n  updateSession({\n    sessionId = 'current',\n  }: {\n    sessionId?: string;\n  }): Promise<Models.Session> {\n    return this._account.updateSession({ sessionId });\n  }\n\n  /**\n   * Delete Session\n   *\n   * Delete the session for the current user.\n   *\n   * @param sessionId The ID of the session to delete.\n   * @returns An empty object.\n   */\n  async deleteSession({\n    sessionId = 'current',\n  }: {\n    sessionId?: string;\n  }): Promise<Record<string, never>> {\n    const deleted = await this._account.deleteSession({ sessionId });\n    this.updateAuthSubscription();\n\n    return deleted === undefined ? {} : deleted;\n  }\n\n  /**\n   * Update Status\n   *\n   * Update the user's status.\n   *\n   * @returns The updated user.\n   */\n  updateStatus<TPrefs extends Models.Preferences>(): Promise<\n    Models.User<TPrefs>\n  > {\n    return this._account.updateStatus();\n  }\n\n  /**\n   * Create Push Target\n   *\n   * Create a new push target for the current user.\n   *\n   * @param targetId The ID of the push target.\n   * @param identifier The identifier of the push target.\n   * @param providerId The ID of the provider to use.\n   * @returns A push target object.\n   */\n  createPushTarget({\n    targetId,\n    identifier,\n    providerId,\n  }: {\n    targetId: string;\n    identifier: string;\n    providerId?: string;\n  }): Promise<Models.Target> {\n    return this._account.createPushTarget({ targetId, identifier, providerId });\n  }\n\n  /**\n   * Update Push Target\n   *\n   * Update a push target for the current user.\n   *\n   * @param targetId The ID of the push target.\n   * @param identifier The identifier of the push target.\n   * @returns A push target object.\n   */\n  updatePushTarget({\n    targetId,\n    identifier,\n  }: {\n    targetId: string;\n    identifier: string;\n  }): Promise<Models.Target> {\n    return this._account.updatePushTarget({ targetId, identifier });\n  }\n\n  /**\n   * Delete Push Target\n   *\n   * Delete a push target for the current user.\n   *\n   * @param targetId The ID of the push target.\n   * @returns An empty object.\n   */\n  async deletePushTarget({\n    targetId,\n  }: {\n    targetId: string;\n  }): Promise<Record<string, never>> {\n    const result = await this._account.deletePushTarget({ targetId });\n\n    return result === undefined ? {} : result;\n  }\n\n  /**\n   * Create Email Token\n   *\n   * Use this endpoint to create a new email token.\n   *\n   * @param userId The user's ID.\n   * @param email The user's email address.\n   * @param phrase Whether to use a phrase or a secret.\n   * @returns A token object.\n   */\n  createEmailToken({\n    userId,\n    email,\n    phrase,\n  }: {\n    userId: string;\n    email: string;\n    phrase?: boolean;\n  }): Promise<Models.Token> {\n    return this._account.createEmailToken({ userId, email, phrase });\n  }\n\n  /**\n   * Create Magic URL Token\n   *\n   * Use this endpoint to create a new magic URL token.\n   *\n   * @param email The user's email address.\n   * @param url The URL to redirect the user to after the magic URL is used.\n   * @param userId The user's ID.\n   * @param phrase Whether to use a phrase or a secret.\n   * @returns A token object.\n   */\n  createMagicURLToken({\n    userId,\n    email,\n    url,\n    phrase,\n  }: {\n    userId: string;\n    email: string;\n    url?: string;\n    phrase?: boolean;\n  }): Promise<Models.Token> {\n    return this._account.createMagicURLToken(userId, email, url, phrase);\n  }\n\n  /**\n   * Create OAuth2 Token\n   *\n   * Use this endpoint to create a new OAuth2 token.\n   *\n   * @param provider The OAuth2 provider to use.\n   * @param success The URL to redirect the user to after a successful login.\n   * @param failure The URL to redirect the user to after a failed login.\n   * @param scopes An array of scopes to request.\n   * @returns A new session.\n   */\n  async createOAuth2Token({\n    provider,\n    success,\n    failure,\n    scopes,\n  }: {\n    provider: OAuthProvider;\n    success?: string;\n    failure?: string;\n    scopes?: string[];\n  }): Promise<string | void> {\n    return this._account.createOAuth2Token(provider, success, failure, scopes);\n  }\n\n  /**\n   * Create Phone Token\n   *\n   * Use this endpoint to create a new phone token.\n   *\n   * @param userId The user's ID.\n   * @param phone The user's phone number.\n   * @returns A token object.\n   */\n  createPhoneToken({\n    userId,\n    phone,\n  }: {\n    userId: string;\n    phone: string;\n  }): Promise<Models.Token> {\n    return this._account.createPhoneToken({ userId, phone });\n  }\n\n  /**\n   * Create Verification\n   *\n   * Use this endpoint to send a verification email to the user.\n   *\n   * @param url The URL to redirect the user to after the verification.\n   * @returns A token object.\n   */\n  createEmailVerification({ url }: { url: string }): Promise<Models.Token> {\n    return this._account.createEmailVerification({ url });\n  }\n\n  /**\n   * Update Verification\n   *\n   * Use this endpoint to complete the email verification process.\n   *\n   * @param userId The user's ID.\n   * @param secret The secret from the verification email.\n   * @returns A token object.\n   */\n  updateEmailVerification({\n    userId,\n    secret,\n  }: {\n    userId: string;\n    secret: string;\n  }): Promise<Models.Token> {\n    return this._account.updateEmailVerification({ userId, secret });\n  }\n\n  /**\n   * Create Phone Verification\n   *\n   * Use this endpoint to send a verification SMS to the user.\n   *\n   * @returns A token object.\n   */\n  createPhoneVerification(): Promise<Models.Token> {\n    return this._account.createPhoneVerification();\n  }\n\n  /**\n   * Update Phone Verification\n   *\n   * Use this endpoint to complete the phone verification process.\n   *\n   * @param userId The user's ID.\n   * @param secret The secret from the verification SMS.\n   * @returns A token object.\n   */\n  updatePhoneVerification({\n    userId,\n    secret,\n  }: {\n    userId: string;\n    secret: string;\n  }): Promise<Models.Token> {\n    return this._account.updatePhoneVerification({ userId, secret });\n  }\n\n  /* -------------------------------------------------------------------------- */\n  /*                          Additional functionality                          */\n  /* -------------------------------------------------------------------------- */\n\n  /**\n   * Convert Anonymous account with password\n   *\n   * This endpoint is a shortcut in order to convert an anonymous account\n   * to a permanent one\n   *\n   * @param {string} email\n   * @param {string} password\n   * @param {ObjectSchema<TPrefs>} prefsSchema\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.User<T>>}\n   */\n  async convertAnonymousAccountWithEmailAndPassword<\n    Preferences extends Models.Preferences,\n  >({\n    email,\n    password,\n  }: {\n    email: string;\n    password: string;\n  }): Promise<Models.User<Preferences>> {\n    const account = await this._account.updateEmail<Preferences>({\n      email,\n      password,\n    });\n    this.updateAuthSubscription();\n    return account as Models.User<Preferences>;\n  }\n\n  /**\n   * Logout - Shortcut for deleteSession\n   *\n   * @returns An empty object.\n   */\n  async logout(): Promise<Record<string, never>> {\n    await this.deleteSession({ sessionId: 'current' });\n    return {};\n  }\n\n  /**\n   * Triggering an auth-check\n   *\n   * Trigger a check of all account and\n   * session-related actions to enable\n   * reactive monitoring of authentication status\n   * @returns {void}\n   */\n  updateAuthSubscription(): void {\n    if (this._authWatchSubscription) {\n      this._authWatchSubscription.unsubscribe();\n    }\n\n    this._authWatchSubscription = this._client$\n      .pipe(\n        switchMap((client) => watch(client, 'account')),\n        // Use exhaustMap to ignore new inner observables while one is still active\n        exhaustMap(() => from(this.get())),\n        distinctUntilChanged((prev, curr) => prev?.$id === curr?.$id),\n        catchError(() => of(null)),\n      )\n      .subscribe((user) => this._auth$.next(user));\n  }\n}\n\n/**\n * An alias for the Account class.\n */\nexport const AccountService = Account;\n\n/**\n * A provider for the Account class.\n */\nexport const provideAccount = (): Provider => {\n  return {\n    provide: Account,\n    useClass: Account,\n  };\n};\n","import { inject, Injectable, Provider } from '@angular/core';\nimport { TablesDB as AppwriteTablesDB, ID, Models, Query } from 'appwrite';\nimport {\n  distinctUntilChanged,\n  Observable,\n  of,\n  shareReplay,\n  startWith,\n  switchMap,\n} from 'rxjs';\nimport { deepEqual, watch } from './helpers';\nimport { APPWRITE_CLIENT, APPWRITE_DEFAULT_DATABASE } from './setup';\nimport { AppwriteErrorHandler } from './error-handler';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class TablesDB {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _defaultDatabaseId = inject(APPWRITE_DEFAULT_DATABASE);\n  private readonly _databases = new AppwriteTablesDB(this._client);\n  private readonly _client$ = of(this._client).pipe(shareReplay(1));\n  private readonly _errorHandler = inject(AppwriteErrorHandler);\n\n  /**\n   * List transactions across all databases.\n   *\n   * @param {string[]} params.queries - Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries).\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.TransactionList>}\n   */\n  listTransactions({\n    queries,\n  }: {\n    queries?: string[];\n  }): Promise<Models.TransactionList> {\n    return this._errorHandler.wrap(\n      this._databases.listTransactions({ queries }),\n      {} as Models.TransactionList,\n    );\n  }\n\n  /**\n   * Create a new transaction.\n   *\n   * @param {number} params.ttl - Seconds before the transaction expires.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  createTransaction({ ttl }: { ttl: number }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.createTransaction({ ttl }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Get a transaction by its unique ID.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  getTransaction({\n    transactionId,\n  }: {\n    transactionId: string;\n  }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.getTransaction({ transactionId }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Update a transaction, to either commit or roll back its operations.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @param {boolean} params.commit - Commit transaction?\n   * @param {boolean} params.rollback - Rollback transaction?\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  updateTransaction({\n    transactionId,\n    commit,\n    rollback,\n  }: {\n    transactionId: string;\n    commit?: boolean;\n    rollback?: boolean;\n  }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.updateTransaction({\n        transactionId,\n        commit,\n        rollback,\n      }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Delete a transaction by its unique ID.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @throws {AppwriteException}\n   * @returns {Promise<{}>}\n   */\n  deleteTransaction({\n    transactionId,\n  }: {\n    transactionId: string;\n  }): Promise<Record<string, unknown>> {\n    return this._errorHandler.wrap(\n      this._databases.deleteTransaction({ transactionId }),\n      {},\n    );\n  }\n\n  /**\n   * Create multiple operations in a single transaction.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @param {object[]} params.operations - Array of staged operations.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  createOperations({\n    transactionId,\n    operations,\n  }: {\n    transactionId: string;\n    operations: object[];\n  }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.createOperations({ transactionId, operations }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Get a list of all the user's rows in a given table. You can use the query params to filter your results.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.tableId - Table ID. You can create a new table using the TablesDB service [server integration](https://appwrite.io/docs/products/databases/tables#create-table).\n   * @param {string[]} params.queries - Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of 100 queries are allowed, each 4096 characters long.\n   * @param {string} params.transactionId - Transaction ID to read uncommitted changes within the transaction.\n   * @param {boolean} params.total - When set to false, the total count returned will be 0 and will not be calculated.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.RowList<Row>>}\n   */\n  async listRows<DocumentShape extends Models.Row>({\n    tableId,\n    queries,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    queries?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Models.RowList<DocumentShape>> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    const data = await this._errorHandler.wrap(\n      this._databases.listRows<DocumentShape>({\n        tableId,\n        queries,\n        databaseId: alternateDatabaseId,\n        transactionId,\n      }),\n      { total: 0, rows: [] } as unknown as Models.RowList<DocumentShape>,\n    );\n\n    return data;\n  }\n\n  /**\n   * Create a new Row. Before using this route, you should create a new table resource using either a [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable) API or directly from your database console.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.tableId - Table ID. You can create a new table using the Database service [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable). Make sure to define columns before creating rows.\n   * @param {string} params.rowId - Row ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can't start with a special char. Max length is 36 chars.\n   * @param {Row extends Models.DefaultRow ? Partial<Models.Row> & Record<string, any> : Partial<Models.Row> & Omit<Row, keyof Models.Row>} params.data - Row data as JSON object.\n   * @param {string[]} params.permissions - An array of permissions strings. By default, only the current user is granted all permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Row>}\n   */\n  createRow<DocumentShape extends Models.Row>({\n    tableId,\n    rowId = ID.unique(),\n    data,\n    permissions,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId?: string;\n    data: DocumentShape extends Models.DefaultRow\n      ? Partial<Models.Row> & Record<string, unknown>\n      : Partial<Models.Row> & Omit<DocumentShape, keyof Models.Row>;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.createRow<DocumentShape>({\n        tableId,\n        rowId,\n        data,\n        databaseId: alternateDatabaseId,\n        permissions,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Get a row by its unique ID. This endpoint response returns a JSON object with the row data.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.tableId - Table ID. You can create a new table using the Database service [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable).\n   * @param {string} params.rowId - Row ID.\n   * @param {string[]} params.queries - Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of 100 queries are allowed, each 4096 characters long.\n   * @param {string} params.transactionId - Transaction ID to read uncommitted changes within the transaction.\n   * @throws {AppwriteException}\n   * @returns {Promise<Row>}\n   */\n  getRow<DocumentShape extends Models.Row>({\n    tableId,\n    rowId,\n    queries,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId: string;\n    queries?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.getRow<DocumentShape>({\n        tableId,\n        rowId,\n        queries,\n        databaseId: alternateDatabaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Create or update a Row. Before using this route, you should create a new table resource using either a [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable) API or directly from your database console.\n   *\n   * @param {string} params.tableId - Table ID.\n   * @param {string} params.rowId - Row ID.\n   * @param {Row extends Models.DefaultRow ? Partial<Models.Row> & Record<string, any> : Partial<Models.Row> & Partial<Omit<Row, keyof Models.Row>>} params.data - Row data as JSON object. Include all required columns of the row to be created or updated.\n   * @param {string[]} params.permissions - An array of permissions strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).\n   * @param {string} params.alternateDatabaseId - Database ID.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Row>}\n   */\n  upsertRow<DocumentShape extends Models.Row>({\n    tableId,\n    rowId,\n    data,\n    permissions,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId: string;\n    data: DocumentShape extends Models.DefaultRow\n      ? Partial<Models.Row> & Record<string, any>\n      : Partial<Models.Row> & Partial<Omit<DocumentShape, keyof Models.Row>>;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.upsertRow<DocumentShape>({\n        tableId,\n        rowId,\n        data,\n        permissions,\n        databaseId: alternateDatabaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Update a row by its unique ID. Using the patch method you can pass only specific fields that will get updated.\n   *\n   * @param {string} params.tableId - Table ID.\n   * @param {string} params.rowId - Row ID.\n   * @param {Row extends Models.DefaultRow ? Partial<Models.Row> & Record<string, any> : Partial<Models.Row> & Partial<Omit<Row, keyof Models.Row>>} params.data - Row data as JSON object. Include only columns and value pairs to be updated.\n   * @param {string[]} params.permissions - An array of permissions strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).\n   * @param {string} params.alternateDatabaseId - Database ID.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Row>}\n   */\n  updateRow<DocumentShape extends Models.Row>({\n    tableId,\n    rowId,\n    data,\n    permissions,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId: string;\n    data: DocumentShape extends Models.DefaultRow\n      ? Partial<Models.Row> & Record<string, any>\n      : Partial<Models.Row> & Partial<Omit<DocumentShape, keyof Models.Row>>;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.updateRow<DocumentShape>({\n        tableId,\n        rowId,\n        data,\n        permissions,\n        databaseId: alternateDatabaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Delete a row by its unique ID.\n   *\n   * @param {string} params.tableId - Table ID. You can create a new table using the Database service [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable).\n   * @param {string} params.rowId - Row ID.\n   * @param {string} params.alternateDatabaseId - Database ID.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<{}>}\n   */\n  deleteRow({\n    tableId,\n    rowId,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId: string;\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Record<string, unknown>> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.deleteRow({\n        tableId,\n        rowId,\n        databaseId: alternateDatabaseId,\n        transactionId,\n      }),\n      {},\n    );\n  }\n\n  /**\n   * Decrement a specific column of a row by a given value.\n   *\n   * @param {string} params.tableId - Table ID.\n   * @param {string} params.rowId - Row ID.\n   * @param {string} params.column - Column key.\n   * @param {number} params.value - Value to increment the column by. The value must be a number.\n   * @param {number} params.min - Minimum value for the column. If the current value is lesser than this value, an exception will be thrown.\n   * @param {string} params.alternateDatabaseId - Database ID.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Row>}\n   */\n  decrementRowColumn<DocumentShape extends Models.Row>({\n    tableId,\n    rowId,\n    column,\n    value,\n    min,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId: string;\n    column: string;\n    value: number;\n    min?: number;\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.decrementRowColumn<DocumentShape>({\n        tableId,\n        rowId,\n        column,\n        value,\n        min,\n        databaseId: alternateDatabaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Increment a specific column of a row by a given value.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.tableId - Table ID.\n   * @param {string} params.rowId - Row ID.\n   * @param {string} params.column - Column key.\n   * @param {number} params.value - Value to increment the column by. The value must be a number.\n   * @param {number} params.max - Maximum value for the column. If the current value is greater than this value, an error will be thrown.\n   * @param {string} params.alternateDatabaseId - Database ID.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Row>}\n   */\n  incrementRowColumn<DocumentShape extends Models.Row>({\n    tableId,\n    rowId,\n    column,\n    value,\n    max,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId: string;\n    column: string;\n    value: number;\n    max?: number;\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.incrementRowColumn<DocumentShape>({\n        tableId,\n        rowId,\n        column,\n        value,\n        max,\n        databaseId: alternateDatabaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * This method returns an observable that will emit the table list\n   * and then listen for changes to the table.\n   *\n   * @param params.tableId The table to watch\n   * @param params.queries The queries to apply to the table\n   * @param params.events The events to listen for\n   * @param params.alternateDatabaseId The database to use\n   * @returns An observable of the collection\n   */\n  listRows$<DocumentShape extends Models.Row>({\n    tableId,\n    queries,\n    events,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    queries?: (string | Query)[];\n    events?: string | string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Observable<Models.RowList<DocumentShape>> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    const path = `databases.${alternateDatabaseId}.tables.${tableId}.rows`;\n\n    return this._client$.pipe(\n      switchMap((client) => watch(client, events ?? path)),\n      startWith(null), // Emit on subscription\n      switchMap(() =>\n        this.listRows<DocumentShape>({\n          tableId,\n          queries: queries as string[],\n          alternateDatabaseId,\n          transactionId,\n        }),\n      ),\n      distinctUntilChanged(deepEqual),\n    );\n  }\n\n  /**\n   * This method returns an observable that will emit the row\n   * and then listen for changes to the row.\n   *\n   * @param params.tableId The table to watch\n   * @param params.rowId The row to watch\n   * @param params.queries The queries to apply to the row\n   * @param params.events The events to listen for\n   * @param params.alternateDatabaseId The database to use\n   * @returns An observable of the document\n   */\n  row$<DocumentShape extends Models.Row>({\n    tableId,\n    rowId,\n    queries,\n    events,\n    alternateDatabaseId = this._defaultDatabaseId,\n    transactionId,\n  }: {\n    tableId: string;\n    rowId: string;\n    queries?: (string | Query)[];\n    events?: string | string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Observable<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    const path = `databases.${alternateDatabaseId}.tables.${tableId}.rows.${rowId}`;\n\n    return this._client$.pipe(\n      switchMap((client) => watch(client, events ?? path)),\n      startWith(null), // Emit on subscription\n      switchMap(() =>\n        this.getRow<DocumentShape>({\n          tableId,\n          rowId,\n          queries: queries as string[],\n          alternateDatabaseId,\n          transactionId,\n        }),\n      ),\n      distinctUntilChanged(deepEqual),\n    );\n  }\n}\n\n/**\n * An alias for the Databases class.\n */\nexport const TablesDBService = TablesDB;\n\n/**\n * A provider for the Databases class.\n */\nexport const provideTablesDB = (): Provider => {\n  return {\n    provide: TablesDB,\n    useClass: TablesDB,\n  };\n};\n","import {\n  Injectable,\n  ResourceRef,\n  Signal,\n  computed,\n  inject,\n} from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { ID, Models } from 'appwrite';\nimport { Observable, map } from 'rxjs';\nimport { TablesDBService } from './tablesdb';\n\n// ! Do not remove this line, needed for build process\nconst rxResourceWrapper = <ParamsType, ReturnType>(\n  $params: Signal<ParamsType>,\n  stream: (resource: { params: ParamsType }) => Observable<ReturnType>,\n  defaultValue: NoInfer<ReturnType> | (undefined & NoInfer<ReturnType>),\n): {\n  isLoading: Signal<boolean>;\n  error: Signal<unknown>;\n  data: Signal<ReturnType>;\n  resource: ResourceRef<ReturnType>;\n} => {\n  const resourceRef = rxResource({\n    params: () => $params(),\n    stream: (resource) => stream(resource),\n    defaultValue,\n  });\n\n  return {\n    isLoading: computed(() => resourceRef.isLoading()),\n    error: computed(() => resourceRef.error()),\n    data: computed(() => resourceRef.value()),\n    resource: resourceRef,\n  };\n};\n\n@Injectable({\n  providedIn: 'root',\n})\nexport abstract class AppwriteAdapter<DocumentShape extends Models.Row> {\n  private tables = inject(TablesDBService);\n  protected abstract tablesId: string;\n  protected abstract validationFn:\n    | undefined\n    | ((data: unknown) => DocumentShape);\n\n  /**\n   * Create Document\n   *\n   * Create a new Document. Before using this route, you should create a new\n   * collection resource using either a [server\n   * integration](/docs/server/databases#databasesCreateCollection) API or\n   * directly from your database console.\n   * @param {DocumentShape} params.data\n   * @param {string[]} [params.permissions]\n   * @param {string} [params.rowId]\n   * @param {string} [params.alternateDatabaseId]\n   * @param {string} [params.transactionId]\n   * @throws {AppwriteException}\n   * @returns {Promise<DocumentShape>}\n   */\n  public async createRow(params: {\n    data: DocumentShape extends Models.DefaultRow\n      ? Partial<Models.Row> & Record<string, any>\n      : Partial<Models.Row> & Omit<DocumentShape, keyof Models.Row>;\n    rowId?: string;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    // remove all appwrite keys with an empty string\n    const data = Object.fromEntries(\n      Object.entries(params.data).filter(([key]) => !key.startsWith('$')),\n    ) as DocumentShape extends Models.DefaultRow\n      ? Partial<Models.Row> & Record<string, any>\n      : Partial<Models.Row> & Omit<DocumentShape, keyof Models.Row>;\n\n    const result = await this.tables.createRow<DocumentShape>({\n      tableId: this.tablesId,\n      rowId: params.rowId ?? ID.unique(),\n      data,\n      permissions: params.permissions,\n      alternateDatabaseId: params.alternateDatabaseId,\n      transactionId: params.transactionId,\n    });\n\n    if (this.validationFn) {\n      return this.validationFn(result);\n    }\n    return result;\n  }\n\n  /**\n   * Update Row\n   *\n   * Updates a Row. Before using this route, you should create a new\n   * collection resource using either a [server\n   * integration](/docs/server/databases#databasesCreateCollection) API or\n   * directly from your database console.\n   * @param {Row extends Models.DefaultRow ? Partial<Models.Row> & Record<string, any> : Partial<Models.Row> & Partial<Omit<Row, keyof Models.Row>>} params.data - Row data as JSON object. Include only columns and value pairs to be updated.\n   * @param {string} params.rowId - Row ID.\n   * @param {string[]} [params.permissions]\n   * @param {string} [params.alternateDatabaseId]\n   * @param {string} [params.transactionId]\n   * @throws {AppwriteException}\n   * @returns {Promise<DocumentShape>}\n   */\n  public async updateRow(params: {\n    data: DocumentShape extends Models.DefaultRow\n      ? Partial<Models.Row> & Record<string, any>\n      : Partial<Models.Row> & Partial<Omit<DocumentShape, keyof Models.Row>>;\n    rowId: string;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    const result = await this.tables.updateRow<DocumentShape>({\n      tableId: this.tablesId,\n      rowId: params.rowId,\n      data: params.data,\n      permissions: params.permissions,\n      alternateDatabaseId: params.alternateDatabaseId,\n      transactionId: params.transactionId,\n    });\n\n    if (this.validationFn) {\n      return this.validationFn(result);\n    }\n    return result;\n  }\n\n  /**\n   * Upsert Row\n   *\n   * Create or update a Row. Before using this route, you should create a new table resource using either a [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable) API or directly from your database console.\n   * @param {Row extends Models.DefaultRow ? Partial<Models.Row> & Record<string, any> : Partial<Models.Row> & Partial<Omit<Row, keyof Models.Row>>} params.data - Row data as JSON object. Include only columns and value pairs to be updated.\n   * @param {string} params.rowId - Row ID.\n   * @param {string[]} [params.permissions]\n   * @param {string} [params.alternateDatabaseId]\n   * @param {string} [params.transactionId]\n   * @throws {AppwriteException}\n   * @returns {Promise<DocumentShape>}\n   */\n  public async upsertRow(params: {\n    data: DocumentShape extends Models.DefaultRow\n      ? Partial<Models.Row> & Record<string, any>\n      : Partial<Models.Row> & Partial<Omit<DocumentShape, keyof Models.Row>>;\n    rowId: string;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }) {\n    const result = await this.tables.upsertRow<DocumentShape>({\n      tableId: this.tablesId,\n      rowId: params.rowId,\n      data: params.data,\n      permissions: params.permissions,\n      alternateDatabaseId: params.alternateDatabaseId,\n      transactionId: params.transactionId,\n    });\n\n    if (this.validationFn) {\n      return this.validationFn(result);\n    }\n    return result;\n  }\n\n  /**\n   * Delete Row\n   *\n   * Deletes a Row.\n   * Takes either a document id or a document object with an id\n   * @param {string} params.rowId - Row ID.\n   * @param {string} [params.alternateDatabaseId] - Alternate database ID.\n   * @throws {AppwriteException}\n   * @returns {Promise<T & Models.Row>}\n   */\n  public async deleteRow(params: {\n    rowId: string;\n    alternateDatabaseId?: string;\n  }) {\n    if (!params.rowId) {\n      throw new Error('Row must have an id to be deleted');\n    }\n    return this.tables.deleteRow({\n      tableId: this.tablesId,\n      rowId: params.rowId,\n      alternateDatabaseId: params.alternateDatabaseId,\n    });\n  }\n\n  public async getRow({\n    rowId,\n    queries,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    rowId: string;\n    queries?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    const data = await this.tables.getRow<DocumentShape>({\n      tableId: this.tablesId,\n      rowId,\n      queries,\n      alternateDatabaseId,\n      transactionId,\n    });\n\n    if (!data) {\n      throw new Error(`Row with id ${rowId} not found`);\n    }\n\n    if (this.validationFn) {\n      return this.validationFn(data);\n    }\n    return data;\n  }\n\n  public async listRows({\n    queries,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    queries?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Models.RowList<DocumentShape>> {\n    const list = await this.tables.listRows<DocumentShape>({\n      tableId: this.tablesId,\n      queries,\n      alternateDatabaseId,\n      transactionId,\n    });\n\n    if (!list) {\n      return {\n        total: 0,\n        rows: [],\n      };\n    }\n\n    const validationFn = this.validationFn;\n\n    if (validationFn) {\n      list.rows = list.rows.map((item) => validationFn(item));\n    }\n    return list;\n  }\n\n  // RXJS\n  public listRows$({\n    queries,\n    events,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    queries?: string[];\n    events?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Observable<Models.RowList<DocumentShape>> {\n    return this.tables\n      .listRows$<DocumentShape>({\n        tableId: this.tablesId,\n        queries,\n        events,\n        alternateDatabaseId,\n        transactionId,\n      })\n      .pipe(\n        map((list) => {\n          if (!list) {\n            return {\n              total: 0,\n              rows: [],\n            };\n          }\n\n          const validationFn = this.validationFn;\n\n          if (validationFn) {\n            list.rows = list.rows.map((item) => validationFn(item));\n          }\n          return list;\n        }),\n      );\n  }\n\n  public row$({\n    rowId,\n    queries,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    rowId: string;\n    queries?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Observable<DocumentShape | null> {\n    return this.tables\n      .row$<DocumentShape>({\n        tableId: this.tablesId,\n        rowId,\n        queries,\n        alternateDatabaseId,\n        transactionId,\n      })\n      .pipe(\n        map((item) => {\n          if (item && this.validationFn) {\n            return this.validationFn(item);\n          }\n          return item;\n        }),\n      );\n  }\n  // Signals\n  public $listRows(\n    params: Signal<{\n      queries?: string[];\n      events?: string[];\n      alternateDatabaseId?: string;\n      transactionId?: string;\n    }>,\n  ): {\n    isLoading: Signal<boolean>;\n    error: Signal<unknown>;\n    data: Signal<Models.RowList<DocumentShape>>;\n    resource: ResourceRef<Models.RowList<DocumentShape>>;\n  } {\n    return rxResourceWrapper(\n      params,\n      (params) => this.listRows$(params.params),\n      {\n        total: 0,\n        rows: [],\n      } as Models.RowList<DocumentShape>,\n    );\n  }\n\n  public $row(\n    params: Signal<{\n      rowId: string;\n      queries?: string[];\n      alternateDatabaseId?: string;\n      transactionId?: string;\n    }>,\n  ): {\n    isLoading: Signal<boolean>;\n    error: Signal<unknown>;\n    data: Signal<DocumentShape | null>;\n    resource: ResourceRef<DocumentShape | null>;\n  } {\n    return rxResourceWrapper(\n      params,\n      (params) => this.row$(params.params),\n      null,\n    );\n  }\n}\n","import { inject, Injectable, Provider } from '@angular/core';\nimport {\n    Avatars as AppwriteAvatars,\n    Browser,\n    CreditCard,\n    Flag,\n} from 'appwrite';\nimport { APPWRITE_CLIENT } from './setup';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Avatars {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _avatars = new AppwriteAvatars(this._client);\n\n  /**\n   * Get Browser Icon\n   *\n   * You can use this endpoint to show different browser icons to your users.\n   * The code argument receives the browser code as it appears in your user [GET\n   * /account/sessions](/docs/client/account#accountGetSessions) endpoint. Use\n   * width, height and quality arguments to change the output settings.\n   *\n   * When one dimension is specified and the other is 0, the image is scaled\n   * with preserved aspect ratio. If both dimensions are 0, the API provides an\n   * image at source quality. If dimensions are not specified, the default size\n   * of image returned is 100x100px.\n   *\n   * @param code The browser code.\n   * @param width The image width.\n   * @param height The image height.\n   * @param quality The image quality.\n   * @returns The browser icon URL.\n   */\n  getBrowser({\n    code,\n    width,\n    height,\n    quality,\n  }: {\n    code: Browser;\n    width?: number;\n    height?: number;\n    quality?: number;\n  }): string {\n    return this._avatars\n      .getBrowser({ code, width, height, quality })\n      .toString();\n  }\n\n  /**\n   * Get Credit Card Icon\n   *\n   * The credit card endpoint will return you the icon of the credit card\n   * provider you need. Use width, height and quality arguments to change the\n   * output settings.\n   *\n   * When one dimension is specified and the other is 0, the image is scaled\n   * with preserved aspect ratio. If both dimensions are 0, the API provides an\n   * image at source quality. If dimensions are not specified, the default size\n   * of image returned is 100x100px.\n   *\n   *\n   * @param code The credit card code.\n   * @param width The image width.\n   * @param height The image height.\n   * @param quality The image quality.\n   * @returns The credit card icon URL.\n   */\n  getCreditCard({\n    code,\n    width,\n    height,\n    quality,\n  }: {\n    code: CreditCard;\n    width?: number;\n    height?: number;\n    quality?: number;\n  }): string {\n    return this._avatars.getCreditCard({ code, width, height, quality });\n  }\n\n  /**\n   * Get Favicon\n   *\n   * Use this endpoint to fetch the favorite icon (AKA favicon) of any remote\n   * website URL.\n   *\n   *\n   * @param url The URL of the website.\n   * @returns The favicon URL.\n   */\n  getFavicon(url: string): string {\n    return this._avatars.getFavicon({ url });\n  }\n\n  /**\n   * Get Country Flag\n   *\n   * You can use this endpoint to show different country flags icons to your\n   * users. The code argument receives the 2 letter country code. Use width,\n   * height and quality arguments to change the output settings. Country codes\n   * follow the [ISO 3166-1](http://en.wikipedia.org/wiki/ISO_3166-1) standard.\n   *\n   * When one dimension is specified and the other is 0, the image is scaled\n   * with preserved aspect ratio. If both dimensions are 0, the API provides an\n   * image at source quality. If dimensions are not specified, the default size\n   * of image returned is 100x100px.\n   *\n   *\n   * @param code The country code.\n   * @param width The image width.\n   * @param height The image height.\n   * @param quality The image quality.\n   * @returns The country flag URL.\n   */\n  getFlag({\n    code,\n    width,\n    height,\n    quality,\n  }: {\n    code: Flag;\n    width?: number;\n    height?: number;\n    quality?: number;\n  }): string {\n    return this._avatars.getFlag({ code, width, height, quality });\n  }\n\n  /**\n   * Get Image from URL\n   *\n   * Use this endpoint to fetch a remote image URL and crop it to any image size\n   * you want. This endpoint is very useful if you need to crop and display\n   * remote images in your app or in case you want to make sure a 3rd party\n   * image is properly served using a TLS protocol.\n   *\n   * When one dimension is specified and the other is 0, the image is scaled\n   * with preserved aspect ratio. If both dimensions are 0, the API provides an\n   * image at source quality. If dimensions are not specified, the default size\n   * of image returned is 400x400px.\n   *\n   *\n   * @param url The URL of the image.\n   * @param width The image width.\n   * @param height The image height.\n   * @returns The image URL.\n   */\n  getImage({\n    url,\n    width,\n    height,\n  }: {\n    url: string;\n    width?: number;\n    height?: number;\n  }): string {\n    return this._avatars.getImage({ url, width, height });\n  }\n\n  /**\n   * Get User Initials\n   *\n   * Use this endpoint to show your user initials avatar icon on your website or\n   * app. By default, this route will try to print your logged-in user name or\n   * email initials. You can also overwrite the user name if you pass the 'name'\n   * parameter. If no name is given and no user is logged, an empty avatar will\n   * be returned.\n   *\n   * You can use the color and background params to change the avatar colors. By\n   * default, a random theme will be selected. The random theme will persist for\n   * the user's initials when reloading the same theme will always return for\n   * the same initials.\n   *\n   * When one dimension is specified and the other is 0, the image is scaled\n   * with preserved aspect ratio. If both dimensions are 0, the API provides an\n   * image at source quality. If dimensions are not specified, the default size\n   * of image returned is 100x100px.\n   *\n   *\n   * @param name The user's name.\n   * @param width The image width.\n   * @param height The image height.\n   * @param background The background color.\n   * @returns The user initials URL.\n   */\n  getInitials({\n    name,\n    width,\n    height,\n    background,\n  }: {\n    name?: string;\n    width?: number;\n    height?: number;\n    background?: string;\n  }): string {\n    return this._avatars.getInitials({ name, width, height, background });\n  }\n\n  /**\n   * Get QR Code\n   *\n   * Converts a given plain text to a QR code image. You can use the query\n   * parameters to change the size and style of the resulting image.\n   *\n   *\n   * @param text The text to convert to a QR code.\n   * @param size The QR code size.\n   * @param margin The QR code margin.\n   * @param download Whether to download the QR code.\n   * @returns The QR code URL.\n   */\n  getQR({\n    text,\n    size,\n    margin,\n    download,\n  }: {\n    text: string;\n    size?: number;\n    margin?: number;\n    download?: boolean;\n  }): string {\n    return this._avatars.getQR({ text, size, margin, download });\n  }\n}\n\n/**\n * An alias for the Avatars class.\n */\nexport const AvatarsService = Avatars;\n\n/**\n * A provider for the Avatars class.\n */\nexport const provideAvatars = (): Provider => {\n  return {\n    provide: Avatars,\n    useClass: Avatars,\n  };\n};\n","import { inject, Injectable, Provider } from '@angular/core';\nimport { Databases as AppwriteDatabases, Models, Query } from 'appwrite';\nimport {\n  distinctUntilChanged,\n  Observable,\n  of,\n  shareReplay,\n  startWith,\n  switchMap,\n} from 'rxjs';\nimport { deepEqual, watch } from './helpers';\nimport { APPWRITE_CLIENT, APPWRITE_DEFAULT_DATABASE } from './setup';\nimport { AppwriteErrorHandler } from './error-handler';\n\n@Injectable({\n  providedIn: 'root',\n})\n// @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB` instead.\nexport class Databases {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _defaultDatabaseId = inject(APPWRITE_DEFAULT_DATABASE);\n  private readonly _databases = new AppwriteDatabases(this._client);\n  private readonly _client$ = of(this._client).pipe(shareReplay(1));\n  private readonly _errorHandler = inject(AppwriteErrorHandler);\n\n  /**\n   * List transactions across all databases.\n   *\n   * @param {string[]} params.queries - Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries).\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.TransactionList>}\n   */\n  listTransactions({\n    queries,\n  }: {\n    queries?: string[];\n  }): Promise<Models.TransactionList> {\n    return this._errorHandler.wrap(\n      this._databases.listTransactions({ queries }),\n      {} as Models.TransactionList,\n    );\n  }\n\n  /**\n   * Create a new transaction.\n   *\n   * @param {number} params.ttl - Seconds before the transaction expires.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  createTransaction({ ttl }: { ttl: number }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.createTransaction({ ttl }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Get a transaction by its unique ID.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  getTransaction({\n    transactionId,\n  }: {\n    transactionId: string;\n  }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.getTransaction({ transactionId }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Update a transaction, to either commit or roll back its operations.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @param {boolean} params.commit - Commit transaction?\n   * @param {boolean} params.rollback - Rollback transaction?\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  updateTransaction({\n    transactionId,\n    commit,\n    rollback,\n  }: {\n    transactionId: string;\n    commit?: boolean;\n    rollback?: boolean;\n  }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.updateTransaction({\n        transactionId,\n        commit,\n        rollback,\n      }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Delete a transaction by its unique ID.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @throws {AppwriteException}\n   * @returns {Promise<{}>}\n   */\n  deleteTransaction({\n    transactionId,\n  }: {\n    transactionId: string;\n  }): Promise<Record<string, unknown>> {\n    return this._errorHandler.wrap(\n      this._databases.deleteTransaction({ transactionId }),\n      {},\n    );\n  }\n\n  /**\n   * Create multiple operations in a single transaction.\n   *\n   * @param {string} params.transactionId - Transaction ID.\n   * @param {object[]} params.operations - Array of staged operations.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.Transaction>}\n   */\n  createOperations({\n    transactionId,\n    operations,\n  }: {\n    transactionId: string;\n    operations: object[];\n  }): Promise<Models.Transaction> {\n    return this._errorHandler.wrap(\n      this._databases.createOperations({ transactionId, operations }),\n      {} as Models.Transaction,\n    );\n  }\n\n  /**\n   * Get a list of all the user's documents in a given collection. You can use the query params to filter your results.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.collectionId - Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).\n   * @param {string[]} params.queries - Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of 100 queries are allowed, each 4096 characters long.\n   * @param {string} params.transactionId - Transaction ID to read uncommitted changes within the transaction.\n   * @throws {AppwriteException}\n   * @returns {Promise<Models.DocumentList<Document>>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.listRows` instead.\n   */\n  listDocuments<DocumentShape extends Models.Document>({\n    collectionId,\n    queries,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    queries?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Models.DocumentList<DocumentShape>> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.listDocuments<DocumentShape>({\n        collectionId,\n        queries,\n        databaseId,\n        transactionId,\n      }),\n      {\n        total: 0,\n        documents: [],\n      } as unknown as Models.DocumentList<DocumentShape>,\n    );\n  }\n\n  /**\n   * Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection) API or directly from your database console.\n   *\n   * @param {string} params.collectionId - Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection). Make sure to define attributes before creating documents.\n   * @param {string} params.documentId - Document ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can't start with a special char. Max length is 36 chars.\n   * @param {Document extends Models.DefaultDocument ? Partial<Models.Document> & Record<string, any> : Partial<Models.Document> & Omit<Document, keyof Models.Document>} params.data - Document data as JSON object.\n   * @param {string[]} params.permissions - An array of permissions strings. By default, only the current user is granted all permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Document>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.createRow` instead.\n   */\n  createDocument<Document extends Models.Document>({\n    collectionId,\n    documentId,\n    data,\n    permissions,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    data: Document extends Models.DefaultDocument\n      ? Partial<Models.Document> & Record<string, unknown>\n      : Partial<Models.Document> & Omit<Document, keyof Models.Document>;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Document> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.createDocument<Document>({\n        collectionId,\n        documentId,\n        data,\n        permissions,\n        databaseId,\n        transactionId,\n      }),\n      {} as Document,\n    );\n  }\n\n  /**\n   * Get a document by its unique ID. This endpoint response returns a JSON object with the document data.\n   *\n   * @param {string} params.collectionId - Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).\n   * @param {string} params.documentId - Document ID.\n   * @param {string[]} params.queries - Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of 100 queries are allowed, each 4096 characters long.\n   * @param {string} params.transactionId - Transaction ID to read uncommitted changes within the transaction.\n   * @throws {AppwriteException}\n   * @returns {Promise<Document>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.getRow` instead.\n   */\n  getDocument<DocumentShape extends Models.Document>({\n    collectionId,\n    documentId,\n    queries,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    queries?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.getDocument<DocumentShape>({\n        collectionId,\n        documentId,\n        queries,\n        databaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Create or update a Document. Before using this route, you should create a new collection resource using either a [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection) API or directly from your database console.\n   *\n   * @param {string} params.collectionId - Collection ID.\n   * @param {string} params.documentId - Document ID.\n   * @param {Document extends Models.DefaultDocument ? Partial<Models.Document> & Record<string, any> : Partial<Models.Document> & Partial<Omit<Document, keyof Models.Document>>} params.data - Document data as JSON object. Include all required attributes of the document to be created or updated.\n   * @param {string[]} params.permissions - An array of permissions strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Document>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.upsertRow` instead.\n   */\n  upsertDocument<DocumentShape extends Models.Document>({\n    collectionId,\n    documentId,\n    data,\n    permissions,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    data: DocumentShape extends Models.DefaultDocument\n      ? Partial<Models.Document> & Record<string, unknown>\n      : Partial<Models.Document> &\n          Partial<Omit<DocumentShape, keyof Models.Document>>;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.upsertDocument<DocumentShape>({\n        collectionId,\n        documentId,\n        data,\n        permissions,\n        databaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Update a document by its unique ID. Using the patch method you can pass only specific fields that will get updated.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.collectionId - Collection ID.\n   * @param {string} params.documentId - Document ID.\n   * @param {Document extends Models.DefaultDocument ? Partial<Models.Document> & Record<string, any> : Partial<Models.Document> & Partial<Omit<Document, keyof Models.Document>>} params.data - Document data as JSON object. Include only attribute and value pairs to be updated.\n   * @param {string[]} params.permissions - An array of permissions strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Document>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.updateRow` instead.\n   */\n  updateDocument<DocumentShape extends Models.Document>({\n    collectionId,\n    documentId,\n    data,\n    permissions,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    data?: DocumentShape extends Models.DefaultDocument\n      ? Partial<Models.Document> & Record<string, unknown>\n      : Partial<Models.Document> &\n          Partial<Omit<DocumentShape, keyof Models.Document>>;\n    permissions?: string[];\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<DocumentShape> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.updateDocument<DocumentShape>({\n        collectionId,\n        documentId,\n        data,\n        permissions,\n        databaseId,\n        transactionId,\n      }),\n      {} as DocumentShape,\n    );\n  }\n\n  /**\n   * Delete a document by its unique ID.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.collectionId - Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).\n   * @param {string} params.documentId - Document ID.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<{}>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.deleteRow` instead.\n   */\n  deleteDocument({\n    collectionId,\n    documentId,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Record<string, unknown>> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.deleteDocument({\n        collectionId,\n        documentId,\n        databaseId,\n        transactionId,\n      }),\n      {},\n    );\n  }\n\n  /**\n   * Decrement a specific attribute of a document by a given value.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.collectionId - Collection ID.\n   * @param {string} params.documentId - Document ID.\n   * @param {string} params.attribute - Attribute key.\n   * @param {number} params.value - Value to increment the attribute by. The value must be a number.\n   * @param {number} params.min - Minimum value for the attribute. If the current value is lesser than this value, an exception will be thrown.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Document>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.decrementRowColumn` instead.\n   */\n  decrementDocumentAttribute({\n    collectionId,\n    documentId,\n    attribute,\n    value,\n    min,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    attribute: string;\n    value?: number;\n    min?: number;\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Models.Document> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.decrementDocumentAttribute({\n        collectionId,\n        documentId,\n        attribute,\n        value,\n        min,\n        databaseId,\n        transactionId,\n      }),\n      {} as Models.Document,\n    );\n  }\n\n  /**\n   * Increment a specific attribute of a document by a given value.\n   *\n   * @param {string} params.databaseId - Database ID.\n   * @param {string} params.collectionId - Collection ID.\n   * @param {string} params.documentId - Document ID.\n   * @param {string} params.attribute - Attribute key.\n   * @param {number} params.value - Value to increment the attribute by. The value must be a number.\n   * @param {number} params.max - Maximum value for the attribute. If the current value is greater than this value, an error will be thrown.\n   * @param {string} params.transactionId - Transaction ID for staging the operation.\n   * @throws {AppwriteException}\n   * @returns {Promise<Document>}\n   * @deprecated This API has been deprecated since 1.8.0. Please use `TablesDB.incrementRowColumn` instead.\n   */\n  incrementDocumentAttribute({\n    collectionId,\n    documentId,\n    attribute,\n    value,\n    max,\n    alternateDatabaseId,\n    transactionId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    attribute: string;\n    value?: number;\n    max?: number;\n    alternateDatabaseId?: string;\n    transactionId?: string;\n  }): Promise<Models.Document> {\n    const databaseId = alternateDatabaseId ?? this._defaultDatabaseId;\n\n    if (!databaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    return this._errorHandler.wrap(\n      this._databases.incrementDocumentAttribute({\n        collectionId,\n        documentId,\n        attribute,\n        value,\n        max,\n        databaseId,\n        transactionId,\n      }),\n      {} as Models.Document,\n    );\n  }\n\n  /**\n   * This method returns an observable that will emit the collection list\n   * and then listen for changes to the collection.\n   *\n   * @param params.collectionId The collection to watch\n   * @param params.queries The queries to apply to the collection\n   * @param params.events The events to listen for\n   * @param params.alternateDatabaseId The database to use\n   * @returns An observable of the collection\n   */\n  collection$<DocumentShape extends Models.Document>({\n    collectionId,\n    queries,\n    events,\n    alternateDatabaseId = this._defaultDatabaseId,\n  }: {\n    collectionId: string;\n    queries: (string | Query)[];\n    events?: string | string[];\n    alternateDatabaseId?: string;\n  }): Observable<Models.DocumentList<DocumentShape>> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    const path = `databases.${alternateDatabaseId}.collections.${collectionId}.documents`;\n\n    return this._client$.pipe(\n      switchMap((client) => watch(client, events ?? path)),\n      startWith(null), // Emit on subscription\n      switchMap(() =>\n        this.listDocuments<DocumentShape>({\n          collectionId,\n          queries: queries as string[],\n          alternateDatabaseId,\n        }),\n      ),\n      distinctUntilChanged(deepEqual),\n    );\n  }\n\n  /**\n   * This method returns an observable that will emit the document\n   * and then listen for changes to the document.\n   *\n   * @param params.collectionId The collection to watch\n   * @param params.documentId The document to watch\n   * @param params.queries The queries to apply to the document\n   * @param params.events The events to listen for\n   * @param params.alternateDatabaseId The database to use\n   * @returns An observable of the document\n   */\n  document$<DocumentShape extends Models.Document>({\n    collectionId,\n    documentId,\n    queries,\n    events,\n    alternateDatabaseId = this._defaultDatabaseId,\n  }: {\n    collectionId: string;\n    documentId: string;\n    queries: (string | Query)[];\n    events?: string | string[];\n    alternateDatabaseId?: string;\n  }): Observable<DocumentShape> {\n    if (!alternateDatabaseId) {\n      throw new Error('Database ID is not set.');\n    }\n\n    const path = `databases.${alternateDatabaseId}.collections.${collectionId}.documents.${documentId}`;\n\n    return this._client$.pipe(\n      switchMap((client) => watch(client, events ?? path)),\n      startWith(null), // Emit on subscription\n      switchMap(() =>\n        this.getDocument<DocumentShape>({\n          collectionId,\n          documentId,\n          queries: queries as string[],\n          alternateDatabaseId,\n        }),\n      ),\n      distinctUntilChanged(deepEqual),\n    );\n  }\n}\n\n/**\n * An alias for the Databases class.\n */\nexport const DatabasesService = Databases;\n\n/**\n * A provider for the Databases class.\n */\nexport const provideDatabases = (): Provider => {\n  return {\n    provide: Databases,\n    useClass: Databases,\n  };\n};\n","import { inject, Injectable, Provider } from '@angular/core';\nimport {\n    AppwriteException,\n    Functions as AppwriteFunctions,\n    ExecutionMethod,\n    Models,\n    Query,\n} from 'appwrite';\nimport { APPWRITE_CLIENT } from './setup';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Functions {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _functions = new AppwriteFunctions(this._client);\n\n  /**\n   * A function that wraps a promise and handles AppwriteExceptions.\n   *\n   * @param promise - The promise to wrap.\n   * @returns The result of the promise.\n   * @throws If the promise rejects with a non-AppwriteException error.\n   */\n  private async _call<T>(promise: Promise<T>): Promise<T | null> {\n    try {\n      return await promise;\n    } catch (e) {\n      if (e instanceof AppwriteException) {\n        console.warn(e.message);\n        return null;\n      }\n      throw e;\n    }\n  }\n\n  /**\n   * List Executions\n   *\n   * Get a list of all the current user function execution logs. You can use the\n   * query params to filter your results.\n   *\n   * @param functionId The function ID.\n   * @param queries The queries to filter the results.\n   * @param search The search string to filter the results.\n   * @returns A list of executions.\n   */\n  listExecutions(\n    functionId: string,\n    queries?: string[],\n    search?: string,\n  ): Promise<Models.ExecutionList | null> {\n    queries = search\n      ? [Query.search('search', search), ...(queries ?? [])]\n      : queries;\n\n    return this._call(this._functions.listExecutions({ functionId, queries }));\n  }\n\n  /**\n   * Create Execution\n   *\n   * Trigger a function execution. The returned object will return you the\n   * current execution status. You can ping the `Get Execution` endpoint to get\n   * updates on the current execution status. Once this endpoint is called, your\n   * function execution process will start asynchronously.\n   *\n   * @param functionId The function ID.\n   * @param body The body of the request.\n   * @param async Whether to execute the function asynchronously.\n   * @param xpath The path of the request.\n   * @param method The method of the request.\n   * @param headers The headers of the request.\n   * @returns An execution.\n   */\n  createExecution({\n    functionId,\n    body,\n    async,\n    xpath,\n    method,\n    headers,\n    scheduledAt,\n  }: {\n    functionId: string;\n    body?: string;\n    async?: boolean;\n    xpath?: string;\n    method?: ExecutionMethod;\n    headers?: object;\n    scheduledAt?: string;\n  }): Promise<Models.Execution | null> {\n    return this._call(\n      this._functions.createExecution({\n        functionId,\n        body,\n        async,\n        xpath,\n        method,\n        headers,\n        scheduledAt,\n      }),\n    );\n  }\n\n  /**\n   * Get Execution\n   *\n   * Get a function execution log by its unique ID.\n   *\n   * @param functionId The function ID.\n   * @param executionId The execution ID.\n   * @returns An execution.\n   */\n  getExecution({\n    functionId,\n    executionId,\n  }: {\n    functionId: string;\n    executionId: string;\n  }): Promise<Models.Execution | null> {\n    return this._call(\n      this._functions.getExecution({ functionId, executionId }),\n    );\n  }\n}\n\n/**\n * An alias for the Functions class.\n */\nexport const FunctionsService = Functions;\n\n/**\n * A provider for the Functions class.\n */\nexport const provideFunctions = (): Provider => {\n  return {\n    provide: Functions,\n    useClass: Functions,\n  };\n};\n","import { inject, Injectable, Provider } from '@angular/core';\nimport { AppwriteException, Locale as AppwriteLocale, Models } from 'appwrite';\nimport { APPWRITE_CLIENT } from './setup';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Localization {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _locale = new AppwriteLocale(this._client);\n\n  /**\n   * A function that wraps a promise and handles AppwriteExceptions.\n   *\n   * @param promise - The promise to wrap.\n   * @returns The result of the promise.\n   * @throws If the promise rejects with a non-AppwriteException error.\n   *\n   */\n  private async _call<T>(promise: Promise<T>): Promise<T | null> {\n    try {\n      return await promise;\n    } catch (e) {\n      if (e instanceof AppwriteException) {\n        console.warn(e.message);\n        return null;\n      }\n      throw e;\n    }\n  }\n\n  /**\n   * Get User Locale\n   *\n   * Get the current user location based on IP. Returns an object with user\n   * country code, country name, continent name, continent code, ip address and\n   * suggested currency. You can use the locale header to get the data in a\n   * supported language.\n   *\n   * ([IP Geolocation by DB-IP](https://db-ip.com))\n   *\n   * @returns The user's locale.\n   */\n  get(): Promise<Models.Locale | null> {\n    return this._call(this._locale.get());\n  }\n\n  /**\n   * List Continents\n   *\n   * List of all continents. You can use the locale header to get the data in a\n   * supported language.\n   *\n   * @returns A list of continents.\n   */\n  listContinents(): Promise<Models.ContinentList | null> {\n    return this._call(this._locale.listContinents());\n  }\n\n  /**\n   * List Countries\n   *\n   * List of all countries. You can use the locale header to get the data in a\n   * supported language.\n   *\n   * @returns A list of countries.\n   */\n  listCountries(): Promise<Models.CountryList | null> {\n    return this._call(this._locale.listCountries());\n  }\n\n  /**\n   * List EU Countries\n   *\n   * List of all countries that are currently members of the EU. You can use the\n   * locale header to get the data in a supported language.\n   *\n   * @returns A list of EU countries.\n   */\n  listCountriesEU(): Promise<Models.CountryList | null> {\n    return this._call(this._locale.listCountriesEU());\n  }\n\n  /**\n   * List Countries Phone Codes\n   *\n   * List of all countries phone codes. You can use the locale header to get the\n   * data in a supported language.\n   *\n   * @returns A list of phone codes.\n   */\n  listCountriesPhones(): Promise<Models.PhoneList | null> {\n    return this._call(this._locale.listCountriesPhones());\n  }\n\n  /**\n   * List Currencies\n   *\n   * List of all currencies, including currency symbol, name, plural, and\n   * decimal digits for all major and minor currencies. You can use the locale\n   * header to get the data in a supported language.\n   *\n   * @returns A list of currencies.\n   */\n  listCurrencies(): Promise<Models.CurrencyList | null> {\n    return this._call(this._locale.listCurrencies());\n  }\n\n  /**\n   * List Languages\n   *\n   * List of all languages classified by ISO 639-1 including 2-letter code, name\n   * in English, and name in the respective language.\n   *\n   * @returns A list of languages.\n   */\n  listLanguages(): Promise<Models.LanguageList | null> {\n    return this._call(this._locale.listLanguages());\n  }\n}\n\n/**\n * An alias for the Localization class.\n */\nexport const LocalizationService = Localization;\n\n/**\n * A provider for the Localization class.\n */\nexport const provideLocalization = (): Provider => {\n  return {\n    provide: Localization,\n    useClass: Localization,\n  };\n};\n","import { inject, Injectable, Provider } from '@angular/core';\nimport {\n    AppwriteException,\n    Messaging as AppwriteMessaging,\n    Models,\n} from 'appwrite';\nimport { APPWRITE_CLIENT } from './setup';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Messaging {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _messaging = new AppwriteMessaging(this._client);\n\n  /**\n   * A function that wraps a promise and handles AppwriteExceptions.\n   *\n   * @param promise - The promise to wrap.\n   * @returns The result of the promise.\n   * @throws If the promise rejects with a non-AppwriteException error.\n   *\n   */\n  private async _call<T>(promise: Promise<T>): Promise<T | null> {\n    try {\n      return await promise;\n    } catch (e) {\n      if (e instanceof AppwriteException) {\n        console.warn(e.message);\n        return null;\n      }\n      throw e;\n    }\n  }\n\n  /**\n   * Create subscriber\n   *\n   * Create a new subscriber.\n   *\n   * @param topicId The topic ID.\n   * @param subscriberId The subscriber ID.\n   * @param targetId The target ID.\n   * @returns The created subscriber.\n   */\n  createSubscriber({\n    topicId,\n    subscriberId,\n    targetId,\n  }: {\n    topicId: string;\n    subscriberId: string;\n    targetId: string;\n  }): Promise<Models.Subscriber | null> {\n    return this._call(\n      this._messaging.createSubscriber({ topicId, subscriberId, targetId }),\n    );\n  }\n\n  /**\n   * Delete subscriber\n   *\n   * Delete a subscriber by its unique ID.\n   *\n   * @param topicId The topic ID.\n   * @param subscriberId The subscriber ID.\n   * @returns An empty object.\n   */\n  deleteSubscriber({\n    topicId,\n    subscriberId,\n  }: {\n    topicId: string;\n    subscriberId: string;\n  }): Promise<Record<string, never> | null> {\n    return this._call(\n      this._messaging.deleteSubscriber({ topicId, subscriberId }),\n    );\n  }\n}\n\n/**\n * An alias for the Messaging class.\n */\nexport const MessagingService = Messaging;\n\n/**\n * A provider for the Messaging class.\n */\nexport const provideMessaging = (): Provider => {\n  return {\n    provide: Messaging,\n    useClass: Messaging,\n  };\n};\n","import { inject, Injectable, Provider } from '@angular/core';\nimport {\n  AppwriteException,\n  Storage as AppwriteStorage,\n  ID,\n  ImageFormat,\n  ImageGravity,\n  Models,\n  UploadProgress,\n} from 'appwrite';\nimport { APPWRITE_CLIENT } from './setup';\nimport { AppwriteErrorHandler } from './error-handler';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Storage {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _storage = new AppwriteStorage(this._client);\n  private readonly _errorHandler = inject(AppwriteErrorHandler);\n\n  /**\n   * List Files\n   *\n   * Get a list of all the user files. You can use the query params to filter\n   * your results.\n   *\n   * @param buckedId The bucket ID.\n   * @param queries The queries to filter the results.\n   * @param search The search string to filter the results.\n   * @returns A list of files.\n   */\n  listFiles({\n    bucketId,\n    queries,\n    search,\n    total,\n  }: {\n    bucketId: string;\n    queries?: string[];\n    search?: string;\n    total?: boolean;\n  }): Promise<Models.FileList | null> {\n    return this._errorHandler.wrap(\n      this._storage.listFiles({ bucketId, queries, search, total }),\n      null,\n    );\n  }\n\n  /**\n   * Get File\n   *\n   * Get a file by its unique ID. This endpoint response returns a JSON object\n   * with the file metadata.\n   *\n   * @param bucketId The bucket ID.\n   * @param fileId The file ID.\n   * @returns A file.\n   */\n  getFile({\n    bucketId,\n    fileId,\n  }: {\n    bucketId: string;\n    fileId: string;\n  }): Promise<Models.File | null> {\n    return this._errorHandler.wrap(\n      this._storage.getFile({ bucketId, fileId }),\n      null,\n    );\n  }\n\n  /**\n   * Get File Preview\n   *\n   * Get a file preview image. Currently, this method supports preview for image\n   * files (jpg, png, and gif), other supported formats, like pdf, docs, slides,\n   * and spreadsheets, will return the file icon image. You can also pass query\n   * string arguments for cutting and resizing your preview image. Preview is\n   * supported only for image files smaller than 10MB.\n   *\n   * @param bucketId The bucket ID.\n   * @param fileId The file ID.\n   * @param width The width of the preview image.\n   * @param height The height of the preview image.\n   * @param gravity The gravity of the preview image.\n   * @param quality The quality of the preview image.\n   * @param borderWidth The border width of the preview image.\n   * @param borderColor The border color of the preview image.\n   * @param borderRadius The border radius of the preview image.\n   * @param opacity The opacity of the preview image.\n   * @param rotation The rotation of the preview image.\n   * @param background The background color of the preview image.\n   * @param output The output format of the preview image.\n   * @param token The token to access the file preview.\n   * @returns A URL to the file preview.\n   */\n  getFilePreview({\n    bucketId,\n    fileId,\n    width,\n    height,\n    gravity,\n    quality,\n    borderWidth,\n    borderColor,\n    borderRadius,\n    opacity,\n    rotation,\n    background,\n    output,\n    token,\n  }: {\n    bucketId: string;\n    fileId: string;\n    width?: number;\n    height?: number;\n    gravity?: ImageGravity;\n    quality?: number;\n    borderWidth?: number;\n    borderColor?: string;\n    borderRadius?: number;\n    opacity?: number;\n    rotation?: number;\n    background?: string;\n    output?: ImageFormat;\n    token?: string;\n  }): string | null {\n    try {\n      return this._storage.getFilePreview({\n        bucketId,\n        fileId,\n        width,\n        height,\n        gravity,\n        quality,\n        borderWidth,\n        borderColor,\n        borderRadius,\n        opacity,\n        rotation,\n        background,\n        output,\n        token,\n      });\n    } catch (e) {\n      return this._errorHandler.handle(e, null);\n    }\n  }\n\n  /**\n   * Get File for Download\n   *\n   * Get a file content by its unique ID. The endpoint response return with a\n   * 'Content-Disposition: attachment' header that tells the browser to start\n   * downloading the file to user downloads directory.\n   *\n   * @param bucketId The bucket ID.\n   * @param fileId The file ID.\n   * @param token The token to access the file download.\n   * @returns A URL to the file.\n   */\n  getFileDownload({\n    bucketId,\n    fileId,\n    token,\n  }: {\n    bucketId: string;\n    fileId: string;\n    token?: string;\n  }): string | null {\n    try {\n      return this._storage.getFileDownload({ bucketId, fileId, token });\n    } catch (e) {\n      return this._errorHandler.handle(e, null);\n    }\n  }\n\n  /**\n   * Get File for View\n   *\n   * Get a file content by its unique ID. This endpoint is similar to the\n   * download method but returns with no  'Content-Disposition: attachment'\n   * header.\n   *\n   * @param bucketId The bucket ID.\n   * @param fileId The file ID.\n   * @param token The token to access the file view.\n   * @returns A URL to the file.\n   */\n  getFileForView({\n    bucketId,\n    fileId,\n    token,\n  }: {\n    bucketId: string;\n    fileId: string;\n    token?: string;\n  }): string | null {\n    try {\n      return this._storage.getFileView({ bucketId, fileId, token });\n    } catch (e) {\n      return this._errorHandler.handle(e, null);\n    }\n  }\n\n  /**\n   * Create File\n   *\n   * Create a new file. Before using this route, you should create a new bucket\n   * resource using either a [server\n   * integration](/docs/server/storage#storageCreateBucket) API or directly from\n   * your Appwrite console.\n   *\n   * Larger files should be uploaded using multiple requests with the\n   * [content-range](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Range)\n   * header to send a partial request with a maximum supported chunk of `5MB`.\n   * The `content-range` header values should always be in bytes.\n   *\n   * When the first request is sent, the server will return the **File** object,\n   * and the subsequent part request must include the file's **id** in\n   * `x-appwrite-id` header to allow the server to know that the partial upload\n   * is for the existing file and not for a new one.\n   *\n   * If you're creating a new file using one of the Appwrite SDKs, all the\n   * chunking logic will be managed by the SDK internally.\n   *\n   *\n   * @param bucketId The bucket ID.\n   * @param file The file to create.\n   * @param fileId The file ID.\n   * @param permissions The permissions for the file.\n   * @param onProgress A callback to track the upload progress.\n   * @returns The created file.\n   */\n  createFile({\n    bucketId,\n    file,\n    fileId = ID.unique(),\n    permissions,\n    onProgress,\n  }: {\n    bucketId: string;\n    file: File;\n    fileId?: string;\n    permissions?: string[];\n    onProgress?: (progress: UploadProgress) => void;\n  }): Promise<Models.File | null> {\n    return this._errorHandler.wrap(\n      this._storage.createFile({\n        bucketId,\n        fileId,\n        file,\n        permissions,\n        onProgress,\n      }),\n      null,\n    );\n  }\n\n  /**\n   * Update File Permissions\n   *\n   * Update a file by its unique ID. Only users with write permissions have\n   * access to update this resource.\n   *\n   * @param bucketId The bucket ID.\n   * @param fileId The file ID.\n   * @param name The new name for the file.\n   * @param permissions The new permissions for the file.\n   * @returns The updated file.\n   */\n  updateFilePermissions({\n    bucketId,\n    fileId,\n    name,\n    permissions,\n  }: {\n    bucketId: string;\n    fileId: string;\n    name?: string;\n    permissions?: string[];\n  }): Promise<Models.File | null> {\n    return this._errorHandler.wrap(\n      this._storage.updateFile({ bucketId, fileId, name, permissions }),\n      null,\n    );\n  }\n\n  /**\n   * Delete File\n   *\n   * Delete a file by its unique ID. Only users with write permissions have\n   * access to delete this resource.\n   *\n   * @param bucketId The bucket ID.\n   * @param fileId The file ID.\n   * @returns An empty object.\n   */\n  deleteFile({\n    bucketId,\n    fileId,\n  }: {\n    bucketId: string;\n    fileId: string;\n  }): Promise<Record<string, never> | null> {\n    return this._errorHandler.wrap(\n      this._storage.deleteFile({ bucketId, fileId }) as Promise<\n        Record<string, never>\n      >,\n      null,\n    );\n  }\n}\n\n/**\n * An alias for the Storage class.\n */\nexport const StorageService = Storage;\n\n/**\n * A provider for the Storage class.\n */\nexport const provideStorage = (): Provider => {\n  return {\n    provide: Storage,\n    useClass: Storage,\n  };\n};\n","import { inject, Injectable, Provider } from '@angular/core';\nimport { Teams as AppwriteTeams, Models } from 'appwrite';\nimport { APPWRITE_CLIENT } from './setup';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Team {\n  private readonly _client = inject(APPWRITE_CLIENT);\n  private readonly _teams = new AppwriteTeams(this._client);\n\n  /**\n   * Create Team\n   *\n   * Create a new team. The user who creates the team will automatically be\n   * assigned as the owner of the team. Only the users with the owner role can\n   * invite new members, add new owners and delete or update the team.\n   *\n   * @param name The team's name.\n   * @param roles The team's roles.\n   * @param teamId The team's ID.\n   * @returns The created team.\n   */\n  create<TPrefs extends Models.Preferences>({\n    name,\n    roles,\n    teamId,\n  }: {\n    name: string;\n    roles?: string[];\n    teamId: string;\n  }): Promise<Models.Team<TPrefs>> {\n    return this._teams.create<TPrefs>({ teamId, name, roles });\n  }\n\n  /**\n   * List Teams\n   *\n   * Get a list of all the teams in which the current user is a member. You can\n   * use the parameters to filter your results.\n   *\n   * @param queries The queries to filter the results.\n   * @param search The search string to filter the results.\n   * @returns A list of teams.\n   */\n  list<TPrefs extends Models.Preferences>({\n    queries,\n    search,\n  }: {\n    queries?: string[];\n    search?: string;\n  }): Promise<Models.TeamList<TPrefs>> {\n    return this._teams.list<TPrefs>({ queries, search });\n  }\n\n  /**\n   * Get Team\n   *\n   * Get a team by its ID. All team members have read access for this resource.\n   *\n   * @param teamId The team's ID.\n   * @returns A team.\n   */\n  get<TPrefs extends Models.Preferences>(\n    teamId: string,\n  ): Promise<Models.Team<TPrefs>> {\n    return this._teams.get<TPrefs>({ teamId });\n  }\n\n  /**\n   * Update Team Name\n   *\n   * Update a team name using its ID. Only members with the owner role can update the\n   * team.\n   *\n   * @param teamId The team's ID.\n   * @param name The new name for the team.\n   * @returns The updated team.\n   */\n  updateName<TPrefs extends Models.Preferences>({\n    teamId,\n    name,\n  }: {\n    teamId: string;\n    name: string;\n  }): Promise<Models.Team<TPrefs>> {\n    return this._teams.updateName<TPrefs>({ teamId, name });\n  }\n\n  /**\n   * Delete Team\n   *\n   * Delete a team using its ID. Only team members with the owner role can\n   * delete the team.\n   *\n   * @param teamId The team's ID.\n   * @returns An empty object.\n   */\n  async delete(teamId: string): Promise<Record<string, never>> {\n    const result = await this._teams.delete({ teamId });\n    return result === undefined ? {} : result;\n  }\n\n  /**\n   * Create Team Membership\n   *\n   * Invite a new member to join your team. If initiated from the client SDK, an\n   * email with a link to join the team will be sent to the member's email\n   * address and an account will be created for them should they not be signed\n   * up already. If initiated from server-side SDKs, the new member will\n   * automatically be added to the team.\n   *\n   * Use the 'url' parameter to redirect the user from the invitation email back\n   * to your app. When the user is redirected, use the [Update Team Membership\n   * Status](/docs/client/teams#teamsUpdateMembershipStatus) endpoint to allow\n   * the user to accept the invitation to the team.\n   *\n   * Please note that to avoid a [Redirect\n   * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md)\n   * the only valid redirect URL's are the once from domains you have set when\n   * adding your platforms in the console interface.\n   *\n   * @param teamId The team's ID.\n   * @param email The email of the new member.\n   * @param roles The roles of the new member.\n   * @param url The URL to redirect the user to after accepting the invitation.\n   * @param name The name of the new member.\n   * @returns The created membership.\n   */\n  createMembership({\n    teamId,\n    roles,\n    email,\n    userId,\n    phone,\n    url,\n    name,\n  }: {\n    teamId: string;\n    roles: string[];\n    email?: string;\n    userId?: string;\n    phone?: string;\n    url?: string;\n    name?: string;\n  }): Promise<Models.Membership> {\n    return this._teams?.createMembership({\n      teamId,\n      roles,\n      email,\n      userId,\n      phone,\n      url,\n      name,\n    });\n  }\n\n  /**\n   * List Team Memberships\n   *\n   * Use this endpoint to list a team's members using the team's ID. All team\n   * members have read access to this endpoint.\n   *\n   * @param teamId The team's ID.\n   * @param queries The queries to filter the results.\n   * @param search The search string to filter the results.\n   * @returns A list of memberships.\n   */\n  listMemberships({\n    teamId,\n    queries,\n    search,\n  }: {\n    teamId: string;\n    queries?: string[];\n    search?: string;\n  }): Promise<Models.MembershipList> {\n    return this._teams.listMemberships({ teamId, queries, search });\n  }\n\n  /**\n   * Get Team Membership\n   *\n   * Get a team member by the membership unique id. All team members have read\n   * access for this resource.\n   *\n   * @param teamId The team's ID.\n   * @param membershipId The membership ID.\n   * @returns A membership.\n   */\n  getMembership({\n    teamId,\n    membershipId,\n  }: {\n    teamId: string;\n    membershipId: string;\n  }): Promise<Models.Membership> {\n    return this._teams.getMembership({ teamId, membershipId });\n  }\n\n  /**\n   * Update Membership\n   *\n   * Modify the roles of a team member. Only team members with the owner role\n   * have access to this endpoint. Learn more about [roles and\n   * permissions](/docs/permissions).\n   *\n   * @param teamId The team's ID.\n   * @param membershipId The membership ID.\n   * @param roles The new roles for the member.\n   * @returns The updated membership.\n   */\n  updateMembership({\n    teamId,\n    membershipId,\n    roles,\n  }: {\n    teamId: string;\n    membershipId: string;\n    roles: string[];\n  }): Promise<Models.Membership> {\n    return this._teams.updateMembership({ teamId, membershipId, roles });\n  }\n\n  /**\n   * Update Team Membership Status\n   *\n   * Use this endpoint to allow a user to accept an invitation to join a team\n   * after being redirected back to your app from the invitation email received\n   * by the user.\n   *\n   * If the request is successful, a session for the user is automatically\n   * created.\n   *\n   *\n   * @param teamId The team's ID.\n   * @param membershipId The membership ID.\n   * @param userId The user's ID.\n   * @param secret The secret from the invitation.\n   * @returns The updated membership.\n   */\n  updateMembershipStatus({\n    teamId,\n    membershipId,\n    userId,\n    secret,\n  }: {\n    teamId: string;\n    membershipId: string;\n    userId: string;\n    secret: string;\n  }): Promise<Models.Membership> {\n    return this._teams.updateMembershipStatus({\n      teamId,\n      membershipId,\n      userId,\n      secret,\n    });\n  }\n\n  /**\n   * Delete Team Membership\n   *\n   * This endpoint allows a user to leave a team or for a team owner to delete\n   * the membership of any other team member. You can also use this endpoint to\n   * delete a user membership even if it is not accepted.\n   *\n   * @param teamId The team's ID.\n   * @param membershipId The membership ID.\n   * @returns An empty object.\n   */\n  async deleteMembership({\n    teamId,\n    membershipId,\n  }: {\n    teamId: string;\n    membershipId: string;\n  }): Promise<Record<string, never>> {\n    const result = await this._teams.deleteMembership({ teamId, membershipId });\n\n    return result === undefined ? {} : result;\n  }\n}\n\nexport const TeamsService = Team;\n\nexport const provideTeams = (): Provider => {\n  return {\n    provide: Team,\n    useClass: Team,\n  };\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AppwriteAccount","AppwriteTablesDB","AppwriteAvatars","AppwriteDatabases","AppwriteFunctions","AppwriteLocale","AppwriteMessaging","AppwriteStorage","AppwriteTeams"],"mappings":"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"}