@workos-inc/widgets 1.10.2-next.1776358760696 → 1.10.2-next.1776729806870
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/CHANGELOG.md +3 -1
- package/dist/cjs/api/api-provider.cjs +44 -6
- package/dist/cjs/api/api-provider.cjs.map +1 -1
- package/dist/cjs/api/api-provider.d.cts +8 -1
- package/dist/cjs/api/endpoint.cjs.map +1 -1
- package/dist/cjs/api/endpoint.d.cts +1 -1
- package/dist/cjs/api/utils.cjs.map +1 -1
- package/dist/cjs/api/utils.d.cts +1 -0
- package/dist/cjs/api/widgets-api-client.cjs +31 -6
- package/dist/cjs/api/widgets-api-client.cjs.map +1 -1
- package/dist/cjs/experimental/api/fetch.cjs.map +1 -1
- package/dist/cjs/experimental/api/fetch.d.cts +1 -1
- package/dist/cjs/experimental/api/react-query.cjs.map +1 -1
- package/dist/cjs/experimental/api/react-query.d.cts +1 -1
- package/dist/cjs/experimental/api/swr.cjs.map +1 -1
- package/dist/cjs/experimental/api/swr.d.cts +1 -1
- package/dist/cjs/lib/errors.cjs +9 -0
- package/dist/cjs/lib/errors.cjs.map +1 -1
- package/dist/cjs/lib/errors.d.cts +7 -1
- package/dist/cjs/lib/generic-error.cjs +16 -10
- package/dist/cjs/lib/generic-error.cjs.map +1 -1
- package/dist/cjs/lib/identity-providers.d.cts +1 -1
- package/dist/cjs/workos-widgets.client.cjs +1 -1
- package/dist/cjs/workos-widgets.client.cjs.map +1 -1
- package/dist/esm/api/api-provider.d.ts +8 -1
- package/dist/esm/api/api-provider.js +44 -7
- package/dist/esm/api/api-provider.js.map +1 -1
- package/dist/esm/api/endpoint.d.ts +1 -1
- package/dist/esm/api/endpoint.js.map +1 -1
- package/dist/esm/api/utils.d.ts +1 -0
- package/dist/esm/api/utils.js.map +1 -1
- package/dist/esm/api/widgets-api-client.js +36 -8
- package/dist/esm/api/widgets-api-client.js.map +1 -1
- package/dist/esm/experimental/api/fetch.d.ts +1 -1
- package/dist/esm/experimental/api/fetch.js.map +1 -1
- package/dist/esm/experimental/api/react-query.d.ts +1 -1
- package/dist/esm/experimental/api/react-query.js.map +1 -1
- package/dist/esm/experimental/api/swr.d.ts +1 -1
- package/dist/esm/experimental/api/swr.js.map +1 -1
- package/dist/esm/lib/errors.d.ts +7 -1
- package/dist/esm/lib/errors.js +8 -0
- package/dist/esm/lib/errors.js.map +1 -1
- package/dist/esm/lib/generic-error.js +17 -10
- package/dist/esm/lib/generic-error.js.map +1 -1
- package/dist/esm/lib/identity-providers.d.ts +1 -1
- package/dist/esm/workos-widgets.client.js +2 -2
- package/dist/esm/workos-widgets.client.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 1.10.2-next.
|
|
3
|
+
## 1.10.2-next.1776729806870
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
+
- [#225](https://github.com/workos/widgets/pull/225) [`7ad4ea9`](https://github.com/workos/widgets/commit/7ad4ea9b98bf3ce3fe8d350dd9a7034536ecc8c2) Thanks [@jasonbarry](https://github.com/jasonbarry)! - Fixes idle sessions from resulting in an incorrect permissions error
|
|
8
|
+
|
|
7
9
|
- [#222](https://github.com/workos/widgets/pull/222) [`c6d4ca0`](https://github.com/workos/widgets/commit/c6d4ca0ef5a5d4d11e83baee6adc2e5b75203ef9) Thanks [@chaance](https://github.com/chaance)! - Fix semantic markup for data list elements in the User Profile Widget
|
|
8
10
|
|
|
9
11
|
## 1.10.1
|
|
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var api_provider_exports = {};
|
|
30
30
|
__export(api_provider_exports, {
|
|
31
31
|
ApiProvider: () => ApiProvider,
|
|
32
|
+
authTokenQueryKey: () => authTokenQueryKey,
|
|
32
33
|
useApi: () => useApi,
|
|
33
34
|
useApiReady: () => useApiReady,
|
|
34
35
|
useElevatedAccessToken: () => useElevatedAccessToken
|
|
@@ -39,6 +40,9 @@ var import_react_query = require("@tanstack/react-query");
|
|
|
39
40
|
var React = __toESM(require("react"), 1);
|
|
40
41
|
var import_use_is_hydrated = require("../lib/use-is-hydrated.js");
|
|
41
42
|
var import_utils = require("./utils.js");
|
|
43
|
+
const authTokenQueryKey = (widgetType) => ["authToken", widgetType];
|
|
44
|
+
const TOKEN_REFRESH_BUFFER_MS = 3e4;
|
|
45
|
+
const MAX_TIMEOUT_MS = 2147483e3;
|
|
42
46
|
const ApiContext = React.createContext(void 0);
|
|
43
47
|
const ApiProvider = ({
|
|
44
48
|
authToken,
|
|
@@ -46,20 +50,52 @@ const ApiProvider = ({
|
|
|
46
50
|
children,
|
|
47
51
|
widgetType
|
|
48
52
|
}) => {
|
|
53
|
+
const queryClient = (0, import_react_query.useQueryClient)();
|
|
49
54
|
const authTokenQuery = (0, import_react_query.useQuery)({
|
|
50
|
-
initialData:
|
|
51
|
-
authToken
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
initialData: () => {
|
|
56
|
+
if (typeof authToken !== "string") {
|
|
57
|
+
return void 0;
|
|
58
|
+
}
|
|
59
|
+
const claims = (0, import_utils.getClaims)(authToken);
|
|
60
|
+
return {
|
|
61
|
+
authToken,
|
|
62
|
+
permissions: claims.permissions,
|
|
63
|
+
exp: claims.exp
|
|
64
|
+
};
|
|
65
|
+
},
|
|
54
66
|
queryFn: async () => {
|
|
55
67
|
const resolvedToken = typeof authToken === "string" ? authToken : await authToken();
|
|
68
|
+
const claims = (0, import_utils.getClaims)(resolvedToken);
|
|
56
69
|
return {
|
|
57
70
|
authToken: resolvedToken,
|
|
58
|
-
permissions:
|
|
71
|
+
permissions: claims.permissions,
|
|
72
|
+
exp: claims.exp
|
|
59
73
|
};
|
|
60
74
|
},
|
|
61
|
-
queryKey:
|
|
75
|
+
queryKey: authTokenQueryKey(widgetType)
|
|
62
76
|
});
|
|
77
|
+
const exp = authTokenQuery.data?.exp;
|
|
78
|
+
React.useEffect(() => {
|
|
79
|
+
if (!exp) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const delay = Math.min(
|
|
83
|
+
MAX_TIMEOUT_MS,
|
|
84
|
+
exp * 1e3 - Date.now() - TOKEN_REFRESH_BUFFER_MS
|
|
85
|
+
);
|
|
86
|
+
if (delay <= 0) {
|
|
87
|
+
void queryClient.refetchQueries({
|
|
88
|
+
queryKey: authTokenQueryKey(widgetType)
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const timeout = window.setTimeout(() => {
|
|
93
|
+
void queryClient.refetchQueries({
|
|
94
|
+
queryKey: authTokenQueryKey(widgetType)
|
|
95
|
+
});
|
|
96
|
+
}, delay);
|
|
97
|
+
return () => window.clearTimeout(timeout);
|
|
98
|
+
}, [exp, queryClient, widgetType]);
|
|
63
99
|
const [elevatedAccess, setElevatedAccess] = React.useState();
|
|
64
100
|
const elevatedAccessTimeout = React.useRef(void 0);
|
|
65
101
|
React.useEffect(() => {
|
|
@@ -85,6 +121,7 @@ const ApiProvider = ({
|
|
|
85
121
|
() => ({
|
|
86
122
|
authToken: authTokenQuery.data?.authToken,
|
|
87
123
|
permissions: authTokenQuery.data?.permissions,
|
|
124
|
+
exp: authTokenQuery.data?.exp,
|
|
88
125
|
baseUrl,
|
|
89
126
|
elevatedAccess,
|
|
90
127
|
setElevatedAccess,
|
|
@@ -119,6 +156,7 @@ const useApiReady = () => {
|
|
|
119
156
|
// Annotate the CommonJS export names for ESM import in node:
|
|
120
157
|
0 && (module.exports = {
|
|
121
158
|
ApiProvider,
|
|
159
|
+
authTokenQueryKey,
|
|
122
160
|
useApi,
|
|
123
161
|
useApiReady,
|
|
124
162
|
useElevatedAccessToken
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { useIsHydrated } from \"../lib/use-is-hydrated.js\";\nimport { getClaims } from \"./utils.js\";\n\nexport type WidgetType =\n | \"admin-portal-audit-log-streaming\"\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\"\n | \"pipes\"\n | \"directory-sync\";\n\nexport type AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiConfig {\n authToken: string | undefined;\n permissions: string[] | undefined;\n baseUrl: string;\n widgetType: WidgetType;\n elevatedAccess?: ElevatedAccess;\n setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;\n}\n\nconst ApiContext = React.createContext<ApiConfig | undefined>(undefined);\n\ninterface ApiProviderProps {\n authToken: AuthToken;\n baseUrl: string;\n children: React.ReactNode;\n widgetType: WidgetType;\n}\n\nexport const ApiProvider = ({\n authToken,\n baseUrl,\n children,\n widgetType,\n}: ApiProviderProps) => {\n const authTokenQuery = useQuery({\n initialData
|
|
1
|
+
{"version":3,"sources":["../../../src/api/api-provider.tsx"],"sourcesContent":["import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport * as React from \"react\";\nimport { useIsHydrated } from \"../lib/use-is-hydrated.js\";\nimport { getClaims } from \"./utils.js\";\n\nexport type WidgetType =\n | \"admin-portal-audit-log-streaming\"\n | \"admin-portal-domain-verification\"\n | \"user-management\"\n | \"organization-switcher\"\n | \"user-sessions\"\n | \"user-security\"\n | \"user-profile\"\n | \"admin-portal-sso-connection\"\n | \"api-keys\"\n | \"pipes\"\n | \"directory-sync\";\n\nexport type AuthToken = string | (() => Promise<string>);\n\ninterface ElevatedAccess {\n token: string;\n expiresAt: string;\n}\n\ninterface ApiConfig {\n authToken: string | undefined;\n permissions: string[] | undefined;\n exp: number | undefined;\n baseUrl: string;\n widgetType: WidgetType;\n elevatedAccess?: ElevatedAccess;\n setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;\n}\n\nexport interface AuthTokenQueryData {\n authToken: string;\n permissions: string[] | undefined;\n exp: number | undefined;\n}\n\nexport const authTokenQueryKey = (widgetType: WidgetType) =>\n [\"authToken\", widgetType] as const;\n\n// Refetch this many ms before the JWT expires so data queries always see a\n// fresh token.\nconst TOKEN_REFRESH_BUFFER_MS = 30_000;\n\n// Cap setTimeout delays at ~24 days to stay well below the 32-bit signed int\n// limit (~24.8 days), which some runtimes silently coerce to 1ms.\nconst MAX_TIMEOUT_MS = 2_147_483_000;\n\nconst ApiContext = React.createContext<ApiConfig | undefined>(undefined);\n\ninterface ApiProviderProps {\n authToken: AuthToken;\n baseUrl: string;\n children: React.ReactNode;\n widgetType: WidgetType;\n}\n\nexport const ApiProvider = ({\n authToken,\n baseUrl,\n children,\n widgetType,\n}: ApiProviderProps) => {\n const queryClient = useQueryClient();\n const authTokenQuery = useQuery<AuthTokenQueryData>({\n initialData: () => {\n if (typeof authToken !== \"string\") {\n return undefined;\n }\n\n const claims = getClaims(authToken);\n return {\n authToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryFn: async () => {\n const resolvedToken =\n typeof authToken === \"string\" ? authToken : await authToken();\n const claims = getClaims(resolvedToken);\n\n return {\n authToken: resolvedToken,\n permissions: claims.permissions,\n exp: claims.exp,\n };\n },\n queryKey: authTokenQueryKey(widgetType),\n });\n\n // Keep the token \"fresh\" until ~30s before it expires, so window-focus\n // re-fetches re-mint before data queries use a stale Bearer.\n //\n // TODO: prefer the function-form `staleTime` on `useQuery` above once we can\n // bump the `@tanstack/react-query` peer dep to ^5.44.0 (the version that\n // introduced it). That lets react-query own the freshness window and avoids\n // the extra timer + window-focus nonsense this effect introduces.\n const exp = authTokenQuery.data?.exp;\n React.useEffect(() => {\n if (!exp) {\n return;\n }\n\n const delay = Math.min(\n MAX_TIMEOUT_MS,\n exp * 1000 - Date.now() - TOKEN_REFRESH_BUFFER_MS,\n );\n if (delay <= 0) {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n return;\n }\n const timeout = window.setTimeout(() => {\n void queryClient.refetchQueries({\n queryKey: authTokenQueryKey(widgetType),\n });\n }, delay);\n return () => window.clearTimeout(timeout);\n }, [exp, queryClient, widgetType]);\n\n const [elevatedAccess, setElevatedAccess] = React.useState<ElevatedAccess>();\n const elevatedAccessTimeout = React.useRef<number | undefined>(undefined);\n\n // This effect manages the expiration of elevated access tokens\n // When an elevated access token is present, it checks every 30 seconds if the token has expired\n // If the token has expired (current time > expiration time), it clears the elevated access\n React.useEffect(() => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n\n if (elevatedAccess) {\n elevatedAccessTimeout.current = window.setInterval(() => {\n const now = new Date();\n const expiresAtDate = new Date(elevatedAccess.expiresAt);\n\n // Reset the elevated access if it has expired\n if (now > expiresAtDate) {\n setElevatedAccess(undefined);\n }\n }, 30_000); // every 30 seconds\n }\n\n return () => {\n if (elevatedAccessTimeout.current) {\n window.clearInterval(elevatedAccessTimeout.current);\n }\n };\n }, [elevatedAccess]);\n\n const value = React.useMemo(\n () => ({\n authToken: authTokenQuery.data?.authToken,\n permissions: authTokenQuery.data?.permissions,\n exp: authTokenQuery.data?.exp,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n }),\n [\n authTokenQuery.data,\n baseUrl,\n elevatedAccess,\n setElevatedAccess,\n widgetType,\n ],\n );\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n};\n\nexport const useApi = () => {\n const context = React.useContext(ApiContext);\n\n if (context === undefined) {\n throw new Error(\"useApi must be used within an ApiProvider\");\n }\n\n return context;\n};\n\nexport const useElevatedAccessToken = () => {\n const { elevatedAccess, setElevatedAccess } = useApi();\n\n return { elevatedAccess, setElevatedAccess };\n};\n\nexport const useApiReady = () => {\n const { authToken } = useApi();\n const isHydrated = useIsHydrated();\n\n return isHydrated && authToken !== undefined;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -10,11 +10,18 @@ interface ElevatedAccess {
|
|
|
10
10
|
interface ApiConfig {
|
|
11
11
|
authToken: string | undefined;
|
|
12
12
|
permissions: string[] | undefined;
|
|
13
|
+
exp: number | undefined;
|
|
13
14
|
baseUrl: string;
|
|
14
15
|
widgetType: WidgetType;
|
|
15
16
|
elevatedAccess?: ElevatedAccess;
|
|
16
17
|
setElevatedAccess: (elevatedAccess?: ElevatedAccess) => void;
|
|
17
18
|
}
|
|
19
|
+
interface AuthTokenQueryData {
|
|
20
|
+
authToken: string;
|
|
21
|
+
permissions: string[] | undefined;
|
|
22
|
+
exp: number | undefined;
|
|
23
|
+
}
|
|
24
|
+
declare const authTokenQueryKey: (widgetType: WidgetType) => readonly ["authToken", WidgetType];
|
|
18
25
|
interface ApiProviderProps {
|
|
19
26
|
authToken: AuthToken;
|
|
20
27
|
baseUrl: string;
|
|
@@ -29,4 +36,4 @@ declare const useElevatedAccessToken: () => {
|
|
|
29
36
|
};
|
|
30
37
|
declare const useApiReady: () => boolean;
|
|
31
38
|
|
|
32
|
-
export { ApiProvider, type AuthToken, type WidgetType, useApi, useApiReady, useElevatedAccessToken };
|
|
39
|
+
export { ApiProvider, type AuthToken, type AuthTokenQueryData, type WidgetType, authTokenQueryKey, useApi, useApiReady, useElevatedAccessToken };
|