From 6bb96e8843cf23be798ca2b220b3561f603430d7 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Tue, 9 Jan 2024 05:05:50 +0200 Subject: [PATCH 1/2] feat(backend): Replace enums with `as const` objects --- packages/backend/src/api/resources/JSON.ts | 88 +++++++++++----------- packages/backend/src/errors.ts | 55 ++++++++------ packages/backend/src/tokens/authStatus.ts | 42 ++++++----- 3 files changed, 98 insertions(+), 87 deletions(-) diff --git a/packages/backend/src/api/resources/JSON.ts b/packages/backend/src/api/resources/JSON.ts index 4eb29e7454b..d2101a29749 100644 --- a/packages/backend/src/api/resources/JSON.ts +++ b/packages/backend/src/api/resources/JSON.ts @@ -7,31 +7,33 @@ import type { SignUpStatus, } from './Enums'; -export enum ObjectType { - AllowlistIdentifier = 'allowlist_identifier', - Client = 'client', - Email = 'email', - EmailAddress = 'email_address', - ExternalAccount = 'external_account', - FacebookAccount = 'facebook_account', - GoogleAccount = 'google_account', - Invitation = 'invitation', - OauthAccessToken = 'oauth_access_token', - Organization = 'organization', - OrganizationInvitation = 'organization_invitation', - OrganizationMembership = 'organization_membership', - PhoneNumber = 'phone_number', - RedirectUrl = 'redirect_url', - Session = 'session', - SignInAttempt = 'sign_in_attempt', - SignInToken = 'sign_in_token', - SignUpAttempt = 'sign_up_attempt', - SmsMessage = 'sms_message', - User = 'user', - Web3Wallet = 'web3_wallet', - Token = 'token', - TotalCount = 'total_count', -} +export const ObjectType = { + AllowlistIdentifier: 'allowlist_identifier', + Client: 'client', + Email: 'email', + EmailAddress: 'email_address', + ExternalAccount: 'external_account', + FacebookAccount: 'facebook_account', + GoogleAccount: 'google_account', + Invitation: 'invitation', + OauthAccessToken: 'oauth_access_token', + Organization: 'organization', + OrganizationInvitation: 'organization_invitation', + OrganizationMembership: 'organization_membership', + PhoneNumber: 'phone_number', + RedirectUrl: 'redirect_url', + Session: 'session', + SignInAttempt: 'sign_in_attempt', + SignInToken: 'sign_in_token', + SignUpAttempt: 'sign_up_attempt', + SmsMessage: 'sms_message', + User: 'user', + Web3Wallet: 'web3_wallet', + Token: 'token', + TotalCount: 'total_count', +} as const; + +export type ObjectType = (typeof ObjectType)[keyof typeof ObjectType]; export interface ClerkResourceJSON { object: ObjectType; @@ -39,12 +41,12 @@ export interface ClerkResourceJSON { } export interface TokenJSON { - object: ObjectType.Token; + object: typeof ObjectType.Token; jwt: string; } export interface AllowlistIdentifierJSON extends ClerkResourceJSON { - object: ObjectType.AllowlistIdentifier; + object: typeof ObjectType.AllowlistIdentifier; identifier: string; created_at: number; updated_at: number; @@ -52,7 +54,7 @@ export interface AllowlistIdentifierJSON extends ClerkResourceJSON { } export interface ClientJSON extends ClerkResourceJSON { - object: ObjectType.Client; + object: typeof ObjectType.Client; session_ids: string[]; sessions: SessionJSON[]; sign_in_id: string | null; @@ -63,7 +65,7 @@ export interface ClientJSON extends ClerkResourceJSON { } export interface EmailJSON extends ClerkResourceJSON { - object: ObjectType.Email; + object: typeof ObjectType.Email; from_email_name: string; to_email_address?: string; email_address_id: string | null; @@ -77,14 +79,14 @@ export interface EmailJSON extends ClerkResourceJSON { } export interface EmailAddressJSON extends ClerkResourceJSON { - object: ObjectType.EmailAddress; + object: typeof ObjectType.EmailAddress; email_address: string; verification: VerificationJSON | null; linked_to: IdentificationLinkJSON[]; } export interface ExternalAccountJSON extends ClerkResourceJSON { - object: ObjectType.ExternalAccount; + object: typeof ObjectType.ExternalAccount; provider: string; identification_id: string; provider_user_id: string; @@ -104,7 +106,7 @@ export interface IdentificationLinkJSON extends ClerkResourceJSON { } export interface InvitationJSON extends ClerkResourceJSON { - object: ObjectType.Invitation; + object: typeof ObjectType.Invitation; email_address: string; public_metadata: Record | null; created_at: number; @@ -114,7 +116,7 @@ export interface InvitationJSON extends ClerkResourceJSON { } export interface OauthAccessTokenJSON { - object: ObjectType.OauthAccessToken; + object: typeof ObjectType.OauthAccessToken; provider: string; token: string; public_metadata: Record; @@ -126,7 +128,7 @@ export interface OauthAccessTokenJSON { } export interface OrganizationJSON extends ClerkResourceJSON { - object: ObjectType.Organization; + object: typeof ObjectType.Organization; name: string; slug: string | null; image_url: string; @@ -153,7 +155,7 @@ export interface OrganizationInvitationJSON extends ClerkResourceJSON { } export interface OrganizationMembershipJSON extends ClerkResourceJSON { - object: ObjectType.OrganizationMembership; + object: typeof ObjectType.OrganizationMembership; organization: OrganizationJSON; public_metadata: OrganizationMembershipPublicMetadata; private_metadata?: OrganizationMembershipPrivateMetadata; @@ -173,7 +175,7 @@ export interface OrganizationMembershipPublicUserDataJSON { } export interface PhoneNumberJSON extends ClerkResourceJSON { - object: ObjectType.PhoneNumber; + object: typeof ObjectType.PhoneNumber; phone_number: string; reserved_for_second_factor: boolean; default_second_factor: boolean; @@ -182,14 +184,14 @@ export interface PhoneNumberJSON extends ClerkResourceJSON { } export interface RedirectUrlJSON extends ClerkResourceJSON { - object: ObjectType.RedirectUrl; + object: typeof ObjectType.RedirectUrl; url: string; created_at: number; updated_at: number; } export interface SessionJSON extends ClerkResourceJSON { - object: ObjectType.Session; + object: typeof ObjectType.Session; client_id: string; user_id: string; status: string; @@ -201,7 +203,7 @@ export interface SessionJSON extends ClerkResourceJSON { } export interface SignInJSON extends ClerkResourceJSON { - object: ObjectType.SignInToken; + object: typeof ObjectType.SignInToken; status: SignInStatus; identifier: string; created_session_id: string | null; @@ -217,7 +219,7 @@ export interface SignInTokenJSON extends ClerkResourceJSON { } export interface SignUpJSON extends ClerkResourceJSON { - object: ObjectType.SignUpAttempt; + object: typeof ObjectType.SignUpAttempt; status: SignUpStatus; attribute_requirements: SignUpAttributeRequirements; username: string | null; @@ -234,7 +236,7 @@ export interface SignUpJSON extends ClerkResourceJSON { } export interface SMSMessageJSON extends ClerkResourceJSON { - object: ObjectType.SmsMessage; + object: typeof ObjectType.SmsMessage; from_phone_number: string; to_phone_number: string; phone_number_id: string | null; @@ -244,7 +246,7 @@ export interface SMSMessageJSON extends ClerkResourceJSON { } export interface UserJSON extends ClerkResourceJSON { - object: ObjectType.User; + object: typeof ObjectType.User; username: string | null; first_name: string; last_name: string; @@ -287,7 +289,7 @@ export interface VerificationJSON extends ClerkResourceJSON { } export interface Web3WalletJSON extends ClerkResourceJSON { - object: ObjectType.Web3Wallet; + object: typeof ObjectType.Web3Wallet; web3_wallet: string; verification: VerificationJSON | null; } diff --git a/packages/backend/src/errors.ts b/packages/backend/src/errors.ts index 32bf6fe170c..3c22894d446 100644 --- a/packages/backend/src/errors.ts +++ b/packages/backend/src/errors.ts @@ -1,35 +1,40 @@ export type TokenCarrier = 'header' | 'cookie'; -export enum TokenVerificationErrorCode { - InvalidSecretKey = 'clerk_key_invalid', -} +export const TokenVerificationErrorCode = { + InvalidSecretKey: 'clerk_key_invalid', +}; -export enum TokenVerificationErrorReason { - TokenExpired = 'token-expired', - TokenInvalid = 'token-invalid', - TokenInvalidAlgorithm = 'token-invalid-algorithm', - TokenInvalidAuthorizedParties = 'token-invalid-authorized-parties', - TokenInvalidSignature = 'token-invalid-signature', - TokenNotActiveYet = 'token-not-active-yet', - TokenVerificationFailed = 'token-verification-failed', - InvalidSecretKey = 'secret-key-invalid', +export type TokenVerificationErrorCode = (typeof TokenVerificationErrorCode)[keyof typeof TokenVerificationErrorCode]; - LocalJWKMissing = 'jwk-local-missing', +export const TokenVerificationErrorReason = { + TokenExpired: 'token-expired', + TokenInvalid: 'token-invalid', + TokenInvalidAlgorithm: 'token-invalid-algorithm', + TokenInvalidAuthorizedParties: 'token-invalid-authorized-parties', + TokenInvalidSignature: 'token-invalid-signature', + TokenNotActiveYet: 'token-not-active-yet', + TokenVerificationFailed: 'token-verification-failed', + InvalidSecretKey: 'secret-key-invalid', + LocalJWKMissing: 'jwk-local-missing', + RemoteJWKFailedToLoad: 'jwk-remote-failed-to-load', + RemoteJWKInvalid: 'jwk-remote-invalid', + RemoteJWKMissing: 'jwk-remote-missing', + JWKFailedToResolve: 'jwk-failed-to-resolve', +}; - RemoteJWKFailedToLoad = 'jwk-remote-failed-to-load', - RemoteJWKInvalid = 'jwk-remote-invalid', - RemoteJWKMissing = 'jwk-remote-missing', +export type TokenVerificationErrorReason = + (typeof TokenVerificationErrorReason)[keyof typeof TokenVerificationErrorReason]; - JWKFailedToResolve = 'jwk-failed-to-resolve', -} +export const TokenVerificationErrorAction = { + ContactSupport: 'Contact support@clerk.com', + EnsureClerkJWT: 'Make sure that this is a valid Clerk generate JWT.', + SetClerkJWTKey: 'Set the CLERK_JWT_KEY environment variable.', + SetClerkSecretKey: 'Set the CLERK_SECRET_KEY environment variable.', + EnsureClockSync: 'Make sure your system clock is in sync (e.g. turn off and on automatic time synchronization).', +}; -export enum TokenVerificationErrorAction { - ContactSupport = 'Contact support@clerk.com', - EnsureClerkJWT = 'Make sure that this is a valid Clerk generate JWT.', - SetClerkJWTKey = 'Set the CLERK_JWT_KEY environment variable.', - SetClerkSecretKey = 'Set the CLERK_SECRET_KEY environment variable.', - EnsureClockSync = 'Make sure your system clock is in sync (e.g. turn off and on automatic time synchronization).', -} +export type TokenVerificationErrorAction = + (typeof TokenVerificationErrorAction)[keyof typeof TokenVerificationErrorAction]; export class TokenVerificationError extends Error { action?: TokenVerificationErrorAction; diff --git a/packages/backend/src/tokens/authStatus.ts b/packages/backend/src/tokens/authStatus.ts index 2a914ef93a6..b8b6b2d589e 100644 --- a/packages/backend/src/tokens/authStatus.ts +++ b/packages/backend/src/tokens/authStatus.ts @@ -5,14 +5,16 @@ import type { AuthenticateContext } from './authenticateContext'; import type { SignedInAuthObject, SignedOutAuthObject } from './authObjects'; import { signedInAuthObject, signedOutAuthObject } from './authObjects'; -export enum AuthStatus { - SignedIn = 'signed-in', - SignedOut = 'signed-out', - Handshake = 'handshake', -} +export const AuthStatus = { + SignedIn: 'signed-in', + SignedOut: 'signed-out', + Handshake: 'handshake', +} as const; + +export type AuthStatus = (typeof AuthStatus)[keyof typeof AuthStatus]; export type SignedInState = { - status: AuthStatus.SignedIn; + status: typeof AuthStatus.SignedIn; reason: null; message: null; proxyUrl?: string; @@ -29,7 +31,7 @@ export type SignedInState = { }; export type SignedOutState = { - status: AuthStatus.SignedOut; + status: typeof AuthStatus.SignedOut; message: string; reason: AuthReason; proxyUrl?: string; @@ -46,22 +48,24 @@ export type SignedOutState = { }; export type HandshakeState = Omit & { - status: AuthStatus.Handshake; + status: typeof AuthStatus.Handshake; headers: Headers; toAuth: () => null; }; -export enum AuthErrorReason { - ClientUATWithoutSessionToken = 'client-uat-but-no-session-token', - DevBrowserSync = 'dev-browser-sync', - PrimaryRespondsToSyncing = 'primary-responds-to-syncing', - SatelliteCookieNeedsSyncing = 'satellite-needs-syncing', - SessionTokenAndUATMissing = 'session-token-and-uat-missing', - SessionTokenMissing = 'session-token-missing', - SessionTokenOutdated = 'session-token-outdated', - SessionTokenWithoutClientUAT = 'session-token-but-no-client-uat', - UnexpectedError = 'unexpected-error', -} +export const AuthErrorReason = { + ClientUATWithoutSessionToken: 'client-uat-but-no-session-token', + DevBrowserSync: 'dev-browser-sync', + PrimaryRespondsToSyncing: 'primary-responds-to-syncing', + SatelliteCookieNeedsSyncing: 'satellite-needs-syncing', + SessionTokenAndUATMissing: 'session-token-and-uat-missing', + SessionTokenMissing: 'session-token-missing', + SessionTokenOutdated: 'session-token-outdated', + SessionTokenWithoutClientUAT: 'session-token-but-no-client-uat', + UnexpectedError: 'unexpected-error', +} as const; + +export type AuthErrorReason = (typeof AuthErrorReason)[keyof typeof AuthErrorReason]; export type AuthReason = AuthErrorReason | TokenVerificationErrorReason; From 78378276fdd4ad84ce231e739219ef741831381b Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Tue, 9 Jan 2024 12:26:30 +0200 Subject: [PATCH 2/2] Create many-moons-matter.md --- .changeset/many-moons-matter.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/many-moons-matter.md diff --git a/.changeset/many-moons-matter.md b/.changeset/many-moons-matter.md new file mode 100644 index 00000000000..565cc2e5cf7 --- /dev/null +++ b/.changeset/many-moons-matter.md @@ -0,0 +1,5 @@ +--- +"@clerk/backend": patch +--- + +Replace enums with `as const` objects so `@clerk/backend` is consistent with the other packages