@atproto/oauth-provider-ui 0.7.2 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account-page-BWtTrJit.js +24 -0
- package/dist/account-page-BWtTrJit.js.map +1 -0
- package/dist/admonition-PcOMNxHc.js +59 -0
- package/dist/admonition-PcOMNxHc.js.map +1 -0
- package/dist/authorization-page-BrCP1UEq.js +2 -0
- package/dist/authorization-page-BrCP1UEq.js.map +1 -0
- package/dist/bundle-manifest.json +39 -39
- package/dist/button-cooldown-Cek48u1l.js +64 -0
- package/dist/button-cooldown-Cek48u1l.js.map +1 -0
- package/dist/{cookie-error-page-DNM0z2Cb.js → cookie-error-page-QWOGgXmH.js} +2 -2
- package/dist/{cookie-error-page-DNM0z2Cb.js.map → cookie-error-page-QWOGgXmH.js.map} +1 -1
- package/dist/error-page-BEjdpIQ7.js +2 -0
- package/dist/error-page-BEjdpIQ7.js.map +1 -0
- package/dist/error-view-BzJJuW_V.js +2 -0
- package/dist/error-view-BzJJuW_V.js.map +1 -0
- package/dist/messages--aCokQ6a.js +2 -0
- package/dist/messages--aCokQ6a.js.map +1 -0
- package/dist/messages-BaWkJYfB.js +2 -0
- package/dist/messages-BaWkJYfB.js.map +1 -0
- package/package.json +7 -8
- package/dist/account-page-DEDJt1AQ.js +0 -24
- package/dist/account-page-DEDJt1AQ.js.map +0 -1
- package/dist/admonition-D93KEqWM.js +0 -59
- package/dist/admonition-D93KEqWM.js.map +0 -1
- package/dist/authorization-page-BCJINyL_.js +0 -2
- package/dist/authorization-page-BCJINyL_.js.map +0 -1
- package/dist/error-page-Wul5BkHY.js +0 -2
- package/dist/error-page-Wul5BkHY.js.map +0 -1
- package/dist/error-view-DTevFrK5.js +0 -2
- package/dist/error-view-DTevFrK5.js.map +0 -1
- package/dist/index-DrKxiTaW.js +0 -64
- package/dist/index-DrKxiTaW.js.map +0 -1
- package/dist/messages-B-lnG-tF.js +0 -2
- package/dist/messages-B-lnG-tF.js.map +0 -1
- package/dist/messages-DwlQkdxq.js +0 -2
- package/dist/messages-DwlQkdxq.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as i,c as q,T as f,u as I,r as S,A as N,e as U,L as F}from"./admonition-D93KEqWM.js";const D=Object.freeze(["syntax","domain","slur","taken","reserved","resolution","unsupported"]),J=r=>D.includes(r),V=(r=document.cookie)=>Object.fromEntries(r.split(";").filter(Boolean).map(e=>e.split("=",2).map(s=>decodeURIComponent(s.trim()))));function M(r,e=document.cookie){return V(e)[r]}class K{constructor(e,s){this.baseUrl=e,this.options=s}async fetch(e,s,t,n){var c,o,l,p,E,a,y,j,A;try{const h=new URL(`${this.baseUrl}${s}`);if(e==="GET"&&t)for(const[k,C]of Object.entries(t))h.searchParams.set(k,C);const m=e==="POST"?JSON.stringify(t):void 0,O=new Headers(await((o=(c=this.options)==null?void 0:c.headers)==null?void 0:o.call(c)));m&&!O.has("content-type")&&O.set("content-type","application/json");const d=await fetch(h,{method:e,headers:O,mode:"same-origin",body:m,signal:n==null?void 0:n.signal});if(d.status===204)return;const T=d.headers.get("content-type");if(T!=="application/json")throw await((l=d.body)==null?void 0:l.cancel()),new Error(`Invalid content type "${T}"`,{cause:d});const w=await d.json();if(!d.ok)throw((p=n==null?void 0:n.parseError)==null?void 0:p.call(n,d,w))||this.parseError(d,w);return(y=(a=(E=this.options)==null?void 0:E.onFetchSuccess)==null?void 0:a[s])==null||y.call(null,{payload:w,method:e,input:t,options:n}),w}catch(h){const m={method:e,path:s,input:t,options:n};throw console.warn("API request failed",h,m),(A=(j=this.options)==null?void 0:j.onFetchError)==null||A.call(null,h,m),h}}parseError(e,s){return new v(s)}}class v extends Error{constructor(e,s="Unknown JSON error response",t){super(s,t),this.name="JsonErrorResponse",this.msg={id:"Jja+Vn"},this.payload=e}}const L="csrf-token",z="x-csrf-token",$="/@atproto/oauth-provider/~api";class ue extends K{constructor(e){const s=new URL($,window.origin).toString();super(s,{...e,headers:async function(){var c;const t=new Headers(await((c=e==null?void 0:e.headers)==null?void 0:c.call(this))),n=M(L);return n&&t.set(z,n),t}}),this.locale=e.locale}async signIn({username:e,password:s,emailOtp:t,remember:n,locale:c=this.locale},o){return this.fetch("POST","/sign-in",{username:e,password:s,emailOtp:t,remember:n,locale:c},o)}async initiatePasswordReset({email:e,locale:s=this.locale},t){await this.fetch("POST","/reset-password-request",{email:e,locale:s},t)}async accountSessions({sub:e},s){return this.fetch("GET","/account-sessions",{sub:e},s)}async revokeAccountSession({sub:e,deviceId:s},t){return this.fetch("POST","/revoke-account-session",{sub:e,deviceId:s},t)}async oauthSessions({sub:e},s){return this.fetch("GET","/oauth-sessions",{sub:e},s)}async revokeOAuthSession({sub:e,tokenId:s},t){return this.fetch("POST","/revoke-oauth-session",{sub:e,tokenId:s},t)}async confirmResetPassword({token:e,password:s},t){await this.fetch("POST","/reset-password-confirm",{token:e,password:s},t)}async validateHandleAvailability({handle:e},s){await this.fetch("POST","/verify-handle-availability",{handle:e},s)}async updateEmailRequest({sub:e,locale:s=this.locale},t){return this.fetch("POST","/update-email-request",{sub:e,locale:s},t)}async updateEmailConfirm({sub:e,token:s,email:t,locale:n=this.locale},c){await this.fetch("POST","/update-email-confirm",{sub:e,token:s,email:t,locale:n},c)}async verifyEmailRequest({sub:e,locale:s=this.locale},t){await this.fetch("POST","/verify-email-request",{sub:e,locale:s},t)}async verifyEmailConfirm({sub:e,token:s,email:t},n){await this.fetch("POST","/verify-email-confirm",{sub:e,token:s,email:t},n)}async updateHandle({sub:e,handle:s},t){return this.fetch("POST","/update-handle",{sub:e,handle:s},t)}async signUp({locale:e=this.locale,handle:s,email:t,password:n,inviteCode:c,hcaptchaToken:o},l){return this.fetch("POST","/sign-up",{locale:e,handle:s,email:t,password:n,inviteCode:c,hcaptchaToken:o},l)}async signOut({sub:e},s){return this.fetch("POST","/sign-out",{sub:e},s)}async consent(e,s,t){return this.fetch("POST","/consent",{sub:e,scope:s},t)}async reject(e){return this.fetch("POST","/reject",{},e)}parseError(e,s){if(H(s)){for(const t of[Q,Y,W,_,se,ee,X,B,g,P])if(t.is(s))return new t(s);return new u(s)}return super.parseError(e,s)}}function H(r,e){return r!=null&&typeof r=="object"&&typeof r.error=="string"&&e===void 0&&(r.error_description===void 0||typeof r.error_description=="string")}class u extends v{constructor(e,s=e.error_description,t){super(e,s||`OAuth Error "${e.error}"`,t),this.name="OAuthErrorResponse",this.msg=u.getMessageForError(e.error)}static getMessageForError(e){switch(e){case"server_error":return{id:"BJ8t7d"};default:return{id:"byKna+"}}}}class B extends u{constructor(e){super(e,e.error_description||"Unauthorized"),this.msg={id:"5OVfoe"}}static is(e){return e.error==="unauthorized"}}class P extends u{constructor(e,s=e.error_description){super(e,s||"Access denied"),this.msg={id:"oYKcFO"}}static is(e){return e.error==="access_denied"}}class g extends u{constructor(e,s=e.error_description){super(e,s||"Invalid request"),this.msg={id:"qrCiCk"}}static is(e){return e.error==="invalid_request"}}class _ extends u{constructor(e,s=e.error_description){super(e,s||"Handle unavailable"),this.msg=_.getMessageForReason(e.reason)}static getMessageForReason(e){switch(e){case"syntax":return{id:"C24/JK"};case"domain":return{id:"qDdKKD"};case"slur":return{id:"AQ3Zbm"};case"reserved":return{id:"3j7n8v"};case"taken":return{id:"AXlE0K"};case"resolution":return{id:"E/Pt37"};case"unsupported":return{id:"qfnQHD"}}}static is(e){return e.error==="handle_unavailable"&&J(e.reason)}}const G=Object.freeze(["emailOtp"]),Z=r=>G.includes(r);class Q extends u{constructor(e,s=e.error_description){const{type:t,hint:n}=e;super(e,s||`${t} auth factor required (hint: ${n})`),this.msg={id:"HJQIko",values:{hint:n}}}get type(){return this.payload.type}get hint(){return this.payload.hint}static is(e){return e.error==="second_authentication_factor_required"&&Z(e.type)&&typeof e.hint=="string"}}class W extends g{constructor(e){super(e),this.msg={id:"+lWheC"}}static is(e){return super.is(e)&&e.error_description!=null&&e.error_description.startsWith("This invite code is invalid.")}}class X extends P{constructor(){super(...arguments),this.msg={id:"5OVfoe"}}static is(e){return super.is(e)&&e.error_description==="This request has expired"}}class Y extends g{constructor(){super(...arguments),this.msg={id:"jSVjfa"}}static is(e){return super.is(e)&&e.error_description==="Invalid identifier or password"}}class ee extends g{constructor(){super(...arguments),this.msg={id:"5OVfoe"}}static is(e){return super.is(e)&&e.error_description==="Unknown request_uri"}}class se extends g{constructor(){super(...arguments),this.msg={id:"SZKM0t"}}static is(e){return super.is(e)&&e.error_description==="Email already taken"}}function de(r,e,s){if(!r)return[e];const t=r.findIndex(s);return t===-1?[...r,e]:[...r.slice(0,t),e,...r.slice(t+1)]}function R(r){try{return JSON.stringify(r,null,2)}catch{return}}function re(r){if(r instanceof u)return{name:r.name,code:r.payload.error,message:r.payload.error_description,payload:R(r.payload),description:te(r)}}function te(r){if(r instanceof v)return r.msg}function ne(r,e,{checkForDefaultPrevented:s=!0}={}){return function(n){if(r==null||r(n),s===!1||!n.defaultPrevented)return e==null?void 0:e(n)}}function ie(r){return r instanceof Error?{name:r.name,message:r.message,stack:r.stack}:typeof r=="string"?{message:r}:{payload:R(r)}}function ce({name:r,code:e,message:s,payload:t,stack:n,className:c,...o}){return i.jsxs("dl",{className:q("mt-2 grid max-w-full grid-cols-[auto_1fr] gap-x-2 text-sm",c),...o,children:[r&&i.jsx(x,{label:i.jsx(f,{id:"Aw7BNz"}),children:i.jsx("code",{children:r})}),e&&i.jsx(x,{label:i.jsx(f,{id:"Gt+Z/D"}),children:i.jsx("code",{children:e})}),s&&i.jsx(x,{label:i.jsx(f,{id:"FTdsAu"}),children:s}),t&&i.jsx(x,{label:i.jsx(f,{id:"IHV30b"}),children:i.jsx("code",{className:"max-h-[200px] overflow-auto",children:i.jsx("pre",{children:t})})}),n&&i.jsx(x,{label:i.jsx(f,{id:"ZJUDum"}),children:i.jsx("code",{className:"max-h-[200px] overflow-auto",children:i.jsx("pre",{children:n})})})]})}function x({children:r,label:e}){return i.jsxs(i.Fragment,{children:[i.jsx("dt",{className:"font-semibold",children:e}),i.jsx("dd",{children:r})]})}function b({error:r,reset:e,parser:s,children:t,onClick:n,...c}){const{_:o}=I(),[l,p]=S.useState(0),E=(l/5|0)%2===1,a=S.useMemo(()=>(s==null?void 0:s(r))??ie(r),[s,r]);return S.useEffect(()=>{console.warn("Displayed error:",a),p(0)},[a]),i.jsx(N,{...c,role:"alert",onClick:ne(n,()=>{p(y=>y+1)}),append:i.jsxs(i.Fragment,{children:[t,E&&i.jsx(ce,{name:a.name,code:a.code,message:a.message,payload:a.payload,stack:a.stack})]}),action:e!=null&&i.jsx(U,{onClick:()=>e(),children:i.jsx(f,{id:"6gRgw8"})}),children:o(a.description??{id:"vW+T+d"})})}const le=r=>i.jsx(b,{...r});function ae({error:r,reset:e,title:s={id:"Vw8l6h"},...t}){return i.jsx(F,{title:s,...t,children:i.jsx("div",{className:"w-[500px] max-w-full",children:i.jsx(b,{className:"mx-5",error:r,reset:e,parser:re})})})}const he=r=>i.jsx(ae,{...r});export{ue as A,ae as E,Y as I,Q as S,ee as U,te as a,B as b,ne as c,le as d,he as e,re as f,de as u};
|
|
2
|
-
//# sourceMappingURL=error-view-DTevFrK5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-view-DTevFrK5.js","sources":["../../oauth-provider-api/dist/errors.js","../src/lib/cookies.ts","../src/lib/json-client.ts","../src/lib/api.ts","../src/lib/util.ts","../src/lib/api-error-parser.ts","../../../../node_modules/.pnpm/@radix-ui+primitive@1.1.3/node_modules/@radix-ui/primitive/dist/index.mjs","../src/lib/error-parser.ts","../src/components/utils/error-details.tsx","../src/components/utils/error-card.tsx","../src/components/error-view.tsx"],"sourcesContent":["export const HANDLE_UNAVAILABLE_REASON = Object.freeze([\n 'syntax',\n 'domain',\n 'slur',\n 'taken',\n 'reserved',\n 'resolution',\n 'unsupported',\n]);\nexport const isHandleUnavailableReason = (value) => {\n return HANDLE_UNAVAILABLE_REASON.includes(value);\n};\n// @TODO consider moving JsonErrorResponse & sub-classes here (or only the\n// schemas?), allowing the same code to be used on both the server and client\n// for error handling/parsing/formatting.\n//# sourceMappingURL=errors.js.map","export const parseCookieString = (\n cookie: string = document.cookie,\n): Record<string, string | undefined> =>\n Object.fromEntries(\n cookie\n .split(';')\n .filter(Boolean)\n .map((str) => str.split('=', 2).map((s) => decodeURIComponent(s.trim()))),\n )\n\nexport function readCookie(\n name: string,\n cookie: string = document.cookie,\n): string | undefined {\n const cookies = parseCookieString(cookie)\n return cookies[name]\n}\n","import { MessageDescriptor } from '@lingui/core'\nimport { msg } from '@lingui/core/macro'\n\nexport type JsonScalar = string | number | boolean | null\nexport type Json = JsonScalar | Json[] | { [key: string]: undefined | Json }\n\ntype Awaitable<T> = T | PromiseLike<T>\n\nexport type Options = {\n signal?: AbortSignal\n parseError?: (response: Response, payload: Json) => undefined | Error\n}\n\nexport type EndpointPath = `/${string}`\nexport type EndpointDefinition =\n | {\n method: 'POST'\n input: Json\n output: Json | void\n }\n | {\n method: 'GET'\n params?: Record<string, string | undefined>\n output: Json | void\n }\nexport type EndpointDefinitions = { [path: EndpointPath]: EndpointDefinition }\n\nexport type JsonClientOptions<Endpoints extends EndpointDefinitions> = {\n onFetchError?: (\n err: unknown,\n context: {\n method: string\n path: string\n input: unknown\n options?: Options\n },\n ) => void\n onFetchSuccess?: {\n [Path in keyof Endpoints & string]?: (data: {\n payload: Endpoints[Path] extends { output: infer Output } ? Output : never\n method: string\n input: Endpoints[Path] extends { method: 'GET'; params: infer Params }\n ? Params\n : Endpoints[Path] extends { method: 'POST'; input: infer Input }\n ? Input\n : undefined\n options?: Options\n }) => void\n }\n headers?: () => Awaitable<HeadersInit>\n}\n\nexport class JsonClient<Endpoints extends EndpointDefinitions> {\n constructor(\n protected readonly baseUrl: string,\n protected readonly options?: JsonClientOptions<Endpoints>,\n ) {}\n\n protected async fetch<Path extends EndpointPath & keyof Endpoints>(\n method: Endpoints[Path]['method'],\n path: Path,\n input: Endpoints[Path] extends { method: 'GET' }\n ? Endpoints[Path]['params']\n : Endpoints[Path] extends { method: 'POST' }\n ? Endpoints[Path]['input']\n : undefined,\n options?: Options,\n ): Promise<Endpoints[Path]['output']> {\n try {\n const url = new URL(`${this.baseUrl}${path}`)\n if (method === 'GET') {\n if (input) {\n for (const [key, value] of Object.entries(input)) {\n url.searchParams.set(key, value)\n }\n }\n }\n\n const body = method === 'POST' ? JSON.stringify(input) : undefined\n\n const headers = new Headers(await this.options?.headers?.())\n\n if (body && !headers.has('content-type')) {\n headers.set('content-type', 'application/json')\n }\n\n const response = await fetch(url, {\n method,\n headers,\n mode: 'same-origin',\n body,\n signal: options?.signal,\n })\n\n if (response.status === 204) {\n return undefined\n }\n\n const responseType = response.headers.get('content-type')\n if (responseType !== 'application/json') {\n await response.body?.cancel()\n throw new Error(`Invalid content type \"${responseType}\"`, {\n cause: response,\n })\n }\n\n const payload = await response.json()\n\n if (!response.ok) {\n const error =\n options?.parseError?.(response, payload) ||\n this.parseError(response, payload)\n throw error\n }\n\n this.options?.onFetchSuccess?.[path]?.call(null, {\n payload,\n method,\n input,\n options,\n } as any)\n\n return payload as Endpoints[Path]['output']\n } catch (err) {\n const context = { method, path, input, options }\n console.warn('API request failed', err, context)\n this.options?.onFetchError?.call(null, err, context)\n throw err\n }\n }\n\n protected parseError(response: Response, payload: Json): Error {\n return new JsonErrorResponse(payload)\n }\n}\n\nexport class JsonErrorResponse<P = unknown> extends Error {\n name = 'JsonErrorResponse'\n\n msg: MessageDescriptor = msg`Unexpected server response`\n\n constructor(\n public readonly payload: P,\n message: string = 'Unknown JSON error response',\n options?: ErrorOptions,\n ) {\n super(message, options)\n }\n}\n","import { MessageDescriptor } from '@lingui/core'\nimport { msg } from '@lingui/core/macro'\nimport {\n AccountSessionsInput,\n type ApiEndpoints,\n ConfirmEmailUpdateInput,\n ConfirmEmailVerificationInput,\n type ConfirmResetPasswordInput,\n type HandleUnavailableReason,\n InitiateEmailUpdateInput,\n InitiateEmailVerificationInput,\n type InitiatePasswordResetInput,\n OAuthSessionsInput,\n RevokeAccountSessionInput,\n RevokeOAuthSessionInput,\n type SignInInput,\n SignOutInput,\n type SignUpInput,\n type UpdateHandleInput,\n type VerifyHandleAvailabilityInput,\n isHandleUnavailableReason,\n} from '@atproto/oauth-provider-api'\nimport { readCookie } from './cookies.ts'\nimport {\n Json,\n JsonClient,\n JsonClientOptions,\n JsonErrorResponse,\n Options,\n} from './json-client.ts'\n\nexport type { Options } from './json-client.ts'\nconst CSRF_COOKIE_NAME = 'csrf-token'\nconst CSRF_HEADER_NAME = 'x-csrf-token'\n\nconst API_ENDPOINT_PREFIX = '/@atproto/oauth-provider/~api'\n\nexport type ApiOptions = JsonClientOptions<ApiEndpoints> & {\n locale: string\n}\n\nexport type WithOptionalLocale<T extends { locale?: unknown }> = Omit<\n T,\n 'locale'\n> & { locale?: T['locale'] }\n\nexport class Api extends JsonClient<ApiEndpoints> {\n locale: string\n\n constructor(options: ApiOptions) {\n const baseUrl = new URL(API_ENDPOINT_PREFIX, window.origin).toString()\n super(baseUrl, {\n ...options,\n headers: async function () {\n const headers = new Headers(await options?.headers?.call(this))\n const csrfToken = readCookie(CSRF_COOKIE_NAME)\n if (csrfToken) headers.set(CSRF_HEADER_NAME, csrfToken)\n return headers\n },\n })\n this.locale = options.locale\n }\n\n async signIn(\n {\n username,\n password,\n emailOtp,\n remember,\n locale = this.locale,\n }: WithOptionalLocale<SignInInput>,\n options?: Options,\n ) {\n return this.fetch(\n 'POST',\n '/sign-in',\n { username, password, emailOtp, remember, locale },\n options,\n )\n }\n\n async initiatePasswordReset(\n {\n email,\n locale = this.locale,\n }: WithOptionalLocale<InitiatePasswordResetInput>,\n options?: Options,\n ) {\n await this.fetch(\n 'POST',\n '/reset-password-request',\n { email, locale },\n options,\n )\n }\n\n // Account sessions\n\n async accountSessions({ sub }: AccountSessionsInput, options?: Options) {\n return this.fetch('GET', '/account-sessions', { sub }, options)\n }\n\n async revokeAccountSession(\n { sub, deviceId }: RevokeAccountSessionInput,\n options?: Options,\n ) {\n return this.fetch(\n 'POST',\n '/revoke-account-session',\n { sub, deviceId },\n options,\n )\n }\n\n // OAuth sessions\n\n async oauthSessions({ sub }: OAuthSessionsInput, options?: Options) {\n return this.fetch('GET', '/oauth-sessions', { sub }, options)\n }\n\n async revokeOAuthSession(\n { sub, tokenId }: RevokeOAuthSessionInput,\n options?: Options,\n ) {\n return this.fetch(\n 'POST',\n '/revoke-oauth-session',\n { sub, tokenId },\n options,\n )\n }\n\n //\n\n async confirmResetPassword(\n { token, password }: ConfirmResetPasswordInput,\n options?: Options,\n ) {\n await this.fetch(\n 'POST',\n '/reset-password-confirm',\n { token, password },\n options,\n )\n }\n\n async validateHandleAvailability(\n { handle }: VerifyHandleAvailabilityInput,\n options?: Options,\n ) {\n await this.fetch('POST', '/verify-handle-availability', { handle }, options)\n }\n\n async updateEmailRequest(\n { sub, locale = this.locale }: WithOptionalLocale<InitiateEmailUpdateInput>,\n options?: Options,\n ) {\n return this.fetch('POST', '/update-email-request', { sub, locale }, options)\n }\n\n async updateEmailConfirm(\n {\n sub,\n token,\n email,\n locale = this.locale,\n }: WithOptionalLocale<ConfirmEmailUpdateInput>,\n options?: Options,\n ) {\n await this.fetch(\n 'POST',\n '/update-email-confirm',\n { sub, token, email, locale },\n options,\n )\n }\n\n async verifyEmailRequest(\n {\n sub,\n locale = this.locale,\n }: WithOptionalLocale<InitiateEmailVerificationInput>,\n options?: Options,\n ) {\n await this.fetch('POST', '/verify-email-request', { sub, locale }, options)\n }\n\n async verifyEmailConfirm(\n { sub, token, email }: ConfirmEmailVerificationInput,\n options?: Options,\n ) {\n await this.fetch(\n 'POST',\n '/verify-email-confirm',\n { sub, token, email },\n options,\n )\n }\n\n async updateHandle({ sub, handle }: UpdateHandleInput, options?: Options) {\n return this.fetch('POST', '/update-handle', { sub, handle }, options)\n }\n\n async signUp(\n {\n locale = this.locale,\n handle,\n email,\n password,\n inviteCode,\n hcaptchaToken,\n }: WithOptionalLocale<SignUpInput>,\n options?: Options,\n ) {\n return this.fetch(\n 'POST',\n '/sign-up',\n { locale, handle, email, password, inviteCode, hcaptchaToken },\n options,\n )\n }\n\n async signOut({ sub }: SignOutInput, options?: Options) {\n return this.fetch('POST', '/sign-out', { sub }, options)\n }\n\n async consent(sub: string, scope?: string, options?: Options) {\n return this.fetch('POST', '/consent', { sub, scope }, options)\n }\n\n async reject(options?: Options) {\n return this.fetch('POST', '/reject', {}, options)\n }\n\n // and transform them into instances of the corresponding error classes.\n protected override parseError(response: Response, payload: Json): Error {\n if (isOAuthErrorPayload(payload)) {\n for (const ErrorClass of [\n // @NOTE Most specific errors must come first!\n SecondAuthenticationFactorRequiredError,\n InvalidCredentialsError,\n InvalidInviteCodeError,\n HandleUnavailableError,\n EmailTakenError,\n UnknownRequestUriError,\n RequestExpiredError,\n UnauthorizedError,\n InvalidRequestError,\n AccessDeniedError,\n ] as Array<{\n is(payload: OAuthErrorPayload): boolean\n new (payload: any): Error\n }>) {\n if (ErrorClass.is(payload)) {\n return new ErrorClass(payload)\n }\n }\n\n return new OAuthErrorResponse(payload)\n }\n\n return super.parseError(response, payload)\n }\n}\n\nexport type OAuthErrorPayload<E extends string = string> = {\n error: E\n error_description?: string\n} & Record<string, Json>\n\nexport function isOAuthErrorPayload<E extends string = string>(\n json: unknown,\n error: E,\n): json is OAuthErrorPayload<E>\nexport function isOAuthErrorPayload(json: unknown): json is OAuthErrorPayload\nexport function isOAuthErrorPayload(json: unknown, error?: string): boolean {\n return (\n json != null &&\n typeof json === 'object' &&\n typeof json['error'] === 'string' &&\n (error === undefined || json['error'] === error) &&\n (json['error_description'] === undefined ||\n typeof json['error_description'] === 'string')\n )\n}\n\nexport class OAuthErrorResponse<\n P extends OAuthErrorPayload = OAuthErrorPayload,\n> extends JsonErrorResponse<P> {\n name = 'OAuthErrorResponse'\n\n constructor(\n payload: P,\n message = payload.error_description,\n options?: ErrorOptions,\n ) {\n super(payload, message || `OAuth Error \"${payload.error}\"`, options)\n this.msg = OAuthErrorResponse.getMessageForError(payload.error)\n }\n\n protected static getMessageForError(error: string): MessageDescriptor {\n switch (error) {\n // @NOTE This only needs value that are not already covered by more\n // specific error classes with their own messages (e.g.\n // InvalidCredentialsError). The base OAuthErrorResponse message is a\n // generic fallback for any unrecognized error codes.\n case 'server_error':\n return msg`The server encountered an unexpected error. Please try again.`\n default:\n return msg`An unexpected error occurred. Please try again.`\n }\n }\n}\n\nexport type UnauthorizedPayload = OAuthErrorPayload<'unauthorized'>\nexport class UnauthorizedError<\n P extends UnauthorizedPayload = UnauthorizedPayload,\n> extends OAuthErrorResponse<P> {\n override msg = msg`This sign-in session has expired`\n\n constructor(payload: P) {\n super(payload, payload.error_description || 'Unauthorized')\n }\n\n static is(json: OAuthErrorPayload): json is UnauthorizedPayload {\n return json.error === 'unauthorized'\n }\n}\n\nexport type AccessDeniedPayload = OAuthErrorPayload<'access_denied'>\nexport class AccessDeniedError<\n P extends AccessDeniedPayload = AccessDeniedPayload,\n> extends OAuthErrorResponse<P> {\n override msg = msg`This authorization request has been denied. Please try again.`\n\n constructor(payload: P, message = payload.error_description) {\n super(payload, message || 'Access denied')\n }\n\n static is(json: OAuthErrorPayload): json is AccessDeniedPayload {\n return json.error === 'access_denied'\n }\n}\n\nexport type InvalidRequestPayload = OAuthErrorPayload<'invalid_request'>\nexport class InvalidRequestError<\n P extends InvalidRequestPayload = InvalidRequestPayload,\n> extends OAuthErrorResponse<P> {\n override msg = msg`The data you submitted is invalid. Please check the form and try again.`\n\n constructor(payload: P, message = payload.error_description) {\n super(payload, message || 'Invalid request')\n }\n\n static is(json: OAuthErrorPayload): json is InvalidRequestPayload {\n return json.error === 'invalid_request'\n }\n}\n\nexport type HandleUnavailablePayload =\n OAuthErrorPayload<'handle_unavailable'> & {\n reason: HandleUnavailableReason\n }\nexport class HandleUnavailableError<\n P extends HandleUnavailablePayload = HandleUnavailablePayload,\n> extends OAuthErrorResponse<P> {\n constructor(payload: P, message = payload.error_description) {\n super(payload, message || 'Handle unavailable')\n this.msg = HandleUnavailableError.getMessageForReason(payload.reason)\n }\n\n static getMessageForReason(\n reason: HandleUnavailableReason,\n ): MessageDescriptor {\n switch (reason) {\n case 'syntax':\n return msg`The username is invalid`\n case 'domain':\n return msg`The domain name is not allowed`\n case 'slur':\n return msg`The username contains inappropriate language`\n case 'reserved':\n return msg`This username is reserved`\n case 'taken':\n return msg`The username is already in use`\n case 'resolution':\n return msg`The username could not be resolved`\n case 'unsupported':\n // @NOTE Only happens during account creation: should never happen since\n // the UI doesn't allow entering custom handles during account creation.\n return msg`Custom domains are not supported`\n }\n }\n\n static is(json: OAuthErrorPayload): json is HandleUnavailablePayload {\n return (\n json.error === 'handle_unavailable' &&\n isHandleUnavailableReason(json['reason'])\n )\n }\n}\n\nexport const SECOND_AUTH_FACTOR_TYPES = Object.freeze(['emailOtp'] as const)\nexport type SecondAuthFactorType = (typeof SECOND_AUTH_FACTOR_TYPES)[number]\nexport const isSecondAuthFactorType = (\n value: unknown,\n): value is SecondAuthFactorType =>\n (SECOND_AUTH_FACTOR_TYPES as readonly unknown[]).includes(value)\n\nexport type SecondAuthenticationFactorRequiredPayload =\n OAuthErrorPayload<'second_authentication_factor_required'> & {\n type: SecondAuthFactorType\n hint: string\n }\nexport class SecondAuthenticationFactorRequiredError<\n P extends\n SecondAuthenticationFactorRequiredPayload = SecondAuthenticationFactorRequiredPayload,\n> extends OAuthErrorResponse<P> {\n constructor(payload: P, message = payload.error_description) {\n const { type, hint } = payload\n super(payload, message || `${type} auth factor required (hint: ${hint})`)\n this.msg = msg`A second authentication factor is required (${hint})`\n }\n\n get type() {\n return this.payload.type\n }\n get hint() {\n return this.payload.hint\n }\n\n static is(\n json: OAuthErrorPayload,\n ): json is SecondAuthenticationFactorRequiredPayload {\n return (\n json.error === 'second_authentication_factor_required' &&\n isSecondAuthFactorType(json['type']) &&\n typeof json['hint'] === 'string'\n )\n }\n}\n\nexport type InvalidInviteCodePayload = InvalidRequestPayload & {\n error_description: `This invite code is invalid.${string}`\n}\nexport class InvalidInviteCodeError<\n P extends InvalidInviteCodePayload = InvalidInviteCodePayload,\n> extends InvalidRequestError<P> {\n msg = msg`The invite code is not valid`\n\n constructor(payload: P) {\n super(payload)\n }\n\n static is(json: OAuthErrorPayload): json is InvalidInviteCodePayload {\n return (\n super.is(json) &&\n json.error_description != null &&\n json.error_description.startsWith('This invite code is invalid.')\n )\n }\n}\n\nexport type RequestExpiredPayload = AccessDeniedPayload & {\n error_description: 'This request has expired'\n}\nexport class RequestExpiredError<\n P extends RequestExpiredPayload = RequestExpiredPayload,\n> extends AccessDeniedError<P> {\n override msg = msg`This sign-in session has expired`\n\n static is(json: OAuthErrorPayload): json is RequestExpiredPayload {\n return (\n super.is(json) && json.error_description === 'This request has expired'\n )\n }\n}\n\nexport type InvalidCredentialsPayload = InvalidRequestPayload & {\n error_description: 'Invalid identifier or password'\n}\nexport class InvalidCredentialsError<\n P extends InvalidCredentialsPayload = InvalidCredentialsPayload,\n> extends InvalidRequestError<P> {\n override msg = msg`Wrong identifier or password`\n\n static is(json: OAuthErrorPayload): json is InvalidCredentialsPayload {\n return (\n super.is(json) &&\n json.error_description === 'Invalid identifier or password'\n )\n }\n}\n\nexport type UnknownRequestPayload = InvalidRequestPayload & {\n error_description: 'Unknown request_uri'\n}\nexport class UnknownRequestUriError<\n P extends UnknownRequestPayload = UnknownRequestPayload,\n> extends InvalidRequestError<P> {\n override msg = msg`This sign-in session has expired`\n\n static is(json: OAuthErrorPayload): json is UnknownRequestPayload {\n return super.is(json) && json.error_description === 'Unknown request_uri'\n }\n}\nexport type EmailTakenPayload = InvalidRequestPayload & {\n error_description: 'Email already taken'\n}\nexport class EmailTakenError<\n P extends EmailTakenPayload = EmailTakenPayload,\n> extends InvalidRequestError<P> {\n override msg = msg`This email is already used`\n\n static is(json: OAuthErrorPayload): json is EmailTakenPayload {\n return super.is(json) && json.error_description === 'Email already taken'\n }\n}\n","export function upsert<T>(\n arr: undefined | readonly T[],\n item: T,\n predicate: (value: T, index: number, obj: readonly T[]) => boolean,\n): T[] {\n if (!arr) return [item]\n const idx = arr.findIndex(predicate)\n return idx === -1\n ? [...arr, item]\n : [...arr.slice(0, idx), item, ...arr.slice(idx + 1)]\n}\n\nexport type Explicit<T> = { [K in keyof T & string]: T[K] }\nexport type Simplify<T> = { [K in keyof T]: T[K] } & NonNullable<unknown>\nexport type Override<T, U> = Simplify<Omit<T, keyof U> & U>\n\nexport function toJsonSafe(value: unknown): string | undefined {\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return undefined\n }\n}\n","import { MessageDescriptor } from '@lingui/core'\nimport { ParsedError } from '#/components/utils/error-card.tsx'\nimport { OAuthErrorResponse } from '#/lib/api.ts'\nimport { JsonErrorResponse } from './json-client.ts'\nimport { toJsonSafe } from './util.ts'\n\nexport function apiErrorParser(error: unknown): ParsedError | void {\n if (error instanceof OAuthErrorResponse) {\n return {\n name: error.name,\n code: error.payload.error,\n message: error.payload.error_description,\n payload: toJsonSafe(error.payload),\n description: apiErrorMessage(error),\n }\n }\n}\n\nexport function apiErrorMessage(error: unknown): MessageDescriptor | undefined {\n if (error instanceof JsonErrorResponse) {\n return error.msg\n }\n}\n","// src/primitive.tsx\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nfunction composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {\n return function handleEvent(event) {\n originalEventHandler?.(event);\n if (checkForDefaultPrevented === false || !event.defaultPrevented) {\n return ourEventHandler?.(event);\n }\n };\n}\nfunction getOwnerWindow(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access window outside of the DOM\");\n }\n return element?.ownerDocument?.defaultView ?? window;\n}\nfunction getOwnerDocument(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access document outside of the DOM\");\n }\n return element?.ownerDocument ?? document;\n}\nfunction getActiveElement(node, activeDescendant = false) {\n const { activeElement } = getOwnerDocument(node);\n if (!activeElement?.nodeName) {\n return null;\n }\n if (isFrame(activeElement) && activeElement.contentDocument) {\n return getActiveElement(activeElement.contentDocument.body, activeDescendant);\n }\n if (activeDescendant) {\n const id = activeElement.getAttribute(\"aria-activedescendant\");\n if (id) {\n const element = getOwnerDocument(activeElement).getElementById(id);\n if (element) {\n return element;\n }\n }\n }\n return activeElement;\n}\nfunction isFrame(element) {\n return element.tagName === \"IFRAME\";\n}\nexport {\n canUseDOM,\n composeEventHandlers,\n getActiveElement,\n getOwnerDocument,\n getOwnerWindow,\n isFrame\n};\n//# sourceMappingURL=index.mjs.map\n","import { MessageDescriptor } from '@lingui/core'\nimport { toJsonSafe } from './util'\n\nexport type ParsedError = {\n name?: string\n code?: string\n message?: string\n payload?: string\n stack?: string\n\n /**\n * A user-friendly description of the error, suitable for display in the UI.\n */\n description?: MessageDescriptor\n}\n\nexport type ErrorParser = (error: unknown) => ParsedError | void\n\nexport function parseError(error: unknown): ParsedError {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n }\n\n if (typeof error === 'string') {\n return {\n message: error,\n }\n }\n\n return {\n payload: toJsonSafe(error),\n }\n}\n\nexport function composeErrorParsers(\n ...parsers: (ErrorParser | undefined)[]\n): ErrorParser {\n return (error) => {\n for (const parser of parsers) {\n const parsed = parser?.(error)\n if (parsed) return parsed\n }\n }\n}\n","import { Trans } from '@lingui/react/macro'\nimport { ReactNode } from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { JSX } from 'react'\nimport { Override } from '#/lib/util.ts'\n\nexport type ErrorDetailsProps = Override<\n JSX.IntrinsicElements['dl'],\n {\n name?: string\n code?: string\n message?: string\n payload?: string\n stack?: string\n }\n>\n\nexport function ErrorDetails({\n name,\n code,\n message,\n payload,\n stack,\n\n // dl\n className,\n ...props\n}: ErrorDetailsProps) {\n return (\n <dl\n className={clsx(\n 'mt-2 grid max-w-full grid-cols-[auto_1fr] gap-x-2 text-sm',\n className,\n )}\n {...props}\n >\n {name && (\n <DetailRow label={<Trans context=\"Error\">Name</Trans>}>\n <code>{name}</code>\n </DetailRow>\n )}\n\n {code && (\n <DetailRow label={<Trans context=\"Error\">Code</Trans>}>\n <code>{code}</code>\n </DetailRow>\n )}\n\n {message && (\n <DetailRow label={<Trans context=\"Error\">Message</Trans>}>\n {message}\n </DetailRow>\n )}\n\n {payload && (\n <DetailRow label={<Trans context=\"Error\">Payload</Trans>}>\n <code className=\"max-h-[200px] overflow-auto\">\n <pre>{payload}</pre>\n </code>\n </DetailRow>\n )}\n\n {stack && (\n <DetailRow label={<Trans context=\"Error\">Stack</Trans>}>\n <code className=\"max-h-[200px] overflow-auto\">\n <pre>{stack}</pre>\n </code>\n </DetailRow>\n )}\n </dl>\n )\n}\n\nfunction DetailRow({\n children,\n label,\n}: {\n children: ReactNode\n label: ReactNode\n}) {\n return (\n <>\n <dt className=\"font-semibold\">{label}</dt>\n <dd>{children}</dd>\n </>\n )\n}\n","import { msg } from '@lingui/core/macro'\nimport { useLingui } from '@lingui/react'\nimport { Trans } from '@lingui/react/macro'\nimport { composeEventHandlers } from '@radix-ui/primitive'\nimport { useEffect, useMemo, useState } from 'react'\nimport { ErrorParser, ParsedError, parseError } from '#/lib/error-parser.ts'\nimport { Override } from '#/lib/util.ts'\nimport { Admonition, AdmonitionAction, AdmonitionProps } from './admonition.tsx'\nimport { ErrorDetails } from './error-details.tsx'\n\nexport type { ErrorParser, ParsedError }\n\nexport type ErrorCardProps = Override<\n Omit<AdmonitionProps, 'role' | 'append' | 'action'>,\n {\n error: unknown\n reset?: () => void\n parser?: ErrorParser\n }\n>\n\nexport function ErrorCard({\n error,\n reset,\n parser,\n\n // Admonition\n children,\n onClick,\n ...props\n}: ErrorCardProps) {\n const { _ } = useLingui()\n const [clickCount, setClickCount] = useState(0)\n\n // Every 5th click; toggle showing the details\n const showDetails = ((clickCount / 5) | 0) % 2 === 1\n\n const parsed = useMemo<ParsedError>(\n () => parser?.(error) ?? parseError(error),\n [parser, error],\n )\n\n useEffect(() => {\n // For debugging purposes\n console.warn('Displayed error:', parsed)\n\n // Reset the click count when the error changes\n setClickCount(0)\n }, [parsed])\n\n return (\n <Admonition\n {...props}\n role=\"alert\"\n onClick={composeEventHandlers(onClick, () => {\n setClickCount((c) => c + 1)\n })}\n append={\n <>\n {children}\n {showDetails && (\n <ErrorDetails\n name={parsed.name}\n code={parsed.code}\n message={parsed.message}\n payload={parsed.payload}\n stack={parsed.stack}\n />\n )}\n </>\n }\n action={\n reset != null && (\n <AdmonitionAction onClick={() => reset()}>\n <Trans>Retry</Trans>\n </AdmonitionAction>\n )\n }\n >\n {_(parsed.description ?? msg`An unknown error occurred`)}\n </Admonition>\n )\n}\n\nexport const errorCardRender = (props: ErrorCardProps) => (\n <ErrorCard {...props} />\n)\n","import { msg } from '@lingui/core/macro'\nimport { apiErrorParser } from '#/lib/api-error-parser.ts'\nimport { Override } from '#/lib/util.ts'\nimport { LayoutApp, LayoutAppProps } from './layouts/layout-app.tsx'\nimport { ErrorCard } from './utils/error-card.tsx'\n\nexport type ErrorViewProps = Override<\n LayoutAppProps,\n {\n error: unknown\n reset?: () => void\n children?: never\n }\n>\n\nexport function ErrorView({\n // FallbackProps\n error,\n reset,\n // LayoutAppProps\n title = msg`An error occurred`,\n ...props\n}: ErrorViewProps) {\n // @TODO improve error page\n return (\n <LayoutApp title={title} {...props}>\n <div className=\"w-[500px] max-w-full\">\n <ErrorCard\n className=\"mx-5\"\n error={error}\n reset={reset}\n parser={apiErrorParser}\n />\n </div>\n </LayoutApp>\n )\n}\n\nexport const errorViewRender = (props: ErrorViewProps) => (\n <ErrorView {...props} />\n)\n"],"names":["HANDLE_UNAVAILABLE_REASON","isHandleUnavailableReason","value","parseCookieString","cookie","document","Object","fromEntries","split","filter","Boolean","map","str","s","decodeURIComponent","trim","readCookie","name","JsonClient","baseUrl","options","fetch","method","path","input","url","URL","key","entries","searchParams","set","body","JSON","stringify","undefined","headers","Headers","_b","_a","has","response","mode","signal","status","responseType","get","cancel","Error","cause","payload","json","ok","error","parseError","_g","_f","_e","onFetchSuccess","call","err","context","warn","_i","_h","onFetchError","JsonErrorResponse","message","msg","CSRF_COOKIE_NAME","CSRF_HEADER_NAME","API_ENDPOINT_PREFIX","Api","window","origin","toString","csrfToken","locale","signIn","username","password","emailOtp","remember","initiatePasswordReset","email","accountSessions","sub","revokeAccountSession","deviceId","oauthSessions","revokeOAuthSession","tokenId","confirmResetPassword","token","validateHandleAvailability","handle","updateEmailRequest","updateEmailConfirm","verifyEmailRequest","verifyEmailConfirm","updateHandle","signUp","inviteCode","hcaptchaToken","signOut","consent","scope","reject","isOAuthErrorPayload","ErrorClass","SecondAuthenticationFactorRequiredError","InvalidCredentialsError","InvalidInviteCodeError","HandleUnavailableError","EmailTakenError","UnknownRequestUriError","RequestExpiredError","UnauthorizedError","InvalidRequestError","AccessDeniedError","is","OAuthErrorResponse","error_description","getMessageForError","getMessageForReason","reason","SECOND_AUTH_FACTOR_TYPES","freeze","isSecondAuthFactorType","includes","type","hint","startsWith","upsert","arr","item","predicate","idx","findIndex","slice","toJsonSafe","apiErrorParser","code","description","apiErrorMessage","composeEventHandlers","originalEventHandler","ourEventHandler","checkForDefaultPrevented","event","stack","ErrorDetails","className","props","dl","clsx","DetailRow","label","Trans_","pre","children","_Fragment","dt","dd","ErrorCard","reset","parser","onClick","_","useLingui","clickCount","setClickCount","useState","showDetails","parsed","useMemo","useEffect","Admonition","role","c","append","action","_jsx","AdmonitionAction","errorCardRender","ErrorView","title","LayoutApp","div","errorViewRender"],"mappings":"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","x_google_ignoreList":[6]}
|