@payloadcms/ui 4.0.0-internal.e7d4ebc → 4.0.0-internal.f11981a

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 (274) hide show
  1. package/dist/css/app.css +121 -0
  2. package/dist/css/forms.css +0 -6
  3. package/dist/css/spacing.css +10 -3
  4. package/dist/css/z-index.css +1 -0
  5. package/dist/elements/AddNewRelation/index.css +0 -1
  6. package/dist/elements/AppHeader/index.css +0 -3
  7. package/dist/elements/AppHeader/index.d.ts.map +1 -1
  8. package/dist/elements/AppHeader/index.js +5 -1
  9. package/dist/elements/AppHeader/index.js.map +1 -1
  10. package/dist/elements/BulkUpload/EditMany/DrawerContent.js +2 -2
  11. package/dist/elements/BulkUpload/EditMany/DrawerContent.js.map +1 -1
  12. package/dist/elements/CodeEditor/index.css +0 -5
  13. package/dist/elements/CommandPalette/index.css +0 -7
  14. package/dist/elements/CopyToClipboard/index.d.ts +1 -0
  15. package/dist/elements/CopyToClipboard/index.d.ts.map +1 -1
  16. package/dist/elements/CopyToClipboard/index.js +10 -8
  17. package/dist/elements/CopyToClipboard/index.js.map +1 -1
  18. package/dist/elements/CreateDocumentButton/index.d.ts.map +1 -1
  19. package/dist/elements/CreateDocumentButton/index.js +4 -1
  20. package/dist/elements/CreateDocumentButton/index.js.map +1 -1
  21. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  22. package/dist/elements/DatePicker/DatePicker.js +1 -0
  23. package/dist/elements/DatePicker/DatePicker.js.map +1 -1
  24. package/dist/elements/DatePicker/index.css +1 -1
  25. package/dist/elements/DeleteDocument/index.d.ts.map +1 -1
  26. package/dist/elements/DeleteDocument/index.js +16 -1
  27. package/dist/elements/DeleteDocument/index.js.map +1 -1
  28. package/dist/elements/EditMany/DrawerContent.js +2 -2
  29. package/dist/elements/EditMany/DrawerContent.js.map +1 -1
  30. package/dist/elements/FieldSelect/reduceFieldOptions.d.ts.map +1 -1
  31. package/dist/elements/FieldSelect/reduceFieldOptions.js +3 -1
  32. package/dist/elements/FieldSelect/reduceFieldOptions.js.map +1 -1
  33. package/dist/elements/FieldSelect/reduceFieldOptions.spec.js +143 -0
  34. package/dist/elements/FieldSelect/reduceFieldOptions.spec.js.map +1 -0
  35. package/dist/elements/FileDetails/StaticFileDetails/index.css +8 -9
  36. package/dist/elements/FileManager/FileToolbar/index.d.ts.map +1 -1
  37. package/dist/elements/FileManager/FileToolbar/index.js +3 -0
  38. package/dist/elements/FileManager/FileToolbar/index.js.map +1 -1
  39. package/dist/elements/FileManager/index.js +1 -0
  40. package/dist/elements/FileManager/index.js.map +1 -1
  41. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.css +0 -1
  42. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts.map +1 -1
  43. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js +109 -89
  44. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js.map +1 -1
  45. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts.map +1 -1
  46. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js +2 -0
  47. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js.map +1 -1
  48. package/dist/elements/Hierarchy/Tree/TreeNode/index.css +0 -1
  49. package/dist/elements/InputStepper/index.css +0 -1
  50. package/dist/elements/Locked/index.css +0 -8
  51. package/dist/elements/Locked/index.d.ts.map +1 -1
  52. package/dist/elements/Locked/index.js +70 -64
  53. package/dist/elements/Locked/index.js.map +1 -1
  54. package/dist/elements/Nav/SidebarTabs/index.client.d.ts.map +1 -1
  55. package/dist/elements/Nav/SidebarTabs/index.client.js +12 -5
  56. package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -1
  57. package/dist/elements/Nav/SidebarTabs/index.css +0 -5
  58. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts +1 -0
  59. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts.map +1 -1
  60. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js +2 -1
  61. package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js.map +1 -1
  62. package/dist/elements/NavGroup/index.css +0 -1
  63. package/dist/elements/PreviewButton/index.d.ts +1 -2
  64. package/dist/elements/PreviewButton/index.d.ts.map +1 -1
  65. package/dist/elements/PreviewButton/index.js +11 -5
  66. package/dist/elements/PreviewButton/index.js.map +1 -1
  67. package/dist/elements/PreviewSizes/index.css +8 -9
  68. package/dist/elements/ReactSelect/ClearIndicator/index.css +0 -1
  69. package/dist/elements/ReactSelect/MultiValue/index.css +0 -1
  70. package/dist/elements/ReactSelect/index.css +0 -3
  71. package/dist/elements/RelationshipTable/Pagination.d.ts +0 -1
  72. package/dist/elements/RelationshipTable/Pagination.d.ts.map +1 -1
  73. package/dist/elements/RelationshipTable/Pagination.js +27 -77
  74. package/dist/elements/RelationshipTable/Pagination.js.map +1 -1
  75. package/dist/elements/RelationshipTable/index.d.ts +1 -0
  76. package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
  77. package/dist/elements/RelationshipTable/index.js +36 -3
  78. package/dist/elements/RelationshipTable/index.js.map +1 -1
  79. package/dist/elements/SelectRow/index.d.ts +4 -3
  80. package/dist/elements/SelectRow/index.d.ts.map +1 -1
  81. package/dist/elements/SelectRow/index.js +10 -7
  82. package/dist/elements/SelectRow/index.js.map +1 -1
  83. package/dist/elements/SidebarToggle/index.css +0 -17
  84. package/dist/elements/SortColumn/index.d.ts.map +1 -1
  85. package/dist/elements/SortColumn/index.js +42 -38
  86. package/dist/elements/SortColumn/index.js.map +1 -1
  87. package/dist/elements/Table/OrderableRow.d.ts +3 -1
  88. package/dist/elements/Table/OrderableRow.d.ts.map +1 -1
  89. package/dist/elements/Table/OrderableRow.js +17 -1
  90. package/dist/elements/Table/OrderableRow.js.map +1 -1
  91. package/dist/elements/Table/OrderableTable.d.ts.map +1 -1
  92. package/dist/elements/Table/OrderableTable.js +19 -2
  93. package/dist/elements/Table/OrderableTable.js.map +1 -1
  94. package/dist/elements/TableSection/index.css +0 -1
  95. package/dist/elements/Tooltip/index.css +15 -34
  96. package/dist/elements/Tooltip/index.d.ts +11 -3
  97. package/dist/elements/Tooltip/index.d.ts.map +1 -1
  98. package/dist/elements/Tooltip/index.js +151 -85
  99. package/dist/elements/Tooltip/index.js.map +1 -1
  100. package/dist/elements/Upload/index.css +0 -5
  101. package/dist/exports/client/index.d.ts +5 -1
  102. package/dist/exports/client/index.d.ts.map +1 -1
  103. package/dist/exports/client/index.js +1 -1
  104. package/dist/exports/client/index.js.map +3 -3
  105. package/dist/fields/Blocks/index.js +3 -3
  106. package/dist/fields/Blocks/index.js.map +1 -1
  107. package/dist/fields/Checkbox/Input.d.ts +2 -0
  108. package/dist/fields/Checkbox/Input.d.ts.map +1 -1
  109. package/dist/fields/Checkbox/Input.js +32 -26
  110. package/dist/fields/Checkbox/Input.js.map +1 -1
  111. package/dist/fields/Checkbox/index.css +37 -73
  112. package/dist/fields/FieldError/index.css +0 -9
  113. package/dist/fields/FieldError/index.d.ts.map +1 -1
  114. package/dist/fields/FieldError/index.js +19 -9
  115. package/dist/fields/FieldError/index.js.map +1 -1
  116. package/dist/fields/Join/index.css +9 -0
  117. package/dist/fields/Join/index.d.ts.map +1 -1
  118. package/dist/fields/Join/index.js +13 -9
  119. package/dist/fields/Join/index.js.map +1 -1
  120. package/dist/fields/RadioGroup/index.css +0 -7
  121. package/dist/fields/Relationship/Input.d.ts.map +1 -1
  122. package/dist/fields/Relationship/Input.js +32 -14
  123. package/dist/fields/Relationship/Input.js.map +1 -1
  124. package/dist/fields/Slug/index.css +0 -1
  125. package/dist/fields/Slug/index.d.ts.map +1 -1
  126. package/dist/fields/Slug/index.js +80 -125
  127. package/dist/fields/Slug/index.js.map +1 -1
  128. package/dist/forms/Form/fieldReducer.d.ts.map +1 -1
  129. package/dist/forms/Form/fieldReducer.js +3 -1
  130. package/dist/forms/Form/fieldReducer.js.map +1 -1
  131. package/dist/forms/Form/index.d.ts.map +1 -1
  132. package/dist/forms/Form/index.js +9 -1
  133. package/dist/forms/Form/index.js.map +1 -1
  134. package/dist/forms/Form/types.d.ts +1 -1
  135. package/dist/forms/Form/types.d.ts.map +1 -1
  136. package/dist/forms/Form/types.js.map +1 -1
  137. package/dist/forms/WatchChildErrors/index.d.ts.map +1 -1
  138. package/dist/forms/WatchChildErrors/index.js +2 -2
  139. package/dist/forms/WatchChildErrors/index.js.map +1 -1
  140. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +1 -1
  141. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
  142. package/dist/forms/fieldSchemasToFormState/renderField.d.ts.map +1 -1
  143. package/dist/forms/fieldSchemasToFormState/renderField.js +1 -3
  144. package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
  145. package/dist/layouts/Root/index.d.ts +1 -1
  146. package/dist/layouts/Root/index.d.ts.map +1 -1
  147. package/dist/layouts/Root/index.js +8 -2
  148. package/dist/layouts/Root/index.js.map +1 -1
  149. package/dist/providers/Auth/AuthSessionDebug/index.css +48 -0
  150. package/dist/providers/Auth/AuthSessionDebug/index.d.ts +13 -0
  151. package/dist/providers/Auth/AuthSessionDebug/index.d.ts.map +1 -0
  152. package/dist/providers/Auth/AuthSessionDebug/index.js +93 -0
  153. package/dist/providers/Auth/AuthSessionDebug/index.js.map +1 -0
  154. package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts +21 -0
  155. package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts.map +1 -0
  156. package/dist/providers/Auth/AuthSessionDebug/utilities.js +53 -0
  157. package/dist/providers/Auth/AuthSessionDebug/utilities.js.map +1 -0
  158. package/dist/providers/Auth/authSessionRequests.d.ts +27 -0
  159. package/dist/providers/Auth/authSessionRequests.d.ts.map +1 -0
  160. package/dist/providers/Auth/authSessionRequests.js +119 -0
  161. package/dist/providers/Auth/authSessionRequests.js.map +1 -0
  162. package/dist/providers/Auth/authSessionRequests.spec.js +121 -0
  163. package/dist/providers/Auth/authSessionRequests.spec.js.map +1 -0
  164. package/dist/providers/Auth/index.d.ts +2 -56
  165. package/dist/providers/Auth/index.d.ts.map +1 -1
  166. package/dist/providers/Auth/index.js +283 -135
  167. package/dist/providers/Auth/index.js.map +1 -1
  168. package/dist/providers/Auth/sessionActivity.d.ts +23 -0
  169. package/dist/providers/Auth/sessionActivity.d.ts.map +1 -0
  170. package/dist/providers/Auth/sessionActivity.js +49 -0
  171. package/dist/providers/Auth/sessionActivity.js.map +1 -0
  172. package/dist/providers/Auth/sessionActivity.spec.js +44 -0
  173. package/dist/providers/Auth/sessionActivity.spec.js.map +1 -0
  174. package/dist/providers/Auth/sessionTiming.d.ts +11 -0
  175. package/dist/providers/Auth/sessionTiming.d.ts.map +1 -0
  176. package/dist/providers/Auth/sessionTiming.js +18 -0
  177. package/dist/providers/Auth/sessionTiming.js.map +1 -0
  178. package/dist/providers/Auth/tabSessionSync/index.d.ts +17 -0
  179. package/dist/providers/Auth/tabSessionSync/index.d.ts.map +1 -0
  180. package/dist/providers/Auth/tabSessionSync/index.js +263 -0
  181. package/dist/providers/Auth/tabSessionSync/index.js.map +1 -0
  182. package/dist/providers/Auth/tabSessionSync/index.spec.js +463 -0
  183. package/dist/providers/Auth/tabSessionSync/index.spec.js.map +1 -0
  184. package/dist/providers/Auth/tabSessionSync/types.d.ts +107 -0
  185. package/dist/providers/Auth/tabSessionSync/types.d.ts.map +1 -0
  186. package/dist/providers/Auth/tabSessionSync/types.js +6 -0
  187. package/dist/providers/Auth/tabSessionSync/types.js.map +1 -0
  188. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts +11 -0
  189. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts.map +1 -0
  190. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js +90 -0
  191. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js.map +1 -0
  192. package/dist/providers/Auth/tabSessionSync/utilities.d.ts +26 -0
  193. package/dist/providers/Auth/tabSessionSync/utilities.d.ts.map +1 -0
  194. package/dist/providers/Auth/tabSessionSync/utilities.js +159 -0
  195. package/dist/providers/Auth/tabSessionSync/utilities.js.map +1 -0
  196. package/dist/providers/Auth/types.d.ts +66 -0
  197. package/dist/providers/Auth/types.d.ts.map +1 -0
  198. package/dist/providers/Auth/types.js +2 -0
  199. package/dist/providers/Auth/types.js.map +1 -0
  200. package/dist/providers/Auth/useAuthSessionTimers.d.ts +26 -0
  201. package/dist/providers/Auth/useAuthSessionTimers.d.ts.map +1 -0
  202. package/dist/providers/Auth/useAuthSessionTimers.js +203 -0
  203. package/dist/providers/Auth/useAuthSessionTimers.js.map +1 -0
  204. package/dist/providers/Auth/useAuthSessionTimers.spec.js +311 -0
  205. package/dist/providers/Auth/useAuthSessionTimers.spec.js.map +1 -0
  206. package/dist/providers/Embed/index.d.ts +24 -0
  207. package/dist/providers/Embed/index.d.ts.map +1 -0
  208. package/dist/providers/Embed/index.js +105 -0
  209. package/dist/providers/Embed/index.js.map +1 -0
  210. package/dist/providers/FormErrorHandler/index.d.ts +24 -0
  211. package/dist/providers/FormErrorHandler/index.d.ts.map +1 -0
  212. package/dist/providers/FormErrorHandler/index.js +6 -0
  213. package/dist/providers/FormErrorHandler/index.js.map +1 -0
  214. package/dist/providers/Root/index.d.ts +1 -0
  215. package/dist/providers/Root/index.d.ts.map +1 -1
  216. package/dist/providers/Root/index.js +37 -31
  217. package/dist/providers/Root/index.js.map +1 -1
  218. package/dist/providers/RouteTransition/ProgressBar/index.js +4 -1
  219. package/dist/providers/RouteTransition/ProgressBar/index.js.map +1 -1
  220. package/dist/providers/RouteTransition/ProgressBar/index.spec.js +44 -0
  221. package/dist/providers/RouteTransition/ProgressBar/index.spec.js.map +1 -0
  222. package/dist/providers/RouteTransition/index.d.ts +2 -0
  223. package/dist/providers/RouteTransition/index.d.ts.map +1 -1
  224. package/dist/providers/RouteTransition/index.js +42 -14
  225. package/dist/providers/RouteTransition/index.js.map +1 -1
  226. package/dist/providers/SidebarTabs/index.d.ts +3 -2
  227. package/dist/providers/SidebarTabs/index.d.ts.map +1 -1
  228. package/dist/providers/SidebarTabs/index.js.map +1 -1
  229. package/dist/providers/Theme/index.d.ts +3 -0
  230. package/dist/providers/Theme/index.d.ts.map +1 -1
  231. package/dist/providers/Theme/index.js +107 -95
  232. package/dist/providers/Theme/index.js.map +1 -1
  233. package/dist/styles.css +12 -10
  234. package/dist/utilities/combineFieldLabel.d.ts.map +1 -1
  235. package/dist/utilities/combineFieldLabel.js +5 -1
  236. package/dist/utilities/combineFieldLabel.js.map +1 -1
  237. package/dist/utilities/generateFieldID.d.ts +1 -1
  238. package/dist/utilities/generateFieldID.d.ts.map +1 -1
  239. package/dist/utilities/generateFieldID.js +2 -2
  240. package/dist/utilities/generateFieldID.js.map +1 -1
  241. package/dist/utilities/getRequestEmbed.d.ts +14 -0
  242. package/dist/utilities/getRequestEmbed.d.ts.map +1 -0
  243. package/dist/utilities/getRequestEmbed.js +10 -0
  244. package/dist/utilities/getRequestEmbed.js.map +1 -0
  245. package/dist/utilities/renderTable.d.ts.map +1 -1
  246. package/dist/utilities/renderTable.js +18 -2
  247. package/dist/utilities/renderTable.js.map +1 -1
  248. package/dist/utilities/slugify.d.ts.map +1 -1
  249. package/dist/utilities/slugify.js +49 -6
  250. package/dist/utilities/slugify.js.map +1 -1
  251. package/dist/views/Dashboard/Default/ModularDashboard/index.css +0 -8
  252. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js +4 -4
  253. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js.map +1 -1
  254. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +10 -10
  255. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
  256. package/dist/views/HierarchyList/index.css +1 -1
  257. package/dist/views/List/index.css +1 -1
  258. package/dist/views/List/index.d.ts.map +1 -1
  259. package/dist/views/List/index.js +4 -0
  260. package/dist/views/List/index.js.map +1 -1
  261. package/dist/views/Logout/index.d.ts.map +1 -1
  262. package/dist/views/Logout/index.js +11 -0
  263. package/dist/views/Logout/index.js.map +1 -1
  264. package/package.json +6 -11
  265. package/dist/elements/RelationshipTable/Pagination.css +0 -39
  266. package/dist/scss/app.scss +0 -183
  267. package/dist/scss/colors.scss +0 -191
  268. package/dist/scss/custom.css +0 -1
  269. package/dist/scss/queries.scss +0 -27
  270. package/dist/scss/styles.scss +0 -9
  271. package/dist/scss/svg.scss +0 -10
  272. package/dist/scss/toastify.scss +0 -61
  273. package/dist/scss/vars.scss +0 -192
  274. package/dist/scss/z-index.scss +0 -9
