@clerk/react 6.0.0-snapshot.v20260122040150 → 6.0.0-snapshot.v20260122110524
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CL3YWFQG.mjs → chunk-7TEGJPWO.mjs} +2 -2
- package/dist/{chunk-LLYMWJ7D.mjs → chunk-IEYBKIEK.mjs} +3 -3
- package/dist/{chunk-RXA3BK2T.mjs → chunk-MB46WFKC.mjs} +1 -1
- package/dist/{chunk-E5QRIS4Z.mjs → chunk-OANWQR3B.mjs} +2 -6
- package/dist/chunk-OANWQR3B.mjs.map +1 -0
- package/dist/{chunk-BD6P2PRO.mjs → chunk-Q3BURVXX.mjs} +4 -51
- package/dist/chunk-Q3BURVXX.mjs.map +1 -0
- package/dist/errors.mjs +1 -1
- package/dist/experimental.mjs +4 -4
- package/dist/index.js +154 -230
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +125 -156
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.mts +1 -7
- package/dist/internal.d.ts +1 -7
- package/dist/internal.js +0 -48
- package/dist/internal.js.map +1 -1
- package/dist/internal.mjs +4 -6
- package/dist/internal.mjs.map +1 -1
- package/dist/legacy.mjs +2 -2
- package/package.json +4 -6
- package/dist/chunk-BD6P2PRO.mjs.map +0 -1
- package/dist/chunk-E5QRIS4Z.mjs.map +0 -1
- /package/dist/{chunk-CL3YWFQG.mjs.map → chunk-7TEGJPWO.mjs.map} +0 -0
- /package/dist/{chunk-LLYMWJ7D.mjs.map → chunk-IEYBKIEK.mjs.map} +0 -0
- /package/dist/{chunk-RXA3BK2T.mjs.map → chunk-MB46WFKC.mjs.map} +0 -0
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
errorThrower,
|
|
3
3
|
useAssertWrappedByClerkProvider,
|
|
4
4
|
useIsomorphicClerkContext
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-MB46WFKC.mjs";
|
|
6
6
|
|
|
7
7
|
// src/hooks/useAuth.ts
|
|
8
8
|
import { createCheckAuthorization, resolveAuthState } from "@clerk/shared/authorization";
|
|
@@ -294,4 +294,4 @@ export {
|
|
|
294
294
|
__experimental_PaymentElementProvider,
|
|
295
295
|
__experimental_PaymentElement
|
|
296
296
|
};
|
|
297
|
-
//# sourceMappingURL=chunk-
|
|
297
|
+
//# sourceMappingURL=chunk-7TEGJPWO.mjs.map
|
|
@@ -15,10 +15,10 @@ import {
|
|
|
15
15
|
userProfileLinkRenderedError,
|
|
16
16
|
userProfilePageRenderedError,
|
|
17
17
|
withClerk
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-7TEGJPWO.mjs";
|
|
19
19
|
import {
|
|
20
20
|
errorThrower
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-MB46WFKC.mjs";
|
|
22
22
|
|
|
23
23
|
// src/components/uiComponents.tsx
|
|
24
24
|
import { logErrorInDevMode as logErrorInDevMode3 } from "@clerk/shared/utils";
|
|
@@ -1030,4 +1030,4 @@ export {
|
|
|
1030
1030
|
TaskChooseOrganization,
|
|
1031
1031
|
TaskResetPassword
|
|
1032
1032
|
};
|
|
1033
|
-
//# sourceMappingURL=chunk-
|
|
1033
|
+
//# sourceMappingURL=chunk-IEYBKIEK.mjs.map
|
|
@@ -7,14 +7,10 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
|
|
|
7
7
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
8
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
9
|
|
|
10
|
-
// <define:__CLERK_UI_SUPPORTED_REACT_BOUNDS__>
|
|
11
|
-
var define_CLERK_UI_SUPPORTED_REACT_BOUNDS_default = [[18, 0, -1, 0], [19, 0, 0, 3], [19, 1, 1, 4], [19, 2, 2, 3], [19, 3, 3, 0]];
|
|
12
|
-
|
|
13
10
|
export {
|
|
14
11
|
__privateGet,
|
|
15
12
|
__privateAdd,
|
|
16
13
|
__privateSet,
|
|
17
|
-
__privateMethod
|
|
18
|
-
define_CLERK_UI_SUPPORTED_REACT_BOUNDS_default
|
|
14
|
+
__privateMethod
|
|
19
15
|
};
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
16
|
+
//# sourceMappingURL=chunk-OANWQR3B.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useAuth,
|
|
3
3
|
withClerk
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7TEGJPWO.mjs";
|
|
5
5
|
import {
|
|
6
6
|
useAssertWrappedByClerkProvider,
|
|
7
7
|
useIsomorphicClerkContext
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import {
|
|
10
|
-
define_CLERK_UI_SUPPORTED_REACT_BOUNDS_default
|
|
11
|
-
} from "./chunk-E5QRIS4Z.mjs";
|
|
8
|
+
} from "./chunk-MB46WFKC.mjs";
|
|
12
9
|
|
|
13
10
|
// src/components/controlComponents.tsx
|
|
14
11
|
import { deprecated } from "@clerk/shared/deprecated";
|
|
@@ -140,49 +137,6 @@ var MultisessionAppSupport = ({ children }) => {
|
|
|
140
137
|
return /* @__PURE__ */ React.createElement(React.Fragment, { key: session ? session.id : "no-users" }, children);
|
|
141
138
|
};
|
|
142
139
|
|
|
143
|
-
// src/utils/versionCheck.ts
|
|
144
|
-
import React2 from "react";
|
|
145
|
-
function parseVersion(version) {
|
|
146
|
-
const match = version.match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
147
|
-
if (!match) {
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
const [, majorStr, minorStr, patchStr] = match;
|
|
151
|
-
return {
|
|
152
|
-
major: parseInt(majorStr, 10),
|
|
153
|
-
minor: parseInt(minorStr, 10),
|
|
154
|
-
patch: parseInt(patchStr, 10)
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
function checkVersionAgainstBounds(version, bounds) {
|
|
158
|
-
const { major, minor, patch } = version;
|
|
159
|
-
return bounds.some(([bMajor, minMinor, maxMinor, minPatch]) => {
|
|
160
|
-
if (major !== bMajor) {
|
|
161
|
-
return false;
|
|
162
|
-
}
|
|
163
|
-
if (maxMinor === -1) {
|
|
164
|
-
return minor > minMinor || minor === minMinor && patch >= minPatch;
|
|
165
|
-
} else {
|
|
166
|
-
return minor === maxMinor && patch >= minPatch;
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
function isVersionCompatible(version, bounds) {
|
|
171
|
-
const parsed = parseVersion(version);
|
|
172
|
-
if (!parsed) {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
return checkVersionAgainstBounds(parsed, bounds);
|
|
176
|
-
}
|
|
177
|
-
function computeReactVersionCompatibility() {
|
|
178
|
-
try {
|
|
179
|
-
return isVersionCompatible(React2.version, define_CLERK_UI_SUPPORTED_REACT_BOUNDS_default);
|
|
180
|
-
} catch {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
var IS_REACT_SHARED_VARIANT_COMPATIBLE = computeReactVersionCompatibility();
|
|
185
|
-
|
|
186
140
|
export {
|
|
187
141
|
ClerkLoaded,
|
|
188
142
|
ClerkLoading,
|
|
@@ -196,7 +150,6 @@ export {
|
|
|
196
150
|
RedirectToOrganizationProfile,
|
|
197
151
|
RedirectToCreateOrganization,
|
|
198
152
|
AuthenticateWithRedirectCallback,
|
|
199
|
-
MultisessionAppSupport
|
|
200
|
-
IS_REACT_SHARED_VARIANT_COMPATIBLE
|
|
153
|
+
MultisessionAppSupport
|
|
201
154
|
};
|
|
202
|
-
//# sourceMappingURL=chunk-
|
|
155
|
+
//# sourceMappingURL=chunk-Q3BURVXX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/controlComponents.tsx","../src/contexts/SessionContext.tsx"],"sourcesContent":["import { deprecated } from '@clerk/shared/deprecated';\nimport type { HandleOAuthCallbackParams, PendingSessionOptions, ShowWhenCondition } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { useIsomorphicClerkContext } from '../contexts/IsomorphicClerkContext';\nimport { useSessionContext } from '../contexts/SessionContext';\nimport { useAuth } from '../hooks';\nimport { useAssertWrappedByClerkProvider } from '../hooks/useAssertWrappedByClerkProvider';\nimport type { RedirectToSignInProps, RedirectToSignUpProps, RedirectToTasksProps, WithClerkProp } from '../types';\nimport { withClerk } from './withClerk';\n\nexport const ClerkLoaded = ({ children }: React.PropsWithChildren<unknown>) => {\n useAssertWrappedByClerkProvider('ClerkLoaded');\n\n const isomorphicClerk = useIsomorphicClerkContext();\n if (!isomorphicClerk.loaded) {\n return null;\n }\n return children;\n};\n\nexport const ClerkLoading = ({ children }: React.PropsWithChildren<unknown>) => {\n useAssertWrappedByClerkProvider('ClerkLoading');\n\n const isomorphicClerk = useIsomorphicClerkContext();\n if (isomorphicClerk.status !== 'loading') {\n return null;\n }\n return children;\n};\n\nexport const ClerkFailed = ({ children }: React.PropsWithChildren<unknown>) => {\n useAssertWrappedByClerkProvider('ClerkFailed');\n\n const isomorphicClerk = useIsomorphicClerkContext();\n if (isomorphicClerk.status !== 'error') {\n return null;\n }\n return children;\n};\n\nexport const ClerkDegraded = ({ children }: React.PropsWithChildren<unknown>) => {\n useAssertWrappedByClerkProvider('ClerkDegraded');\n\n const isomorphicClerk = useIsomorphicClerkContext();\n if (isomorphicClerk.status !== 'degraded') {\n return null;\n }\n return children;\n};\n\nexport type ShowProps = React.PropsWithChildren<\n {\n fallback?: React.ReactNode;\n when: ShowWhenCondition;\n } & PendingSessionOptions\n>;\n\n/**\n * Use `<Show/>` to conditionally render content based on user authorization or sign-in state.\n * Returns `null` while auth is loading. Set `treatPendingAsSignedOut` to treat\n * pending sessions as signed out during that period.\n *\n * The `when` prop supports:\n * - `\"signed-in\"` or `\"signed-out\"` shorthands\n * - Authorization descriptors (e.g., `{ permission: \"org:billing:manage\" }`, `{ role: \"admin\" }`)\n * - A predicate function `(has) => boolean` that receives the `has` helper\n *\n * @example\n * ```tsx\n * <Show when={{ permission: \"org:billing:manage\" }} fallback={<p>Unauthorized</p>}>\n * <BillingSettings />\n * </Show>\n *\n * <Show when={{ role: \"admin\" }}>\n * <AdminPanel />\n * </Show>\n *\n * <Show when={(has) => has({ permission: \"org:read\" }) && isFeatureEnabled}>\n * <ProtectedFeature />\n * </Show>\n * ```\n *\n */\nexport const Show = ({ children, fallback, treatPendingAsSignedOut, when }: ShowProps) => {\n useAssertWrappedByClerkProvider('Show');\n\n const { has, isLoaded, userId } = useAuth({ treatPendingAsSignedOut });\n\n if (!isLoaded) {\n return null;\n }\n\n const resolvedWhen = when;\n const authorized = children;\n const unauthorized = fallback ?? null;\n\n if (resolvedWhen === 'signed-out') {\n return userId ? unauthorized : authorized;\n }\n\n if (!userId) {\n return unauthorized;\n }\n\n if (resolvedWhen === 'signed-in') {\n return authorized;\n }\n\n if (checkAuthorization(resolvedWhen, has)) {\n return authorized;\n }\n\n return unauthorized;\n};\n\nfunction checkAuthorization(\n when: Exclude<ShowWhenCondition, 'signed-in' | 'signed-out'>,\n has: NonNullable<ReturnType<typeof useAuth>['has']>,\n): boolean {\n if (typeof when === 'function') {\n return when(has);\n }\n return has(when);\n}\n\nexport const RedirectToSignIn = withClerk(({ clerk, ...props }: WithClerkProp<RedirectToSignInProps>) => {\n const { client, session } = clerk;\n\n const hasSignedInSessions = (client.signedInSessions?.length ?? 0) > 0;\n\n React.useEffect(() => {\n if (session === null && hasSignedInSessions) {\n void clerk.redirectToAfterSignOut();\n } else {\n void clerk.redirectToSignIn(props);\n }\n }, []);\n\n return null;\n}, 'RedirectToSignIn');\n\nexport const RedirectToSignUp = withClerk(({ clerk, ...props }: WithClerkProp<RedirectToSignUpProps>) => {\n React.useEffect(() => {\n void clerk.redirectToSignUp(props);\n }, []);\n\n return null;\n}, 'RedirectToSignUp');\n\nexport const RedirectToTasks = withClerk(({ clerk, ...props }: WithClerkProp<RedirectToTasksProps>) => {\n React.useEffect(() => {\n void clerk.redirectToTasks(props);\n }, []);\n\n return null;\n}, 'RedirectToTasks');\n\n/**\n * @function\n * @deprecated Use [`redirectToUserProfile()`](https://clerk.com/docs/reference/javascript/clerk#redirect-to-user-profile) instead.\n */\nexport const RedirectToUserProfile = withClerk(({ clerk }) => {\n React.useEffect(() => {\n deprecated('RedirectToUserProfile', 'Use the `redirectToUserProfile()` method instead.');\n void clerk.redirectToUserProfile();\n }, []);\n\n return null;\n}, 'RedirectToUserProfile');\n\n/**\n * @function\n * @deprecated Use [`redirectToOrganizationProfile()`](https://clerk.com/docs/reference/javascript/clerk#redirect-to-organization-profile) instead.\n */\nexport const RedirectToOrganizationProfile = withClerk(({ clerk }) => {\n React.useEffect(() => {\n deprecated('RedirectToOrganizationProfile', 'Use the `redirectToOrganizationProfile()` method instead.');\n void clerk.redirectToOrganizationProfile();\n }, []);\n\n return null;\n}, 'RedirectToOrganizationProfile');\n\n/**\n * @function\n * @deprecated Use [`redirectToCreateOrganization()`](https://clerk.com/docs/reference/javascript/clerk#redirect-to-create-organization) instead.\n */\nexport const RedirectToCreateOrganization = withClerk(({ clerk }) => {\n React.useEffect(() => {\n deprecated('RedirectToCreateOrganization', 'Use the `redirectToCreateOrganization()` method instead.');\n void clerk.redirectToCreateOrganization();\n }, []);\n\n return null;\n}, 'RedirectToCreateOrganization');\n\nexport const AuthenticateWithRedirectCallback = withClerk(\n ({ clerk, ...handleRedirectCallbackParams }: WithClerkProp<HandleOAuthCallbackParams>) => {\n React.useEffect(() => {\n void clerk.handleRedirectCallback(handleRedirectCallbackParams);\n }, []);\n\n return null;\n },\n 'AuthenticateWithRedirectCallback',\n);\n\nexport const MultisessionAppSupport = ({ children }: React.PropsWithChildren<unknown>) => {\n useAssertWrappedByClerkProvider('MultisessionAppSupport');\n\n const session = useSessionContext();\n return <React.Fragment key={session ? session.id : 'no-users'}>{children}</React.Fragment>;\n};\n","export { SessionContext, useSessionContext } from '@clerk/shared/react';\n"],"mappings":"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","names":[]}
|
package/dist/errors.mjs
CHANGED
package/dist/experimental.mjs
CHANGED
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
assertSingleChild,
|
|
3
3
|
normalizeWithDefaultValue,
|
|
4
4
|
safeExecute
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-IEYBKIEK.mjs";
|
|
6
6
|
import {
|
|
7
7
|
useAuth,
|
|
8
8
|
withClerk
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-7TEGJPWO.mjs";
|
|
10
|
+
import "./chunk-MB46WFKC.mjs";
|
|
11
|
+
import "./chunk-OANWQR3B.mjs";
|
|
12
12
|
|
|
13
13
|
// src/components/CheckoutButton.tsx
|
|
14
14
|
import React from "react";
|