diff --git a/.changeset/eighty-cobras-matter.md b/.changeset/eighty-cobras-matter.md new file mode 100644 index 0000000000..ffc96feab5 --- /dev/null +++ b/.changeset/eighty-cobras-matter.md @@ -0,0 +1,17 @@ +--- +'@clerk/clerk-js': patch +'@clerk/backend': patch +'@clerk/shared': patch +'@clerk/clerk-react': patch +--- + +Apply deprecation warnings for @clerk/types: + +- `orgs` jwt claims +- `apiKey` +- `frontendApi` +- `redirect_url` +- `password` +- `generateSignature` +- `afterSwitchOrganizationUrl` +- `profileImageUrl` diff --git a/packages/backend/src/redirections.ts b/packages/backend/src/redirections.ts index d5a9687777..7a6f2dbcaf 100644 --- a/packages/backend/src/redirections.ts +++ b/packages/backend/src/redirections.ts @@ -40,7 +40,7 @@ export function redirect({ redirectAdapter, signUpUrl, signInUrl, frontendApi, p if (!frontendApi) { frontendApi = parsePublishableKey(publishableKey)?.frontendApi; } else { - deprecated('frontentApi', 'Use `publishableKey` instead.'); + deprecated('frontendApi', 'Use `publishableKey` instead.'); } const accountsBaseUrl = buildAccountsBaseUrl(frontendApi); diff --git a/packages/backend/src/tokens/authObjects.ts b/packages/backend/src/tokens/authObjects.ts index dcdfce2c0a..bd2e5bcb72 100644 --- a/packages/backend/src/tokens/authObjects.ts +++ b/packages/backend/src/tokens/authObjects.ts @@ -1,3 +1,4 @@ +import { deprecated } from '@clerk/shared'; import type { ActClaim, JwtPayload, ServerGetToken, ServerGetTokenOptions } from '@clerk/types'; import type { Organization, Session, User } from '../api'; @@ -80,6 +81,10 @@ export function signedInAuthObject( } = sessionClaims; const { apiKey, secretKey, apiUrl, apiVersion, token, session, user, organization } = options; + if (apiKey) { + deprecated('apiKey', 'Use `secretKey` instead.'); + } + const { sessions } = createBackendApiClient({ apiKey, secretKey, @@ -110,6 +115,10 @@ export function signedInAuthObject( } export function signedOutAuthObject(debugData?: AuthObjectDebugData): SignedOutAuthObject { + if (debugData?.apiKey) { + deprecated('apiKey', 'Use `secretKey` instead.'); + } + return { sessionClaims: null, sessionId: null, diff --git a/packages/backend/src/tokens/interstitial.ts b/packages/backend/src/tokens/interstitial.ts index 64721a06db..5d0e1b93d8 100644 --- a/packages/backend/src/tokens/interstitial.ts +++ b/packages/backend/src/tokens/interstitial.ts @@ -35,7 +35,7 @@ export type LoadInterstitialOptions = { export function loadInterstitialFromLocal(options: Omit) { if (options.frontendApi) { - deprecated('frontentApi', 'Use `publishableKey` instead.'); + deprecated('frontendApi', 'Use `publishableKey` instead.'); } if (options.pkgVersion) { deprecated('pkgVersion', 'Use `clerkJSVersion` instead.'); @@ -135,7 +135,7 @@ export function loadInterstitialFromLocal(options: Omit => { const { signature, generateSignature } = params || {}; + if (generateSignature) { + deprecated('generateSignature', 'Use signature field instead.'); + } + if (signature) { return this.attemptVerification({ signature, strategy: 'web3_metamask_signature' }); } diff --git a/packages/clerk-js/src/core/resources/User.ts b/packages/clerk-js/src/core/resources/User.ts index 8c46dca10a..31898f8b75 100644 --- a/packages/clerk-js/src/core/resources/User.ts +++ b/packages/clerk-js/src/core/resources/User.ts @@ -1,3 +1,4 @@ +import { deprecated } from '@clerk/shared'; import { deprecatedProperty } from '@clerk/shared'; import type { BackupCodeJSON, @@ -154,6 +155,9 @@ export class User extends BaseResource implements UserResource { createExternalAccount = async (params: CreateExternalAccountParams): Promise => { const { strategy, redirectUrl, additionalScopes, redirect_url } = params || {}; + if (redirect_url) { + deprecated('redirect_url', 'Use `redirectUrl` instead.'); + } const json = ( await BaseResource._fetch({ @@ -216,6 +220,12 @@ export class User extends BaseResource implements UserResource { }; update = (params: UpdateUserParams): Promise => { + if (params.password) { + deprecated( + 'password', + 'This will be removed in the next major version. Please use `updatePassword(params)` instead.', + ); + } return this._basePatch({ body: normalizeUnsafeMetadata(params), }); diff --git a/packages/clerk-js/src/core/resources/UserData.ts b/packages/clerk-js/src/core/resources/UserData.ts new file mode 100644 index 0000000000..f19e284d24 --- /dev/null +++ b/packages/clerk-js/src/core/resources/UserData.ts @@ -0,0 +1,32 @@ +import { deprecatedProperty } from '@clerk/shared'; +import type { UserData as IUserData } from '@clerk/types'; +import type { UserDataJSON } from '@clerk/types'; + +export class UserData implements IUserData { + firstName?: string; + lastName?: string; + /** + * @deprecated Use `imageUrl` instead. + */ + profileImageUrl?: string; + imageUrl?: string; + hasImage?: boolean; + + constructor(data: UserDataJSON) { + this.fromJSON(data); + } + + protected fromJSON(data: UserDataJSON | null): this { + if (data) { + this.firstName = data.first_name; + this.lastName = data.last_name; + this.profileImageUrl = data.profile_image_url; + this.imageUrl = data.image_url; + this.hasImage = data.has_image; + } + + return this; + } +} + +deprecatedProperty(UserData, 'profileImageUrl', 'Use `imageUrl` instead.'); diff --git a/packages/clerk-js/src/core/resources/Web3Wallet.ts b/packages/clerk-js/src/core/resources/Web3Wallet.ts index f5e58253e8..3359495db5 100644 --- a/packages/clerk-js/src/core/resources/Web3Wallet.ts +++ b/packages/clerk-js/src/core/resources/Web3Wallet.ts @@ -1,3 +1,4 @@ +import { deprecated } from '@clerk/shared'; import type { AttemptWeb3WalletVerificationParams, PrepareWeb3WalletVerificationParams, @@ -37,6 +38,10 @@ export class Web3Wallet extends BaseResource implements Web3WalletResource { attemptVerification = (params: AttemptWeb3WalletVerificationParams): Promise => { const { signature, generateSignature } = params || {}; + if (generateSignature) { + deprecated('generateSignature', 'Use signature field instead.'); + } + if (signature) { return this._basePost({ action: 'attempt_verification', diff --git a/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembership.test.ts.snap b/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembership.test.ts.snap index 9dc12dad15..d0d745fea4 100644 --- a/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembership.test.ts.snap +++ b/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembership.test.ts.snap @@ -41,7 +41,7 @@ OrganizationMembership { "publicMetadata": { "foo": "bar", }, - "publicUserData": OrganizationPublicUserData { + "publicUserData": PublicUserData { "firstName": "test_first_name", "hasImage": true, "identifier": "test@identifier.gr", diff --git a/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembershipRequest.test.ts.snap b/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembershipRequest.test.ts.snap index f448ff5831..57cabd7dc0 100644 --- a/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembershipRequest.test.ts.snap +++ b/packages/clerk-js/src/core/resources/__snapshots__/OrganizationMembershipRequest.test.ts.snap @@ -7,7 +7,7 @@ OrganizationMembershipRequest { "id": "test_id", "organizationId": "test_org_id", "pathRoot": "", - "publicUserData": OrganizationPublicUserData { + "publicUserData": PublicUserData { "firstName": "test_first_name", "hasImage": true, "identifier": "test@identifier.gr", diff --git a/packages/clerk-js/src/core/resources/internal.ts b/packages/clerk-js/src/core/resources/internal.ts index f7189e6b0a..77986c11b2 100644 --- a/packages/clerk-js/src/core/resources/internal.ts +++ b/packages/clerk-js/src/core/resources/internal.ts @@ -17,12 +17,13 @@ export * from './OrganizationDomain'; export * from './OrganizationInvitation'; export * from './OrganizationMembership'; export * from './OrganizationMembershipRequest'; -export * from './OrganizationPublicUserData'; export * from './OrganizationSuggestion'; export * from './SamlAccount'; export * from './Session'; +export * from './PublicUserData'; export * from './SessionWithActivities'; export * from './SignIn'; +export * from './UserData'; export * from './SignUp'; export * from './Token'; export * from './TOTP'; diff --git a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx index 98ed7863ed..07ef3640e9 100644 --- a/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx +++ b/packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx @@ -1,4 +1,4 @@ -import { snakeToCamel } from '@clerk/shared'; +import { deprecated, snakeToCamel } from '@clerk/shared'; import type { OrganizationResource, UserResource } from '@clerk/types'; import React, { useMemo } from 'react'; @@ -294,6 +294,7 @@ export const useOrganizationSwitcherContext = () => { // Continue to support afterSwitchOrganizationUrl if (ctx.afterSwitchOrganizationUrl) { + deprecated('afterSwitchOrganizationUrl', 'Use `afterSelectOrganizationUrl` or `afterSelectPersonalUrl`'); return navigate(ctx.afterSwitchOrganizationUrl); } diff --git a/packages/clerk-js/src/utils/jwt.ts b/packages/clerk-js/src/utils/jwt.ts index eb89046e66..2177dbd4c0 100644 --- a/packages/clerk-js/src/utils/jwt.ts +++ b/packages/clerk-js/src/utils/jwt.ts @@ -1,3 +1,4 @@ +import { deprecatedObjectProperty } from '@clerk/shared'; import type { JWT, JWTClaims } from '@clerk/types'; import { urlDecodeB64 } from './encoders'; @@ -17,9 +18,18 @@ export function decode(token: string): JWT { claims[k] = payloadJSON[k]; }); - return { + const decodedToken = { encoded: { header, payload, signature }, header: JSON.parse(urlDecodeB64(header)), claims, }; + + deprecatedObjectProperty( + decodedToken, + 'orgs', + 'Add orgs to your session token using the "user.organizations" shortcode in JWT Templates instead.', + 'decode:orgs', + ); + + return decodedToken; } diff --git a/packages/react/src/contexts/ClerkContextProvider.tsx b/packages/react/src/contexts/ClerkContextProvider.tsx index 5973c95576..84948aff11 100644 --- a/packages/react/src/contexts/ClerkContextProvider.tsx +++ b/packages/react/src/contexts/ClerkContextProvider.tsx @@ -1,3 +1,4 @@ +import { deprecated } from '@clerk/shared'; import type { ClientResource, InitialState, Resources } from '@clerk/types'; import React from 'react'; @@ -23,6 +24,10 @@ export function ClerkContextProvider(props: ClerkContextProvider): JSX.Element | const { isomorphicClerkOptions, initialState, children } = props; const { isomorphicClerk: clerk, loaded: clerkLoaded } = useLoadedIsomorphicClerk(isomorphicClerkOptions); + if (isomorphicClerkOptions.frontendApi) { + deprecated('frontendApi', 'Use `publishableKey` instead.'); + } + const [state, setState] = React.useState({ client: clerk.client as ClientResource, session: clerk.session, diff --git a/packages/shared/src/utils/deprecated.ts b/packages/shared/src/utils/deprecated.ts index 1392fb2a53..19ea73cb5c 100644 --- a/packages/shared/src/utils/deprecated.ts +++ b/packages/shared/src/utils/deprecated.ts @@ -81,6 +81,20 @@ export const deprecatedProperty = (cls: AnyClass, propName: string, warning: str * * deprecatedObjectProperty(obj, 'something', 'Use `somethingElse` instead.'); */ -export const deprecatedObjectProperty = (obj: Record, propName: string, warning: string): void => { - deprecatedProperty(obj as any, propName, warning, true); +export const deprecatedObjectProperty = ( + obj: Record, + propName: string, + warning: string, + key?: string, +): void => { + let value = obj[propName]; + Object.defineProperty(obj, propName, { + get() { + deprecated(propName, warning, key); + return value; + }, + set(v: unknown) { + value = v; + }, + }); };