@@ -0,0 +1,93 @@
1
+ 'use client';
2
+
3
+ import { c as _c } from "react/compiler-runtime";
4
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
5
+ import React from 'react';
6
+ import { useAuth } from '../index.js';
7
+ import { formatCountdown, getActivityStatus, getActivityWindowStatus, getRefreshWindowStatus } from './utilities.js';
8
+ import './index.css';
9
+ /**
10
+ * Displays the current auth session's expiration, refresh, and activity lifecycle.
11
+ *
12
+ * Register this component as an admin provider to render it on every admin page.
13
+ */
14
+ export const AuthSessionDebug = t0 => {
15
+ const $ = _c(7);
16
+ const {
17
+ children
18
+ } = t0;
19
+ const {
20
+ authSession
21
+ } = useAuth();
22
+ const [nowMs, setNowMs] = React.useState();
23
+ let t1;
24
+ let t2;
25
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
26
+ t1 = () => {
27
+ const updateCountdown = () => setNowMs(Date.now());
28
+ updateCountdown();
29
+ const interval = window.setInterval(updateCountdown, 1000);
30
+ return () => window.clearInterval(interval);
31
+ };
32
+ t2 = [];
33
+ $[0] = t1;
34
+ $[1] = t2;
35
+ } else {
36
+ t1 = $[0];
37
+ t2 = $[1];
38
+ }
39
+ React.useEffect(t1, t2);
40
+ const expiresInMs = Math.max(0, (authSession?.expiresAt ?? 0) - (nowMs ?? 0));
41
+ let t3;
42
+ if ($[2] !== authSession || $[3] !== children || $[4] !== expiresInMs || $[5] !== nowMs) {
43
+ const activityStatus = authSession && nowMs !== undefined ? getActivityStatus({
44
+ authSession,
45
+ nowMs
46
+ }) : "waiting";
47
+ const activityWindowStatus = authSession && nowMs !== undefined ? getActivityWindowStatus({
48
+ activityStatus,
49
+ authSession,
50
+ nowMs
51
+ }) : "";
52
+ const refreshWindowStatus = authSession && nowMs !== undefined ? getRefreshWindowStatus({
53
+ authSession,
54
+ nowMs
55
+ }) : "";
56
+ t3 = _jsxs(_Fragment, {
57
+ children: [children, authSession && nowMs !== undefined ? _jsxs("aside", {
58
+ "aria-label": "Auth session countdown",
59
+ className: "auth-session-debug",
60
+ "data-auth-session-debug": true,
61
+ "data-auth-session-expires-at": authSession.expiresAt,
62
+ children: [_jsx("strong", {
63
+ children: "Auth session"
64
+ }), _jsxs("span", {
65
+ children: ["Access expires in: ", formatCountdown(expiresInMs)]
66
+ }), _jsxs("span", {
67
+ children: ["Refresh window: ", _jsx("span", {
68
+ "data-auth-session-refresh-window": true,
69
+ children: refreshWindowStatus
70
+ })]
71
+ }), _jsxs("span", {
72
+ className: `auth-session-debug__activity auth-session-debug__activity--${activityStatus}`,
73
+ children: [_jsx("span", {
74
+ "aria-hidden": true,
75
+ className: "auth-session-debug__activity-indicator"
76
+ }), "Activity window: ", _jsx("span", {
77
+ "data-auth-session-activity": true,
78
+ children: activityWindowStatus
79
+ })]
80
+ })]
81
+ }) : null]
82
+ });
83
+ $[2] = authSession;
84
+ $[3] = children;
85
+ $[4] = expiresInMs;
86
+ $[5] = nowMs;
87
+ $[6] = t3;
88
+ } else {
89
+ t3 = $[6];
90
+ }
91
+ return t3;
92
+ };
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["c","_c","React","useAuth","formatCountdown","getActivityStatus","getActivityWindowStatus","getRefreshWindowStatus","AuthSessionDebug","t0","$","children","authSession","nowMs","setNowMs","useState","t1","t2","Symbol","for","updateCountdown","Date","now","interval","window","setInterval","clearInterval","useEffect","expiresInMs","Math","max","expiresAt","t3","activityStatus","undefined","activityWindowStatus","refreshWindowStatus","_jsxs","_Fragment","className","_jsx"],"sources":["../../../../src/providers/Auth/AuthSessionDebug/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { useAuth } from '../index.js'\nimport {\n formatCountdown,\n getActivityStatus,\n getActivityWindowStatus,\n getRefreshWindowStatus,\n} from './utilities.js'\nimport './index.css'\n\ntype Props = {\n children?: React.ReactNode\n}\n\n/**\n * Displays the current auth session's expiration, refresh, and activity lifecycle.\n *\n * Register this component as an admin provider to render it on every admin page.\n */\nexport const AuthSessionDebug: React.FC<Props> = ({ children }) => {\n const { authSession } = useAuth()\n const [nowMs, setNowMs] = React.useState<number>()\n\n React.useEffect(() => {\n const updateCountdown = () => setNowMs(Date.now())\n\n updateCountdown()\n\n const interval = window.setInterval(updateCountdown, 1000)\n\n return () => window.clearInterval(interval)\n }, [])\n\n const expiresInMs = Math.max(0, (authSession?.expiresAt ?? 0) - (nowMs ?? 0))\n const activityStatus =\n authSession && nowMs !== undefined ? getActivityStatus({ authSession, nowMs }) : 'waiting'\n const activityWindowStatus =\n authSession && nowMs !== undefined\n ? getActivityWindowStatus({ activityStatus, authSession, nowMs })\n : ''\n const refreshWindowStatus =\n authSession && nowMs !== undefined ? getRefreshWindowStatus({ authSession, nowMs }) : ''\n\n return (\n <>\n {children}\n\n {authSession && nowMs !== undefined ? (\n <aside\n aria-label=\"Auth session countdown\"\n className=\"auth-session-debug\"\n data-auth-session-debug\n data-auth-session-expires-at={authSession.expiresAt}\n >\n <strong>Auth session</strong>\n <span>Access expires in: {formatCountdown(expiresInMs)}</span>\n <span>\n Refresh window: <span data-auth-session-refresh-window>{refreshWindowStatus}</span>\n </span>\n <span\n className={`auth-session-debug__activity auth-session-debug__activity--${activityStatus}`}\n >\n <span aria-hidden className=\"auth-session-debug__activity-indicator\" />\n Activity window: <span data-auth-session-activity>{activityWindowStatus}</span>\n </span>\n </aside>\n ) : null}\n </>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,OAAOC,KAAA,MAAW;AAElB,SAASC,OAAO,QAAQ;AACxB,SACEC,eAAe,EACfC,iBAAiB,EACjBC,uBAAuB,EACvBC,sBAAsB,QACjB;AACP,OAAO;AAMP;;;;;AAKA,OAAO,MAAMC,gBAAA,GAAoCC,EAAA;EAAA,MAAAC,CAAA,GAAAT,EAAA;EAAC;IAAAU;EAAA,IAAAF,EAAY;EAC5D;IAAAG;EAAA,IAAwBT,OAAA;EACxB,OAAAU,KAAA,EAAAC,QAAA,IAA0BZ,KAAA,CAAAa,QAAA,CAAc;EAAA,IAAAC,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAP,CAAA,QAAAQ,MAAA,CAAAC,GAAA;IAExBH,EAAA,GAAAA,CAAA;MACd,MAAAI,eAAA,GAAAA,CAAA,KAA8BN,QAAA,CAASO,IAAA,CAAAC,GAAA,CAAQ;MAE/CF,eAAA;MAEA,MAAAG,QAAA,GAAiBC,MAAA,CAAAC,WAAA,CAAmBL,eAAA,MAAiB;MAAA,aAExCI,MAAA,CAAAE,aAAA,CAAqBH,QAAA;IAAA;IACjCN,EAAA;IAAEP,CAAA,MAAAM,EAAA;IAAAN,CAAA,MAAAO,EAAA;EAAA;IAAAD,EAAA,GAAAN,CAAA;IAAAO,EAAA,GAAAP,CAAA;EAAA;EARLR,KAAA,CAAAyB,SAAA,CAAgBX,EAQhB,EAAGC,EAAE;EAEL,MAAAW,WAAA,GAAoBC,IAAA,CAAAC,GAAA,IAAY,CAAClB,WAAA,EAAAmB,SAAA,KAA0B,KAAMlB,KAAA,KAAS;EAAA,IAAAmB,EAAA;EAAA,IAAAtB,CAAA,QAAAE,WAAA,IAAAF,CAAA,QAAAC,QAAA,IAAAD,CAAA,QAAAkB,WAAA,IAAAlB,CAAA,QAAAG,KAAA;IAC1E,MAAAoB,cAAA,GACErB,WAAA,IAAeC,KAAA,KAAAqB,SAAU,GAAY7B,iBAAA;MAAAO,WAAA;MAAAC;IAAA,CAAuC,IAAK;IACnF,MAAAsB,oBAAA,GACEvB,WAAA,IAAeC,KAAA,KAAAqB,SAAU,GACrB5B,uBAAA;MAAA2B,cAAA;MAAArB,WAAA;MAAAC;IAAA,CAA6D,IAC7D;IACN,MAAAuB,mBAAA,GACExB,WAAA,IAAeC,KAAA,KAAAqB,SAAU,GAAY3B,sBAAA;MAAAK,WAAA;MAAAC;IAAA,CAA4C,IAAK;IAGtFmB,EAAA,GAAAK,KAAA,CAAAC,SAAA;MAAA3B,QAAA,GACGA,QAAA,EAEAC,WAAA,IAAeC,KAAA,KAAAqB,SAAU,GACxBG,KAAA,CAAC;QAAA,cACY;QAAAE,SAAA,EACD;QAAA;QAAA,gCAEoB3B,WAAA,CAAAmB,SAAA;QAAApB,QAAA,GAE9B6B,IAAA,CAAC;UAAA7B,QAAA,EAAO;QAAA,C,GACR0B,KAAA,CAAC;UAAA1B,QAAA,GAAK,uBAAoBP,eAAA,CAAgBwB,WAAA;QAAA,C,GAC1CS,KAAA,CAAC;UAAA1B,QAAA,GAAK,oBACY6B,IAAA,CAAC;YAAA;YAAA7B,QAAA,EAAuCyB;UAAA,C;YAE1DC,KAAA,CAAC;UAAAE,SAAA,EACY,8DAA8DN,cAAA,EAAgB;UAAAtB,QAAA,GAEzF6B,IAAA,CAAC;YAAA;YAAAD,SAAA,EAA2B;UAAA,C,GAA2C,qBACtDC,IAAA,CAAC;YAAA;YAAA7B,QAAA,EAAiCwB;UAAA,C;;eAGrD;IAAA,C;;;;;;;;;SAtBNH,E;CAyBJ","ignoreList":[]}
@@ -0,0 +1,21 @@
1
+ import type { AuthSession } from '../types.js';
2
+ export type ActivityStatus = 'closed' | 'tracking' | 'waiting' | 'will-refresh';
3
+ type GetActivityStatusArgs = {
4
+ authSession: AuthSession;
5
+ nowMs: number;
6
+ };
7
+ type GetActivityWindowStatusArgs = {
8
+ activityStatus: ActivityStatus;
9
+ authSession: AuthSession;
10
+ nowMs: number;
11
+ };
12
+ type GetRefreshWindowStatusArgs = {
13
+ authSession: AuthSession;
14
+ nowMs: number;
15
+ };
16
+ export declare const formatCountdown: (durationMs: number) => string;
17
+ export declare const getActivityStatus: ({ authSession, nowMs, }: GetActivityStatusArgs) => ActivityStatus;
18
+ export declare const getActivityWindowStatus: ({ activityStatus, authSession, nowMs, }: GetActivityWindowStatusArgs) => string;
19
+ export declare const getRefreshWindowStatus: ({ authSession, nowMs, }: GetRefreshWindowStatusArgs) => string;
20
+ export {};
21
+ //# sourceMappingURL=utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../../../src/providers/Auth/AuthSessionDebug/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,CAAA;AAE/E,KAAK,qBAAqB,GAAG;IAC3B,WAAW,EAAE,WAAW,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,2BAA2B,GAAG;IACjC,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,EAAE,WAAW,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,0BAA0B,GAAG;IAChC,WAAW,EAAE,WAAW,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,eAAe,eAAgB,MAAM,KAAG,MAMpD,CAAA;AAED,eAAO,MAAM,iBAAiB,4BAG3B,qBAAqB,KAAG,cAc1B,CAAA;AAED,eAAO,MAAM,uBAAuB,4CAIjC,2BAA2B,KAAG,MAkBhC,CAAA;AAED,eAAO,MAAM,sBAAsB,4BAGhC,0BAA0B,KAAG,MAU/B,CAAA"}
@@ -0,0 +1,53 @@
1
+ export const formatCountdown = durationMs => {
2
+ const totalSeconds = Math.max(0, Math.ceil(durationMs / 1000));
3
+ const minutes = Math.floor(totalSeconds / 60);
4
+ const seconds = totalSeconds % 60;
5
+ return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
6
+ };
7
+ export const getActivityStatus = ({
8
+ authSession,
9
+ nowMs
10
+ }) => {
11
+ if (nowMs >= authSession.reminderStartsAt) {
12
+ return 'closed';
13
+ }
14
+ if (authSession.activityRecorded) {
15
+ return 'will-refresh';
16
+ }
17
+ if (nowMs >= authSession.activityTrackingStartsAt) {
18
+ return 'tracking';
19
+ }
20
+ return 'waiting';
21
+ };
22
+ export const getActivityWindowStatus = ({
23
+ activityStatus,
24
+ authSession,
25
+ nowMs
26
+ }) => {
27
+ if (activityStatus === 'closed') {
28
+ return 'Closed · no refresh';
29
+ }
30
+ if (activityStatus === 'will-refresh') {
31
+ if (nowMs < authSession.refreshStartsAt) {
32
+ return `Recorded · refresh in ${formatCountdown(authSession.refreshStartsAt - nowMs)}`;
33
+ }
34
+ return 'Recorded · refreshing';
35
+ }
36
+ if (activityStatus === 'tracking') {
37
+ return `Open · closes in ${formatCountdown(authSession.reminderStartsAt - nowMs)}`;
38
+ }
39
+ return `Opens in ${formatCountdown(authSession.activityTrackingStartsAt - nowMs)}`;
40
+ };
41
+ export const getRefreshWindowStatus = ({
42
+ authSession,
43
+ nowMs
44
+ }) => {
45
+ if (nowMs >= authSession.reminderStartsAt) {
46
+ return 'Closed';
47
+ }
48
+ if (nowMs >= authSession.refreshStartsAt) {
49
+ return 'Open';
50
+ }
51
+ return `Opens in ${formatCountdown(authSession.refreshStartsAt - nowMs)}`;
52
+ };
53
+ //# sourceMappingURL=utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.js","names":["formatCountdown","durationMs","totalSeconds","Math","max","ceil","minutes","floor","seconds","String","padStart","getActivityStatus","authSession","nowMs","reminderStartsAt","activityRecorded","activityTrackingStartsAt","getActivityWindowStatus","activityStatus","refreshStartsAt","getRefreshWindowStatus"],"sources":["../../../../src/providers/Auth/AuthSessionDebug/utilities.ts"],"sourcesContent":["import type { AuthSession } from '../types.js'\n\nexport type ActivityStatus = 'closed' | 'tracking' | 'waiting' | 'will-refresh'\n\ntype GetActivityStatusArgs = {\n authSession: AuthSession\n nowMs: number\n}\n\ntype GetActivityWindowStatusArgs = {\n activityStatus: ActivityStatus\n authSession: AuthSession\n nowMs: number\n}\n\ntype GetRefreshWindowStatusArgs = {\n authSession: AuthSession\n nowMs: number\n}\n\nexport const formatCountdown = (durationMs: number): string => {\n const totalSeconds = Math.max(0, Math.ceil(durationMs / 1000))\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`\n}\n\nexport const getActivityStatus = ({\n authSession,\n nowMs,\n}: GetActivityStatusArgs): ActivityStatus => {\n if (nowMs >= authSession.reminderStartsAt) {\n return 'closed'\n }\n\n if (authSession.activityRecorded) {\n return 'will-refresh'\n }\n\n if (nowMs >= authSession.activityTrackingStartsAt) {\n return 'tracking'\n }\n\n return 'waiting'\n}\n\nexport const getActivityWindowStatus = ({\n activityStatus,\n authSession,\n nowMs,\n}: GetActivityWindowStatusArgs): string => {\n if (activityStatus === 'closed') {\n return 'Closed · no refresh'\n }\n\n if (activityStatus === 'will-refresh') {\n if (nowMs < authSession.refreshStartsAt) {\n return `Recorded · refresh in ${formatCountdown(authSession.refreshStartsAt - nowMs)}`\n }\n\n return 'Recorded · refreshing'\n }\n\n if (activityStatus === 'tracking') {\n return `Open · closes in ${formatCountdown(authSession.reminderStartsAt - nowMs)}`\n }\n\n return `Opens in ${formatCountdown(authSession.activityTrackingStartsAt - nowMs)}`\n}\n\nexport const getRefreshWindowStatus = ({\n authSession,\n nowMs,\n}: GetRefreshWindowStatusArgs): string => {\n if (nowMs >= authSession.reminderStartsAt) {\n return 'Closed'\n }\n\n if (nowMs >= authSession.refreshStartsAt) {\n return 'Open'\n }\n\n return `Opens in ${formatCountdown(authSession.refreshStartsAt - nowMs)}`\n}\n"],"mappings":"AAoBA,OAAO,MAAMA,eAAA,GAAmBC,UAAA;EAC9B,MAAMC,YAAA,GAAeC,IAAA,CAAKC,GAAG,CAAC,GAAGD,IAAA,CAAKE,IAAI,CAACJ,UAAA,GAAa;EACxD,MAAMK,OAAA,GAAUH,IAAA,CAAKI,KAAK,CAACL,YAAA,GAAe;EAC1C,MAAMM,OAAA,GAAUN,YAAA,GAAe;EAE/B,OAAO,GAAGO,MAAA,CAAOH,OAAA,EAASI,QAAQ,CAAC,GAAG,QAAQD,MAAA,CAAOD,OAAA,EAASE,QAAQ,CAAC,GAAG,MAAM;AAClF;AAEA,OAAO,MAAMC,iBAAA,GAAoBA,CAAC;EAChCC,WAAW;EACXC;AAAK,CACiB;EACtB,IAAIA,KAAA,IAASD,WAAA,CAAYE,gBAAgB,EAAE;IACzC,OAAO;EACT;EAEA,IAAIF,WAAA,CAAYG,gBAAgB,EAAE;IAChC,OAAO;EACT;EAEA,IAAIF,KAAA,IAASD,WAAA,CAAYI,wBAAwB,EAAE;IACjD,OAAO;EACT;EAEA,OAAO;AACT;AAEA,OAAO,MAAMC,uBAAA,GAA0BA,CAAC;EACtCC,cAAc;EACdN,WAAW;EACXC;AAAK,CACuB;EAC5B,IAAIK,cAAA,KAAmB,UAAU;IAC/B,OAAO;EACT;EAEA,IAAIA,cAAA,KAAmB,gBAAgB;IACrC,IAAIL,KAAA,GAAQD,WAAA,CAAYO,eAAe,EAAE;MACvC,OAAO,yBAAyBnB,eAAA,CAAgBY,WAAA,CAAYO,eAAe,GAAGN,KAAA,GAAQ;IACxF;IAEA,OAAO;EACT;EAEA,IAAIK,cAAA,KAAmB,YAAY;IACjC,OAAO,oBAAoBlB,eAAA,CAAgBY,WAAA,CAAYE,gBAAgB,GAAGD,KAAA,GAAQ;EACpF;EAEA,OAAO,YAAYb,eAAA,CAAgBY,WAAA,CAAYI,wBAAwB,GAAGH,KAAA,GAAQ;AACpF;AAEA,OAAO,MAAMO,sBAAA,GAAyBA,CAAC;EACrCR,WAAW;EACXC;AAAK,CACsB;EAC3B,IAAIA,KAAA,IAASD,WAAA,CAAYE,gBAAgB,EAAE;IACzC,OAAO;EACT;EAEA,IAAID,KAAA,IAASD,WAAA,CAAYO,eAAe,EAAE;IACxC,OAAO;EACT;EAEA,OAAO,YAAYnB,eAAA,CAAgBY,WAAA,CAAYO,eAAe,GAAGN,KAAA,GAAQ;AAC3E","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ import type { AuthenticatedUser } from 'payload';
2
+ export type AuthRequestContext = {
3
+ /** Accepts the result when its session is still active and cancels any deferred invalidation. */
4
+ acceptResult: () => boolean;
5
+ /** Invalidates the session after newer queued auth requests have had a chance to restore it. */
6
+ invalidateWhenIdle: (invalidate: () => void) => void;
7
+ /** Whether the session changed or logout began after this request was queued. */
8
+ isResultStale: () => boolean;
9
+ };
10
+ export type AuthSessionRequests = {
11
+ discardPendingResults: () => void;
12
+ isLoggingOut: () => boolean;
13
+ logOut: ({ clearSession, request, }: {
14
+ clearSession: () => void;
15
+ request: () => Promise<void>;
16
+ }) => Promise<void>;
17
+ queue: <Result>(request: (context: AuthRequestContext) => Promise<Result>) => Promise<Result>;
18
+ refresh: (request: (context: AuthRequestContext) => Promise<AuthenticatedUser | null>) => Promise<AuthenticatedUser | null>;
19
+ };
20
+ /**
21
+ * Coordinates requests that read or update the current auth session.
22
+ *
23
+ * Requests run in order, concurrent refreshes and logouts share a promise, and outdated results can
24
+ * be discarded after the session changes.
25
+ */
26
+ export declare function createAuthSessionRequests(): AuthSessionRequests;
27
+ //# sourceMappingURL=authSessionRequests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authSessionRequests.d.ts","sourceRoot":"","sources":["../../../src/providers/Auth/authSessionRequests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iGAAiG;IACjG,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,gGAAgG;IAChG,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;IACpD,iFAAiF;IACjF,aAAa,EAAE,MAAM,OAAO,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,qBAAqB,EAAE,MAAM,IAAI,CAAA;IACjC,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,MAAM,EAAE,CAAC,EACP,YAAY,EACZ,OAAO,GACR,EAAE;QACD,YAAY,EAAE,MAAM,IAAI,CAAA;QACxB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAC7B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7F,OAAO,EAAE,CACP,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,KACxE,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;CACvC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,IAAI,mBAAmB,CA0J/D"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Coordinates requests that read or update the current auth session.
3
+ *
4
+ * Requests run in order, concurrent refreshes and logouts share a promise, and outdated results can
5
+ * be discarded after the session changes.
6
+ */export function createAuthSessionRequests() {
7
+ let authRequestQueue = Promise.resolve();
8
+ let authRequestSequence = 0;
9
+ let isLoggingOut = false;
10
+ let logoutRequest;
11
+ let pendingAuthInvalidation;
12
+ let refreshRequest;
13
+ let sessionGeneration = 0;
14
+ const clearPendingInvalidation = () => {
15
+ pendingAuthInvalidation = undefined;
16
+ };
17
+ const discardPendingResults = () => {
18
+ sessionGeneration += 1;
19
+ clearPendingInvalidation();
20
+ };
21
+ const queue = request => {
22
+ const requestGeneration = sessionGeneration;
23
+ const requestSequence = ++authRequestSequence;
24
+ const runRequest = async () => {
25
+ const isResultStale = () => sessionGeneration !== requestGeneration || isLoggingOut;
26
+ const result = await request({
27
+ acceptResult: () => {
28
+ if (isResultStale()) {
29
+ return false;
30
+ }
31
+ clearPendingInvalidation();
32
+ return true;
33
+ },
34
+ invalidateWhenIdle: invalidate => {
35
+ if (isResultStale()) {
36
+ return;
37
+ }
38
+ if (requestSequence < authRequestSequence) {
39
+ pendingAuthInvalidation = {
40
+ generation: requestGeneration,
41
+ run: invalidate
42
+ };
43
+ } else {
44
+ invalidate();
45
+ }
46
+ },
47
+ isResultStale
48
+ });
49
+ if (requestSequence === authRequestSequence) {
50
+ const pendingInvalidation = pendingAuthInvalidation;
51
+ clearPendingInvalidation();
52
+ if (pendingInvalidation?.generation === sessionGeneration) {
53
+ pendingInvalidation.run();
54
+ }
55
+ }
56
+ return result;
57
+ };
58
+ const queuedRequest = authRequestQueue.then(runRequest, runRequest);
59
+ authRequestQueue = queuedRequest.then(() => undefined, () => undefined);
60
+ return queuedRequest;
61
+ };
62
+ const refresh = request => {
63
+ const requestGeneration = sessionGeneration;
64
+ const activeRequest = refreshRequest;
65
+ if (isLoggingOut) {
66
+ return Promise.resolve(null);
67
+ }
68
+ if (activeRequest?.generation === requestGeneration) {
69
+ return activeRequest.promise;
70
+ }
71
+ const refreshPromise = queue(request);
72
+ refreshRequest = {
73
+ generation: requestGeneration,
74
+ promise: refreshPromise
75
+ };
76
+ /** Stops sharing this refresh after it settles without clearing a newer refresh request. */
77
+ const clearRefreshRequest = () => {
78
+ if (refreshRequest?.promise === refreshPromise) {
79
+ refreshRequest = undefined;
80
+ }
81
+ };
82
+ void refreshPromise.then(clearRefreshRequest, clearRefreshRequest);
83
+ return refreshPromise;
84
+ };
85
+ const logOut = ({
86
+ clearSession,
87
+ request
88
+ }) => {
89
+ if (logoutRequest !== undefined) {
90
+ return logoutRequest;
91
+ }
92
+ isLoggingOut = true;
93
+ clearSession();
94
+ const pendingLogout = queue(async () => {
95
+ try {
96
+ await request();
97
+ } finally {
98
+ isLoggingOut = false;
99
+ }
100
+ });
101
+ logoutRequest = pendingLogout;
102
+ /** Stops sharing this logout after it settles without clearing a newer logout request. */
103
+ const clearLogoutRequest = () => {
104
+ if (logoutRequest === pendingLogout) {
105
+ logoutRequest = undefined;
106
+ }
107
+ };
108
+ void pendingLogout.then(clearLogoutRequest, clearLogoutRequest);
109
+ return pendingLogout;
110
+ };
111
+ return {
112
+ discardPendingResults,
113
+ isLoggingOut: () => isLoggingOut,
114
+ logOut,
115
+ queue,
116
+ refresh
117
+ };
118
+ }
119
+ //# sourceMappingURL=authSessionRequests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authSessionRequests.js","names":["createAuthSessionRequests","authRequestQueue","Promise","resolve","authRequestSequence","isLoggingOut","logoutRequest","pendingAuthInvalidation","refreshRequest","sessionGeneration","clearPendingInvalidation","undefined","discardPendingResults","queue","request","requestGeneration","requestSequence","runRequest","isResultStale","result","acceptResult","invalidateWhenIdle","invalidate","generation","run","pendingInvalidation","queuedRequest","then","refresh","activeRequest","promise","refreshPromise","clearRefreshRequest","logOut","clearSession","pendingLogout","clearLogoutRequest"],"sources":["../../../src/providers/Auth/authSessionRequests.ts"],"sourcesContent":["import type { AuthenticatedUser } from 'payload'\n\nexport type AuthRequestContext = {\n /** Accepts the result when its session is still active and cancels any deferred invalidation. */\n acceptResult: () => boolean\n /** Invalidates the session after newer queued auth requests have had a chance to restore it. */\n invalidateWhenIdle: (invalidate: () => void) => void\n /** Whether the session changed or logout began after this request was queued. */\n isResultStale: () => boolean\n}\n\nexport type AuthSessionRequests = {\n discardPendingResults: () => void\n isLoggingOut: () => boolean\n logOut: ({\n clearSession,\n request,\n }: {\n clearSession: () => void\n request: () => Promise<void>\n }) => Promise<void>\n queue: <Result>(request: (context: AuthRequestContext) => Promise<Result>) => Promise<Result>\n refresh: (\n request: (context: AuthRequestContext) => Promise<AuthenticatedUser | null>,\n ) => Promise<AuthenticatedUser | null>\n}\n\n/**\n * Coordinates requests that read or update the current auth session.\n *\n * Requests run in order, concurrent refreshes and logouts share a promise, and outdated results can\n * be discarded after the session changes.\n */\nexport function createAuthSessionRequests(): AuthSessionRequests {\n let authRequestQueue = Promise.resolve()\n let authRequestSequence = 0\n let isLoggingOut = false\n let logoutRequest: Promise<void> | undefined\n let pendingAuthInvalidation:\n | {\n generation: number\n run: () => void\n }\n | undefined\n let refreshRequest:\n | {\n generation: number\n promise: Promise<AuthenticatedUser | null>\n }\n | undefined\n let sessionGeneration = 0\n\n const clearPendingInvalidation = (): void => {\n pendingAuthInvalidation = undefined\n }\n\n const discardPendingResults = (): void => {\n sessionGeneration += 1\n clearPendingInvalidation()\n }\n\n const queue = <Result>(\n request: (context: AuthRequestContext) => Promise<Result>,\n ): Promise<Result> => {\n const requestGeneration = sessionGeneration\n const requestSequence = ++authRequestSequence\n const runRequest = async (): Promise<Result> => {\n const isResultStale = () => sessionGeneration !== requestGeneration || isLoggingOut\n const result = await request({\n acceptResult: () => {\n if (isResultStale()) {\n return false\n }\n\n clearPendingInvalidation()\n return true\n },\n invalidateWhenIdle: (invalidate) => {\n if (isResultStale()) {\n return\n }\n\n if (requestSequence < authRequestSequence) {\n pendingAuthInvalidation = { generation: requestGeneration, run: invalidate }\n } else {\n invalidate()\n }\n },\n isResultStale,\n })\n\n if (requestSequence === authRequestSequence) {\n const pendingInvalidation = pendingAuthInvalidation\n\n clearPendingInvalidation()\n\n if (pendingInvalidation?.generation === sessionGeneration) {\n pendingInvalidation.run()\n }\n }\n\n return result\n }\n const queuedRequest = authRequestQueue.then(runRequest, runRequest)\n\n authRequestQueue = queuedRequest.then(\n () => undefined,\n () => undefined,\n )\n\n return queuedRequest\n }\n\n const refresh = (\n request: (context: AuthRequestContext) => Promise<AuthenticatedUser | null>,\n ): Promise<AuthenticatedUser | null> => {\n const requestGeneration = sessionGeneration\n const activeRequest = refreshRequest\n\n if (isLoggingOut) {\n return Promise.resolve(null)\n }\n\n if (activeRequest?.generation === requestGeneration) {\n return activeRequest.promise\n }\n\n const refreshPromise = queue(request)\n\n refreshRequest = { generation: requestGeneration, promise: refreshPromise }\n /** Stops sharing this refresh after it settles without clearing a newer refresh request. */\n const clearRefreshRequest = () => {\n if (refreshRequest?.promise === refreshPromise) {\n refreshRequest = undefined\n }\n }\n\n void refreshPromise.then(clearRefreshRequest, clearRefreshRequest)\n\n return refreshPromise\n }\n\n const logOut = ({\n clearSession,\n request,\n }: {\n clearSession: () => void\n request: () => Promise<void>\n }): Promise<void> => {\n if (logoutRequest !== undefined) {\n return logoutRequest\n }\n\n isLoggingOut = true\n clearSession()\n\n const pendingLogout = queue(async () => {\n try {\n await request()\n } finally {\n isLoggingOut = false\n }\n })\n\n logoutRequest = pendingLogout\n /** Stops sharing this logout after it settles without clearing a newer logout request. */\n const clearLogoutRequest = () => {\n if (logoutRequest === pendingLogout) {\n logoutRequest = undefined\n }\n }\n\n void pendingLogout.then(\n clearLogoutRequest, // onSuccess\n clearLogoutRequest, // onFailure\n )\n\n return pendingLogout\n }\n\n return {\n discardPendingResults,\n isLoggingOut: () => isLoggingOut,\n logOut,\n queue,\n refresh,\n }\n}\n"],"mappings":"AA2BA;;;;;GAMA,OAAO,SAASA,0BAAA;EACd,IAAIC,gBAAA,GAAmBC,OAAA,CAAQC,OAAO;EACtC,IAAIC,mBAAA,GAAsB;EAC1B,IAAIC,YAAA,GAAe;EACnB,IAAIC,aAAA;EACJ,IAAIC,uBAAA;EAMJ,IAAIC,cAAA;EAMJ,IAAIC,iBAAA,GAAoB;EAExB,MAAMC,wBAAA,GAA2BA,CAAA;IAC/BH,uBAAA,GAA0BI,SAAA;EAC5B;EAEA,MAAMC,qBAAA,GAAwBA,CAAA;IAC5BH,iBAAA,IAAqB;IACrBC,wBAAA;EACF;EAEA,MAAMG,KAAA,GACJC,OAAA;IAEA,MAAMC,iBAAA,GAAoBN,iBAAA;IAC1B,MAAMO,eAAA,GAAkB,EAAEZ,mBAAA;IAC1B,MAAMa,UAAA,GAAa,MAAAA,CAAA;MACjB,MAAMC,aAAA,GAAgBA,CAAA,KAAMT,iBAAA,KAAsBM,iBAAA,IAAqBV,YAAA;MACvE,MAAMc,MAAA,GAAS,MAAML,OAAA,CAAQ;QAC3BM,YAAA,EAAcA,CAAA;UACZ,IAAIF,aAAA,IAAiB;YACnB,OAAO;UACT;UAEAR,wBAAA;UACA,OAAO;QACT;QACAW,kBAAA,EAAqBC,UAAA;UACnB,IAAIJ,aAAA,IAAiB;YACnB;UACF;UAEA,IAAIF,eAAA,GAAkBZ,mBAAA,EAAqB;YACzCG,uBAAA,GAA0B;cAAEgB,UAAA,EAAYR,iBAAA;cAAmBS,GAAA,EAAKF;YAAW;UAC7E,OAAO;YACLA,UAAA;UACF;QACF;QACAJ;MACF;MAEA,IAAIF,eAAA,KAAoBZ,mBAAA,EAAqB;QAC3C,MAAMqB,mBAAA,GAAsBlB,uBAAA;QAE5BG,wBAAA;QAEA,IAAIe,mBAAA,EAAqBF,UAAA,KAAed,iBAAA,EAAmB;UACzDgB,mBAAA,CAAoBD,GAAG;QACzB;MACF;MAEA,OAAOL,MAAA;IACT;IACA,MAAMO,aAAA,GAAgBzB,gBAAA,CAAiB0B,IAAI,CAACV,UAAA,EAAYA,UAAA;IAExDhB,gBAAA,GAAmByB,aAAA,CAAcC,IAAI,CACnC,MAAMhB,SAAA,EACN,MAAMA,SAAA;IAGR,OAAOe,aAAA;EACT;EAEA,MAAME,OAAA,GACJd,OAAA;IAEA,MAAMC,iBAAA,GAAoBN,iBAAA;IAC1B,MAAMoB,aAAA,GAAgBrB,cAAA;IAEtB,IAAIH,YAAA,EAAc;MAChB,OAAOH,OAAA,CAAQC,OAAO,CAAC;IACzB;IAEA,IAAI0B,aAAA,EAAeN,UAAA,KAAeR,iBAAA,EAAmB;MACnD,OAAOc,aAAA,CAAcC,OAAO;IAC9B;IAEA,MAAMC,cAAA,GAAiBlB,KAAA,CAAMC,OAAA;IAE7BN,cAAA,GAAiB;MAAEe,UAAA,EAAYR,iBAAA;MAAmBe,OAAA,EAASC;IAAe;IAC1E;IACA,MAAMC,mBAAA,GAAsBA,CAAA;MAC1B,IAAIxB,cAAA,EAAgBsB,OAAA,KAAYC,cAAA,EAAgB;QAC9CvB,cAAA,GAAiBG,SAAA;MACnB;IACF;IAEA,KAAKoB,cAAA,CAAeJ,IAAI,CAACK,mBAAA,EAAqBA,mBAAA;IAE9C,OAAOD,cAAA;EACT;EAEA,MAAME,MAAA,GAASA,CAAC;IACdC,YAAY;IACZpB;EAAO,CAIR;IACC,IAAIR,aAAA,KAAkBK,SAAA,EAAW;MAC/B,OAAOL,aAAA;IACT;IAEAD,YAAA,GAAe;IACf6B,YAAA;IAEA,MAAMC,aAAA,GAAgBtB,KAAA,CAAM;MAC1B,IAAI;QACF,MAAMC,OAAA;MACR,UAAU;QACRT,YAAA,GAAe;MACjB;IACF;IAEAC,aAAA,GAAgB6B,aAAA;IAChB;IACA,MAAMC,kBAAA,GAAqBA,CAAA;MACzB,IAAI9B,aAAA,KAAkB6B,aAAA,EAAe;QACnC7B,aAAA,GAAgBK,SAAA;MAClB;IACF;IAEA,KAAKwB,aAAA,CAAcR,IAAI,CACrBS,kBAAA,EACAA,kBAAA;IAGF,OAAOD,aAAA;EACT;EAEA,OAAO;IACLvB,qBAAA;IACAP,YAAA,EAAcA,CAAA,KAAMA,YAAA;IACpB4B,MAAA;IACApB,KAAA;IACAe;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,121 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createAuthSessionRequests } from './authSessionRequests.js';
3
+ describe('createAuthSessionRequests', () => {
4
+ it('should serialize auth requests in queue order', async () => {
5
+ const authRequests = createAuthSessionRequests();
6
+ const first = createDeferred();
7
+ const order = [];
8
+ const firstRequest = authRequests.queue(async () => {
9
+ order.push('first:start');
10
+ await first.promise;
11
+ order.push('first:end');
12
+ });
13
+ const secondRequest = authRequests.queue(async () => {
14
+ order.push('second');
15
+ });
16
+ expect(order).toEqual([]);
17
+ await Promise.resolve();
18
+ expect(order).toEqual(['first:start']);
19
+ first.resolve();
20
+ await Promise.all([firstRequest, secondRequest]);
21
+ expect(order).toEqual(['first:start', 'first:end', 'second']);
22
+ });
23
+ it('should share a refresh while session results remain current', async () => {
24
+ const authRequests = createAuthSessionRequests();
25
+ const refresh = createDeferred();
26
+ let runs = 0;
27
+ const run = () => authRequests.refresh(async () => {
28
+ runs += 1;
29
+ return refresh.promise;
30
+ });
31
+ const first = run();
32
+ const second = run();
33
+ expect(first).toBe(second);
34
+ refresh.resolve(null);
35
+ await Promise.all([first, second]);
36
+ expect(runs).toBe(1);
37
+ });
38
+ it('should discard a queued result after the session changes', async () => {
39
+ const authRequests = createAuthSessionRequests();
40
+ const operation = createDeferred();
41
+ let isResultStaleAfterSettlement = false;
42
+ const request = authRequests.queue(async ({
43
+ isResultStale
44
+ }) => {
45
+ await operation.promise;
46
+ isResultStaleAfterSettlement = isResultStale();
47
+ });
48
+ await Promise.resolve();
49
+ authRequests.discardPendingResults();
50
+ operation.resolve();
51
+ await request;
52
+ expect(isResultStaleAfterSettlement).toBe(true);
53
+ });
54
+ it('should settle a logout once and prevent refresh from committing', async () => {
55
+ const authRequests = createAuthSessionRequests();
56
+ const logout = createDeferred();
57
+ let clears = 0;
58
+ let logoutRequests = 0;
59
+ const first = authRequests.logOut({
60
+ clearSession: () => {
61
+ clears += 1;
62
+ authRequests.discardPendingResults();
63
+ },
64
+ request: async () => {
65
+ logoutRequests += 1;
66
+ await logout.promise;
67
+ }
68
+ });
69
+ const second = authRequests.logOut({
70
+ clearSession: () => {
71
+ clears += 1;
72
+ },
73
+ request: async () => {
74
+ logoutRequests += 1;
75
+ }
76
+ });
77
+ expect(first).toBe(second);
78
+ expect(authRequests.isLoggingOut()).toBe(true);
79
+ expect(await authRequests.refresh(async () => null)).toBeNull();
80
+ logout.resolve();
81
+ await first;
82
+ expect({
83
+ clears,
84
+ logoutRequests
85
+ }).toEqual({
86
+ clears: 1,
87
+ logoutRequests: 1
88
+ });
89
+ });
90
+ it('should discard a deferred invalidation after the session changes', async () => {
91
+ const authRequests = createAuthSessionRequests();
92
+ let invalidations = 0;
93
+ const first = authRequests.refresh(async ({
94
+ invalidateWhenIdle
95
+ }) => {
96
+ invalidateWhenIdle(() => {
97
+ invalidations += 1;
98
+ });
99
+ return null;
100
+ });
101
+ const second = authRequests.queue(async () => {
102
+ authRequests.discardPendingResults();
103
+ });
104
+ await Promise.all([first, second]);
105
+ expect(invalidations).toBe(0);
106
+ });
107
+ });
108
+ function createDeferred() {
109
+ let resolve;
110
+ const promise = new Promise(resolvePromise => {
111
+ resolve = resolvePromise;
112
+ });
113
+ if (!resolve) {
114
+ throw new Error('Expected deferred promise resolver.');
115
+ }
116
+ return {
117
+ promise,
118
+ resolve
119
+ };
120
+ }
121
+ //# sourceMappingURL=authSessionRequests.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authSessionRequests.spec.js","names":["describe","expect","it","createAuthSessionRequests","authRequests","first","createDeferred","order","firstRequest","queue","push","promise","secondRequest","toEqual","Promise","resolve","all","refresh","runs","run","second","toBe","operation","isResultStaleAfterSettlement","request","isResultStale","discardPendingResults","logout","clears","logoutRequests","logOut","clearSession","isLoggingOut","toBeNull","invalidations","invalidateWhenIdle","resolvePromise","Error"],"sources":["../../../src/providers/Auth/authSessionRequests.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { createAuthSessionRequests } from './authSessionRequests.js'\n\ndescribe('createAuthSessionRequests', () => {\n it('should serialize auth requests in queue order', async () => {\n const authRequests = createAuthSessionRequests()\n const first = createDeferred<void>()\n const order: string[] = []\n\n const firstRequest = authRequests.queue(async () => {\n order.push('first:start')\n await first.promise\n order.push('first:end')\n })\n const secondRequest = authRequests.queue(async () => {\n order.push('second')\n })\n\n expect(order).toEqual([])\n await Promise.resolve()\n expect(order).toEqual(['first:start'])\n\n first.resolve()\n await Promise.all([firstRequest, secondRequest])\n expect(order).toEqual(['first:start', 'first:end', 'second'])\n })\n\n it('should share a refresh while session results remain current', async () => {\n const authRequests = createAuthSessionRequests()\n const refresh = createDeferred<null>()\n let runs = 0\n const run = () =>\n authRequests.refresh(async () => {\n runs += 1\n return refresh.promise\n })\n\n const first = run()\n const second = run()\n expect(first).toBe(second)\n\n refresh.resolve(null)\n await Promise.all([first, second])\n expect(runs).toBe(1)\n })\n\n it('should discard a queued result after the session changes', async () => {\n const authRequests = createAuthSessionRequests()\n const operation = createDeferred<void>()\n let isResultStaleAfterSettlement = false\n\n const request = authRequests.queue(async ({ isResultStale }) => {\n await operation.promise\n isResultStaleAfterSettlement = isResultStale()\n })\n\n await Promise.resolve()\n authRequests.discardPendingResults()\n operation.resolve()\n await request\n\n expect(isResultStaleAfterSettlement).toBe(true)\n })\n\n it('should settle a logout once and prevent refresh from committing', async () => {\n const authRequests = createAuthSessionRequests()\n const logout = createDeferred<void>()\n let clears = 0\n let logoutRequests = 0\n\n const first = authRequests.logOut({\n clearSession: () => {\n clears += 1\n authRequests.discardPendingResults()\n },\n request: async () => {\n logoutRequests += 1\n await logout.promise\n },\n })\n const second = authRequests.logOut({\n clearSession: () => {\n clears += 1\n },\n request: async () => {\n logoutRequests += 1\n },\n })\n\n expect(first).toBe(second)\n expect(authRequests.isLoggingOut()).toBe(true)\n expect(await authRequests.refresh(async () => null)).toBeNull()\n logout.resolve()\n await first\n expect({ clears, logoutRequests }).toEqual({ clears: 1, logoutRequests: 1 })\n })\n\n it('should discard a deferred invalidation after the session changes', async () => {\n const authRequests = createAuthSessionRequests()\n let invalidations = 0\n\n const first = authRequests.refresh(async ({ invalidateWhenIdle }) => {\n invalidateWhenIdle(() => {\n invalidations += 1\n })\n return null\n })\n const second = authRequests.queue(async () => {\n authRequests.discardPendingResults()\n })\n\n await Promise.all([first, second])\n expect(invalidations).toBe(0)\n })\n})\n\nfunction createDeferred<Value>(): {\n promise: Promise<Value>\n resolve: (value: Value | PromiseLike<Value>) => void\n} {\n let resolve: ((value: Value | PromiseLike<Value>) => void) | undefined\n const promise = new Promise<Value>((resolvePromise) => {\n resolve = resolvePromise\n })\n\n if (!resolve) {\n throw new Error('Expected deferred promise resolver.')\n }\n\n return { promise, resolve }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,60 +1,7 @@
1
1
  import type { AuthenticatedUser, SanitizedPermissions } from 'payload';
