Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down
, '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
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down
, '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
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down
, '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
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down
, '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
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down
, '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
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down
, '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
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down
, '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
22 commits
Select commit Hold shift + click to select a range
5801a06
feat(clerk-js): Change the default path of afterSignOutUrl
octoper Nov 2, 2023
ac94a63
feat(clerk-js,shared): Use default options if nothing passed when loa…
octoper Nov 2, 2023
bb62c3c
chore(repo): Update NextJS playground
octoper Nov 2, 2023
3255cf4
chore(clerk-js): Fix typo
octoper Nov 2, 2023
b7775b3
chore(repo): Added Changeset
octoper Nov 2, 2023
0d4204e
chore(shared): Fixed types for getNonUndefinedValues and added tests
octoper Nov 7, 2023
6e4ef19
fix(remix): Utility function getEnvVariable return undefined instead …
octoper Nov 7, 2023
c856132
fix(clerk-js): Give empty object when options are undefined
octoper Nov 7, 2023
936fdf2
test(shared): Fixed test for getNonUndefinedValues utility function
octoper Nov 8, 2023
060401b
fix(clerk-js): Apply changes to ui.retheme
octoper Nov 13, 2023
016da40
fix(clerk-js): Add missing import
octoper Nov 13, 2023
6c23963
fix(clerk-js): Add missing import
octoper Nov 13, 2023
2260eb9
test(clerk-js): Update Clerk redirect tests
octoper Nov 14, 2023
c58c6f0
chore(repo): Update Changeset
octoper Nov 15, 2023
e34efdd
chore(remix): Update return type comment
octoper Nov 15, 2023
09ae7be
fix(clerk-js): Use the defaults for afterSignInUrl and afterSignUpUrl…
octoper Nov 16, 2023
58aba6a
chore(remix): Update return type of getEnvVariable utility function
octoper Nov 16, 2023
4fb3201
test(clerk-js): Update test for SignInStart component
octoper Nov 16, 2023
b47a5c0
test(clerk-js): Update test for SignInStart component in ui.retheme
octoper Nov 16, 2023
e8ebc75
feat(clerk-js): Removed display config values
octoper Nov 16, 2023
74b0d29
chore(repo): Apply Prettier formating
octoper Nov 27, 2023
59ab8ae
chore(shared): Remove unused import from tests
octoper Nov 29, 2023
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
6 changes: 6 additions & 0 deletions .changeset/spotty-boxes-do.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
'@clerk/clerk-js': major
'@clerk/shared': patch
---

Change the default behavior of `afterSignOutUrl`, `afterSignIn` and `afterSignUp` props to be redirected to `/` instead of the Account Portal defined URL.
8 changes: 2 additions & 6 deletions packages/clerk-js/src/core/clerk.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -915,13 +915,9 @@ export class Clerk implements ClerkInterface {
buildURL({ base: displayConfig.signInUrl, hashPath: '/reset-password' }, { stringify: true }),
);

const navigateAfterSignIn = makeNavigate(
params.afterSignInUrl || params.redirectUrl || displayConfig.afterSignInUrl,
);
const navigateAfterSignIn = makeNavigate(params.afterSignInUrl || params.redirectUrl || '/');

const navigateAfterSignUp = makeNavigate(
params.afterSignUpUrl || params.redirectUrl || displayConfig.afterSignUpUrl,
);
const navigateAfterSignUp = makeNavigate(params.afterSignUpUrl || params.redirectUrl || '/');

