{"version":3,"sources":["../src/types.ts","../src/adapters/auth.ts","../src/adapters/database.ts","../src/adapters/storage.ts","../src/adapters/base.ts","../src/adapters/types.ts","../src/adapters/core/base-auth-adapter.ts","../src/adapters/core/registry.ts","../src/schemas.ts","../src/guards.ts","../src/errors/index.ts"],"names":["z","AdapterEventType","AdapterType","uuidv4","_a","event"],"mappings":"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","file":"index.mjs","sourcesContent":["import { z } from 'zod';\n\nexport type FieldType =\n  | 'String'\n  | 'Number'\n  | 'Boolean'\n  | 'Date'\n  | 'JSON'\n  | 'ID'\n  | 'Relation';\n\nexport const fieldTypeSchema = z.enum([\n  'String',\n  'Number',\n  'Boolean',\n  'Date',\n  'JSON',\n  'ID',\n  'Relation',\n]);\n\nexport interface BaseFieldDefinition {\n  type: FieldType;\n  required?: boolean;\n  unique?: boolean;\n  default?: any;\n  isArray?: boolean;\n  validators?: Array<(value: any) => string | null>;\n  description?: string;\n}\n\nexport interface StringFieldDefinition extends BaseFieldDefinition {\n  type: 'String';\n  enum?: string[];\n  minLength?: number;\n  maxLength?: number;\n  pattern?: string;\n  format?: 'email' | 'uri' | 'uuid' | 'date-time' | 'date' | 'time' | string;\n}\n\nexport interface NumberFieldDefinition extends BaseFieldDefinition {\n  type: 'Number';\n  minimum?: number;\n  maximum?: number;\n  exclusiveMinimum?: boolean;\n  exclusiveMaximum?: boolean;\n  multipleOf?: number;\n}\n\nexport interface BooleanFieldDefinition extends BaseFieldDefinition {\n  type: 'Boolean';\n}\n\nexport interface DateFieldDefinition extends BaseFieldDefinition {\n  type: 'Date';\n}\n\nexport interface JsonFieldDefinition extends BaseFieldDefinition {\n  type: 'JSON';\n}\n\nexport interface IDFieldDefinition extends BaseFieldDefinition {\n  type: 'ID';\n  autoIncrement?: boolean;\n  autoGenerate?: boolean;\n}\n\nexport interface RelationFieldDefinition extends BaseFieldDefinition {\n  type: 'Relation';\n  relation: {\n    model: string;\n    type: 'hasOne' | 'hasMany' | 'belongsTo' | 'manyToMany';\n    foreignKey?: string;\n    through?: string;\n  };\n}\n\nexport type FieldDefinition =\n  | StringFieldDefinition\n  | NumberFieldDefinition\n  | BooleanFieldDefinition\n  | DateFieldDefinition\n  | JsonFieldDefinition\n  | IDFieldDefinition\n  | RelationFieldDefinition;\n\nexport interface ModelDefinition {\n  fields: Record<string, FieldDefinition>;\n  timestamps?: boolean;\n  softDelete?: boolean;\n  tableName?: string;\n  indexes?: Array<{\n    fields: string | string[];\n    unique?: boolean;\n    name?: string;\n  }>;\n}\n\nexport interface Schema {\n  models: Record<string, ModelDefinition>;\n  enums?: Record<string, string[]>;\n  config?: {\n    database?: {\n      provider?: 'postgresql' | 'mysql' | 'sqlite' | 'mongodb';\n      url?: string;\n      ssl?: boolean;\n    };\n    auth?: {\n      enabled?: boolean;\n      providers?: ('credentials' | 'github' | 'google')[];\n    };\n  };\n}\n","// packages/types/src/adapters/auth.ts\nimport { z } from 'zod';\nimport type { BaseAdapter } from './base.js';\nimport { AdapterType } from './types.js';\n\nexport interface AuthProvider {\n  id: string;\n  name: string;\n  type: 'oauth' | 'oidc' | 'saml' | 'email' | 'phone' | 'password' | 'magic-link' | 'webauthn';\n  clientId?: string;\n  clientSecret?: string;\n  scopes?: string[];\n  authorizationUrl?: string;\n  tokenUrl?: string;\n  userInfoUrl?: string;\n  issuer?: string;\n  jwksUri?: string;\n  redirectUri?: string;\n  params?: Record<string, string>;\n  style?: {\n    logo?: string;\n    logoDark?: string;\n    bgColor?: string;\n    textColor?: string;\n    bgDark?: string;\n    textDark?: string;\n  };\n  [key: string]: any;\n}\n\n// Schemas\nexport const userProfileSchema = z.object({\n  id: z.string(),\n  email: z.string().email().optional(),\n  emailVerified: z.boolean().optional(),\n  name: z.string().optional(),\n  avatar: z.string().url().optional(),\n  // Allow additional properties\n}).passthrough();\n\nexport const authSessionSchema = z.object({\n  user: userProfileSchema,\n  accessToken: z.string(),\n  refreshToken: z.string().optional(),\n  expiresAt: z.date().or(z.string().datetime()).optional(),\n});\n\nexport const emailPasswordCredentialsSchema = z.object({\n  email: z.string().email(),\n  password: z.string().min(6),\n});\n\nexport interface UserProfile {\n    id: string;\n    email?: string;\n    emailVerified?: boolean;\n    name?: string;\n    avatar?: string;\n    [key: string]: any;\n  }\n  \n  export interface AuthSession<TUser extends UserProfile = UserProfile> {\n    user: TUser;\n    accessToken: string;\n    refreshToken?: string;\n    expiresAt?: Date;\n  }\n  \n  export interface EmailPasswordCredentials {\n    email: string;\n    password: string;\n  }\n  \n  export interface AuthAdapter<TUser extends UserProfile = UserProfile> extends BaseAdapter {\n    readonly type: AdapterType.AUTH;\n    \n    // Core authentication methods\n    signIn(credentials: any): Promise<AuthSession<TUser>>;\n    signOut(): Promise<void>;\n    getCurrentUser(): Promise<TUser | null>;\n    onAuthStateChanged(callback: (user: TUser | null) => void): () => void;\n    \n    // Common auth operations (optional)\n    signUp?(credentials: any): Promise<TUser>;\n    sendPasswordResetEmail?(email: string): Promise<void>;\n    confirmPasswordReset?(code: string, newPassword: string): Promise<void>;\n    updateProfile?(updates: Partial<TUser>): Promise<TUser>;\n    updateEmail?(email: string, currentPassword?: string): Promise<void>;\n    updatePassword?(newPassword: string, currentPassword?: string): Promise<void>;\n    signInWithProvider?(providerId: string, options?: any): Promise<AuthSession<TUser>>;\n    getAccessToken?(forceRefresh?: boolean): Promise<string | null>;\n    refreshSession?(): Promise<AuthSession<TUser>>;\n    getIdToken?(forceRefresh?: boolean): Promise<string | null>;\n  }\n\n/**\n * Options for configuring an auth adapter\n */\nexport interface AuthAdapterOptions {\n  /**\n   * Unique identifier for the auth adapter instance\n   * If not provided, a UUID will be generated automatically\n   */\n  id?: string;\n  \n  /**\n   * The persistence mechanism to use for the auth state\n   * @default 'local'\n   */\n  persistence?: 'local' | 'session' | 'none';\n  \n  /**\n   * Whether to automatically refresh the access token when it expires\n   * @default true\n   */\n  autoRefreshToken?: boolean;\n  \n  /**\n   * The threshold in seconds before token expiration to attempt a refresh\n   * @default 300 (5 minutes)\n   */\n  refreshThreshold?: number;\n  \n  /**\n   * The URL to redirect to after successful authentication\n   */\n  redirectTo?: string;\n  \n  /**\n   * The URL to redirect to after sign out\n   */\n  redirectAfterSignOut?: string;\n}\n\n/**\n * Configuration for a social authentication provider\n */\nexport interface SocialProviderConfig {\n  /** The OAuth client ID */\n  clientId: string;\n  \n  /** The OAuth client secret (server-side only) */\n  clientSecret?: string;\n  \n  /** The OAuth scopes to request */\n  scopes?: string[];\n  \n  /** The redirect URI for OAuth callbacks */\n  redirectUri?: string;\n  \n  /** Additional provider-specific parameters */\n  params?: Record<string, string>;\n}\n\n/**\n * Schema for validating social provider configurations\n */\nexport const socialProviderConfigSchema = z.object({\n  clientId: z.string().min(1, 'Client ID is required'),\n  clientSecret: z.string().optional(),\n  scopes: z.array(z.string()).default([]),\n  redirectUri: z.string().url('Invalid redirect URI').optional(),\n  params: z.record(z.string()).optional(),\n});\n\n/**\n * Type guard for UserProfile\n * @param value - The value to check\n * @returns True if the value is a valid UserProfile\n */\nexport function isUserProfile(value: unknown): value is UserProfile {\n  try {\n    userProfileSchema.parse(value);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Type guard for AuthSession\n * @param value - The value to check\n * @returns True if the value is a valid AuthSession\n */\nexport function isAuthSession<T extends UserProfile = UserProfile>(\n  value: unknown\n): value is AuthSession<T> {\n  try {\n    authSessionSchema.parse(value);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Type guard for EmailPasswordCredentials\n * @param value - The value to check\n * @returns True if the value is a valid EmailPasswordCredentials\n */\nexport function isEmailPasswordCredentials(\n  value: unknown\n): value is EmailPasswordCredentials {\n  try {\n    emailPasswordCredentialsSchema.parse(value);\n    return true;\n  } catch {\n    return false;\n  }\n}","import type { BaseAdapter } from './base.js';\r\nimport { AdapterType } from './types.js';\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Supported comparison operators for database queries\r\n */\r\nexport type Operator = \r\n  | '==' | '!=' | '<' | '<=' | '>' | '>='\r\n  | 'in' | 'not-in' | 'array-contains' | 'array-contains-any';\r\n\r\n/**\r\n * Schema for validating query operators\r\n */\r\nexport const operatorSchema = z.union([\r\n  z.literal('=='),\r\n  z.literal('!='),\r\n  z.literal('<'),\r\n  z.literal('<='),\r\n  z.literal('>'),\r\n  z.literal('>='),\r\n  z.literal('in'),\r\n  z.literal('not-in'),\r\n  z.literal('array-contains'),\r\n  z.literal('array-contains-any'),\r\n]);\r\n\r\n/**\r\n * Represents a filter condition for database queries\r\n */\r\nexport interface QueryFilter<T = unknown> {\r\n  /** The field to filter on */\r\n  field: string;\r\n  \r\n  /** The comparison operator */\r\n  operator: Operator;\r\n  \r\n  /** The value to compare against */\r\n  value: T;\r\n}\r\n\r\n/**\r\n * Schema for validating query filters\r\n */\r\nexport const queryFilterSchema = z.object({\r\n  field: z.string().min(1, 'Field name is required'),\r\n  operator: operatorSchema,\r\n  value: z.any(),\r\n});\r\n\r\n/**\r\n * Options for database adapter queries\r\n * @template T - Type of the document being queried\r\n */\r\nexport interface DatabaseAdapterQueryOptions<T = unknown> {\r\n  /** Filter conditions */\r\n  where?: QueryFilter[];\r\n  \r\n  /** Sorting order as [field, direction] */\r\n  orderBy?: [string, 'asc' | 'desc'];\r\n  \r\n  /** Maximum number of results to return */\r\n  limit?: number;\r\n  \r\n  /** Cursor for pagination - start after this document */\r\n  startAfter?: unknown;\r\n  \r\n  /** Cursor for pagination - end before this document */\r\n  endBefore?: unknown;\r\n  \r\n  /** Fields to include in the result */\r\n  select?: (keyof T)[];\r\n  \r\n  /** Number of documents to skip */\r\n  offset?: number;\r\n}\r\n\r\n/**\r\n * Schema for validating database query options\r\n */\r\nexport const databaseQueryOptionsSchema = z.object({\r\n  where: z.array(queryFilterSchema).optional(),\r\n  orderBy: z.tuple([z.string(), z.enum(['asc', 'desc'])]).optional(),\r\n  limit: z.number().int().positive().optional(),\r\n  startAfter: z.any().optional(),\r\n  endBefore: z.any().optional(),\r\n  select: z.array(z.any()).optional(),\r\n  offset: z.number().int().nonnegative().optional(),\r\n}).strict();\r\n\r\n/**\r\n * Options for database transactions\r\n */\r\nexport interface TransactionOptions {\r\n  /** Maximum number of retry attempts */\r\n  maxAttempts?: number;\r\n  \r\n  /** Whether to allow writes in the transaction */\r\n  readOnly?: boolean;\r\n  \r\n  /** Transaction timeout in milliseconds */\r\n  timeout?: number;\r\n}\r\n\r\n/**\r\n * Schema for validating transaction options\r\n */\r\nexport const transactionOptionsSchema = z.object({\r\n  maxAttempts: z.number().int().positive().optional(),\r\n  readOnly: z.boolean().optional(),\r\n  timeout: z.number().int().positive().optional(),\r\n}).strict();\r\n\r\n/**\r\n * Interface for database adapters\r\n * @template T - Default document type\r\n * @template TConfig - Type of the configuration object\r\n */\r\nexport interface DatabaseAdapter<\r\n  T = unknown,\r\n  TConfig = unknown\r\n> extends BaseAdapter<TConfig> {\r\n  readonly type: AdapterType.DATABASE;\r\n  \r\n  /**\r\n   * Creates a new document in the specified collection\r\n   * @param collection - The name of the collection\r\n   * @param data - The document data (without ID)\r\n   * @returns A promise that resolves to the created document with ID\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  create(collection: string, data: Omit<T, 'id'>): Promise<T & { id: string }>;\r\n  \r\n  /**\r\n   * Finds multiple documents matching the query options\r\n   * @param collection - The name of the collection\r\n   * @param options - Query options for filtering, sorting, and pagination\r\n   * @returns A promise that resolves to an array of matching documents\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  findMany(collection: string, options?: DatabaseAdapterQueryOptions<T>): Promise<T[]>;\r\n  \r\n  /**\r\n   * Reads a document by ID\r\n   * @param collection - The name of the collection\r\n   * @param id - The document ID\r\n   * @returns A promise that resolves to the document, or null if not found\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  read(collection: string, id: string): Promise<T | null>;\r\n  \r\n  /**\r\n   * Updates a document\r\n   * @param collection - The name of the collection\r\n   * @param id - The document ID\r\n   * @param data - The fields to update\r\n   * @returns A promise that resolves to the updated document\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  update(collection: string, id: string, data: Partial<T>): Promise<T>;\r\n  \r\n  /**\r\n   * Deletes a document\r\n   * @param collection - The name of the collection\r\n   * @param id - The document ID\r\n   * @returns A promise that resolves when the operation completes\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  delete(collection: string, id: string): Promise<void>;\r\n  \r\n  /**\r\n   * Finds documents matching the query options\r\n   * @template TQuery - Type of the document being queried\r\n   * @param collection - The name of the collection\r\n   * @param options - Query options\r\n   * @returns A promise that resolves to an array of matching documents\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  find<TQuery = T>(\r\n    collection: string,\r\n    options?: DatabaseAdapterQueryOptions<TQuery>\r\n  ): Promise<TQuery[]>;\r\n\r\n  /**\r\n   * Finds a single document by ID with optional query options\r\n   * @template TQuery - Type of the document being queried\r\n   * @param collection - The name of the collection\r\n   * @param id - The document ID\r\n   * @param options - Additional query options\r\n   * @returns A promise that resolves to the document, or null if not found\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  findOne<TQuery = T>(\r\n    collection: string,\r\n    id: string,\r\n    options?: Omit<DatabaseAdapterQueryOptions<TQuery>, 'limit' | 'offset'>\r\n  ): Promise<TQuery | null>;\r\n\r\n  /**\r\n   * Counts documents matching the query criteria\r\n   * @template TQuery - Type of the document being queried\r\n   * @param collection - The name of the collection\r\n   * @param options - Query options\r\n   * @returns A promise that resolves to the count of matching documents\r\n   * @throws {DatabaseError} If the operation fails\r\n   */\r\n  count<TQuery = T>(\r\n    collection: string,\r\n    options?: Pick<DatabaseAdapterQueryOptions<TQuery>, 'where'>\r\n  ): Promise<number>;\r\n  \r\n  // Real-time\r\n  subscribe(collection: string, callback: (data: T[]) => void, options?: DatabaseAdapterQueryOptions<T>): () => void;\r\n  \r\n  // Transactions\r\n  transaction<U>(updateFunction: (transaction: any) => Promise<U>): Promise<U>;\r\n}","/// <reference lib=\"dom\" />\n\nimport type { BaseAdapter } from \"./base.js\";\nimport { AdapterType } from \"./types.js\";\nimport { z } from 'zod';\n\n/**\n * Represents a file-like object that can be uploaded to storage\n */\nexport type FileLike = File | Blob | ArrayBuffer | Uint8Array | string;\n\n/**\n * Schema for validating file metadata\n */\nexport const fileMetadataSchema = z.object({\n  /** Name of the file */\n  name: z.string().min(1, 'File name is required'),\n  \n  /** Size of the file in bytes */\n  size: z.number().int().nonnegative('File size must be a non-negative number'),\n  \n  /** MIME type of the file */\n  type: z.string().min(1, 'File type is required'),\n  \n  /** Last modified timestamp */\n  lastModified: z.number().int().positive().optional(),\n  \n  /** Custom metadata key-value pairs */\n  customMetadata: z.record(z.string()).optional(),\n}).strict();\n\n/**\n * Represents metadata for a stored file\n */\nexport interface FileMetadata extends z.infer<typeof fileMetadataSchema> {}\n\n/**\n * Represents a file in storage with its metadata\n */\nexport interface StoredFile extends FileMetadata {\n  /** Full path to the file in storage */\n  path: string;\n  \n  /** Public URL to access the file */\n  url: string;\n  \n  /** When the file was created */\n  createdAt: Date;\n  \n  /** When the file was last updated */\n  updatedAt: Date;\n}\n\n/**\n * Schema for validating stored file objects\n */\nexport const storedFileSchema = fileMetadataSchema.extend({\n  path: z.string().min(1, 'File path is required'),\n  url: z.string().url('Invalid URL'),\n  createdAt: z.date(),\n  updatedAt: z.date(),\n}).strict();\n\n/**\n * Options for file uploads\n */\nexport interface UploadOptions {\n  /** Whether to make the file publicly accessible */\n  public?: boolean;\n  \n  /** Custom metadata to store with the file */\n  metadata?: Omit<FileMetadata, 'name' | 'size' | 'type'>;\n  \n  /** Content type override */\n  contentType?: string;\n  \n  /** Cache control header value */\n  cacheControl?: string;\n  \n  /** Content encoding */\n  contentEncoding?: string;\n  \n  /** Content disposition header value */\n  contentDisposition?: string;\n}\n\n/**\n * Schema for validating upload options\n */\nexport const uploadOptionsSchema = z.object({\n  public: z.boolean().default(false),\n  metadata: fileMetadataSchema.omit({ name: true, size: true, type: true }).optional(),\n  contentType: z.string().optional(),\n  cacheControl: z.string().optional(),\n  contentEncoding: z.string().optional(),\n  contentDisposition: z.string().optional(),\n}).strict();\n\n/**\n * Options for file downloads\n */\nexport interface DownloadOptions {\n  /** Whether to get a temporary download URL */\n  temporary?: boolean;\n  \n  /** Expiration time in seconds for temporary URLs */\n  expiresIn?: number;\n  \n  /** Response content type override */\n  responseContentType?: string;\n  \n  /** Response content disposition */\n  responseContentDisposition?: string;\n}\n\n/**\n * Schema for validating download options\n */\nexport const downloadOptionsSchema = z.object({\n  temporary: z.boolean().default(false),\n  expiresIn: z.number().int().positive().optional(),\n  responseContentType: z.string().optional(),\n  responseContentDisposition: z.string().optional(),\n}).strict();\n\n/**\n * Options for listing files\n */\nexport interface ListOptions {\n  /** Maximum number of results to return */\n  maxResults?: number;\n  \n  /** Pagination token */\n  pageToken?: string;\n  \n  /** Whether to include file metadata in results */\n  includeMetadata?: boolean;\n}\n\n/**\n * Schema for validating list options\n */\nexport const listOptionsSchema = z.object({\n  maxResults: z.number().int().positive().optional(),\n  pageToken: z.string().optional(),\n  includeMetadata: z.boolean().default(false),\n}).strict();\n\n/**\n * Result of a list operation\n */\nexport interface ListResult {\n  /** Array of file paths or objects */\n  items: (string | StoredFile)[];\n  \n  /** Pagination token for the next page */\n  nextPageToken?: string;\n  \n  /** Whether there are more results */\n  hasMore: boolean;\n}\n\n/**\n * Schema for validating list results\n */\nexport const listResultSchema = z.object({\n  items: z.array(z.union([z.string(), storedFileSchema])),\n  nextPageToken: z.string().optional(),\n  hasMore: z.boolean(),\n}).strict();\n\n/**\n * Interface for storage adapters\n * @template TConfig - Type of the configuration object\n */\nexport interface StorageAdapter<TConfig = unknown> extends BaseAdapter<TConfig> {\n  readonly type: AdapterType.STORAGE;\n  \n  /**\n   * Uploads a file to storage\n   * @param file - The file to upload\n   * @param path - The destination path in storage\n   * @param options - Upload options\n   * @returns A promise that resolves to the public URL of the uploaded file\n   * @throws {StorageError} If the upload fails\n   */\n  upload(\n    file: FileLike, \n    path: string, \n    options?: UploadOptions\n  ): Promise<string>;\n  \n  /**\n   * Downloads a file from storage\n   * @param path - The path to the file in storage\n   * @param options - Download options\n   * @returns A promise that resolves to the file data as a Blob\n   * @throws {StorageError} If the download fails\n   */\n  download(\n    path: string, \n    options?: DownloadOptions\n  ): Promise<Blob>;\n  \n  /**\n   * Gets a download URL for a file\n   * @param path - The path to the file in storage\n   * @param options - Download options\n   * @returns A promise that resolves to a download URL\n   * @throws {StorageError} If the operation fails\n   */\n  getDownloadUrl(\n    path: string, \n    options?: Omit<DownloadOptions, 'temporary'>\n  ): Promise<string>;\n  \n  /**\n   * Deletes a file from storage\n   * @param path - The path to the file in storage\n   * @returns A promise that resolves when the operation completes\n   * @throws {StorageError} If the deletion fails\n   */\n  delete(path: string): Promise<void>;\n  \n  /**\n   * Lists files in a storage path\n   * @param path - The directory path to list\n   * @param options - List options\n   * @returns A promise that resolves to a list of file paths or objects\n   * @throws {StorageError} If the operation fails\n   */\n  list(\n    path: string, \n    options?: ListOptions\n  ): Promise<ListResult>;\n  \n  /**\n   * Gets metadata for a file\n   * @param path - The path to the file in storage\n   * @returns A promise that resolves to the file metadata\n   * @throws {StorageError} If the operation fails\n   */\n  getMetadata(path: string): Promise<StoredFile>;\n  \n  /**\n   * Updates file metadata\n   * @param path - The path to the file in storage\n   * @param metadata - The metadata to update\n   * @returns A promise that resolves to the updated file metadata\n   * @throws {StorageError} If the operation fails\n   */\n  updateMetadata(\n    path: string, \n    metadata: Partial<FileMetadata>\n  ): Promise<StoredFile>;\n}","import type { AdapterType } from './types.js';\nimport type { z } from 'zod';\n\n/**\n * Base interface that all adapters must implement\n * @template TConfig - Type of the configuration object\n * @template TSchema - Type of the Zod schema for the configuration\n * @template TType - Type of the adapter (from AdapterType)\n */\nexport interface BaseAdapter<\n  TConfig = unknown,\n  TSchema extends z.ZodType<any, any, any> = z.ZodType<any, any, any>,\n  TType extends AdapterType = AdapterType\n> {\n  /** Unique identifier for the adapter instance */\n  readonly id: string;\n  \n  /** Type of the adapter (auth, database, storage, etc.) */\n  readonly type: TType;\n  \n  /** Current configuration of the adapter */\n  readonly config: TConfig;\n  \n  /** Zod schema for validating the configuration */\n  readonly schema: TSchema;\n  \n  /**\n   * Initialize the adapter with the given configuration\n   * @param config Configuration object for the adapter\n   */\n  init(config: TConfig): Promise<void>;\n  \n  /**\n   * Clean up resources when the adapter is no longer needed\n   */\n  destroy(): Promise<void>;\n  \n  /**\n   * Check if the adapter is properly initialized\n   */\n  isInitialized(): boolean;\n  \n  /**\n   * Update the adapter's configuration\n   * @param config Partial configuration to update\n   */\n  updateConfig(config: Partial<TConfig>): Promise<void>;\n  \n  /**\n   * Validate the configuration against the schema\n   * @param config Configuration to validate\n   * @returns The validated configuration\n   */\n  validateConfig(config: unknown): TConfig;\n}\n\n/**\n * Adapter that can execute operations\n * @template TConfig - Type of the configuration object\n * @template TSchema - Zod schema for the configuration\n * @template TResult - Type of the result\n * @template TInput - Type of the input parameters\n */\nexport interface ExecutableAdapter<\n  TConfig = unknown,\n  TSchema extends z.ZodType = z.ZodType,\n  TResult = unknown,\n  TInput = unknown\n> extends BaseAdapter<TConfig, TSchema> {\n  /**\n   * Execute an operation with the given parameters\n   * @param params Input parameters for the operation\n   */\n  execute(params: TInput): Promise<TResult>;\n}\n\n/**\n * Adapter that can subscribe to data changes\n * @template TConfig - Type of the configuration object\n * @template TSchema - Zod schema for the configuration\n * @template TData - Type of the data being subscribed to\n * @template TParams - Type of the subscription parameters\n */\nexport interface SubscribableAdapter<\n  TConfig = unknown,\n  TSchema extends z.ZodType = z.ZodType,\n  TData = unknown,\n  TParams = unknown\n> extends BaseAdapter<TConfig, TSchema> {\n  /**\n   * Subscribe to data changes\n   * @param callback Function to call when data changes\n   * @param params Optional parameters for the subscription\n   * @returns Unsubscribe function\n   */\n  subscribe(callback: (data: TData) => void, params?: TParams): () => void;\n}\n\n/**\n * Adapter that can be used as a factory to create other adapters\n */\nexport interface AdapterFactory<T extends BaseAdapter = BaseAdapter> {\n  /**\n   * Create a new adapter instance\n   * @param config Configuration for the adapter\n   */\n  create(config: unknown): Promise<T>;\n  \n  /**\n   * Get the default configuration for the adapter\n   */\n  getDefaultConfig(): unknown;\n  \n  /**\n   * Get the schema for the adapter configuration\n   */\n  getSchema(): z.ZodType;\n}\n\n/**\n * Event types that can be emitted by adapters\n */\nexport enum AdapterEventType {\n  INITIALIZED = 'initialized',\n  DESTROYED = 'destroyed',\n  ERROR = 'error',\n  CONFIG_UPDATED = 'config_updated',\n  STATE_CHANGED = 'state_changed',\n  DATA_CHANGED = 'data_changed',\n  AUTH_STATE_CHANGED = 'auth_state_changed',\n  ID_TOKEN_CHANGED = 'id_token_changed',\n}\n\n/**\n * Base event interface for adapter events\n * @template T - Type of the event data\n */\nexport interface AdapterEvent<T = unknown> {\n  /** Type of the event */\n  type: AdapterEventType;\n  \n  /** Timestamp when the event occurred */\n  timestamp: Date;\n  \n  /** Event data */\n  data?: T;\n  \n  /** Error if the event represents an error */\n  error?: Error;\n  \n  /** Metadata about the event */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Event listener function\n * @template T - Type of the event data\n */\nexport type AdapterEventListener<T = unknown> = (event: AdapterEvent<T>) => void;\n\n/**\n * Event emitter interface for adapters\n */\nexport interface AdapterEventEmitter {\n  /**\n   * Add an event listener\n   * @param event Event type to listen for\n   * @param listener Callback function\n   */\n  on<T = unknown>(\n    event: AdapterEventType | string, \n    listener: AdapterEventListener<T>\n  ): void;\n  \n  /**\n   * Remove an event listener\n   * @param event Event type to remove listener from\n   * @param listener Callback function to remove\n   */\n  off<T = unknown>(\n    event: AdapterEventType | string, \n    listener: AdapterEventListener<T>\n  ): void;\n  \n  /**\n   * Emit an event\n   * @param event Event to emit\n   */\n  emit<T = unknown>(event: AdapterEvent<T>): void;\n}\n\n/**\n * Options for initializing an adapter\n */\nexport interface AdapterOptions {\n  /** Whether to automatically initialize the adapter */\n  autoInit?: boolean;\n  \n  /** Whether to throw an error if initialization fails */\n  throwOnError?: boolean;\n  \n  /** Logger instance */\n  logger?: {\n    debug: (...args: any[]) => void;\n    info: (...args: any[]) => void;\n    warn: (...args: any[]) => void;\n    error: (...args: any[]) => void;\n  };\n}","import type { BaseAdapter } from './base.js';\r\nimport type { z } from 'zod';\r\n\r\n/**\r\n * Supported adapter types\r\n */\r\nexport enum AdapterType {\r\n  /** Authentication adapter (handles users, sessions, etc.) */\r\n  AUTH = 'auth',\r\n  \r\n  /** Database adapter (CRUD operations) */\r\n  DATABASE = 'database',\r\n  \r\n  /** Storage adapter (file storage) */\r\n  STORAGE = 'storage',\r\n  \r\n  /** Payment processing adapter */\r\n  PAYMENT = 'payment',\r\n}\r\n\r\n/**\r\n * Configuration for initializing an adapter\r\n * @template T - Type of the configuration object\r\n */\r\nexport interface AdapterConfig<T = unknown> {\r\n  /** Type of adapter to create */\r\n  type: AdapterType;\r\n  \r\n  /** Unique identifier for the adapter instance */\r\n  id: string;\r\n  \r\n  /** Provider-specific configuration */\r\n  config: T;\r\n}\r\n\r\n/**\r\n * Registry of all adapters by type\r\n */\r\nexport interface AdapterRegistry {\r\n  [AdapterType.AUTH]?: Map<string, BaseAdapter<unknown, z.ZodType, AdapterType.AUTH>>;\r\n  [AdapterType.DATABASE]?: Map<string, BaseAdapter<unknown, z.ZodType, AdapterType.DATABASE>>;\r\n  [AdapterType.STORAGE]?: Map<string, BaseAdapter<unknown, z.ZodType, AdapterType.STORAGE>>;\r\n  [AdapterType.PAYMENT]?: Map<string, BaseAdapter<unknown, z.ZodType, AdapterType.PAYMENT>>;\r\n  [key: string]: Map<string, BaseAdapter> | undefined;\r\n}\r\n\r\n// Re-export base types for convenience\r\nexport * from './base.js';\r\n","import { EventEmitter } from 'events';\nimport { v4 as uuidv4 } from 'uuid';\n\n// Define event map type for auth adapter\ntype AuthAdapterEventMap<TUser> = {\n  [K in AdapterEventType]: \n    K extends AdapterEventType.INITIALIZED ? { initialized: boolean } :\n    K extends AdapterEventType.ERROR ? { error: Error } :\n    K extends AdapterEventType.STATE_CHANGED ? { user: TUser | null } :\n    K extends AdapterEventType.AUTH_STATE_CHANGED ? { user: TUser | null } :\n    K extends AdapterEventType.ID_TOKEN_CHANGED ? { token: string | null } :\n    K extends AdapterEventType.DESTROYED ? { destroyed: boolean } :\n    never;\n};\n\n// Auth state interface\nexport interface AuthState<TUser = any> {\n  user: TUser | null;\n  isInitialized: boolean;\n}\n\n// Import types from the base module\nimport { \n  AdapterEventType, \n  type AdapterEvent, \n  type AdapterEventListener \n} from '../base.js';\n\n// Define concrete event names that map to AdapterEventType\nconst ADAPTER_EVENT_NAMES: Record<AdapterEventType, string> = {\n  [AdapterEventType.INITIALIZED]: 'initialized',\n  [AdapterEventType.ERROR]: 'error',\n  [AdapterEventType.CONFIG_UPDATED]: 'config_updated',\n  [AdapterEventType.STATE_CHANGED]: 'state_changed',\n  [AdapterEventType.DATA_CHANGED]: 'data_changed',\n  [AdapterEventType.AUTH_STATE_CHANGED]: 'auth_state_changed',\n  [AdapterEventType.ID_TOKEN_CHANGED]: 'id_token_changed',\n  [AdapterEventType.DESTROYED]: 'destroyed',\n};\n\ntype EventName = string & keyof typeof ADAPTER_EVENT_NAMES;\n\nimport type { AuthAdapter, AuthAdapterOptions, AuthProvider, AuthSession, ID, UserProfile } from '@api-buddy/types';\nimport type { ActionCodeSettings, IdTokenResult } from 'firebase/auth';\n\n// Extend the EventEmitter interface to include our custom events\ndeclare module 'events' {\n  interface EventEmitter {\n    on<TEvent extends AdapterEventType>(\n      event: TEvent,\n      listener: (event: AdapterEvent<AuthAdapterEventMap<any>[TEvent]> & { adapter: BaseAuthAdapter<any> }) => void\n    ): this;\n    on(\n      event: string | symbol,\n      listener: (...args: any[]) => void\n    ): this;\n    \n    off<TEvent extends AdapterEventType>(\n      event: TEvent,\n      listener: (event: AdapterEvent<AuthAdapterEventMap<any>[TEvent]> & { adapter: BaseAuthAdapter<any> }) => void\n    ): this;\n    off(\n      event: string | symbol,\n      listener: (...args: any[]) => void\n    ): this;\n    \n    emit(\n      event: AdapterEventType,\n      ...args: any[]\n    ): boolean;\n    emit(\n      event: string | symbol,\n      ...args: any[]\n    ): boolean;\n  }\n}\n\n// Use imported types from database.types.js\n\n/**\n * Base implementation of the AuthAdapter interface\n * Provides common functionality that can be shared across different auth providers\n * \n * @template TUser - The user type that this adapter works with\n * @template TCredentials - The credentials type used for authentication\n */\n// Define a base user interface that extends the expected ID type\nexport interface BaseUser {\n  id?: ID;\n  uid: string;\n  email?: string | null;\n  displayName?: string | null;\n  photoURL?: string | null;\n  // Add other common user properties as needed\n}\n\nexport abstract class BaseAuthAdapter<TUser extends UserProfile = UserProfile, TCredentials = any>\n  implements AuthAdapter<TUser>\n{\n  /**\n   * Connect to the authentication service\n   * @returns Promise that resolves when connected\n   */\n  abstract connect(): Promise<void>;\n\n  /**\n   * Disconnect from the authentication service\n   * @returns Promise that resolves when disconnected\n   */\n  abstract disconnect(): Promise<void>;\n  \n  //@ts-ignore\n  public readonly type = 'auth';\n  public readonly id: string;\n  public state: AuthState = { user: null, isInitialized: false };\n  public providers: Record<string, AuthProvider> = {};\n  protected eventEmitter: EventEmitter;\n  protected listeners: Map<AdapterEventType, Set<AdapterEventListener>> = new Map();\n  protected wrappedListeners: WeakMap<AdapterEventListener, AdapterEventListener> = new WeakMap();\n  \n  constructor(options: AuthAdapterOptions) {\n    this.id = options.id || `auth-${uuidv4()}`;\n    this.eventEmitter = new EventEmitter();\n    this.eventEmitter.setMaxListeners(100);\n    \n    // Safe type for the event emitter with our custom methods\n    interface CustomEventEmitter extends Omit<EventEmitter, 'on' | 'off' | 'emit'> {\n      on: {\n        <TEvent extends AdapterEventType>(\n          event: TEvent,\n          listener: (event: AdapterEvent<AuthAdapterEventMap<any>[TEvent]> & { adapter: BaseAuthAdapter<any> }) => void\n        ): CustomEventEmitter;\n        (event: string | symbol, listener: (...args: any[]) => void): CustomEventEmitter;\n      };\n      off: {\n        <TEvent extends AdapterEventType>(\n          event: TEvent,\n          listener: (event: AdapterEvent<AuthAdapterEventMap<any>[TEvent]> & { adapter: BaseAuthAdapter<any> }) => void\n        ): CustomEventEmitter;\n        (event: string | symbol, listener: (...args: any[]) => void): CustomEventEmitter;\n      };\n      emit: (event: string | symbol, ...args: any[]) => boolean;\n    }\n\n    // Cast to our custom event emitter type\n    const customEmitter = this.eventEmitter as CustomEventEmitter;\n    \n    // Save original methods\n    const originalEmit = this.eventEmitter.emit.bind(this.eventEmitter);\n    const originalOn = this.eventEmitter.on.bind(this.eventEmitter);\n    const originalOff = this.eventEmitter.off?.bind(this.eventEmitter) || \n                       ((event: string | symbol, listener: (...args: any[]) => void) => {\n                         this.eventEmitter.removeListener(event, listener);\n                         return this;\n                       });\n    \n    // Override emit to handle our custom events\n    customEmitter.emit = ((event: string | symbol, ...args: any[]): boolean => {\n      if (typeof event === 'string' && Object.values(AdapterEventType).includes(event as AdapterEventType)) {\n        const eventType = event as AdapterEventType;\n        const listeners = this.listeners.get(eventType);\n        if (listeners) {\n          // Create a proper event object with the expected shape\n          const eventPayload = args[0] || {};\n          const eventData: AdapterEvent<unknown> & { adapter: BaseAuthAdapter<TUser> } = {\n            ...eventPayload,\n            adapter: this,\n            type: eventType,\n            timestamp: new Date()\n          };\n          \n          // Notify all listeners\n          for (const listener of listeners) {\n            try {\n              (listener as any)(eventData);\n            } catch (error) {\n              console.error(`Error in ${event} listener:`, error);\n            }\n          }\n        }\n      }\n      return originalEmit(event, ...args);\n    }) as any;\n    \n    // Override on to track our custom listeners\n    customEmitter.on = ((event: string | symbol, listener: (...args: any[]) => void) => {\n      if (typeof event === 'string' && Object.values(AdapterEventType).includes(event as AdapterEventType)) {\n        const eventType = event as AdapterEventType;\n        if (!this.listeners.has(eventType)) {\n          this.listeners.set(eventType, new Set());\n        }\n        \n        // Wrap the listener to ensure proper event shape\n        const wrappedListener = (e: any) => {\n          const eventWithTimestamp: AdapterEvent<unknown> & { adapter: BaseAuthAdapter<TUser> } = {\n            ...e,\n            adapter: this,\n            type: eventType,\n            timestamp: new Date()\n          };\n          (listener as any)(eventWithTimestamp);\n        };\n        \n        this.listeners.get(eventType)?.add(wrappedListener);\n        this.wrappedListeners.set(listener as AdapterEventListener<unknown>, wrappedListener);\n        \n        return originalOn(event, wrappedListener);\n      }\n      return originalOn(event, listener);\n    }) as any;\n    \n    // Override off to clean up our listener tracking\n    customEmitter.off = ((event: string | symbol, listener: (...args: any[]) => void) => {\n      if (typeof event === 'string' && Object.values(AdapterEventType).includes(event as AdapterEventType)) {\n        const eventType = event as AdapterEventType;\n        const wrappedListener = this.wrappedListeners.get(listener as AdapterEventListener<unknown>);\n        \n        if (wrappedListener) {\n          this.listeners.get(eventType)?.delete(wrappedListener);\n          this.wrappedListeners.delete(listener as AdapterEventListener<unknown>);\n          return originalOff(event, wrappedListener);\n        }\n      }\n      return originalOff(event, listener);\n    }) as any;\n  }\n\n  /**\n   * Whether the adapter has been initialized\n   */\n  isInitialized(): boolean {\n    return this.state.isInitialized;\n  }\n\n  /**\n   * Internal initialization state\n   */\n  protected _isInitialized: boolean = false;\n\n  /**\n   * The current user, if any\n   */\n  protected currentUser: TUser | null = null;\n\n  /**\n   * The current authentication session, if any\n   */\n  protected currentSession: AuthSession | null = null;\n\n  // ==========================================\n  // Event Emitter Implementation\n  // ==========================================\n  // Implement on/off methods to satisfy AuthAdapter interface\n  // These methods use the custom event emitter we set up in the constructor\n  on<T = unknown>(event: AdapterEventType, listener: AdapterEventListener<T>): void {\n    if (typeof event === 'string' && Object.values(AdapterEventType).includes(event as AdapterEventType)) {\n      const eventType = event as AdapterEventType;\n      if (!this.listeners.has(eventType)) {\n        this.listeners.set(eventType, new Set());\n      }\n      \n      // Wrap the listener to ensure proper event shape\n      const wrappedListener = (e: any) => {\n        const eventWithTimestamp: AdapterEvent<unknown> & { adapter: BaseAuthAdapter<TUser> } = {\n          ...e,\n          adapter: this,\n          type: eventType,\n          timestamp: Date.now()\n        };\n        (listener as any)(eventWithTimestamp);\n      };\n      \n      this.listeners.get(eventType)?.add(wrappedListener);\n      this.wrappedListeners.set(listener as AdapterEventListener<unknown>, wrappedListener);\n      \n      // Add to Node.js EventEmitter\n      this.eventEmitter.on(eventType as string, wrappedListener);\n    } else {\n      // Fallback for non-custom event types\n      this.eventEmitter.on(event as string | symbol, listener as any);\n    }\n  }\n\n  off<T = unknown>(event: AdapterEventType, listener: AdapterEventListener<T>): void {\n    if (typeof event === 'string' && Object.values(AdapterEventType).includes(event as AdapterEventType)) {\n      const eventType = event as AdapterEventType;\n      const wrappedListener = this.wrappedListeners.get(listener as AdapterEventListener<unknown>);\n      \n      if (wrappedListener) {\n        this.listeners.get(eventType)?.delete(wrappedListener);\n        this.wrappedListeners.delete(listener as AdapterEventListener<unknown>);\n        this.eventEmitter.off(eventType as string, wrappedListener);\n      }\n    } else {\n      // Fallback for non-custom event types\n      this.eventEmitter.off(event as string | symbol, listener as any);\n    }\n  }\n\n  emit(event: AdapterEvent<unknown>): boolean {\n    const eventType = event.type as AdapterEventType;\n    \n    // Create the event payload with all required properties\n    const eventPayload: AdapterEvent<unknown> & { adapter: BaseAuthAdapter<TUser> } = {\n      ...event,\n      adapter: this,\n      timestamp: event.timestamp || new Date()\n    };\n    \n    // Notify direct listeners\n    if (this.listeners.has(eventType)) {\n      const listeners = this.listeners.get(eventType)!;\n      for (const listener of listeners) {\n        try {\n          listener(eventPayload);\n        } catch (error) {\n          console.error(`Error in ${eventType} listener:`, error);\n        }\n      }\n    }\n    \n    // Forward to Node.js EventEmitter with proper type conversion\n    const eventName = eventType as string;\n    return (this.eventEmitter as EventEmitter).emit(eventName, eventPayload);\n  }\n\n  /**\n   * Helper method to emit events with proper typing\n   */\n  protected emitEvent<K extends keyof AuthAdapterEventMap<TUser>>(\n    type: K,\n    data: AuthAdapterEventMap<TUser>[K],\n    error?: Error\n  ): void {\n    // Create a properly typed event object\n    const event: AdapterEvent<AuthAdapterEventMap<TUser>[K]> & { adapter: BaseAuthAdapter<TUser> } = {\n      type: type as unknown as AdapterEventType,\n      adapter: this,\n      data,\n      timestamp: new Date(),\n      error\n    };\n    \n    // Emit the event through the Node.js EventEmitter with type assertion\n    const eventName = type as string;\n    (this.eventEmitter as EventEmitter).emit(eventName, event);\n    \n    // Also emit through our custom event system\n    if (this.listeners.has(type)) {\n      const listeners = this.listeners.get(type)!;\n      for (const listener of listeners) {\n        try {\n          // Cast to any to handle the generic type properly\n          (listener as any)(event);\n        } catch (err) {\n          console.error(`Error in ${type} listener:`, err);\n        }\n      }\n    }\n  }\n\n  removeAllListeners(event?: EventName): this {\n    if (event) {\n      this.listeners.get(event)?.clear();\n      this.eventEmitter.removeAllListeners(event);\n    } else {\n      this.listeners.clear();\n      this.eventEmitter.removeAllListeners();\n    }\n    return this;\n  }\n\n  // ==========================================\n  // Abstract Methods (must be implemented by subclasses)\n  // ==========================================\n\n  // Authentication methods\n  abstract signUp(credentials: TCredentials): Promise<TUser>;\n  abstract signIn(credentials: TCredentials): Promise<AuthSession<TUser>>;\n  abstract signOut(): Promise<void>;\n  abstract getSession(): Promise<AuthSession | null>;\n  abstract register(credentials: TCredentials): Promise<TUser>;\n  abstract sendPasswordResetEmail(email: string): Promise<void>;\n  abstract verifyPasswordResetCode(code: string): Promise<string>;\n  abstract confirmPasswordReset(code: string, newPassword: string): Promise<void>;\n  abstract updateEmail(email: string): Promise<void>;\n  abstract updatePassword(newPassword: string): Promise<void>;\n  abstract updateProfile(updates: Partial<TUser>): Promise<TUser>;\n  abstract sendEmailVerification(actionCodeSettings?: ActionCodeSettings): Promise<void>;\n  abstract applyActionCode(code: string): Promise<void>;\n  abstract checkActionCode(code: string): Promise<{ \n    data: { \n      email?: string; \n      fromEmail?: string; \n      previousEmail?: string; \n      requestType: string; \n    }; \n    operation: string; \n  }>;\n  abstract verifyEmail(code: string): Promise<void>;\n  abstract getProviderData(): Promise<Array<{\n    providerId: string;\n    uid: string;\n    displayName?: string | null;\n    email?: string | null;\n    phoneNumber?: string | null;\n    photoURL?: string | null;\n  }>>;\n  \n  getProviderId(): Promise<string | null> {\n    return Promise.resolve(this.id);\n  }\n\n  getTenantId(): Promise<string | null> {\n    return Promise.resolve(null);\n  }\n\n  abstract setTenantId(tenantId: string | null): void;\n  abstract getUserMetadata(): Promise<{\n    creationTime?: string;\n    lastSignInTime?: string;\n  }>;\n  abstract setLanguageCode(languageCode: string): void;\n  abstract getLanguageCode(): string | null;\n  abstract isSignInWithEmailLink(emailLink: string): boolean;\n  abstract sendSignInLinkToEmail(email: string, actionCodeSettings: ActionCodeSettings): Promise<void>;\n  abstract signInWithPopup(providerId: string): Promise<TUser>;\n  abstract signInWithRedirect(providerId: string): Promise<void>;\n  abstract getRedirectResult(): Promise<{\n    user: TUser | null;\n    credential: any | null;\n    operationType?: string | null;\n  }>;\n  abstract reload(): Promise<void>;\n  abstract init(config: unknown): Promise<void>;\n  abstract destroy(): Promise<void>;\n  \n  // Phone authentication methods\n  abstract verifyPhoneNumber(\n    phoneNumber: string,\n    applicationVerifier: any\n  ): Promise<string>;\n  \n  abstract signInWithPhoneNumber(\n    verificationId: string,\n    verificationCode: string\n  ): Promise<TUser>;\n  \n  abstract updatePhoneNumber(\n    phoneNumber: string,\n    applicationVerifier: any\n  ): Promise<void>;\n\n  // Additional AuthAdapter methods with default implementations\n  async deleteAccount(): Promise<void> {\n    throw new Error('deleteAccount not implemented');\n  }\n\n  async refreshToken(_forceRefresh: boolean = false): Promise<string> {\n    throw new Error('refreshToken not implemented');\n  }\n\n  async getIdToken(_forceRefresh: boolean = false): Promise<string | null> {\n    throw new Error('getIdToken not implemented');\n  }\n\n  async getIdTokenResult(_forceRefresh: boolean = false): Promise<IdTokenResult> {\n    throw new Error('getIdTokenResult not implemented');\n  }\n\n  async getRefreshToken(): Promise<string> {\n    throw new Error('getRefreshToken not implemented');\n  }\n\n  onAuthStateChanged(_callback: (user: TUser | null) => void): () => void {\n    throw new Error('onAuthStateChanged not implemented');\n  }\n\n  onIdTokenChanged(_callback: (user: TUser | null) => void): () => void {\n    throw new Error('onIdTokenChanged not implemented');\n  }\n\n  async getCurrentUser(): Promise<TUser | null> {\n    throw new Error('getCurrentUser not implemented');\n  }\n\n  async isEmailVerified(): Promise<boolean> {\n    throw new Error('isEmailVerified not implemented');\n  }\n\n  async isAnonymous(): Promise<boolean> {\n    throw new Error('isAnonymous not implemented');\n  }\n\n  async linkWithCredential(_credential: any): Promise<TUser> {\n    throw new Error('linkWithCredential not implemented');\n  }\n\n  async unlink(_providerId: string): Promise<TUser> {\n    throw new Error('unlink not implemented');\n  }\n\n  async reauthenticate(_credential: any): Promise<void> {\n    throw new Error('reauthenticate not implemented');\n  }\n\n  /**\n   * Helper method to emit auth state change events\n   */\n  // Helper method to emit auth state change events\n  protected emitAuthStateChanged(user: TUser | null): void {\n    this.emitEvent(AdapterEventType.AUTH_STATE_CHANGED, { user } as const);\n  }\n\n  protected emitTokenRefreshed(token: string): void {\n    this.emitEvent(AdapterEventType.ID_TOKEN_CHANGED, { token });\n  }\n\n\n\n  /**\n   * Ensure the adapter is initialized\n   * @throws {Error} If the adapter is not initialized\n   */\n  protected ensureInitialized(): void {\n    if (!this._isInitialized) {\n      throw new Error(`Auth adapter ${this.id} is not initialized`);\n    }\n  }\n}\n","// Import types and enums\nimport { AdapterConfig, AdapterEvent, AdapterEventListener, AdapterEventType, AdapterFactory, AdapterOptions, AdapterType } from '../types.js';\nimport { AdapterCategory } from './adapter-category.js';\n\n/**\n * Type guard to check if an object has event emitter methods\n */\nfunction hasEventEmitterMethods(obj: any): obj is { on: Function, off: Function, emit: Function } {\n  return obj && \n         typeof obj.on === 'function' && \n         typeof obj.off === 'function' &&\n         typeof obj.emit === 'function';\n}\n\n// AdapterOptions is now imported from types.js\n\n/**\n * Registry-specific event types\n */\nexport const RegistryEventTypes = {\n  // Adapter registration events\n  REGISTERED: 'registered',\n  UNREGISTERED: 'unregistered',\n  CLEARED: 'cleared',\n  \n  // Adapter instance events\n  CREATED: 'created',\n  INITIALIZING: 'initializing',\n  \n  // Error event (redefined here to avoid circular dependency)\n  ERROR: 'error'\n} as const;\n\nexport type RegistryEventType = typeof RegistryEventTypes[keyof typeof RegistryEventTypes];\n\n/**\n * Base event interface for registry events\n */\nexport interface BaseRegistryEvent<T = unknown> {\n  /** Event type */\n  type: RegistryEventType;\n  \n  /** Timestamp when the event occurred */\n  timestamp: number;\n  \n  /** Event data */\n  data?: T;\n  \n  /** Error object if this is an error event */\n  error?: Error;\n  \n  /** Related adapter if applicable */\n  adapter?: AdapterCategory;\n}\n\n/**\n * Union of all possible event types in the registry\n */\nexport type RegistryEvent<T = unknown> = \n  | BaseRegistryEvent<T>\n  | AdapterEvent<T>;\n\n/**\n * Type for adapter events that come through the registry\n */\nexport type RegistryAdapterEvent = AdapterEvent;\n\n/**\n * Union of all possible event types (registry + adapter events)\n */\nexport type AllEventTypes = RegistryEventType | AdapterEventType;\n\n/**\n * Event listener type for registry events\n */\nexport type RegistryEventListener<T = unknown> = (event: RegistryEvent<T>) => void;\n\n// Simple singleton implementation\nfunction singleton<T extends { new(...args: any[]): any }>(\n  target: T,\n  _context: ClassDecoratorContext<T>\n) {\n  let instance: InstanceType<T> | null = null;\n  \n  return class extends target {\n    constructor(...args: any[]) {\n      if (!instance) {\n        super(...args);\n        instance = this as InstanceType<T>;\n      }\n      return instance as InstanceType<T>;\n    }\n  } as unknown as T;\n}\n\n/**\n * Represents an adapter registration in the registry\n */\n/**\n * Represents an adapter registration in the registry\n */\nexport interface AdapterRegistration<T extends AdapterCategory = AdapterCategory> {\n  /** Unique identifier for the adapter */\n  id: string;\n  \n  /** Type of adapter (auth, database, etc.) */\n  type: AdapterType;\n  \n  /** Factory function to create the adapter */\n  factory: AdapterFactory<T>;\n  \n  /** Default configuration for the adapter */\n  defaultConfig?: Partial<AdapterConfig>;\n  \n  /** Whether the adapter is a singleton (single instance) */\n  singleton?: boolean;\n}\n\n/**\n * Manages the registration and instantiation of adapters\n */\n@singleton\nexport class AdapterRegistry {\n  private readonly registry = new Map<string, AdapterRegistration>();\n  private instances = new Map<string, AdapterCategory>();\n  private options: Required<AdapterOptions>;\n  private eventListeners = new Map<RegistryEventType | AdapterEventType, Set<RegistryEventListener | AdapterEventListener>>();\n\n  /**\n   * Generate a unique key for an adapter registration or instance\n   */\n  private getRegistrationKey(id: string, type: AdapterType): string {\n    return `${type}:${id}`;\n  }\n\n  /**\n   * Remove an event listener\n   */\n  off<T = unknown>(event: RegistryEventType | AdapterEventType, listener: RegistryEventListener<T> | AdapterEventListener<T>): void {\n    this.eventListeners.get(event)?.delete(listener as any);\n  }\n\n  /**\n   * Emit an event to all listeners\n   */\n  private emit<T = unknown>(event: RegistryEvent<T>): void {\n    const listeners = this.eventListeners.get(event.type as RegistryEventType | AdapterEventType);\n    if (listeners) {\n      for (const listener of listeners) {\n        try {\n          listener(event as any);\n        } catch (error) {\n          this.options.logger.error(`Error in ${event.type} event listener:`, error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Emit an error event\n   */\n  private emitError(\n    type: RegistryEventType | AdapterEventType,\n    error: Error,\n    data: Record<string, unknown> = {}\n  ): void {\n    const event: BaseRegistryEvent<unknown> = {\n      type: RegistryEventTypes.ERROR,\n      timestamp: Date.now(),\n      error,\n      data: { ...data, originalEventType: type },\n      adapter: null as unknown as AdapterCategory\n    };\n    \n    this.emit(event);\n\n    if (this.options.throwOnError) {\n      throw error;\n    }\n  }\n\n  constructor(options: Partial<AdapterOptions> = {}) {\n    this.options = {\n      autoInit: true,\n      throwOnError: true,\n      logger: console,\n      ...options\n    } as Required<AdapterOptions>;\n  }\n\n  /**\n   * Register a new adapter factory\n   */\n  register<T extends AdapterCategory>(registration: AdapterRegistration<T>): void {\n    const key = this.getRegistrationKey(registration.id, registration.type);\n    \n    if (this.registry.has(key)) {\n      const error = new Error(`Adapter with id '${registration.id}' and type '${registration.type}' is already registered`);\n      this.emitError(RegistryEventTypes.REGISTERED, error, { id: registration.id, type: registration.type });\n      throw error;\n    }\n    \n    this.registry.set(key, registration);\n    const event: BaseRegistryEvent = {\n      type: RegistryEventTypes.REGISTERED,\n      timestamp: Date.now(),\n      data: { id: registration.id, type: registration.type }\n    };\n    this.emit(event);\n  }\n\n  /**\n   * Create and initialize an adapter instance\n   */\n  async createAdapter<T extends AdapterCategory>(\n    id: string, \n    type: AdapterType, \n    config: unknown = {},\n    options?: Partial<AdapterOptions>\n  ): Promise<T> {\n    const key = this.getRegistrationKey(id, type);\n    const registration = this.registry.get(key);\n    if (!registration) {\n      const error = new Error(`No adapter registered for type: ${type} and id: ${id}`);\n      this.emitError(RegistryEventTypes.ERROR, error, { id, type });\n      throw error;\n    }\n    \n    try {\n      // Create the adapter instance with merged options\n      const adapterOptions = {\n        ...this.options,\n        ...(options || {})\n      };\n      \n      const adapter = await registration.factory.create({\n        id,\n        type,\n        config,\n        options: adapterOptions\n      });\n      \n      // Store the instance if it's a singleton\n      if (registration.singleton !== false) {\n        this.instances.set(`${type}:${id}`, adapter);\n      }\n      \n      // Set up the adapter's event forwarding if it has event emitter methods\n      const eventEmitter = adapter as unknown as { on: (type: string, listener: (event: any) => void) => void };\n      if (hasEventEmitterMethods(eventEmitter)) {\n        // Listen for all adapter events and forward them\n        Object.values(AdapterEventType).forEach((eventType) => {\n          eventEmitter.on(eventType, (event: any) => {\n            this.emit({\n              ...event,\n              timestamp: Date.now(),\n              type: eventType,\n              adapter: adapter as AdapterCategory\n            } as RegistryEvent);\n          });\n        });\n      }\n      \n      const event: BaseRegistryEvent = {\n        type: RegistryEventTypes.CREATED,\n        timestamp: Date.now(),\n        data: { id, type },\n        adapter\n      };\n      this.emit(event);\n      \n      return adapter as T;\n    } catch (error) {\n      this.emitError(RegistryEventTypes.ERROR, error as Error, { id, type });\n      throw error;\n    }\n  }\n\n  /**\n   * Get or create an adapter instance\n   */\n  async getAdapter<T extends AdapterCategory>(\n    id: string,\n    type: AdapterType,\n    config?: AdapterConfig,\n    options?: Partial<AdapterOptions>\n  ): Promise<T> {\n    const key = this.getRegistrationKey(id, type);\n    \n    // Return existing instance if available and it's a singleton\n    if (this.instances.has(key)) {\n      return this.instances.get(key) as T;\n    }\n    \n    // Otherwise create a new instance\n    return this.createAdapter<T>(id, type, config, options);\n  }\n\n  /**\n   * Get all registered adapters of a specific type\n   */\n  getRegisteredAdapters(type?: AdapterType): AdapterRegistration[] {\n    const registrations = Array.from(this.registry.values());\n    return type ? registrations.filter(reg => reg.type === type) : registrations;\n  }\n\n  /**\n   * Initialize an adapter with the given config\n   */\n  async initializeAdapter(adapter: AdapterCategory, config: AdapterConfig): Promise<void> {\n    try {\n      const initializingEvent: BaseRegistryEvent = {\n        type: RegistryEventTypes.INITIALIZING,\n        timestamp: Date.now(),\n        data: { id: adapter.id, type: adapter.type },\n        adapter\n      };\n      this.emit(initializingEvent);\n      \n      await adapter.init(config);\n      \n      // The INITIALIZED event will be emitted by the adapter itself\n      // through the event forwarding we set up in createAdapter\n    } catch (error) {\n      this.emitError(RegistryEventTypes.ERROR, error as Error, { \n        id: adapter.id, \n        type: adapter.type, \n        phase: 'initialization' \n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Remove an adapter registration and clean up its instance\n   */\n  async unregister(id: string, type: AdapterType): Promise<boolean> {\n    const key = this.getRegistrationKey(id, type);\n    const registration = this.registry.get(key);\n    \n    if (!registration) {\n      return false;\n    }\n    \n    // Clean up instance if it exists\n    if (this.instances.has(key)) {\n      const instance = this.instances.get(key)!;\n      try {\n        await instance.destroy();\n      } catch (error) {\n        this.emitError(RegistryEventTypes.ERROR, error as Error, { id, type, phase: 'destruction' });\n      }\n      this.instances.delete(key);\n    }\n    \n    this.registry.delete(key);\n    \n    const event: BaseRegistryEvent = {\n      type: RegistryEventTypes.UNREGISTERED,\n      timestamp: Date.now(),\n      data: { id, type }\n    };\n    this.emit(event);\n    \n    return true;\n  }\n\n  /**\n   * Clear all adapter registrations and instances\n   */\n  async clear(): Promise<void> {\n    // Clear all instances\n    await Promise.all(\n      Array.from(this.instances.keys()).map(async (key) => {\n        const [id, type] = key.split('::');\n        await this.unregister(id, type as AdapterType);\n      })\n    );\n    \n    // Clear the registry\n    this.registry.clear();\n    \n    const event: BaseRegistryEvent = {\n      type: RegistryEventTypes.CLEARED,\n      timestamp: Date.now(),\n      data: {}\n    };\n    this.emit(event);\n  }\n\n  /**\n   * Event handling\n   */\n  on<T = unknown>(\n    event: RegistryEventType | AdapterEventType, \n    listener: RegistryEventListener<T> | AdapterEventListener<T>\n  ): void {\n    if (!this.eventListeners.has(event)) {\n      this.eventListeners.set(event, new Set());\n    }\n    this.eventListeners.get(event)!.add(listener as any);\n  }\n\n  // Removed duplicate implementations of emitError and getRegistrationKey\n}\n\n/**\n * Global adapter registry instance\n */\nconst adapterRegistry = new AdapterRegistry();\n\n// Export the instance as both named and default export\nexport { adapterRegistry };\nexport default adapterRegistry;\n","import { z } from 'zod';\nimport { AdapterType } from './adapters/types.js';\n\n// Base schema for common adapter properties\nexport const baseAdapterConfigSchema = z.object({\n  id: z.string().min(1, 'Adapter ID is required'),\n  type: z.nativeEnum(AdapterType, {\n    required_error: 'Adapter type is required',\n    invalid_type_error: 'Invalid adapter type',\n  }),\n  enabled: z.boolean().default(true),\n  debug: z.boolean().default(false),\n});\n\n// Auth adapter specific config\nexport const authConfigSchema = baseAdapterConfigSchema.extend({\n  type: z.literal(AdapterType.AUTH),\n  secret: z.string().min(32, 'Secret must be at least 32 characters'),\n  session: z.object({\n    maxAge: z.number().int().positive().default(30 * 24 * 60 * 60), // 30 days\n    updateAge: z.number().int().positive().default(24 * 60 * 60), // 24 hours\n  }).optional(),\n});\n\n// Database adapter specific config\nexport const databaseConfigSchema = baseAdapterConfigSchema.extend({\n  type: z.literal(AdapterType.DATABASE),\n  url: z.string().url('Invalid database URL'),\n  ssl: z.boolean().default(false),\n  pool: z.object({\n    min: z.number().int().nonnegative().default(2),\n    max: z.number().int().positive().default(10),\n  }).optional(),\n});\n\n// Storage adapter specific config\nexport const storageConfigSchema = baseAdapterConfigSchema.extend({\n  type: z.literal(AdapterType.STORAGE),\n  bucket: z.string().min(1, 'Bucket name is required'),\n  region: z.string().optional(),\n  endpoint: z.string().url().optional(),\n});\n\n// Union of all possible config schemas\nexport const adapterConfigSchema = z.discriminatedUnion('type', [\n  authConfigSchema,\n  databaseConfigSchema,\n  storageConfigSchema,\n]);\n\n// Type guards\nexport function isAuthConfig(\n  config: unknown\n): config is z.infer<typeof authConfigSchema> {\n  return authConfigSchema.safeParse(config).success;\n}\n\nexport function isDatabaseConfig(\n  config: unknown\n): config is z.infer<typeof databaseConfigSchema> {\n  return databaseConfigSchema.safeParse(config).success;\n}\n\nexport function isStorageConfig(\n  config: unknown\n): config is z.infer<typeof storageConfigSchema> {\n  return storageConfigSchema.safeParse(config).success;\n}\n\n// Helper function to validate config with proper typing\nexport function validateConfig<T extends z.ZodTypeAny>(\n  schema: T,\n  config: unknown\n): z.infer<T> {\n  return schema.parse(config);\n}\n","import { BaseAdapter } from './adapters/base.js';\nimport { AuthAdapter } from './adapters/auth.js';\nimport { DatabaseAdapter } from './adapters/database.js';\nimport { StorageAdapter } from './adapters/storage.js';\nimport { AdapterType } from './adapters/types.js';\n\n/**\n * Type guard for AuthAdapter\n * @param adapter The adapter to check\n * @returns boolean indicating if the adapter is an AuthAdapter\n */\nexport function isAuthAdapter(adapter: unknown): adapter is AuthAdapter {\n  return (\n    typeof adapter === 'object' &&\n    adapter !== null &&\n    'type' in adapter &&\n    (adapter as BaseAdapter).type === AdapterType.AUTH &&\n    typeof (adapter as AuthAdapter).signIn === 'function' &&\n    typeof (adapter as AuthAdapter).signOut === 'function'\n  );\n}\n\n/**\n * Type guard for DatabaseAdapter\n * @param adapter The adapter to check\n * @returns boolean indicating if the adapter is a DatabaseAdapter\n */\nexport function isDatabaseAdapter(adapter: unknown): adapter is DatabaseAdapter {\n  return (\n    typeof adapter === 'object' &&\n    adapter !== null &&\n    'type' in adapter &&\n    (adapter as BaseAdapter).type === AdapterType.DATABASE &&\n    typeof (adapter as DatabaseAdapter).find === 'function' &&\n    typeof (adapter as DatabaseAdapter).transaction === 'function'\n  );\n}\n\n/**\n * Type guard for StorageAdapter\n * @param adapter The adapter to check\n * @returns boolean indicating if the adapter is a StorageAdapter\n */\nexport function isStorageAdapter(adapter: unknown): adapter is StorageAdapter {\n  return (\n    typeof adapter === 'object' &&\n    adapter !== null &&\n    'type' in adapter &&\n    (adapter as BaseAdapter).type === AdapterType.STORAGE &&\n    typeof (adapter as StorageAdapter).upload === 'function' &&\n    typeof (adapter as StorageAdapter).getDownloadUrl === 'function'\n  );\n}\n\n/**\n * Type guard for BaseAdapter\n * @param adapter The adapter to check\n * @returns boolean indicating if the adapter is a BaseAdapter\n */\nexport function isBaseAdapter(adapter: unknown): adapter is BaseAdapter {\n  return (\n    typeof adapter === 'object' &&\n    adapter !== null &&\n    'id' in adapter &&\n    'type' in adapter &&\n    'init' in adapter &&\n    'destroy' in adapter &&\n    'isInitialized' in adapter\n  );\n}\n","export class BuddyError extends Error {\r\n    constructor(\r\n      message: string,\r\n      public code: string,\r\n      public details?: any\r\n    ) {\r\n      super(message);\r\n      this.name = 'BuddyError';\r\n    }\r\n  }\r\n  \r\n  export class DatabaseError extends BuddyError {\r\n    constructor(message: string, code: string, details?: any) {\r\n      super(message, `database/${code}`, details);\r\n      this.name = 'DatabaseError';\r\n    }\r\n  }\r\n  \r\n // packages/types/src/errors.ts - Enhance existing\r\nexport class APIError extends Error {\r\n  constructor(\r\n    public code: string,\r\n    message: string,\r\n    public status: number = 500,\r\n    public details?: any\r\n  ) {\r\n    super(message);\r\n    this.name = 'APIError';\r\n  }\r\n}\r\n\r\nexport class AuthError extends APIError {\r\n  constructor(message: string, code: string = 'AUTH_ERROR', status: number = 401) {\r\n    super(code, message, status);\r\n    this.name = 'AuthError';\r\n  }\r\n}\r\n\r\nexport class ValidationError extends APIError {\r\n  constructor(message: string, public fields: Record<string, string[]>) {\r\n    super('VALIDATION_ERROR', message, 400);\r\n    this.name = 'ValidationError';\r\n  }\r\n}"]}