2
2
  import React from 'react';
3
- export type UserWithToken<T = AuthenticatedUser> = {
4
- /** seconds until expiration */
5
- exp: number;
6
- refreshedToken?: string;
7
- token?: string;
8
- user: T;
9
- };
10
- export type AuthContext<T = AuthenticatedUser> = {
11
- fetchFullUser: () => Promise<null | T>;
12
- logOut: () => Promise<boolean>;
13
- /**
14
- * These are the permissions for the current user from a global scope.
15
- *
16
- * When checking for permissions on document specific level, use the `useDocumentInfo` hook instead.
17
- *
18
- * @example
19
- *
20
- * ```tsx
21
- * import { useAuth } from 'payload/ui'
22
- *
23
- * const MyComponent: React.FC = () => {
24
- * const { permissions } = useAuth()
25
- *
26
- * if (permissions?.collections?.myCollection?.create) {
27
- * // user can create documents in 'myCollection'
28
- * }
29
- *
30
- * return null
31
- * }
32
- * ```
33
- *
34
- * with useDocumentInfo:
35
- *
36
- * ```tsx
37
- * import { useDocumentInfo } from 'payload/ui'
38
- *
39
- * const MyComponent: React.FC = () => {
40
- * const { docPermissions } = useDocumentInfo()
41
- * if (docPermissions?.create) {
42
- * // user can create this document
43
- * }
44
- * return null
45
- * } ```
46
- */
47
- permissions?: SanitizedPermissions;
48
- refreshCookie: (forceRefresh?: boolean) => void;
49
- refreshCookieAsync: () => Promise<null | T>;
50
- refreshPermissions: () => Promise<void>;
51
- setPermissions: (permissions: SanitizedPermissions) => void;
52
- setUser: (user: null | UserWithToken<T>) => void;
53
- strategy?: string;
54
- token?: string;
55
- tokenExpirationMs?: number;
56
- user?: null | T;
57
- };
3
+ import type { AuthContext } from './types.js';
4
+ export type { AuthContext, AuthSession, UserWithToken } from './types.js';
58
5
  type Props = {
59
6
  children: React.ReactNode;
60
7
  permissions?: SanitizedPermissions;
@@ -62,5 +9,4 @@ type Props = {
62
9
  };
63
10
  export declare function AuthProvider({ children, permissions: initialPermissions, user: initialUser, }: Props): React.JSX.Element;
64
11
  export declare const useAuth: <T = AuthenticatedUser>() => AuthContext<T>;
65
- export {};
66
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/Auth/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAKtE,OAAO,KAA+D,MAAM,OAAO,CAAA;AAWnF,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,iBAAiB,IAAI;IACjD,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,iBAAiB,IAAI;IAC/C,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;IACtC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,aAAa,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/C,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;IAC3C,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,cAAc,EAAE,CAAC,WAAW,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC3D,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,CAAA;CAChB,CAAA;AAMD,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAChC,CAAA;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,WAAW,GAClB,EAAE,KAAK,qBAgUP;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,GAAG,iBAAiB,OAAM,WAAW,CAAC,CAAC,CAAmC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/Auth/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAKtE,OAAO,KAA+D,MAAM,OAAO,CAAA;AAInF,OAAO,KAAK,EAAE,WAAW,EAA8B,MAAM,YAAY,CAAA;AAczE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAIzE,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAChC,CAAA;AAsBD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,EAAE,kBAAkB,EAC/B,IAAI,EAAE,WAAW,GAClB,EAAE,KAAK,qBAodP;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,GAAG,iBAAiB,OAAM,WAAW,CAAC,CAAC,CAAmC,CAAA"}