Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
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
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
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
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
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
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
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
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
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
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
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
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
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
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
22 changes: 0 additions & 22 deletions packages/backend/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -40,7 +40,6 @@ This package provides Clerk Backend API resources and low-level authentication u
- Support multiple CLERK_API_KEY for multiple instance REST access.
- Align JWT key resolution algorithm across all environments (Function param > Environment variable > JWKS from API).
- Tested automatically across different runtimes (Node, CF Workers, Vercel Edge middleware.)
- Clean up Clerk interstitial logic.
- Refactor the Rest Client API to return `{data, errors}` instead of throwing errors.
- Export a generic verifyToken for Clerk JWTs verification.
- Align AuthData interface for SSR.
Expand DownExpand Up@@ -80,7 +79,6 @@ clerk.allowlistIdentifiers;
clerk.clients;
clerk.emailAddresses;
clerk.emails;
clerk.interstitial;
clerk.invitations;
clerk.organizations;
clerk.phoneNumbers;
Expand All@@ -96,12 +94,6 @@ clerk.authenticateRequest(options);

// Build debug payload of the request state.
clerk.debugRequestState(requestState);

// Load clerk interstitial from this package
clerk.localInterstitial(options);

// Load clerk interstitial from the public Private API endpoint (Deprecated)
clerk.remotePrivateInterstitial(options);
```

#### verifyToken(token: string, options: VerifyTokenOptions)
Expand DownExpand Up@@ -161,20 +153,6 @@ import { debugRequestState } from '@clerk/backend';
debugRequestState(requestState);
```

#### loadInterstitialFromLocal(options)

Generates a debug payload for the request state. The debug payload is available via `window.__clerk_debug`.

```js
import { loadInterstitialFromLocal } from '@clerk/backend';

loadInterstitialFromLocal({
frontendApi: '...',
clerkJSVersion: '...',
debugData: {},
});
```

#### signedInAuthObject(sessionClaims, options)

Builds the AuthObject when the user is signed in.
Expand Down
21 changes: 0 additions & 21 deletions packages/backend/src/api/endpoints/InterstitialApi.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/backend/src/api/endpoints/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ export * from './ClientApi';
export * from './DomainApi';
export * from './EmailAddressApi';
export * from './EmailApi';
export * from './InterstitialApi';
export * from './InvitationApi';
export * from './OrganizationApi';
export * from './PhoneNumberApi';
Expand Down
2 changes: 0 additions & 2 deletions packages/backend/src/api/factory.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import {
DomainAPI,
EmailAddressAPI,
EmailAPI,
InterstitialAPI,
InvitationAPI,
OrganizationAPI,
PhoneNumberAPI,
Expand All@@ -27,7 +26,6 @@ export function createBackendApiClient(options: CreateBackendApiOptions) {
clients: new ClientAPI(request),
emailAddresses: new EmailAddressAPI(request),
emails: new EmailAPI(request),
interstitial: new InterstitialAPI(request),
invitations: new InvitationAPI(request),
organizations: new OrganizationAPI(request),
phoneNumbers: new PhoneNumberAPI(request),
Expand Down
1 change: 0 additions & 1 deletion packages/backend/src/exports.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,7 +44,6 @@ export default (QUnit: QUnit) => {
'decodeJwt',
'deserialize',
'hasValidSignature',
'loadInterstitialFromLocal',
'makeAuthObjectSerializable',
'prunePrivateMetadata',
'redirect',
Expand Down
95 changes: 1 addition & 94 deletions packages/backend/src/tokens/authStatus.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,9 +8,7 @@ import type { TokenVerificationErrorReason } from './errors';
export enum AuthStatus {
SignedIn = 'signed-in',
SignedOut = 'signed-out',
Interstitial = 'interstitial',
Handshake = 'handshake',
Unknown = 'unknown',
SessionTokenOutdated = 'SessionTokenOutdated',
}

Expand All@@ -27,8 +25,6 @@ export type SignedInState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: true;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedInAuthObject;
headers: Headers;
};
Expand All@@ -46,31 +42,16 @@ export type SignedOutState = {
afterSignInUrl: string;
afterSignUpUrl: string;
isSignedIn: false;
isInterstitial: false;
isUnknown: false;
toAuth: () => SignedOutAuthObject;
headers: Headers;
};

export type InterstitialState = Omit<SignedOutState, 'isInterstitial' | 'status' | 'toAuth'> & {
status: AuthStatus.Interstitial;
isInterstitial: true;
toAuth: () => null;
};

export type HandshakeState = Omit<SignedOutState, 'status' | 'toAuth'> & {
status: AuthStatus.Handshake;
headers: Headers;
isInterstitial: false;
toAuth: () => null;
};

export type UnknownState = Omit<InterstitialState, 'status' | 'isInterstitial' | 'isUnknown'> & {
status: AuthStatus.Unknown;
isInterstitial: false;
isUnknown: true;
};

export enum AuthErrorReason {
DevBrowserSync = 'dev-browser-sync',
SessionTokenMissing = 'session-token-missing',
Expand DownExpand Up@@ -98,7 +79,7 @@ export enum AuthErrorReason {

export type AuthReason = AuthErrorReason | TokenVerificationErrorReason;

export type RequestState = SignedInState | SignedOutState | InterstitialState | HandshakeState | UnknownState;
export type RequestState = SignedInState | SignedOutState | HandshakeState;

type LoadResourcesOptions = {
loadSession?: boolean;
Expand DownExpand Up@@ -200,8 +181,6 @@ export async function signedIn<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: true,
isInterstitial: false,
isUnknown: false,
toAuth: () => authObject,
headers,
};
Expand DownExpand Up@@ -236,49 +215,11 @@ export function signedOut<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: false,
headers,
toAuth: () => signedOutAuthObject({ ...options, status: AuthStatus.SignedOut, reason, message }),
};
}

export function interstitial<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
message = '',
): InterstitialState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Interstitial,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: true,
isUnknown: false,
toAuth: () => null,
headers: new Headers(),
};
}