const navigateToContinueSignUp = makeNavigate(
params.continueSignUpUrl ||
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,8 +139,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,7 +18,7 @@ export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
const ctx = useSignInContext();
const signIn = useCoreSignIn();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return (
<SocialButtons
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -236,7 +236,7 @@ export function _SignInStart(): JSX.Element {

const authenticateWithSaml = async () => {
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
const redirectUrlComplete = ctx.afterSignInUrl || displayConfig.afterSignInUrl;
const redirectUrlComplete = ctx.afterSignInUrl || '/';

return signIn.authenticateWithRedirect({
strategy: 'saml',
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -138,8 +138,8 @@ describe('SignInStart', () => {
expect(fixtures.signIn.create).toHaveBeenCalled();
expect(fixtures.signIn.authenticateWithRedirect).toHaveBeenCalledWith({
strategy: 'saml',
redirectUrl: 'http://localhost/#/sso-callback',
redirectUrlComplete: 'https://dashboard.clerk.com',
redirectUrl: 'http://localhost/#/sso-callback?redirect_url=http%3A%2F%2Flocalhost%2F',
redirectUrlComplete: '/',
});
});
});
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
const ctx = useSignUpContext();
const signUp = useCoreSignUp();
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
const { continueSignUp = false, ...rest } = props;

return (
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -211,7 +211,7 @@ function _SignUpStart(): JSX.Element {
card.setError(undefined);

const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);
const redirectUrlComplete = ctx.afterSignUpUrl || displayConfig.afterSignUpUrl;
const redirectUrlComplete = ctx.afterSignUpUrl || '/';

return signUp
.create(buildRequest(fieldsToSubmit))
Expand Down
14 changes: 5 additions & 9 deletions packages/clerk-js/src/ui/contexts/ClerkUIComponentsContext.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,17 +69,15 @@ export const useSignUpContext = (): SignUpContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignUp = () => navigate(afterSignUpUrl);
Expand DownExpand Up@@ -145,17 +143,15 @@ export const useSignInContext = (): SignInContextType => {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const afterSignInUrl = clerk.buildUrlWithAuth(
pickRedirectionProp('afterSignInUrl', {
queryParams,
ctx,
options,
displayConfig,
}),
}) || '/',
);

const navigateAfterSignIn = () => navigate(afterSignInUrl);
Expand DownExpand Up@@ -236,7 +232,7 @@ export const useUserButtonContext = () => {
const afterMultiSessionSingleSignOutUrl = ctx.afterMultiSessionSingleSignOutUrl || displayConfig.afterSignOutOneUrl;
const navigateAfterMultiSessionSingleSignOut = () => clerk.redirectWithAuth(afterMultiSessionSingleSignOutUrl);

const afterSignOutUrl = ctx.afterSignOutUrl || displayConfig.afterSignOutAllUrl;
const afterSignOutUrl = ctx.afterSignOutUrl || '/';
const navigateAfterSignOut = () => navigate(afterSignOutUrl);

const afterSwitchSessionUrl = ctx.afterSwitchSessionUrl || displayConfig.afterSwitchSessionUrl;
Expand Down
9 changes: 1 addition & 8 deletions packages/clerk-js/src/utils/pagesToOffset.ts
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
import { getNonUndefinedValues } from '@clerk/shared';
Comment thread
octoper marked this conversation as resolved.
import type { ClerkPaginationParams, ClerkPaginationRequest } from '@clerk/types';

function getNonUndefinedValues<T>(obj: Record<string, T>): Record<string, T> {
return Object.keys(obj).reduce((result, key) => {
if (obj[key] !== undefined) {
result[key] = obj[key];
}
return result;
}, {} as Record<string, T>);
}
export function convertPageToOffset<T extends ClerkPaginationParams | undefined>(
pageParams: T,
): ClerkPaginationRequest {
Expand Down
2 changes: 1 addition & 1 deletion packages/remix/src/utils.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -29,7 +29,7 @@ export function assertValidClerkState(val: any): asserts val is ClerkState | und
* Utility function to get env variables across Node and Edge runtimes.
*
* @param name
* @returns
* @returns string
*/
export const getEnvVariable = (name: string, context: AppLoadContext | undefined): string => {
// Node envs
Expand Down
54 changes: 53 additions & 1 deletion packages/shared/src/__tests__/underscore.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
import { deepCamelToSnake, deepSnakeToCamel, isIPV4Address, isTruthy, titleize, toSentence } from '../underscore';
import {
deepCamelToSnake,
deepSnakeToCamel,
getNonUndefinedValues,
isIPV4Address,
isTruthy,
titleize,
toSentence,
} from '../underscore';

describe('toSentence', () => {
it('returns a single item as-is', () => {
Expand DownExpand Up@@ -204,3 +212,47 @@ describe(`isTruthy`, () => {
expect(isTruthy(`foobar`)).toBe(false);
});
});

describe('getNonUndefinedValues', () => {
it(`removes all the undefined values from the object`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
});
});

it(`returns the same object if no undefined value exists`, () => {
const obj = {
a: 1,
b: 'foo',
c: null,
};
expect(getNonUndefinedValues(obj)).toStrictEqual(obj);
expect(getNonUndefinedValues({})).toStrictEqual({});
});

it(`removes only the undefined values from the top level`, () => {
const obj = {
a: 1,
b: undefined,
c: null,
e: {
f: undefined,
g: 1,
},
};
expect(getNonUndefinedValues(obj)).toStrictEqual({
a: 1,
c: null,
e: {
f: undefined,
g: 1,
},
});
});
});
9 changes: 9 additions & 0 deletions packages/shared/src/underscore.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -108,3 +108,12 @@ export function isTruthy(value: unknown): boolean {
// Default to false
return false;
}

export function getNonUndefinedValues<T extends object>(obj: T): Partial<T> {
Comment thread
octoper marked this conversation as resolved.
return Object.entries(obj).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key as keyof T] = value;
}
return acc;
}, {} as Partial<T>);
}
4 changes: 2 additions & 2 deletions playground/nextjs/pages/_app.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
import '../styles/globals.css';
import type { AppProps } from 'next/app';
import '../styles/globals.css';

import {
ClerkProvider,
Expand DownExpand Up@@ -91,7 +91,7 @@ const AppBar = (props: AppBarProps) => {
<option value='shadesOfPurple'>shadesOfPurple</option>
</select>
<button onClick={props.onToggleDark}>toggle dark mode</button>
<UserButton afterSignOutUrl='/' />
<UserButton />

<SignedIn>
<SignOutButton />
Expand Down