@workos-inc/widgets 1.11.0 → 1.12.0-next.1778098442416

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.
Files changed (120) hide show
  1. package/CHANGELOG.md +6 -6
  2. package/dist/cjs/api/api-provider.cjs.map +1 -1
  3. package/dist/cjs/api/api-provider.d.cts +1 -1
  4. package/dist/cjs/api/endpoint.cjs.map +1 -1
  5. package/dist/cjs/api/endpoint.d.cts +1 -1
  6. package/dist/cjs/api-keys.client.cjs +72 -4
  7. package/dist/cjs/api-keys.client.cjs.map +1 -1
  8. package/dist/cjs/api-keys.client.d.cts +1 -0
  9. package/dist/cjs/experimental/api/fetch.cjs.map +1 -1
  10. package/dist/cjs/experimental/api/fetch.d.cts +1 -1
  11. package/dist/cjs/experimental/api/react-query.cjs.map +1 -1
  12. package/dist/cjs/experimental/api/react-query.d.cts +1 -1
  13. package/dist/cjs/experimental/api/swr.cjs.map +1 -1
  14. package/dist/cjs/experimental/api/swr.d.cts +1 -1
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/lib/api/user-api-key.cjs +72 -0
  17. package/dist/cjs/lib/api/user-api-key.cjs.map +1 -0
  18. package/dist/cjs/lib/api/user-api-key.d.cts +16 -0
  19. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +13 -6
  20. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
  21. package/dist/cjs/lib/api-keys/api-keys-state.cjs +6 -0
  22. package/dist/cjs/lib/api-keys/api-keys-state.cjs.map +1 -1
  23. package/dist/cjs/lib/api-keys/api-keys-state.d.cts +2 -0
  24. package/dist/cjs/lib/api-keys/create-api-key.cjs +13 -1
  25. package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
  26. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +3 -0
  27. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
  28. package/dist/cjs/lib/use-permissions.cjs +3 -2
  29. package/dist/cjs/lib/use-permissions.cjs.map +1 -1
  30. package/dist/cjs/lib/use-permissions.d.cts +2 -2
  31. package/dist/cjs/lib/user-api-keys/create-user-api-key.cjs +593 -0
  32. package/dist/cjs/lib/user-api-keys/create-user-api-key.cjs.map +1 -0
  33. package/dist/cjs/lib/user-api-keys/create-user-api-key.d.cts +10 -0
  34. package/dist/cjs/lib/user-api-keys/revoke-user-api-key-dialog.cjs +130 -0
  35. package/dist/cjs/lib/user-api-keys/revoke-user-api-key-dialog.cjs.map +1 -0
  36. package/dist/cjs/lib/user-api-keys/revoke-user-api-key-dialog.d.cts +12 -0
  37. package/dist/cjs/lib/user-api-keys/user-api-key-details-card.cjs +94 -0
  38. package/dist/cjs/lib/user-api-keys/user-api-key-details-card.cjs.map +1 -0
  39. package/dist/cjs/lib/user-api-keys/user-api-key-details-card.d.cts +11 -0
  40. package/dist/cjs/lib/user-api-keys/user-api-key-details-dialog.cjs +108 -0
  41. package/dist/cjs/lib/user-api-keys/user-api-key-details-dialog.cjs.map +1 -0
  42. package/dist/cjs/lib/user-api-keys/user-api-key-details-dialog.d.cts +13 -0
  43. package/dist/cjs/lib/user-api-keys/user-api-keys-context.cjs +83 -0
  44. package/dist/cjs/lib/user-api-keys/user-api-keys-context.cjs.map +1 -0
  45. package/dist/cjs/lib/user-api-keys/user-api-keys-context.d.cts +16 -0
  46. package/dist/cjs/lib/user-api-keys/user-api-keys-search-provider.cjs +95 -0
  47. package/dist/cjs/lib/user-api-keys/user-api-keys-search-provider.cjs.map +1 -0
  48. package/dist/cjs/lib/user-api-keys/user-api-keys-search-provider.d.cts +12 -0
  49. package/dist/cjs/lib/user-api-keys/user-api-keys-search.cjs +104 -0
  50. package/dist/cjs/lib/user-api-keys/user-api-keys-search.cjs.map +1 -0
  51. package/dist/cjs/lib/user-api-keys/user-api-keys-search.d.cts +6 -0
  52. package/dist/cjs/lib/user-api-keys/user-api-keys-state.cjs +165 -0
  53. package/dist/cjs/lib/user-api-keys/user-api-keys-state.cjs.map +1 -0
  54. package/dist/cjs/lib/user-api-keys/user-api-keys-state.d.cts +33 -0
  55. package/dist/cjs/lib/user-api-keys/user-api-keys-table.cjs +300 -0
  56. package/dist/cjs/lib/user-api-keys/user-api-keys-table.cjs.map +1 -0
  57. package/dist/cjs/lib/user-api-keys/user-api-keys-table.d.cts +12 -0
  58. package/dist/cjs/lib/user-api-keys/user-api-keys.cjs +165 -0
  59. package/dist/cjs/lib/user-api-keys/user-api-keys.cjs.map +1 -0
  60. package/dist/cjs/lib/user-api-keys/user-api-keys.d.cts +34 -0
  61. package/dist/esm/api/api-provider.d.ts +1 -1
  62. package/dist/esm/api/api-provider.js.map +1 -1
  63. package/dist/esm/api/endpoint.d.ts +1 -1
  64. package/dist/esm/api/endpoint.js.map +1 -1
  65. package/dist/esm/api-keys.client.d.ts +1 -0
  66. package/dist/esm/api-keys.client.js +87 -5
  67. package/dist/esm/api-keys.client.js.map +1 -1
  68. package/dist/esm/experimental/api/fetch.d.ts +1 -1
  69. package/dist/esm/experimental/api/fetch.js.map +1 -1
  70. package/dist/esm/experimental/api/react-query.d.ts +1 -1
  71. package/dist/esm/experimental/api/react-query.js.map +1 -1
  72. package/dist/esm/experimental/api/swr.d.ts +1 -1
  73. package/dist/esm/experimental/api/swr.js.map +1 -1
  74. package/dist/esm/index.js.map +1 -1
  75. package/dist/esm/lib/api/user-api-key.d.ts +16 -0
  76. package/dist/esm/lib/api/user-api-key.js +52 -0
  77. package/dist/esm/lib/api/user-api-key.js.map +1 -0
  78. package/dist/esm/lib/api-keys/api-key-details-dialog.js +13 -6
  79. package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
  80. package/dist/esm/lib/api-keys/api-keys-state.d.ts +2 -0
  81. package/dist/esm/lib/api-keys/api-keys-state.js +6 -0
  82. package/dist/esm/lib/api-keys/api-keys-state.js.map +1 -1
  83. package/dist/esm/lib/api-keys/create-api-key.js +13 -1
  84. package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
  85. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +3 -0
  86. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
  87. package/dist/esm/lib/use-permissions.d.ts +2 -2
  88. package/dist/esm/lib/use-permissions.js +3 -2
  89. package/dist/esm/lib/use-permissions.js.map +1 -1
  90. package/dist/esm/lib/user-api-keys/create-user-api-key.d.ts +10 -0
  91. package/dist/esm/lib/user-api-keys/create-user-api-key.js +578 -0
  92. package/dist/esm/lib/user-api-keys/create-user-api-key.js.map +1 -0
  93. package/dist/esm/lib/user-api-keys/revoke-user-api-key-dialog.d.ts +12 -0
  94. package/dist/esm/lib/user-api-keys/revoke-user-api-key-dialog.js +109 -0
  95. package/dist/esm/lib/user-api-keys/revoke-user-api-key-dialog.js.map +1 -0
  96. package/dist/esm/lib/user-api-keys/user-api-key-details-card.d.ts +11 -0
  97. package/dist/esm/lib/user-api-keys/user-api-key-details-card.js +60 -0
  98. package/dist/esm/lib/user-api-keys/user-api-key-details-card.js.map +1 -0
  99. package/dist/esm/lib/user-api-keys/user-api-key-details-dialog.d.ts +13 -0
  100. package/dist/esm/lib/user-api-keys/user-api-key-details-dialog.js +86 -0
  101. package/dist/esm/lib/user-api-keys/user-api-key-details-dialog.js.map +1 -0
  102. package/dist/esm/lib/user-api-keys/user-api-keys-context.d.ts +16 -0
  103. package/dist/esm/lib/user-api-keys/user-api-keys-context.js +50 -0
  104. package/dist/esm/lib/user-api-keys/user-api-keys-context.js.map +1 -0
  105. package/dist/esm/lib/user-api-keys/user-api-keys-search-provider.d.ts +12 -0
  106. package/dist/esm/lib/user-api-keys/user-api-keys-search-provider.js +60 -0
  107. package/dist/esm/lib/user-api-keys/user-api-keys-search-provider.js.map +1 -0
  108. package/dist/esm/lib/user-api-keys/user-api-keys-search.d.ts +6 -0
  109. package/dist/esm/lib/user-api-keys/user-api-keys-search.js +70 -0
  110. package/dist/esm/lib/user-api-keys/user-api-keys-search.js.map +1 -0
  111. package/dist/esm/lib/user-api-keys/user-api-keys-state.d.ts +33 -0
  112. package/dist/esm/lib/user-api-keys/user-api-keys-state.js +131 -0
  113. package/dist/esm/lib/user-api-keys/user-api-keys-state.js.map +1 -0
  114. package/dist/esm/lib/user-api-keys/user-api-keys-table.d.ts +12 -0
  115. package/dist/esm/lib/user-api-keys/user-api-keys-table.js +276 -0
  116. package/dist/esm/lib/user-api-keys/user-api-keys-table.js.map +1 -0
  117. package/dist/esm/lib/user-api-keys/user-api-keys.d.ts +34 -0
  118. package/dist/esm/lib/user-api-keys/user-api-keys.js +141 -0
  119. package/dist/esm/lib/user-api-keys/user-api-keys.js.map +1 -0
  120. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # Changelog