export function handshake<T extends AuthStatusOptionsType>(
options: T,
reason: AuthReason,
Expand DownExpand Up@@ -309,41 +250,7 @@ export function handshake<T extends AuthStatusOptionsType>(
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isUnknown: false,
headers,
isInterstitial: false,
toAuth: () => null,
};
}

export function unknownState(options: AuthStatusOptionsType, reason: AuthReason, message = ''): UnknownState {
const {
publishableKey = '',
proxyUrl = '',
isSatellite = false,
domain = '',
signInUrl = '',
signUpUrl = '',
afterSignInUrl = '',
afterSignUpUrl = '',
} = options;

return {
status: AuthStatus.Unknown,
reason,
message,
publishableKey,
isSatellite,
domain,
proxyUrl,
signInUrl,
signUpUrl,
afterSignInUrl,
afterSignUpUrl,
isSignedIn: false,
isInterstitial: false,
isUnknown: true,
toAuth: () => null,
headers: new Headers(),
};
}
2 changes: 0 additions & 2 deletions packages/backend/src/tokens/errors.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,8 +21,6 @@ export enum TokenVerificationErrorReason {
RemoteJWKMissing = 'jwk-remote-missing',

JWKFailedToResolve = 'jwk-failed-to-resolve',

RemoteInterstitialFailedToLoad = 'interstitial-remote-failed-to-load',
}

export enum TokenVerificationErrorAction {
Expand Down
13 changes: 0 additions & 13 deletions packages/backend/src/tokens/factory.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
import type { ApiClient } from '../api';
import { mergePreDefinedOptions } from '../util/mergePreDefinedOptions';
import type { LoadInterstitialOptions } from './interstitial';
import { loadInterstitialFromLocal } from './interstitial';
import type { AuthenticateRequestOptions } from './request';
import { authenticateRequest as authenticateRequestOriginal, debugRequestState } from './request';

Expand DownExpand Up@@ -40,7 +38,6 @@ export type CreateAuthenticateRequestOptions = {
};

export function createAuthenticateRequest(params: CreateAuthenticateRequestOptions) {
const { apiClient } = params;
const buildTimeOptions = mergePreDefinedOptions(defaultOptions, params.options);

const authenticateRequest = (request: Request, options: RunTimeOptions = {}) => {
Expand All@@ -56,18 +53,8 @@ export function createAuthenticateRequest(params: CreateAuthenticateRequestOptio
});
};

const localInterstitial = (options: Omit<LoadInterstitialOptions, 'apiUrl'>) => {
const runTimeOptions = mergePreDefinedOptions(buildTimeOptions, options);
return loadInterstitialFromLocal({ ...options, ...runTimeOptions });
};

// TODO: Replace this function with remotePublicInterstitial
const remotePrivateInterstitial = () => apiClient.interstitial.getInterstitial();

return {
authenticateRequest,
localInterstitial,
remotePrivateInterstitial,
debugRequestState,
};
}
1 change: 0 additions & 1 deletion packages/backend/src/tokens/index.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,5 @@ export { AuthStatus } from './authStatus';
export type { RequestState } from './authStatus';
export * from './errors';
export * from './factory';
export { loadInterstitialFromLocal } from './interstitial';
export { debugRequestState } from './request';
export type { AuthenticateRequestOptions, OptionalVerifyTokenOptions } from './request';
Loading