@clerk/shared
Version:
Internal package utils used by the Clerk SDKs
225 lines (223 loc) • 7.18 kB
JavaScript
// 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