UNPKG

@clerk/shared

Version:

Internal package utils used by the Clerk SDKs

225 lines (223 loc) • 7.18 kB
// src/error.ts function isUnauthorizedError(e) { const status = e?.status; const code = e?.errors?.[0]?.code; return code === "authentication_invalid" && status === 401; } function isCaptchaError(e) { return ["captcha_invalid", "captcha_not_enabled", "captcha_missing_token"].includes(e.errors[0].code); } function is4xxError(e) { const status = e?.status; return !!status && status >= 400 && status < 500; } function isNetworkError(e) { const message = (`${e.message}${e.name}` || "").toLowerCase().replace(/\s+/g, ""); return message.includes("networkerror"); } function isKnownError(error) { return isClerkAPIResponseError(error) || isMetamaskError(error) || isClerkRuntimeError(error); } function isClerkAPIResponseError(err) { return "clerkError" in err; } function isClerkRuntimeError(err) { return "clerkRuntimeError" in err; } function isMetamaskError(err) { return "code" in err && [4001, 32602, 32603].includes(err.code) && "message" in err; } function isUserLockedError(err) { return isClerkAPIResponseError(err) && err.errors?.[0]?.code === "user_locked"; } function isPasswordPwnedError(err) { return isClerkAPIResponseError(err) && err.errors?.[0]?.code === "form_password_pwned"; } function parseErrors(data = []) { return data.length > 0 ? data.map(parseError) : []; } function parseError(error) { return { code: error.code, message: error.message, longMessage: error.long_message, meta: { paramName: error?.meta?.param_name, sessionId: error?.meta?.session_id, emailAddresses: error?.meta?.email_addresses, identifiers: error?.meta?.identifiers, zxcvbn: error?.meta?.zxcvbn } }; } function errorToJSON(error) { return { code: error?.code || "", message: error?.message || "", long_message: error?.longMessage, meta: { param_name: error?.meta?.paramName, session_id: error?.meta?.sessionId, email_addresses: error?.meta?.emailAddresses, identifiers: error?.meta?.identifiers, zxcvbn: error?.meta?.zxcvbn } }; } var ClerkAPIResponseError = class _ClerkAPIResponseError extends Error { constructor(message, { data, status, clerkTraceId }) { super(message); this.toString = () => { let message = `[${this.name}] Message:${this.message} Status:${this.status} Serialized errors: ${this.errors.map( (e) => JSON.stringify(e) )}`; if (this.clerkTraceId) { message += ` Clerk Trace ID: ${this.clerkTraceId}`; } return message; }; Object.setPrototypeOf(this, _ClerkAPIResponseError.prototype); this.status = status; this.message = message; this.clerkTraceId = clerkTraceId; this.clerkError = true; this.errors = parseErrors(data); } }; var ClerkRuntimeError = class _ClerkRuntimeError extends Error { constructor(message, { code }) { const prefix = "\u{1F512} Clerk:"; const regex = new RegExp(prefix.replace(" ", "\\s*"), "i"); const sanitized = message.replace(regex, ""); const _message = `${prefix} ${sanitized.trim()} (code="${code}") `; super(_message); /** * Returns a string representation of the error. * * @returns {string} A formatted string with the error name and message. * @memberof ClerkRuntimeError */ this.toString = () => { return `[${this.name}] Message:${this.message}`; }; Object.setPrototypeOf(this, _ClerkRuntimeError.prototype); this.code = code; this.message = _message; this.clerkRuntimeError = true; this.name = "ClerkRuntimeError"; } }; var EmailLinkError = class _EmailLinkError extends Error { constructor(code) { super(code); this.code = code; this.name = "EmailLinkError"; Object.setPrototypeOf(this, _EmailLinkError.prototype); } }; function isEmailLinkError(err) { return err.name === "EmailLinkError"; } var EmailLinkErrorCode = { Expired: "expired", Failed: "failed", ClientMismatch: "client_mismatch" }; var EmailLinkErrorCodeStatus = { Expired: "expired", Failed: "failed", ClientMismatch: "client_mismatch" }; var DefaultMessages = Object.freeze({ InvalidProxyUrlErrorMessage: `The proxyUrl passed to Clerk is invalid. The expected value for proxyUrl is an absolute URL or a relative path with a leading '/'. (key={{url}})`, InvalidPublishableKeyErrorMessage: `The publishableKey passed to Clerk is invalid. You can get your Publishable key at https://dashboard.clerk.com/last-active?path=api-keys. (key={{key}})`, MissingPublishableKeyErrorMessage: `Missing publishableKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`, MissingSecretKeyErrorMessage: `Missing secretKey. You can get your key at https://dashboard.clerk.com/last-active?path=api-keys.`, MissingClerkProvider: `{{source}} can only be used within the <ClerkProvider /> component. Learn more: https://clerk.com/docs/components/clerk-provider` }); function buildErrorThrower({ packageName, customMessages }) { let pkg = packageName; const messages = { ...DefaultMessages, ...customMessages }; function buildMessage(rawMessage, replacements) { if (!replacements) { return `${pkg}: ${rawMessage}`; } let msg = rawMessage; const matches = rawMessage.matchAll(/{{([a-zA-Z0-9-_]+)}}/g); for (const match of matches) { const replacement = (replacements[match[1]] || "").toString(); msg = msg.replace(`{{${match[1]}}}`, replacement); } return `${pkg}: ${msg}`; } return { setPackageName({ packageName: packageName2 }) { if (typeof packageName2 === "string") { pkg = packageName2; } return this; }, setMessages({ customMessages: customMessages2 }) { Object.assign(messages, customMessages2 || {}); return this; }, throwInvalidPublishableKeyError(params) { throw new Error(buildMessage(messages.InvalidPublishableKeyErrorMessage, params)); }, throwInvalidProxyUrl(params) { throw new Error(buildMessage(messages.InvalidProxyUrlErrorMessage, params)); }, throwMissingPublishableKeyError() { throw new Error(buildMessage(messages.MissingPublishableKeyErrorMessage)); }, throwMissingSecretKeyError() { throw new Error(buildMessage(messages.MissingSecretKeyErrorMessage)); }, throwMissingClerkProviderError(params) { throw new Error(buildMessage(messages.MissingClerkProvider, params)); }, throw(message) { throw new Error(buildMessage(message)); } }; } var ClerkWebAuthnError = class extends ClerkRuntimeError { constructor(message, { code }) { super(message, { code }); this.code = code; } }; export { isUnauthorizedError, isCaptchaError, is4xxError, isNetworkError, isKnownError, isClerkAPIResponseError, isClerkRuntimeError, isMetamaskError, isUserLockedError, isPasswordPwnedError, parseErrors, parseError, errorToJSON, ClerkAPIResponseError, ClerkRuntimeError, EmailLinkError, isEmailLinkError, EmailLinkErrorCode, EmailLinkErrorCodeStatus, buildErrorThrower, ClerkWebAuthnError }; //# sourceMappingURL=chunk-MPPYFYYM.mjs.map