Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/quiet-signs-peel.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
---
'@clerk/clerk-js': patch
'@clerk/backend': patch
'@clerk/shared': patch
'@clerk/clerk-react': patch
'@clerk/types': patch
'@clerk/clerk-expo': patch
---

Update jsdocs mentions of `@experimental` tag.
2 changes: 1 addition & 1 deletion .typedoc/custom-plugin.mjs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
// @ts-check
// @ts-check - Enable TypeScript checks for safer MDX post-processing and link rewriting
import { MarkdownPageEvent } from 'typedoc-plugin-markdown';

/**
Expand Down
12 changes: 9 additions & 3 deletions .typedoc/custom-theme.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -218,13 +218,19 @@ class ClerkMarkdownThemeContext extends MarkdownThemeContext {
const customizedModel = model;
customizedModel.typeParameters = undefined;

Comment thread
alexisintech marked this conversation as resolved.
// Extract the Accessors group (if any) and prevent default rendering for it
const originalGroups = customizedModel.groups;
const accessorsGroup = originalGroups?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = originalGroups?.filter(g => g.title !== 'Accessors');

// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');

// Extract the Accessors group (if any) and prevent default rendering for it
const accessorsGroup = groupsWithoutMethods?.find(g => g.title === 'Accessors');
const groupsWithoutAccessors = groupsWithoutMethods?.filter(g => g.title !== 'Accessors');
Comment on lines +223 to +229

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Hiding every “Methods” group is too broad; restrict to interfaces (extends case).

As written, you’ll also remove legitimate methods from classes. Limit the filter to interface pages only.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel?.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups?.filter(g => g.title !== 'Methods')+ : originalGroups;

Build a sample class with methods in the docs to confirm the Methods section remains visible.


🏁 Script executed:

#!/bin/bash# Locate ReflectionKind usage and import in custom-theme.mjs
grep -R "ReflectionKind" -n .typedoc/custom-theme.mjs ||true# Locate where customizedModel is defined or passed in
grep -R "customizedModel" -n .typedoc/custom-theme.mjs ||true

Length of output: 1133


Restrict “Methods” filtering to interfaces only
Only omit the “Methods” group when customizedModel.kind === ReflectionKind.Interface; leave it intact for classes.

- const groupsWithoutMethods = originalGroups?.filter(g => g.title !== 'Methods');+ const isInterface = customizedModel.kind === ReflectionKind.Interface;+ const groupsWithoutMethods = isInterface+ ? originalGroups.filter(g => g.title !== 'Methods')+ : originalGroups;

[matches .typedoc/custom-theme.mjs:243]

📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constgroupsWithoutMethods=originalGroups?.filter(g=>g.title!=='Methods');
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
// When an interface extends another interface, typedoc will generate a "Methods" group
// We want to hide this group from being rendered
constisInterface=customizedModel.kind===ReflectionKind.Interface;
constgroupsWithoutMethods=isInterface
? originalGroups.filter(g=>g.title!=='Methods')
: originalGroups;
// Extract the Accessors group (if any) and prevent default rendering for it
constaccessorsGroup=groupsWithoutMethods?.find(g=>g.title==='Accessors');
constgroupsWithoutAccessors=groupsWithoutMethods?.filter(g=>g.title!=='Accessors');
🤖 Prompt for AI Agents
In .typedoc/custom-theme.mjs around lines 243 to 249, the current code always
filters out the "Methods" group; change this to only filter when the model is an
interface by wrapping the "Methods" removal in a conditional that checks if
customizedModel.kind === ReflectionKind.Interface (ensure ReflectionKind is
imported/available in this module). Leave the "Accessors" extraction and
subsequent filtering unchanged so accessors are still handled the same way.


customizedModel.groups = groupsWithoutAccessors;
const nonAccessorOutput = superPartials.memberWithGroups(customizedModel, options);

customizedModel.groups = originalGroups;

/** @type {string[]} */
Expand Down
15 changes: 5 additions & 10 deletions packages/backend/src/api/endpoints/BillingApi.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,7 @@ type ExtendSubscriptionItemFreeTrialParams = {

export class BillingAPI extends AbstractAPI {
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getPlanList(params?: GetOrganizationListParams) {
return this.request<PaginatedResourceResponse<CommercePlan[]>>({
Expand All@@ -45,8 +44,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async cancelSubscriptionItem(subscriptionItemId: string, params?: CancelSubscriptionItemParams) {
this.requireId(subscriptionItemId);
Expand All@@ -58,8 +56,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async extendSubscriptionItemFreeTrial(
subscriptionItemId: string,
Expand All@@ -74,8 +71,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getOrganizationBillingSubscription(organizationId: string) {
this.requireId(organizationId);
Expand All@@ -86,8 +82,7 @@ export class BillingAPI extends AbstractAPI {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
public async getUserBillingSubscription(userId: string) {
this.requireId(userId);
Expand Down
3 changes: 1 addition & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -54,8 +54,7 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
betaFeatures: new BetaFeaturesAPI(request),
blocklistIdentifiers: new BlocklistIdentifierAPI(request),
/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
billing: new BillingAPI(request),
clients: new ClientAPI(request),
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommercePlan.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { Feature } from './Feature';
import type { CommercePlanJSON } from './JSON';

/**
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommercePlan` object is similar to the [`CommercePlanResource`](/docs/references/javascript/types/commerce-plan-resource) object as it holds information about a plan, as well as methods for managing it. However, the `CommercePlan` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/plans) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommercePlan {
constructor(
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/api/resources/CommerceSubscription.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommerceSubscriptionItem } from './CommerceSubscriptionItem';
import type { CommerceSubscriptionJSON } from './JSON';

/**
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscription` object is similar to the [`CommerceSubscriptionResource`](/docs/references/javascript/types/commerce-subscription-resource) object as it holds information about a subscription, as well as methods for managing it. However, the `CommerceSubscription` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/billing/get/organizations/%7Borganization_id%7D/billing/subscription) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscription {
constructor(
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,9 +4,9 @@ import { CommercePlan } from './CommercePlan';
import type { CommerceSubscriptionItemJSON } from './JSON';

/**
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items){{ target: '_blank' }} and is not directly accessible from the Frontend API.
* The `CommerceSubscriptionItem` object is similar to the [`CommerceSubscriptionItemResource`](/docs/references/javascript/types/commerce-subscription-item-resource) object as it holds information about a subscription item, as well as methods for managing it. However, the `CommerceSubscriptionItem` object is different in that it is used in the [Backend API](https://clerk.com/docs/reference/backend-api/tag/commerce/get/commerce/subscription_items) and is not directly accessible from the Frontend API.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class CommerceSubscriptionItem {
constructor(
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/src/api/resources/Feature.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@ import type { FeatureJSON } from './JSON';
/**
* The `Feature` object represents a feature of a subscription plan.
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export class Feature {
constructor(
Expand Down
6 changes: 2 additions & 4 deletions packages/backend/src/api/resources/JSON.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -828,8 +828,7 @@ export interface FeatureJSON extends ClerkResourceJSON {
}

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommercePlanJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommercePlan;
Expand DownExpand Up@@ -860,8 +859,7 @@ type CommerceSubscriptionItemStatus =
| 'upcoming';

/**
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
* It is advised to pin the SDK version to avoid breaking changes.
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export interface CommerceSubscriptionItemJSON extends ClerkResourceJSON {
object: typeof ObjectType.CommerceSubscriptionItem;
Expand Down
6 changes: 2 additions & 4 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1158,8 +1158,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Mount a api keys component at the target element.
* @param targetNode Target to mount the APIKeys component.
Expand DownExpand Up@@ -1201,8 +1200,7 @@ export class Clerk implements ClerkInterface {
};

/**
* @experimental
* This API is in early access and may change in future releases.
* @experimental This API is in early access and may change in future releases.
*
* Unmount a api keys component from the target element.
* If there is no component mounted at the target node, results in a noop.
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/ClerkProvider.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,8 +23,8 @@ export type ClerkProviderProps = Without<React.ComponentProps<typeof ClerkReactP
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
/**
Expand Down
4 changes: 2 additions & 2 deletions packages/expo/src/provider/singleton/types.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ export type BuildClerkOptions = {
/**
* Note: Passkey support in Expo is currently in a limited rollout phase.
* If you're interested in using this feature, please contact us for early access or additional details.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_passkeys?: {
get: ({
Expand Down
4 changes: 3 additions & 1 deletion packages/react/src/components/CheckoutButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* A button component that opens the Clerk Checkout drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
Expand DownExpand Up@@ -43,6 +43,8 @@ import { withClerk } from './withClerk';
*
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const CheckoutButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_CheckoutButtonProps>>) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/react/src/components/PlanDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* A button component that opens the Clerk Plan Details drawer when clicked. This component is part of
* Clerk's Billing feature which is available under a public beta.
*
* @example
Expand All@@ -31,7 +31,7 @@ import { withClerk } from './withClerk';
* }
* ```
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const PlanDetailsButton = withClerk(
({ clerk, children, ...props }: WithClerkProp<React.PropsWithChildren<__experimental_PlanDetailsButtonProps>>) => {
Expand Down
5 changes: 2 additions & 3 deletions packages/react/src/components/SubscriptionDetailsButton.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,8 +7,7 @@ import { assertSingleChild, normalizeWithDefaultValue, safeExecute } from '../ut
import { withClerk } from './withClerk';

/**
* @experimental A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered
* inside a `<SignedIn />` component to ensure the user is authenticated.
* A button component that opens the Clerk Subscription Details drawer when clicked. This component must be rendered inside a `<SignedIn />` component to ensure the user is authenticated.
*
* @example
* ```tsx
Expand DownExpand Up@@ -38,7 +37,7 @@ import { withClerk } from './withClerk';
* @throws {Error} When rendered outside of a `<SignedIn />` component
* @throws {Error} When `for="organization"` is used without an active organization context
*
* @see https://clerk.com/docs/billing/overview
* @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
*/
export const SubscriptionDetailsButton = withClerk(
({
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/components/uiComponents.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -81,8 +81,8 @@ type UserButtonPropsWithoutCustomPages = Without<
userProfileProps?: Pick<UserProfileProps, 'additionalOAuthScopes' | 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand All@@ -99,6 +99,7 @@ type OrganizationSwitcherExportType = typeof _OrganizationSwitcher & {
/**
* The `<Outlet />` component can be used in conjunction with `asProvider` in order to control rendering
* of the `<OrganizationSwitcher />` without affecting its configuration or any custom pages that could be mounted
*
* @experimental This API is experimental and may change at any moment.
*/
__experimental_Outlet: typeof OrganizationSwitcherOutlet;
Expand All@@ -111,8 +112,8 @@ type OrganizationSwitcherPropsWithoutCustomPages = Without<
organizationProfileProps?: Pick<OrganizationProfileProps, 'appearance'>;
/**
* Adding `asProvider` will defer rendering until the `<Outlet />` component is mounted.
* This API is experimental and may change at any moment.
* @experimental
*
* @experimental This API is experimental and may change at any moment.
* @default undefined
*/
__experimental_asProvider?: boolean;
Expand DownExpand Up@@ -609,8 +610,7 @@ export const PricingTable = withClerk(
);

/**
* @experimental
* This component is in early access and may change in future releases.
* @experimental This component is in early access and may change in future releases.
*/
export const APIKeys = withClerk(
({ clerk, component, fallback, ...props }: WithClerkProp<APIKeysProps & FallbackProp>) => {
Expand Down
Loading
Loading