@atproto/oauth-provider-ui 0.5.2 → 0.6.0
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-BWF2SB1c.js +20 -0
- package/dist/account-page-BWF2SB1c.js.map +1 -0
- package/dist/{admonition-CynrBtB4.js → admonition-yRjCycmU.js} +14 -14
- package/dist/admonition-yRjCycmU.js.map +1 -0
- package/dist/authorization-page-CVdjW3kW.js +6 -0
- package/dist/authorization-page-CVdjW3kW.js.map +1 -0
- package/dist/bundle-manifest.json +101 -101
- package/dist/{cookie-error-page-BaAfiN7q.js → cookie-error-page-Bkn1GFNn.js} +2 -2
- package/dist/cookie-error-page-Bkn1GFNn.js.map +1 -0
- package/dist/did-document-YkmTdTdF.js +60 -0
- package/dist/did-document-YkmTdTdF.js.map +1 -0
- package/dist/{error-page-BJWyhSsa.js → error-page-BNXmA0-7.js} +2 -2
- package/dist/{error-page-BJWyhSsa.js.map → error-page-BNXmA0-7.js.map} +1 -1
- package/dist/error-view-C10M9k8v.js +2 -0
- package/dist/{error-view-Bn_MnV68.js.map → error-view-C10M9k8v.js.map} +1 -1
- package/dist/{form-card-BodfR5wP.js → form-card-CGJ-DqBg.js} +2 -2
- package/dist/{form-card-BodfR5wP.js.map → form-card-CGJ-DqBg.js.map} +1 -1
- package/package.json +9 -9
- package/dist/account-page-Do28ZzQf.js +0 -20
- package/dist/account-page-Do28ZzQf.js.map +0 -1
- package/dist/admonition-CynrBtB4.js.map +0 -1
- package/dist/authorization-page-XxpDhuMt.js +0 -6
- package/dist/authorization-page-XxpDhuMt.js.map +0 -1
- package/dist/cookie-error-page-BaAfiN7q.js.map +0 -1
- package/dist/error-view-Bn_MnV68.js +0 -2
- package/dist/index-BtIdBUOA.js +0 -60
- package/dist/index-BtIdBUOA.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=error-page-
|
|
1
|
+
import{g as o,j as r,r as t,C as e,h as a}from"./admonition-yRjCycmU.js";import{E as i}from"./error-view-C10M9k8v.js";const{__errorData:s,__customizationData:n}=window,c=document.getElementById("root");o.createRoot(c).render(r.jsx(t.StrictMode,{children:r.jsx(e,{value:n,children:r.jsx(a,{children:r.jsx(i,{error:s})})})}));
|
|
2
|
+
//# sourceMappingURL=error-page-BNXmA0-7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-page-
|
|
1
|
+
{"version":3,"file":"error-page-BNXmA0-7.js","sources":["../src/error-page.tsx"],"sourcesContent":["import './style.css'\n\nimport { StrictMode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { ErrorView } from '#/components/error-view.tsx'\nimport { CustomizationProvider } from '#/contexts/customization'\nimport type { HydrationData } from '#/hydration-data.d.ts'\nimport { LocaleProvider } from '#/locales/locale-provider.tsx'\n\nconst {\n //\n __errorData: errorData,\n __customizationData: customizationData,\n} = window as typeof window & HydrationData['error-page']\n\nconst container = document.getElementById('root')!\n\ncreateRoot(container).render(\n <StrictMode>\n <CustomizationProvider value={customizationData}>\n <LocaleProvider>\n <ErrorView error={errorData} />\n </LocaleProvider>\n </CustomizationProvider>\n </StrictMode>,\n)\n"],"names":["__errorData","errorData","__customizationData","customizationData","window","container","document","getElementById","createRoot","render","_jsx","StrictMode","CustomizationProvider","value","LocaleProvider","ErrorView","error"],"mappings":"sHASA,KAAM,CAEJA,YAAaC,EACbC,oBAAqBC,GACnBC,OAEEC,EAAYC,SAASC,eAAe,MAAA,EAE1CC,EAAAA,WAAWH,CAAAA,EAAWI,OACpBC,EAAAA,IAACC,EAAAA,WAAAA,CACC,eAACC,EAAAA,CAAsBC,MAAOV,EAC5B,eAACW,EAAAA,CACC,eAACC,EAAAA,CAAUC,MAAOf"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as T,r as w,j as t,c as F,T as p,A as D,e as J,L as $}from"./admonition-yRjCycmU.js";const M=(r=document.cookie)=>Object.fromEntries(r.split(";").filter(Boolean).map(e=>e.split("=",2).map(s=>decodeURIComponent(s.trim()))));function V(r,e=document.cookie){return M(e)[r]}class K{constructor(e,s){this.baseUrl=e,this.options=s}async fetch(e,s,n,i){var a,h,x,u,S;try{const l=new URL(`${this.baseUrl}${s}`);if(e==="GET"&&n)for(const[E,P]of Object.entries(n))l.searchParams.set(E,P);const f=e==="POST"?JSON.stringify(n):void 0,A=await((h=(a=this.options)==null?void 0:a.headers)==null?void 0:h.call(a)),_=new Headers(A?Object.entries(A).filter(E=>E[1]!=null):void 0);f&&!_.has("content-type")&&_.set("content-type","application/json");const o=await fetch(l,{method:e,headers:_,mode:"same-origin",body:f,signal:i==null?void 0:i.signal});if(o.status===204)return;const N=o.headers.get("content-type");if(N!=="application/json")throw await((x=o.body)==null?void 0:x.cancel()),new Error(`Invalid content type "${N}"`,{cause:o});const O=await o.json();if(o.ok)return O;throw this.parseError(o,O)}catch(l){const f={method:e,path:s,input:n,options:i};throw console.warn("API request failed",l,f),(S=(u=this.options)==null?void 0:u.onFetchError)==null||S.call(u,l,f),l}}parseError(e,s){const i=this.constructor.parseError(s);return i||new Error("Invalid JSON response",{cause:e})}static parseError(e){if(c.is(e))return new c(e)}}class c extends Error{constructor(e,s=e.error_description,n){super(s||`Error "${e.error}"`,n),this.name="JsonErrorResponse",this.payload=e}get error(){return this.payload.error}get description(){return this.payload.error_description}static is(e){return e!=null&&typeof e=="object"&&typeof e.error=="string"&&(e.error_description===void 0||typeof e.error_description=="string")}}const L="csrf-token",W="x-csrf-token",G="/@atproto/oauth-provider/~api";class X extends K{constructor(e){const s=new URL(G,window.origin).toString();super(s,{...e,headers:async()=>{var n;return{...await((n=e==null?void 0:e.headers)==null?void 0:n.call(e)),[W]:V(L)}}})}static parseError(e){return g.is(e)?new g(e):I.is(e)?new I(e):k.is(e)?new k(e):y.is(e)?new y(e):R.is(e)?new R(e):b.is(e)?new b(e):v.is(e)?new v(e):C.is(e)?new C(e):d.is(e)?new d(e):m.is(e)?new m(e):super.parseError(e)}}class g extends c{constructor(e){super(e,e.error_description||"Unauthorized")}static is(e){return super.is(e)&&e.error==="unauthorized"}}class m extends c{constructor(e,s=e.error_description||"Access denied"){super(e,s)}static is(e){return super.is(e)&&e.error==="access_denied"}}class d extends c{constructor(e,s=e.error_description||"Invalid request"){super(e,s)}static is(e){return super.is(e)&&e.error==="invalid_request"}}class y extends d{constructor(e){super(e)}static is(e){return super.is(e)&&e.error_description!=null&&e.error_description.startsWith("This invite code is invalid.")}}class v extends m{static is(e){return super.is(e)&&e.error_description==="This request has expired"}}class k extends d{static is(e){return super.is(e)&&e.error_description==="Invalid identifier or password"}}class C extends d{static is(e){return super.is(e)&&e.error_description==="Unknown request_uri"}}class b extends d{static is(e){return super.is(e)&&e.error_description==="Email already taken"}}class R extends c{constructor(e,s=e.error_description||"That handle cannot be used"){super(e,s)}get reason(){return this.payload.reason}static is(e){return super.is(e)&&e.error==="handle_unavailable"&&"reason"in e&&(e.reason==="syntax"||e.reason==="domain"||e.reason==="slur"||e.reason==="taken")}}class I extends c{constructor(e,s=e.error_description||`${e.type} authentication factor required (hint: ${e.hint})`){super(e,s)}get type(){return this.payload.type}get hint(){return this.payload.hint}static is(e){return super.is(e)&&e.error==="second_authentication_factor_required"&&"type"in e&&e.type==="emailOtp"&&"hint"in e&&typeof e.hint=="string"}}function H(r){const{i18n:e,_:s}=T();if(r instanceof I)return e._({id:"S90jaV"});if(r instanceof k)return e._({id:"jSVjfa"});if(r instanceof y)return e._({id:"+lWheC"});if(r instanceof R)switch(r.reason){case"syntax":return e._({id:"LSPrK4"});case"domain":return e._({id:"qDdKKD"});case"slur":return e._({id:"we0QGx"});case"taken":return r.description==="Reserved handle"?e._({id:"T61uiW"}):e._({id:"kPGuFg"});default:return e._({id:"D00bHj"})}return r instanceof b?e._({id:"SZKM0t"}):r instanceof g||r instanceof C||r instanceof v?e._({id:"5OVfoe"}):r instanceof d?e._({id:"qrCiCk"}):r instanceof m?e._({id:"oYKcFO"}):r instanceof c?e._({id:"Jja+Vn"}):e._({id:"vW+T+d"})}function z(r){if(r instanceof c)return{name:r.name,code:r.error,message:r.description,details:U(r.payload)}}function B({error:r,parser:e=z,className:s,...n}){const i=w.useMemo(()=>{const a=e==null?void 0:e(r);return a||(r instanceof Error?{name:r.name,message:r.message,details:r.stack}:{name:"UnknownError",details:U(r)})},[r,e]);return t.jsxs("dl",{className:F("mt-2 grid max-w-full grid-cols-[auto_1fr] gap-x-2 text-sm",s),...n,children:[t.jsx("dt",{className:"font-semibold",children:t.jsx(p,{id:"6YtxFj"})}),t.jsx("dd",{children:t.jsx("code",{children:i.name})}),i.code&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{className:"font-semibold",children:t.jsx(p,{id:"EWPtMO"})}),t.jsx("dd",{children:t.jsx("code",{children:i.code})})]}),i.message&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{className:"font-semibold",children:t.jsx(p,{id:"xDAtGP"})}),t.jsx("dd",{children:i.message})]}),i.details&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{className:"font-semibold",children:t.jsx(p,{id:"P9fBwv"})}),t.jsx("dd",{className:"max-h-[200px] overflow-auto",children:t.jsx("code",{children:t.jsx("pre",{children:i.details})})})]})]})}function U(r){try{return JSON.stringify(r,null,2)}catch{return}}function q({error:r,reset:e,className:s,children:n}){const[i,a]=w.useState(0),h=(i/5|0)%2===1,x=H(r);return w.useEffect(()=>{console.warn("Displayed error details:",r),a(0)},[r]),t.jsx(D,{role:"alert",className:s,onClick:()=>a(u=>u+1),title:x,append:h&&t.jsx(B,{error:r}),action:e!=null&&t.jsx(J,{onClick:()=>e(),children:t.jsx(p,{id:"6gRgw8"})}),children:n})}const Z=r=>t.jsx(q,{...r});function Y({error:r,reset:e,title:s={id:"Vw8l6h"},...n}){return t.jsx($,{title:s,...n,children:t.jsx("div",{className:"w-[500px] max-w-full",children:t.jsx(q,{className:"mx-5",error:r,reset:e})})})}const j=r=>t.jsx(Y,{...r});export{X as A,Y as E,k as I,I as S,C as U,g as a,Z as b,j as e};
|
|
2
|
+
//# sourceMappingURL=error-view-C10M9k8v.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-view-Bn_MnV68.js","sources":["../src/lib/cookies.ts","../src/lib/json-client.ts","../src/lib/api.ts","../src/hooks/use-error-message.ts","../src/components/utils/error-details.tsx","../src/components/utils/error-card.tsx","../src/components/error-view.tsx"],"sourcesContent":["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","export 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}\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 = {\n onFetchError?: (\n err: unknown,\n context: {\n method: string\n path: string\n input: unknown\n options?: Options\n },\n ) => void\n headers?: () => Awaitable<Record<string, string | undefined>>\n}\n\nexport class JsonClient<Endpoints extends EndpointDefinitions> {\n constructor(\n protected readonly baseUrl: string,\n protected readonly options?: JsonClientOptions,\n ) {}\n\n public 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 headersEntries = await this.options?.headers?.()\n const headers = new Headers(\n headersEntries\n ? Object.entries(headersEntries).filter(\n (entry): entry is [string, string] => entry[1] != null,\n )\n : undefined,\n )\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 json = await response.json()\n\n if (response.ok) return json as Endpoints[Path]['output']\n else throw this.parseError(response, json)\n } catch (err) {\n const context = { method, path, input, options }\n console.warn('API request failed', err, context)\n this.options?.onFetchError?.(err, context)\n throw err\n }\n }\n\n protected parseError(response: Response, json: Json): Error {\n const Class = this.constructor as typeof JsonClient\n const error = Class.parseError(json)\n if (error) return error\n\n return new Error('Invalid JSON response', { cause: response })\n }\n\n public static parseError(json: unknown): undefined | JsonErrorResponse {\n if (JsonErrorResponse.is(json)) {\n return new JsonErrorResponse(json)\n }\n }\n}\n\nexport type JsonErrorPayload<E extends string = string> = {\n error: E\n error_description?: string\n}\n\nexport class JsonErrorResponse<\n P extends JsonErrorPayload = JsonErrorPayload,\n> extends Error {\n name = 'JsonErrorResponse'\n\n constructor(\n public readonly payload: P,\n message = payload.error_description,\n options?: ErrorOptions,\n ) {\n super(message || `Error \"${payload.error}\"`, options)\n }\n\n get error(): string {\n return this.payload.error\n }\n\n get description(): string | undefined {\n return this.payload.error_description\n }\n\n static is(json: unknown): json is JsonErrorPayload {\n return (\n json != null &&\n typeof json === 'object' &&\n typeof json['error'] === 'string' &&\n (json['error_description'] === undefined ||\n typeof json['error_description'] === 'string')\n )\n }\n}\n","import type { ApiEndpoints } from '@atproto/oauth-provider-api'\nimport { readCookie } from './cookies.ts'\nimport {\n JsonClient,\n JsonClientOptions,\n JsonErrorPayload,\n JsonErrorResponse,\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 class Api extends JsonClient<ApiEndpoints> {\n constructor(options?: JsonClientOptions) {\n const baseUrl = new URL(API_ENDPOINT_PREFIX, window.origin).toString()\n super(baseUrl, {\n ...options,\n headers: async () => ({\n ...(await options?.headers?.()),\n [CSRF_HEADER_NAME]: readCookie(CSRF_COOKIE_NAME),\n }),\n })\n }\n\n // Override the parent's parseError method to handle expected error responses\n // and transform them into instances of the corresponding error classes.\n public static override parseError(\n json: unknown,\n ): undefined | JsonErrorResponse {\n // @NOTE Most specific errors first !\n if (UnauthorizedError.is(json)) {\n return new UnauthorizedError(json)\n }\n if (SecondAuthenticationFactorRequiredError.is(json)) {\n return new SecondAuthenticationFactorRequiredError(json)\n }\n if (InvalidCredentialsError.is(json)) {\n return new InvalidCredentialsError(json)\n }\n if (InvalidInviteCodeError.is(json)) {\n return new InvalidInviteCodeError(json)\n }\n if (HandleUnavailableError.is(json)) {\n return new HandleUnavailableError(json)\n }\n if (EmailTakenError.is(json)) {\n return new EmailTakenError(json)\n }\n if (RequestExpiredError.is(json)) {\n return new RequestExpiredError(json)\n }\n if (UnknownRequestUriError.is(json)) {\n return new UnknownRequestUriError(json)\n }\n if (InvalidRequestError.is(json)) {\n return new InvalidRequestError(json)\n }\n if (AccessDeniedError.is(json)) {\n return new AccessDeniedError(json)\n }\n return super.parseError(json)\n }\n}\n\nexport type UnauthorizedPayload = JsonErrorPayload<'unauthorized'>\nexport class UnauthorizedError<\n P extends UnauthorizedPayload = UnauthorizedPayload,\n> extends JsonErrorResponse<P> {\n constructor(payload: P) {\n super(payload, payload.error_description || 'Unauthorized')\n }\n\n static is(json: unknown): json is UnauthorizedPayload {\n return super.is(json) && json.error === 'unauthorized'\n }\n}\n\nexport type AccessDeniedPayload = JsonErrorPayload<'access_denied'>\nexport class AccessDeniedError<\n P extends AccessDeniedPayload = AccessDeniedPayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description || 'Access denied',\n ) {\n super(payload, message)\n }\n\n static is(json: unknown): json is AccessDeniedPayload {\n return super.is(json) && json.error === 'access_denied'\n }\n}\n\nexport type InvalidRequestPayload = JsonErrorPayload<'invalid_request'>\nexport class InvalidRequestError<\n P extends InvalidRequestPayload = InvalidRequestPayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description || 'Invalid request',\n ) {\n super(payload, message)\n }\n\n static is(json: unknown): json is InvalidRequestPayload {\n return super.is(json) && json.error === 'invalid_request'\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 constructor(payload: P) {\n super(payload)\n }\n\n static is(json: unknown): 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 static is(json: unknown): 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 static is(json: unknown): 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 static is(json: unknown): 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 static is(json: unknown): json is EmailTakenPayload {\n return super.is(json) && json.error_description === 'Email already taken'\n }\n}\n\nexport type HandleUnavailablePayload =\n JsonErrorPayload<'handle_unavailable'> & {\n reason: 'syntax' | 'domain' | 'slur' | 'taken'\n }\nexport class HandleUnavailableError<\n P extends HandleUnavailablePayload = HandleUnavailablePayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description || 'That handle cannot be used',\n ) {\n super(payload, message)\n }\n\n get reason() {\n return this.payload.reason\n }\n\n static is(json: unknown): json is HandleUnavailablePayload {\n return (\n super.is(json) &&\n json.error === 'handle_unavailable' &&\n 'reason' in json &&\n (json.reason === 'syntax' ||\n json.reason === 'domain' ||\n json.reason === 'slur' ||\n json.reason === 'taken')\n )\n }\n}\n\nexport type SecondAuthenticationFactorRequiredPayload =\n JsonErrorPayload<'second_authentication_factor_required'> & {\n type: 'emailOtp'\n hint: string\n }\nexport class SecondAuthenticationFactorRequiredError<\n P extends\n SecondAuthenticationFactorRequiredPayload = SecondAuthenticationFactorRequiredPayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description ||\n `${payload.type} authentication factor required (hint: ${payload.hint})`,\n ) {\n super(payload, message)\n }\n\n get type() {\n return this.payload.type\n }\n get hint() {\n return this.payload.hint\n }\n\n static is(json: unknown): json is SecondAuthenticationFactorRequiredPayload {\n return (\n super.is(json) &&\n json.error === 'second_authentication_factor_required' &&\n 'type' in json &&\n json.type === 'emailOtp' &&\n 'hint' in json &&\n typeof json.hint === 'string'\n )\n }\n}\n","import { useLingui } from '@lingui/react/macro'\nimport {\n AccessDeniedError,\n EmailTakenError,\n HandleUnavailableError,\n InvalidCredentialsError,\n InvalidInviteCodeError,\n InvalidRequestError,\n RequestExpiredError,\n SecondAuthenticationFactorRequiredError,\n UnauthorizedError,\n UnknownRequestUriError,\n} from '#/lib/api.ts'\nimport { JsonErrorResponse } from '#/lib/json-client.ts'\n\nexport function useErrorMessage(error: unknown): string {\n // Matches the order of the error checks in the API's parseError method (must\n // be from most specific to least specific to avoid unreachable code paths).\n const { t } = useLingui()\n\n if (error instanceof SecondAuthenticationFactorRequiredError) {\n return t`A second authentication factor is required`\n }\n\n if (error instanceof InvalidCredentialsError) {\n return t`Wrong identifier or password`\n }\n\n if (error instanceof InvalidInviteCodeError) {\n return t`The invite code is not valid`\n }\n\n if (error instanceof HandleUnavailableError) {\n switch (error.reason) {\n case 'syntax':\n return t`The handle is invalid`\n case 'domain':\n return t`The domain name is not allowed`\n case 'slur':\n return t`The handle contains inappropriate language`\n case 'taken':\n if (error.description === 'Reserved handle') {\n return t`This handle is reserved`\n }\n return t`The handle is already in use`\n default:\n return t`That handle cannot be used`\n }\n }\n\n if (error instanceof EmailTakenError) {\n return t`This email is already used`\n }\n\n if (\n error instanceof UnauthorizedError ||\n error instanceof UnknownRequestUriError ||\n error instanceof RequestExpiredError\n ) {\n return t`This sign-in session has expired`\n }\n\n if (error instanceof InvalidRequestError) {\n return t`The data you submitted is invalid. Please check the form and try again.`\n }\n\n if (error instanceof AccessDeniedError) {\n return t`This authorization request has been denied. Please try again.`\n }\n\n if (error instanceof JsonErrorResponse) {\n return t`Unexpected server response`\n }\n\n return t`An unknown error occurred`\n}\n","import { Trans } from '@lingui/react/macro'\nimport { clsx } from 'clsx'\nimport { JSX, useMemo } from 'react'\nimport { JsonErrorResponse } from '#/lib/json-client.ts'\nimport { Override } from '#/lib/util.ts'\n\nexport type ParsedError = {\n name: string\n code?: string\n message?: string\n details?: string\n}\n\n// @TODO this should me moved out of utils and be more specific to API errors\nexport function apiErrorParser(error: unknown): ParsedError | void {\n if (error instanceof JsonErrorResponse) {\n return {\n name: error.name,\n code: error.error,\n message: error.description,\n details: toJsonSafe(error.payload),\n }\n }\n}\n\nexport type ErrorDetailsProps = Override<\n JSX.IntrinsicElements['dl'],\n {\n error: unknown\n parser?: (error: unknown) => ParsedError | void\n }\n>\n\nexport function ErrorDetails({\n error,\n parser = apiErrorParser,\n className,\n ...props\n}: ErrorDetailsProps) {\n const parsed = useMemo<ParsedError>(() => {\n const parsed = parser?.(error)\n if (parsed) return parsed\n\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n details: error.stack,\n }\n }\n\n return {\n name: 'UnknownError',\n details: toJsonSafe(error),\n }\n }, [error, parser])\n\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 <dt className=\"font-semibold\">\n <Trans>Name</Trans>\n </dt>\n <dd>\n <code>{parsed.name}</code>\n </dd>\n\n {parsed.code && (\n <>\n <dt className=\"font-semibold\">\n <Trans>Code</Trans>\n </dt>\n <dd>\n <code>{parsed.code}</code>\n </dd>\n </>\n )}\n\n {parsed.message && (\n <>\n <dt className=\"font-semibold\">\n <Trans>Message</Trans>\n </dt>\n <dd>{parsed.message}</dd>\n </>\n )}\n\n {parsed.details && (\n <>\n <dt className=\"font-semibold\">\n <Trans>Stack</Trans>\n </dt>\n <dd className=\"max-h-[200px] overflow-auto\">\n <code>\n <pre>{parsed.details}</pre>\n </code>\n </dd>\n </>\n )}\n </dl>\n )\n}\n\nfunction toJsonSafe(value: unknown): string | undefined {\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return undefined\n }\n}\n","import { Trans } from '@lingui/react/macro'\nimport { ReactNode, useEffect, useState } from 'react'\nimport { useErrorMessage } from '#/hooks/use-error-message.ts'\nimport { Action, Admonition } from './admonition.tsx'\nimport { ErrorDetails } from './error-details.tsx'\n\nexport type ErrorCardProps = {\n className?: string\n children?: ReactNode\n error: unknown\n reset?: () => void\n}\n\nexport function ErrorCard({\n error,\n reset,\n className,\n children,\n}: ErrorCardProps) {\n const [inputCount, setInputCount] = useState(0)\n // Every 5th input will toggle showing the details\n const showDetails = ((inputCount / 5) | 0) % 2 === 1\n\n const errorMessage = useErrorMessage(error)\n\n useEffect(() => {\n // For debugging purposes\n console.warn('Displayed error details:', error)\n\n // Reset the input count when the error changes\n setInputCount(0)\n }, [error])\n\n return (\n <Admonition\n role=\"alert\"\n className={className}\n onClick={() => setInputCount((c) => c + 1)}\n title={errorMessage}\n append={showDetails && <ErrorDetails error={error} />}\n action={\n reset != null && (\n <Action onClick={() => reset()}>\n <Trans>Retry</Trans>\n </Action>\n )\n }\n >\n {children}\n </Admonition>\n )\n}\n\nexport const errorCardRender = (props: ErrorCardProps) => (\n <ErrorCard {...props} />\n)\n","import { msg } from '@lingui/core/macro'\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 className=\"mx-5\" error={error} reset={reset} />\n </div>\n </LayoutApp>\n )\n}\n\nexport const errorViewRender = (props: ErrorViewProps) => (\n <ErrorView {...props} />\n)\n"],"names":["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","value","entries","searchParams","set","body","JSON","stringify","undefined","headersEntries","_b","_a","headers","Headers","entry","has","response","mode","signal","status","responseType","get","cancel","Error","cause","json","ok","parseError","err","context","warn","onFetchError","error","JsonErrorResponse","is","payload","message","error_description","description","CSRF_COOKIE_NAME","CSRF_HEADER_NAME","API_ENDPOINT_PREFIX","Api","window","origin","toString","UnauthorizedError","SecondAuthenticationFactorRequiredError","InvalidCredentialsError","InvalidInviteCodeError","HandleUnavailableError","EmailTakenError","RequestExpiredError","UnknownRequestUriError","InvalidRequestError","AccessDeniedError","startsWith","reason","type","hint","useErrorMessage","useLingui","$__i18n","apiErrorParser","code","details","toJsonSafe","ErrorDetails","parser","className","props","parsed","useMemo","stack","dl","clsx","dt","Trans_","dd","_jsxs","_Fragment","pre","ErrorCard","reset","children","inputCount","setInputCount","useState","showDetails","errorMessage","useEffect","Admonition","role","onClick","c","title","append","_jsx","action","Action","errorCardRender","ErrorView","LayoutApp","div","errorViewRender"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"error-view-C10M9k8v.js","sources":["../src/lib/cookies.ts","../src/lib/json-client.ts","../src/lib/api.ts","../src/hooks/use-error-message.ts","../src/components/utils/error-details.tsx","../src/components/utils/error-card.tsx","../src/components/error-view.tsx"],"sourcesContent":["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","export 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}\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 = {\n onFetchError?: (\n err: unknown,\n context: {\n method: string\n path: string\n input: unknown\n options?: Options\n },\n ) => void\n headers?: () => Awaitable<Record<string, string | undefined>>\n}\n\nexport class JsonClient<Endpoints extends EndpointDefinitions> {\n constructor(\n protected readonly baseUrl: string,\n protected readonly options?: JsonClientOptions,\n ) {}\n\n public 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 headersEntries = await this.options?.headers?.()\n const headers = new Headers(\n headersEntries\n ? Object.entries(headersEntries).filter(\n (entry): entry is [string, string] => entry[1] != null,\n )\n : undefined,\n )\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 json = await response.json()\n\n if (response.ok) return json as Endpoints[Path]['output']\n else throw this.parseError(response, json)\n } catch (err) {\n const context = { method, path, input, options }\n console.warn('API request failed', err, context)\n this.options?.onFetchError?.(err, context)\n throw err\n }\n }\n\n protected parseError(response: Response, json: Json): Error {\n const Class = this.constructor as typeof JsonClient\n const error = Class.parseError(json)\n if (error) return error\n\n return new Error('Invalid JSON response', { cause: response })\n }\n\n public static parseError(json: unknown): undefined | JsonErrorResponse {\n if (JsonErrorResponse.is(json)) {\n return new JsonErrorResponse(json)\n }\n }\n}\n\nexport type JsonErrorPayload<E extends string = string> = {\n error: E\n error_description?: string\n}\n\nexport class JsonErrorResponse<\n P extends JsonErrorPayload = JsonErrorPayload,\n> extends Error {\n name = 'JsonErrorResponse'\n\n constructor(\n public readonly payload: P,\n message = payload.error_description,\n options?: ErrorOptions,\n ) {\n super(message || `Error \"${payload.error}\"`, options)\n }\n\n get error(): string {\n return this.payload.error\n }\n\n get description(): string | undefined {\n return this.payload.error_description\n }\n\n static is(json: unknown): json is JsonErrorPayload {\n return (\n json != null &&\n typeof json === 'object' &&\n typeof json['error'] === 'string' &&\n (json['error_description'] === undefined ||\n typeof json['error_description'] === 'string')\n )\n }\n}\n","import type { ApiEndpoints } from '@atproto/oauth-provider-api'\nimport { readCookie } from './cookies.ts'\nimport {\n JsonClient,\n JsonClientOptions,\n JsonErrorPayload,\n JsonErrorResponse,\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 class Api extends JsonClient<ApiEndpoints> {\n constructor(options?: JsonClientOptions) {\n const baseUrl = new URL(API_ENDPOINT_PREFIX, window.origin).toString()\n super(baseUrl, {\n ...options,\n headers: async () => ({\n ...(await options?.headers?.()),\n [CSRF_HEADER_NAME]: readCookie(CSRF_COOKIE_NAME),\n }),\n })\n }\n\n // Override the parent's parseError method to handle expected error responses\n // and transform them into instances of the corresponding error classes.\n public static override parseError(\n json: unknown,\n ): undefined | JsonErrorResponse {\n // @NOTE Most specific errors first !\n if (UnauthorizedError.is(json)) {\n return new UnauthorizedError(json)\n }\n if (SecondAuthenticationFactorRequiredError.is(json)) {\n return new SecondAuthenticationFactorRequiredError(json)\n }\n if (InvalidCredentialsError.is(json)) {\n return new InvalidCredentialsError(json)\n }\n if (InvalidInviteCodeError.is(json)) {\n return new InvalidInviteCodeError(json)\n }\n if (HandleUnavailableError.is(json)) {\n return new HandleUnavailableError(json)\n }\n if (EmailTakenError.is(json)) {\n return new EmailTakenError(json)\n }\n if (RequestExpiredError.is(json)) {\n return new RequestExpiredError(json)\n }\n if (UnknownRequestUriError.is(json)) {\n return new UnknownRequestUriError(json)\n }\n if (InvalidRequestError.is(json)) {\n return new InvalidRequestError(json)\n }\n if (AccessDeniedError.is(json)) {\n return new AccessDeniedError(json)\n }\n return super.parseError(json)\n }\n}\n\nexport type UnauthorizedPayload = JsonErrorPayload<'unauthorized'>\nexport class UnauthorizedError<\n P extends UnauthorizedPayload = UnauthorizedPayload,\n> extends JsonErrorResponse<P> {\n constructor(payload: P) {\n super(payload, payload.error_description || 'Unauthorized')\n }\n\n static is(json: unknown): json is UnauthorizedPayload {\n return super.is(json) && json.error === 'unauthorized'\n }\n}\n\nexport type AccessDeniedPayload = JsonErrorPayload<'access_denied'>\nexport class AccessDeniedError<\n P extends AccessDeniedPayload = AccessDeniedPayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description || 'Access denied',\n ) {\n super(payload, message)\n }\n\n static is(json: unknown): json is AccessDeniedPayload {\n return super.is(json) && json.error === 'access_denied'\n }\n}\n\nexport type InvalidRequestPayload = JsonErrorPayload<'invalid_request'>\nexport class InvalidRequestError<\n P extends InvalidRequestPayload = InvalidRequestPayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description || 'Invalid request',\n ) {\n super(payload, message)\n }\n\n static is(json: unknown): json is InvalidRequestPayload {\n return super.is(json) && json.error === 'invalid_request'\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 constructor(payload: P) {\n super(payload)\n }\n\n static is(json: unknown): 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 static is(json: unknown): 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 static is(json: unknown): 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 static is(json: unknown): 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 static is(json: unknown): json is EmailTakenPayload {\n return super.is(json) && json.error_description === 'Email already taken'\n }\n}\n\nexport type HandleUnavailablePayload =\n JsonErrorPayload<'handle_unavailable'> & {\n reason: 'syntax' | 'domain' | 'slur' | 'taken'\n }\nexport class HandleUnavailableError<\n P extends HandleUnavailablePayload = HandleUnavailablePayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description || 'That handle cannot be used',\n ) {\n super(payload, message)\n }\n\n get reason() {\n return this.payload.reason\n }\n\n static is(json: unknown): json is HandleUnavailablePayload {\n return (\n super.is(json) &&\n json.error === 'handle_unavailable' &&\n 'reason' in json &&\n (json.reason === 'syntax' ||\n json.reason === 'domain' ||\n json.reason === 'slur' ||\n json.reason === 'taken')\n )\n }\n}\n\nexport type SecondAuthenticationFactorRequiredPayload =\n JsonErrorPayload<'second_authentication_factor_required'> & {\n type: 'emailOtp'\n hint: string\n }\nexport class SecondAuthenticationFactorRequiredError<\n P extends\n SecondAuthenticationFactorRequiredPayload = SecondAuthenticationFactorRequiredPayload,\n> extends JsonErrorResponse<P> {\n constructor(\n payload: P,\n message = payload.error_description ||\n `${payload.type} authentication factor required (hint: ${payload.hint})`,\n ) {\n super(payload, message)\n }\n\n get type() {\n return this.payload.type\n }\n get hint() {\n return this.payload.hint\n }\n\n static is(json: unknown): json is SecondAuthenticationFactorRequiredPayload {\n return (\n super.is(json) &&\n json.error === 'second_authentication_factor_required' &&\n 'type' in json &&\n json.type === 'emailOtp' &&\n 'hint' in json &&\n typeof json.hint === 'string'\n )\n }\n}\n","import { useLingui } from '@lingui/react/macro'\nimport {\n AccessDeniedError,\n EmailTakenError,\n HandleUnavailableError,\n InvalidCredentialsError,\n InvalidInviteCodeError,\n InvalidRequestError,\n RequestExpiredError,\n SecondAuthenticationFactorRequiredError,\n UnauthorizedError,\n UnknownRequestUriError,\n} from '#/lib/api.ts'\nimport { JsonErrorResponse } from '#/lib/json-client.ts'\n\nexport function useErrorMessage(error: unknown): string {\n // Matches the order of the error checks in the API's parseError method (must\n // be from most specific to least specific to avoid unreachable code paths).\n const { t } = useLingui()\n\n if (error instanceof SecondAuthenticationFactorRequiredError) {\n return t`A second authentication factor is required`\n }\n\n if (error instanceof InvalidCredentialsError) {\n return t`Wrong identifier or password`\n }\n\n if (error instanceof InvalidInviteCodeError) {\n return t`The invite code is not valid`\n }\n\n if (error instanceof HandleUnavailableError) {\n switch (error.reason) {\n case 'syntax':\n return t`The handle is invalid`\n case 'domain':\n return t`The domain name is not allowed`\n case 'slur':\n return t`The handle contains inappropriate language`\n case 'taken':\n if (error.description === 'Reserved handle') {\n return t`This handle is reserved`\n }\n return t`The handle is already in use`\n default:\n return t`That handle cannot be used`\n }\n }\n\n if (error instanceof EmailTakenError) {\n return t`This email is already used`\n }\n\n if (\n error instanceof UnauthorizedError ||\n error instanceof UnknownRequestUriError ||\n error instanceof RequestExpiredError\n ) {\n return t`This sign-in session has expired`\n }\n\n if (error instanceof InvalidRequestError) {\n return t`The data you submitted is invalid. Please check the form and try again.`\n }\n\n if (error instanceof AccessDeniedError) {\n return t`This authorization request has been denied. Please try again.`\n }\n\n if (error instanceof JsonErrorResponse) {\n return t`Unexpected server response`\n }\n\n return t`An unknown error occurred`\n}\n","import { Trans } from '@lingui/react/macro'\nimport { clsx } from 'clsx'\nimport { JSX, useMemo } from 'react'\nimport { JsonErrorResponse } from '#/lib/json-client.ts'\nimport { Override } from '#/lib/util.ts'\n\nexport type ParsedError = {\n name: string\n code?: string\n message?: string\n details?: string\n}\n\n// @TODO this should me moved out of utils and be more specific to API errors\nexport function apiErrorParser(error: unknown): ParsedError | void {\n if (error instanceof JsonErrorResponse) {\n return {\n name: error.name,\n code: error.error,\n message: error.description,\n details: toJsonSafe(error.payload),\n }\n }\n}\n\nexport type ErrorDetailsProps = Override<\n JSX.IntrinsicElements['dl'],\n {\n error: unknown\n parser?: (error: unknown) => ParsedError | void\n }\n>\n\nexport function ErrorDetails({\n error,\n parser = apiErrorParser,\n className,\n ...props\n}: ErrorDetailsProps) {\n const parsed = useMemo<ParsedError>(() => {\n const parsed = parser?.(error)\n if (parsed) return parsed\n\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n details: error.stack,\n }\n }\n\n return {\n name: 'UnknownError',\n details: toJsonSafe(error),\n }\n }, [error, parser])\n\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 <dt className=\"font-semibold\">\n <Trans>Name</Trans>\n </dt>\n <dd>\n <code>{parsed.name}</code>\n </dd>\n\n {parsed.code && (\n <>\n <dt className=\"font-semibold\">\n <Trans>Code</Trans>\n </dt>\n <dd>\n <code>{parsed.code}</code>\n </dd>\n </>\n )}\n\n {parsed.message && (\n <>\n <dt className=\"font-semibold\">\n <Trans>Message</Trans>\n </dt>\n <dd>{parsed.message}</dd>\n </>\n )}\n\n {parsed.details && (\n <>\n <dt className=\"font-semibold\">\n <Trans>Stack</Trans>\n </dt>\n <dd className=\"max-h-[200px] overflow-auto\">\n <code>\n <pre>{parsed.details}</pre>\n </code>\n </dd>\n </>\n )}\n </dl>\n )\n}\n\nfunction toJsonSafe(value: unknown): string | undefined {\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return undefined\n }\n}\n","import { Trans } from '@lingui/react/macro'\nimport { ReactNode, useEffect, useState } from 'react'\nimport { useErrorMessage } from '#/hooks/use-error-message.ts'\nimport { Action, Admonition } from './admonition.tsx'\nimport { ErrorDetails } from './error-details.tsx'\n\nexport type ErrorCardProps = {\n className?: string\n children?: ReactNode\n error: unknown\n reset?: () => void\n}\n\nexport function ErrorCard({\n error,\n reset,\n className,\n children,\n}: ErrorCardProps) {\n const [inputCount, setInputCount] = useState(0)\n // Every 5th input will toggle showing the details\n const showDetails = ((inputCount / 5) | 0) % 2 === 1\n\n const errorMessage = useErrorMessage(error)\n\n useEffect(() => {\n // For debugging purposes\n console.warn('Displayed error details:', error)\n\n // Reset the input count when the error changes\n setInputCount(0)\n }, [error])\n\n return (\n <Admonition\n role=\"alert\"\n className={className}\n onClick={() => setInputCount((c) => c + 1)}\n title={errorMessage}\n append={showDetails && <ErrorDetails error={error} />}\n action={\n reset != null && (\n <Action onClick={() => reset()}>\n <Trans>Retry</Trans>\n </Action>\n )\n }\n >\n {children}\n </Admonition>\n )\n}\n\nexport const errorCardRender = (props: ErrorCardProps) => (\n <ErrorCard {...props} />\n)\n","import { msg } from '@lingui/core/macro'\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 className=\"mx-5\" error={error} reset={reset} />\n </div>\n </LayoutApp>\n )\n}\n\nexport const errorViewRender = (props: ErrorViewProps) => (\n <ErrorView {...props} />\n)\n"],"names":["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","value","entries","searchParams","set","body","JSON","stringify","undefined","headersEntries","_b","_a","headers","Headers","entry","has","response","mode","signal","status","responseType","get","cancel","Error","cause","json","ok","parseError","err","context","warn","onFetchError","error","JsonErrorResponse","is","payload","message","error_description","description","CSRF_COOKIE_NAME","CSRF_HEADER_NAME","API_ENDPOINT_PREFIX","Api","window","origin","toString","UnauthorizedError","SecondAuthenticationFactorRequiredError","InvalidCredentialsError","InvalidInviteCodeError","HandleUnavailableError","EmailTakenError","RequestExpiredError","UnknownRequestUriError","InvalidRequestError","AccessDeniedError","startsWith","reason","type","hint","useErrorMessage","useLingui","$__i18n","apiErrorParser","code","details","toJsonSafe","ErrorDetails","parser","className","props","parsed","useMemo","stack","dl","clsx","dt","Trans_","dd","_jsxs","_Fragment","pre","ErrorCard","reset","children","inputCount","setInputCount","useState","showDetails","errorMessage","useEffect","Admonition","role","onClick","c","title","append","_jsx","action","Action","errorCardRender","ErrorView","LayoutApp","div","errorViewRender"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as s,j as e,c as f}from"./admonition-
|
|
2
|
-
//# sourceMappingURL=form-card-
|
|
1
|
+
import{r as s,j as e,c as f}from"./admonition-yRjCycmU.js";const t=s.createContext({disabled:!1});t.displayName="FormContext";function p(){return s.useContext(t)}function v({actions:r,cancel:a,append:x,children:d,prepend:l,disabled:o=!1,inert:c=o,className:i,...m}){const n=o||c,u=s.useMemo(()=>({disabled:n}),[n]);return e.jsx("form",{inert:c,className:f("flex flex-col gap-4",i),...m,children:e.jsxs(t,{value:u,children:[l&&e.jsx("div",{children:l},"prepend"),e.jsx("div",{className:"space-y-4",children:d},"children"),x&&e.jsx("div",{children:x},"append"),(r||a)&&e.jsxs("div",{className:"flex flex-row-reverse flex-wrap items-center justify-end space-x-2 space-x-reverse",children:[r,e.jsx("div",{className:"flex-auto"}),a]},"buttons")]})})}export{v as F,p as u};
|
|
2
|
+
//# sourceMappingURL=form-card-CGJ-DqBg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-card-
|
|
1
|
+
{"version":3,"file":"form-card-CGJ-DqBg.js","sources":["../src/components/forms/form-card.tsx"],"sourcesContent":["import { clsx } from 'clsx'\nimport { JSX, ReactNode, createContext, useContext, useMemo } from 'react'\nimport { Override } from '#/lib/util.ts'\n\nexport type FormContextValue = {\n disabled: boolean\n}\n\nexport const FormContext = createContext<FormContextValue>({\n disabled: false,\n})\nFormContext.displayName = 'FormContext'\n\nexport function useFormContext() {\n return useContext(FormContext)\n}\n\nexport type FormCardProps = Override<\n JSX.IntrinsicElements['form'],\n {\n disabled?: boolean\n append?: ReactNode\n prepend?: ReactNode\n cancel?: ReactNode\n actions?: ReactNode\n }\n>\n\nexport function FormCard({\n actions,\n cancel,\n append,\n children,\n prepend,\n disabled: disabledProp = false,\n\n // form\n inert = disabledProp,\n className,\n ...props\n}: FormCardProps) {\n // The form is disabled when either the `disabled` or `inert` prop is true.\n const disabled = disabledProp || inert\n\n const contextValue = useMemo<FormContextValue>(\n () => ({ disabled }),\n [disabled],\n )\n\n return (\n <form\n inert={inert}\n className={clsx('flex flex-col gap-4', className)}\n {...props}\n >\n <FormContext value={contextValue}>\n {prepend && <div key=\"prepend\">{prepend}</div>}\n\n <div key=\"children\" className=\"space-y-4\">\n {children}\n </div>\n\n {append && <div key=\"append\">{append}</div>}\n\n {(actions || cancel) && (\n <div\n key=\"buttons\"\n className=\"flex flex-row-reverse flex-wrap items-center justify-end space-x-2 space-x-reverse\"\n >\n {actions}\n <div className=\"flex-auto\" />\n {cancel}\n </div>\n )}\n </FormContext>\n </form>\n )\n}\n"],"names":["FormContext","createContext","disabled","displayName","useFormContext","useContext","FormCard","actions","cancel","append","children","prepend","disabledProp","inert","className","props","contextValue","useMemo","form","clsx","value","div","_jsxs"],"mappings":"2DAQO,MAAMA,EAA8CC,EAAAA,cAAA,CACzDC,SAAU,EACZ,CAAE,EACFF,EAAYG,YAAc,cAEnB,SAASC,GAAAA,CACd,OAAOC,EAAAA,WAAWL,CAAAA,CACpB,CAaO,SAASM,EAAS,CACvBC,QAAAA,EACAC,OAAAA,EACAC,OAAAA,EACAC,SAAAA,EACAC,QAAAA,EACAT,SAAUU,EAAe,GAGzBC,MAAAA,EAAQD,EACRE,UAAAA,EACA,GAAGC,CACW,EAAA,CAEd,MAAMb,EAAWU,GAAgBC,EAE3BG,EAAeC,EAAAA,QACnB,KAAO,CAAEf,SAAAA,CAAAA,GACT,CAACA,CAAAA,CAAS,EAGZ,aACGgB,OAAAA,CACCL,MAAAA,EACAC,UAAWK,EAAK,sBAAuBL,CAAAA,EACtC,GAAGC,EAEJ,gBAACf,EAAAA,CAAYoB,MAAOJ,YACjBL,SAAYU,MAAAA,CAAmBV,SAAAA,GAAX,SAAA,QAEpBU,MAAAA,CAAmBP,UAAU,YAC3BJ,SAAAA,GADM,UAAA,EAIRD,SAAWY,MAAAA,CAAkBZ,SAAAA,GAAV,QAAA,GAElBF,GAAWC,IACXc,EAAA,KAACD,MAAAA,CAECP,UAAU,+FAETP,QACAc,MAAAA,CAAIP,UAAU,WAAA,GACdN,CAAAA,GALG,SAAA,CAAA,KAWhB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/oauth-provider-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Sign-in & Sign-up UI for the @atproto/oauth-provider",
|
|
6
6
|
"homepage": "https://atproto.com",
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"directory": "packages/oauth/oauth-provider-ui"
|
|
11
11
|
},
|
|
12
12
|
"engines": {
|
|
13
|
-
"node": ">=
|
|
13
|
+
"node": ">=22"
|
|
14
14
|
},
|
|
15
|
-
"type": "
|
|
15
|
+
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
"./bundle-manifest.json": {
|
|
18
18
|
"default": "./dist/bundle-manifest.json"
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"hydration-data.d.ts"
|
|
27
27
|
],
|
|
28
28
|
"optionalDependencies": {
|
|
29
|
-
"@atproto/oauth-provider-api": "0.
|
|
29
|
+
"@atproto/oauth-provider-api": "0.5.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@hcaptcha/react-hcaptcha": "^1.11.2",
|
|
@@ -52,14 +52,14 @@
|
|
|
52
52
|
"react-dom": "^19.0.0",
|
|
53
53
|
"react-error-boundary": "^5.0.0",
|
|
54
54
|
"tailwindcss": "^4.1.3",
|
|
55
|
-
"typescript": "^
|
|
55
|
+
"typescript": "^6.0.3",
|
|
56
56
|
"ua-parser-js": "^2.0.3",
|
|
57
57
|
"vite": "^6.2.0",
|
|
58
58
|
"zod": "^3.24.2",
|
|
59
|
-
"@atproto-labs/fetch": "^0.
|
|
60
|
-
"@atproto-labs/rollup-plugin-bundle-manifest": "^0.
|
|
61
|
-
"@atproto/oauth-scopes": "^0.
|
|
62
|
-
"@atproto/oauth-types": "^0.
|
|
59
|
+
"@atproto-labs/fetch": "^0.3.0",
|
|
60
|
+
"@atproto-labs/rollup-plugin-bundle-manifest": "^0.3.0",
|
|
61
|
+
"@atproto/oauth-scopes": "^0.4.0",
|
|
62
|
+
"@atproto/oauth-types": "^0.7.0"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"i18n:extract": "lingui extract --clean",
|