2
2
 
3
- ## 1.11.0
3
+ ## 1.12.0-next.1778098442416
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - [`323678a`](https://github.com/workos/widgets/commit/323678a8d32e032bfb34e68cbcdd5b8bda116ef4) Thanks [@thompsongl](https://github.com/thompsongl)! - Add user-initiated email change flow to the User Profile widget, including a verification code step and an optional set-password step for users without a password.
8
-
9
- ### Patch Changes
7
+ - [#239](https://github.com/workos/widgets/pull/239) [`cd4c515`](https://github.com/workos/widgets/commit/cd4c515aacb091ec23b07941dcc560c4a4cd62b2) Thanks [@stanleyphu](https://github.com/stanleyphu)! - Add user-scoped API key management support to the API Keys widget.
10
8
 
11
- - [`c508b79`](https://github.com/workos/widgets/commit/c508b7965ec1958be60ad17ee75b74e3ffac5be3) Thanks [@workosbot](https://github.com/workosbot)! - Sync generated API from upstream OpenAPI spec.
9
+ ## 1.11.0
12
10
 
13
- - [`823754f`](https://github.com/workos/widgets/commit/823754fed89292f872b5aab215de334f8d3f53bf) Thanks [@dandorman](https://github.com/dandorman)! - Pipes: Support server-supplied provider icons via new `iconSlug`, `iconUrl`, and `iconDarkUrl` fields on `DataIntegration`
11
+ - Add user-initiated email change flow to the `UserProfile` Widget, including a verification code step and an optional set-password step for users without a password
12
+ - Pipes: Support server-supplied provider icons via new `iconSlug`, `iconUrl`, and `iconDarkUrl` fields on `DataIntegration`
13
+ - Sync generated API from upstream OpenAPI spec
14
14
 
15
15
  ## 1.10.2
16
16
 
@@ -1 +1 @@
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":[]}
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 | \"user-api-keys\"\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":[]}
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
 
4
- type WidgetType = "admin-portal-audit-log-streaming" | "admin-portal-domain-verification" | "user-management" | "organization-switcher" | "user-sessions" | "user-security" | "user-profile" | "admin-portal-sso-connection" | "api-keys" | "pipes" | "directory-sync";
4
+ type WidgetType = "admin-portal-audit-log-streaming" | "admin-portal-domain-verification" | "user-management" | "user-api-keys" | "organization-switcher" | "user-sessions" | "user-security" | "user-profile" | "admin-portal-sso-connection" | "api-keys" | "pipes" | "directory-sync";
5
5
  type AuthToken = string | (() => Promise<string>);
6
6
  interface ElevatedAccess {
7
7
  token: string;