{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { type AuthResponse, NetworkError, type SWRLoginPlugin } from '@swr-login/core';\n\n/** Credentials for password-based login */\nexport interface PasswordCredentials {\n  /** Username, email, or phone number */\n  username: string;\n  /** User's password */\n  password: string;\n  /** Optional: remember me flag */\n  rememberMe?: boolean;\n}\n\nexport interface PasswordPluginOptions {\n  /** URL of your login API endpoint */\n  loginUrl: string;\n  /** URL of your logout API endpoint (optional) */\n  logoutUrl?: string;\n  /** Custom fetch options (e.g., headers) */\n  fetchOptions?: RequestInit;\n  /**\n   * Transform server response to AuthResponse.\n   * Override if your API has a different response shape.\n   */\n  transformResponse?: (data: unknown) => AuthResponse;\n}\n\n/**\n * Password login plugin for username/password authentication.\n *\n * @example\n * ```ts\n * import { PasswordPlugin } from '@swr-login/plugin-password';\n *\n * const plugin = PasswordPlugin({\n *   loginUrl: '/api/auth/login',\n *   logoutUrl: '/api/auth/logout',\n * });\n *\n * // Use with SWRLoginProvider\n * <SWRLoginProvider config={{ plugins: [plugin], ... }}>\n * ```\n */\nexport function PasswordPlugin(\n  options: PasswordPluginOptions,\n): SWRLoginPlugin<PasswordCredentials> {\n  const { loginUrl, logoutUrl, fetchOptions = {}, transformResponse } = options;\n\n  return {\n    name: 'password',\n    type: 'password',\n\n    async login(credentials, ctx) {\n      const response = await fetch(loginUrl, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...((fetchOptions.headers as Record<string, string>) ?? {}),\n        },\n        body: JSON.stringify(credentials),\n        credentials: 'include',\n        ...fetchOptions,\n      });\n\n      if (!response.ok) {\n        throw new NetworkError(`Login failed: ${response.statusText}`, response.status);\n      }\n\n      const data = await response.json();\n\n      if (transformResponse) {\n        const authResponse = transformResponse(data);\n        ctx.setTokens({\n          accessToken: authResponse.accessToken,\n          refreshToken: authResponse.refreshToken,\n          expiresAt: authResponse.expiresAt,\n        });\n        return authResponse;\n      }\n\n      // Default: expect standard AuthResponse shape\n      const authResponse: AuthResponse = {\n        user: data.user,\n        accessToken: data.accessToken ?? data.access_token ?? data.token,\n        refreshToken: data.refreshToken ?? data.refresh_token,\n        expiresAt: data.expiresAt ?? data.expires_at ?? Date.now() + 3600 * 1000,\n      };\n\n      ctx.setTokens({\n        accessToken: authResponse.accessToken,\n        refreshToken: authResponse.refreshToken,\n        expiresAt: authResponse.expiresAt,\n      });\n\n      return authResponse;\n    },\n\n    async logout(ctx) {\n      if (logoutUrl) {\n        try {\n          await fetch(logoutUrl, {\n            method: 'POST',\n            credentials: 'include',\n            headers: {\n              'Content-Type': 'application/json',\n              ...((fetchOptions.headers as Record<string, string>) ?? {}),\n            },\n          });\n        } catch {\n          // Swallow logout API errors - local cleanup is more important\n        }\n      }\n      ctx.clearTokens();\n    },\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAqE;AA0C9D,SAAS,eACd,SACqC;AACrC,QAAM,EAAE,UAAU,WAAW,eAAe,CAAC,GAAG,kBAAkB,IAAI;AAEtE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IAEN,MAAM,MAAM,aAAa,KAAK;AAC5B,YAAM,WAAW,MAAM,MAAM,UAAU;AAAA,QACrC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,GAAK,aAAa,WAAsC,CAAC;AAAA,QAC3D;AAAA,QACA,MAAM,KAAK,UAAU,WAAW;AAAA,QAChC,aAAa;AAAA,QACb,GAAG;AAAA,MACL,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,yBAAa,iBAAiB,SAAS,UAAU,IAAI,SAAS,MAAM;AAAA,MAChF;AAEA,YAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAI,mBAAmB;AACrB,cAAMA,gBAAe,kBAAkB,IAAI;AAC3C,YAAI,UAAU;AAAA,UACZ,aAAaA,cAAa;AAAA,UAC1B,cAAcA,cAAa;AAAA,UAC3B,WAAWA,cAAa;AAAA,QAC1B,CAAC;AACD,eAAOA;AAAA,MACT;AAGA,YAAM,eAA6B;AAAA,QACjC,MAAM,KAAK;AAAA,QACX,aAAa,KAAK,eAAe,KAAK,gBAAgB,KAAK;AAAA,QAC3D,cAAc,KAAK,gBAAgB,KAAK;AAAA,QACxC,WAAW,KAAK,aAAa,KAAK,cAAc,KAAK,IAAI,IAAI,OAAO;AAAA,MACtE;AAEA,UAAI,UAAU;AAAA,QACZ,aAAa,aAAa;AAAA,QAC1B,cAAc,aAAa;AAAA,QAC3B,WAAW,aAAa;AAAA,MAC1B,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,OAAO,KAAK;AAChB,UAAI,WAAW;AACb,YAAI;AACF,gBAAM,MAAM,WAAW;AAAA,YACrB,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,GAAK,aAAa,WAAsC,CAAC;AAAA,YAC3D;AAAA,UACF,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AACA,UAAI,YAAY;AAAA,IAClB;AAAA,EACF;AACF;","names":["authResponse"]}