@payloadcms/ui 4.0.0-internal.e55ccef → 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.
- package/dist/css/app.css +121 -0
- package/dist/css/forms.css +0 -6
- package/dist/css/spacing.css +11 -3
- package/dist/css/z-index.css +1 -0
- package/dist/elements/AddNewRelation/index.css +0 -1
- package/dist/elements/AppHeader/index.css +0 -3
- package/dist/elements/AppHeader/index.d.ts.map +1 -1
- package/dist/elements/AppHeader/index.js +5 -1
- package/dist/elements/AppHeader/index.js.map +1 -1
- package/dist/elements/ArrayAction/index.d.ts +2 -0
- package/dist/elements/ArrayAction/index.d.ts.map +1 -1
- package/dist/elements/ArrayAction/index.js +65 -24
- package/dist/elements/ArrayAction/index.js.map +1 -1
- package/dist/elements/BulkUpload/EditMany/DrawerContent.js +2 -2
- package/dist/elements/BulkUpload/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/BulkUpload/FileSidebar/index.css +4 -0
- package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts +2 -2
- package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/createFormData.js +4 -15
- package/dist/elements/BulkUpload/FormsManager/createFormData.js.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.js +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
- package/dist/elements/ClipboardAction/clipboardUtilities.d.ts +8 -1
- package/dist/elements/ClipboardAction/clipboardUtilities.d.ts.map +1 -1
- package/dist/elements/ClipboardAction/clipboardUtilities.js +40 -8
- package/dist/elements/ClipboardAction/clipboardUtilities.js.map +1 -1
- package/dist/elements/ClipboardAction/clipboardUtilities.spec.js +120 -0
- package/dist/elements/ClipboardAction/clipboardUtilities.spec.js.map +1 -0
- package/dist/elements/ClipboardAction/index.d.ts.map +1 -1
- package/dist/elements/ClipboardAction/index.js +17 -1
- package/dist/elements/ClipboardAction/index.js.map +1 -1
- package/dist/elements/ClipboardAction/isClipboardDataValid.spec.js +144 -0
- package/dist/elements/ClipboardAction/isClipboardDataValid.spec.js.map +1 -0
- package/dist/elements/ClipboardAction/types.d.ts +3 -0
- package/dist/elements/ClipboardAction/types.d.ts.map +1 -1
- package/dist/elements/ClipboardAction/types.js.map +1 -1
- package/dist/elements/ClipboardAction/useCanPasteClipboard.d.ts +10 -0
- package/dist/elements/ClipboardAction/useCanPasteClipboard.d.ts.map +1 -0
- package/dist/elements/ClipboardAction/useCanPasteClipboard.js +21 -0
- package/dist/elements/ClipboardAction/useCanPasteClipboard.js.map +1 -0
- package/dist/elements/CodeEditor/index.css +0 -5
- package/dist/elements/CommandPalette/index.css +0 -7
- package/dist/elements/CopyToClipboard/index.d.ts +1 -0
- package/dist/elements/CopyToClipboard/index.d.ts.map +1 -1
- package/dist/elements/CopyToClipboard/index.js +10 -8
- package/dist/elements/CopyToClipboard/index.js.map +1 -1
- package/dist/elements/CreateDocumentButton/index.d.ts.map +1 -1
- package/dist/elements/CreateDocumentButton/index.js +4 -1
- package/dist/elements/CreateDocumentButton/index.js.map +1 -1
- package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/elements/DatePicker/DatePicker.js +1 -0
- package/dist/elements/DatePicker/DatePicker.js.map +1 -1
- package/dist/elements/DatePicker/index.css +1 -1
- package/dist/elements/DeleteDocument/index.d.ts.map +1 -1
- package/dist/elements/DeleteDocument/index.js +16 -1
- package/dist/elements/DeleteDocument/index.js.map +1 -1
- package/dist/elements/EditMany/DrawerContent.js +2 -2
- package/dist/elements/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/FieldSelect/reduceFieldOptions.d.ts.map +1 -1
- package/dist/elements/FieldSelect/reduceFieldOptions.js +3 -1
- package/dist/elements/FieldSelect/reduceFieldOptions.js.map +1 -1
- package/dist/elements/FieldSelect/reduceFieldOptions.spec.js +143 -0
- package/dist/elements/FieldSelect/reduceFieldOptions.spec.js.map +1 -0
- package/dist/elements/FileDetails/StaticFileDetails/index.css +8 -9
- package/dist/elements/FileManager/FilePreview/index.css +3 -3
- package/dist/elements/FileManager/FileToolbar/index.d.ts.map +1 -1
- package/dist/elements/FileManager/FileToolbar/index.js +3 -0
- package/dist/elements/FileManager/FileToolbar/index.js.map +1 -1
- package/dist/elements/FileManager/index.css +36 -23
- package/dist/elements/FileManager/index.d.ts +1 -1
- package/dist/elements/FileManager/index.d.ts.map +1 -1
- package/dist/elements/FileManager/index.js +15 -4
- package/dist/elements/FileManager/index.js.map +1 -1
- package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.css +0 -1
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts.map +1 -1
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js +109 -89
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js.map +1 -1
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts.map +1 -1
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js +2 -0
- package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js.map +1 -1
- package/dist/elements/Hierarchy/Tree/TreeNode/index.css +0 -1
- package/dist/elements/InputStepper/index.css +0 -1
- package/dist/elements/Locked/index.css +0 -8
- package/dist/elements/Locked/index.d.ts.map +1 -1
- package/dist/elements/Locked/index.js +70 -64
- package/dist/elements/Locked/index.js.map +1 -1
- package/dist/elements/MiniCarousel/index.css +39 -37
- package/dist/elements/Nav/SidebarTabs/index.client.d.ts.map +1 -1
- package/dist/elements/Nav/SidebarTabs/index.client.js +12 -5
- package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -1
- package/dist/elements/Nav/SidebarTabs/index.css +0 -5
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts +1 -0
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts.map +1 -1
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js +2 -1
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js.map +1 -1
- package/dist/elements/NavGroup/index.css +0 -1
- package/dist/elements/PreviewButton/index.d.ts +1 -2
- package/dist/elements/PreviewButton/index.d.ts.map +1 -1
- package/dist/elements/PreviewButton/index.js +11 -5
- package/dist/elements/PreviewButton/index.js.map +1 -1
- package/dist/elements/PreviewSizes/index.css +8 -9
- package/dist/elements/ReactSelect/ClearIndicator/index.css +0 -1
- package/dist/elements/ReactSelect/MultiValue/index.css +0 -1
- package/dist/elements/ReactSelect/MultiValueLabel/index.css +2 -2
- package/dist/elements/ReactSelect/index.css +0 -3
- package/dist/elements/RelationshipTable/Pagination.d.ts +0 -1
- package/dist/elements/RelationshipTable/Pagination.d.ts.map +1 -1
- package/dist/elements/RelationshipTable/Pagination.js +27 -77
- package/dist/elements/RelationshipTable/Pagination.js.map +1 -1
- package/dist/elements/RelationshipTable/index.css +0 -2
- package/dist/elements/RelationshipTable/index.d.ts +1 -0
- package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
- package/dist/elements/RelationshipTable/index.js +36 -3
- package/dist/elements/RelationshipTable/index.js.map +1 -1
- package/dist/elements/RenderTitle/index.css +4 -0
- package/dist/elements/RenderTitle/index.d.ts.map +1 -1
- package/dist/elements/RenderTitle/index.js +18 -13
- package/dist/elements/RenderTitle/index.js.map +1 -1
- package/dist/elements/SelectRow/index.d.ts +4 -3
- package/dist/elements/SelectRow/index.d.ts.map +1 -1
- package/dist/elements/SelectRow/index.js +10 -7
- package/dist/elements/SelectRow/index.js.map +1 -1
- package/dist/elements/SidebarToggle/index.css +0 -17
- package/dist/elements/SortColumn/index.d.ts.map +1 -1
- package/dist/elements/SortColumn/index.js +42 -38
- package/dist/elements/SortColumn/index.js.map +1 -1
- package/dist/elements/Table/OrderableRow.d.ts +3 -1
- package/dist/elements/Table/OrderableRow.d.ts.map +1 -1
- package/dist/elements/Table/OrderableRow.js +17 -1
- package/dist/elements/Table/OrderableRow.js.map +1 -1
- package/dist/elements/Table/OrderableTable.d.ts.map +1 -1
- package/dist/elements/Table/OrderableTable.js +19 -2
- package/dist/elements/Table/OrderableTable.js.map +1 -1
- package/dist/elements/Table/index.css +1 -0
- package/dist/elements/TableSection/index.css +0 -1
- package/dist/elements/Thumbnail/index.d.ts +1 -1
- package/dist/elements/Thumbnail/index.d.ts.map +1 -1
- package/dist/elements/Thumbnail/index.js.map +1 -1
- package/dist/elements/TimezonePicker/index.d.ts.map +1 -1
- package/dist/elements/TimezonePicker/index.js +5 -1
- package/dist/elements/TimezonePicker/index.js.map +1 -1
- package/dist/elements/Tooltip/index.css +15 -34
- package/dist/elements/Tooltip/index.d.ts +11 -3
- package/dist/elements/Tooltip/index.d.ts.map +1 -1
- package/dist/elements/Tooltip/index.js +151 -85
- package/dist/elements/Tooltip/index.js.map +1 -1
- package/dist/elements/Upload/index.css +0 -5
- package/dist/exports/client/index.d.ts +5 -1
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +1 -1
- package/dist/exports/client/index.js.map +3 -3
- package/dist/fields/Array/ArrayRow.d.ts.map +1 -1
- package/dist/fields/Array/ArrayRow.js +97 -160
- package/dist/fields/Array/ArrayRow.js.map +1 -1
- package/dist/fields/Blocks/BlockRow.d.ts.map +1 -1
- package/dist/fields/Blocks/BlockRow.js +134 -195
- package/dist/fields/Blocks/BlockRow.js.map +1 -1
- package/dist/fields/Blocks/RowActions.d.ts +2 -0
- package/dist/fields/Blocks/RowActions.d.ts.map +1 -1
- package/dist/fields/Blocks/RowActions.js +23 -20
- package/dist/fields/Blocks/RowActions.js.map +1 -1
- package/dist/fields/Blocks/index.js +3 -3
- package/dist/fields/Blocks/index.js.map +1 -1
- package/dist/fields/Checkbox/Input.d.ts +2 -0
- package/dist/fields/Checkbox/Input.d.ts.map +1 -1
- package/dist/fields/Checkbox/Input.js +32 -26
- package/dist/fields/Checkbox/Input.js.map +1 -1
- package/dist/fields/Checkbox/index.css +37 -73
- package/dist/fields/FieldError/index.css +0 -9
- package/dist/fields/FieldError/index.d.ts.map +1 -1
- package/dist/fields/FieldError/index.js +19 -9
- package/dist/fields/FieldError/index.js.map +1 -1
- package/dist/fields/Join/index.css +9 -0
- package/dist/fields/Join/index.d.ts.map +1 -1
- package/dist/fields/Join/index.js +13 -9
- package/dist/fields/Join/index.js.map +1 -1
- package/dist/fields/RadioGroup/index.css +0 -7
- package/dist/fields/Relationship/Input.d.ts.map +1 -1
- package/dist/fields/Relationship/Input.js +32 -14
- package/dist/fields/Relationship/Input.js.map +1 -1
- package/dist/fields/Relationship/select-components/MultiValueLabel/index.css +1 -1
- package/dist/fields/Slug/index.css +0 -1
- package/dist/fields/Slug/index.d.ts.map +1 -1
- package/dist/fields/Slug/index.js +75 -111
- package/dist/fields/Slug/index.js.map +1 -1
- package/dist/fields/Upload/index.css +19 -4
- package/dist/forms/Form/fieldReducer.d.ts.map +1 -1
- package/dist/forms/Form/fieldReducer.js +3 -1
- package/dist/forms/Form/fieldReducer.js.map +1 -1
- package/dist/forms/Form/index.d.ts.map +1 -1
- package/dist/forms/Form/index.js +12 -15
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/forms/Form/types.d.ts +1 -1
- package/dist/forms/Form/types.d.ts.map +1 -1
- package/dist/forms/Form/types.js.map +1 -1
- package/dist/forms/RenderFields/index.css +16 -2
- package/dist/forms/WatchChildErrors/index.d.ts.map +1 -1
- package/dist/forms/WatchChildErrors/index.js +2 -2
- package/dist/forms/WatchChildErrors/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/renderField.d.ts.map +1 -1
- package/dist/forms/fieldSchemasToFormState/renderField.js +1 -3
- package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
- package/dist/layouts/Root/index.d.ts +1 -1
- package/dist/layouts/Root/index.d.ts.map +1 -1
- package/dist/layouts/Root/index.js +8 -2
- package/dist/layouts/Root/index.js.map +1 -1
- package/dist/providers/Auth/AuthSessionDebug/index.css +48 -0
- package/dist/providers/Auth/AuthSessionDebug/index.d.ts +13 -0
- package/dist/providers/Auth/AuthSessionDebug/index.d.ts.map +1 -0
- package/dist/providers/Auth/AuthSessionDebug/index.js +93 -0
- package/dist/providers/Auth/AuthSessionDebug/index.js.map +1 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts +21 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts.map +1 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.js +53 -0
- package/dist/providers/Auth/AuthSessionDebug/utilities.js.map +1 -0
- package/dist/providers/Auth/authSessionRequests.d.ts +27 -0
- package/dist/providers/Auth/authSessionRequests.d.ts.map +1 -0
- package/dist/providers/Auth/authSessionRequests.js +119 -0
- package/dist/providers/Auth/authSessionRequests.js.map +1 -0
- package/dist/providers/Auth/authSessionRequests.spec.js +121 -0
- package/dist/providers/Auth/authSessionRequests.spec.js.map +1 -0
- package/dist/providers/Auth/index.d.ts +2 -56
- package/dist/providers/Auth/index.d.ts.map +1 -1
- package/dist/providers/Auth/index.js +283 -135
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/Auth/sessionActivity.d.ts +23 -0
- package/dist/providers/Auth/sessionActivity.d.ts.map +1 -0
- package/dist/providers/Auth/sessionActivity.js +49 -0
- package/dist/providers/Auth/sessionActivity.js.map +1 -0
- package/dist/providers/Auth/sessionActivity.spec.js +44 -0
- package/dist/providers/Auth/sessionActivity.spec.js.map +1 -0
- package/dist/providers/Auth/sessionTiming.d.ts +11 -0
- package/dist/providers/Auth/sessionTiming.d.ts.map +1 -0
- package/dist/providers/Auth/sessionTiming.js +18 -0
- package/dist/providers/Auth/sessionTiming.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/index.d.ts +17 -0
- package/dist/providers/Auth/tabSessionSync/index.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/index.js +263 -0
- package/dist/providers/Auth/tabSessionSync/index.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/index.spec.js +463 -0
- package/dist/providers/Auth/tabSessionSync/index.spec.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/types.d.ts +107 -0
- package/dist/providers/Auth/tabSessionSync/types.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/types.js +6 -0
- package/dist/providers/Auth/tabSessionSync/types.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts +11 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js +90 -0
- package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js.map +1 -0
- package/dist/providers/Auth/tabSessionSync/utilities.d.ts +26 -0
- package/dist/providers/Auth/tabSessionSync/utilities.d.ts.map +1 -0
- package/dist/providers/Auth/tabSessionSync/utilities.js +159 -0
- package/dist/providers/Auth/tabSessionSync/utilities.js.map +1 -0
- package/dist/providers/Auth/types.d.ts +66 -0
- package/dist/providers/Auth/types.d.ts.map +1 -0
- package/dist/providers/Auth/types.js +2 -0
- package/dist/providers/Auth/types.js.map +1 -0
- package/dist/providers/Auth/useAuthSessionTimers.d.ts +26 -0
- package/dist/providers/Auth/useAuthSessionTimers.d.ts.map +1 -0
- package/dist/providers/Auth/useAuthSessionTimers.js +203 -0
- package/dist/providers/Auth/useAuthSessionTimers.js.map +1 -0
- package/dist/providers/Auth/useAuthSessionTimers.spec.js +311 -0
- package/dist/providers/Auth/useAuthSessionTimers.spec.js.map +1 -0
- package/dist/providers/DocumentTitle/index.d.ts +1 -0
- package/dist/providers/DocumentTitle/index.d.ts.map +1 -1
- package/dist/providers/DocumentTitle/index.js +2 -0
- package/dist/providers/DocumentTitle/index.js.map +1 -1
- package/dist/providers/Embed/index.d.ts +24 -0
- package/dist/providers/Embed/index.d.ts.map +1 -0
- package/dist/providers/Embed/index.js +105 -0
- package/dist/providers/Embed/index.js.map +1 -0
- package/dist/providers/FormErrorHandler/index.d.ts +24 -0
- package/dist/providers/FormErrorHandler/index.d.ts.map +1 -0
- package/dist/providers/FormErrorHandler/index.js +6 -0
- package/dist/providers/FormErrorHandler/index.js.map +1 -0
- package/dist/providers/Root/index.d.ts +1 -0
- package/dist/providers/Root/index.d.ts.map +1 -1
- package/dist/providers/Root/index.js +37 -31
- package/dist/providers/Root/index.js.map +1 -1
- package/dist/providers/RouteTransition/ProgressBar/index.js +4 -1
- package/dist/providers/RouteTransition/ProgressBar/index.js.map +1 -1
- package/dist/providers/RouteTransition/ProgressBar/index.spec.js +44 -0
- package/dist/providers/RouteTransition/ProgressBar/index.spec.js.map +1 -0
- package/dist/providers/RouteTransition/index.d.ts +2 -0
- package/dist/providers/RouteTransition/index.d.ts.map +1 -1
- package/dist/providers/RouteTransition/index.js +42 -14
- package/dist/providers/RouteTransition/index.js.map +1 -1
- package/dist/providers/SidebarTabs/index.d.ts +3 -2
- package/dist/providers/SidebarTabs/index.d.ts.map +1 -1
- package/dist/providers/SidebarTabs/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.d.ts.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.js +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.spec.js +40 -0
- package/dist/providers/TableColumns/buildColumnState/index.spec.js.map +1 -0
- package/dist/providers/Theme/index.d.ts +3 -0
- package/dist/providers/Theme/index.d.ts.map +1 -1
- package/dist/providers/Theme/index.js +107 -95
- package/dist/providers/Theme/index.js.map +1 -1
- package/dist/providers/UploadHandlers/index.d.ts +2 -7
- package/dist/providers/UploadHandlers/index.d.ts.map +1 -1
- package/dist/providers/UploadHandlers/index.js +102 -42
- package/dist/providers/UploadHandlers/index.js.map +1 -1
- package/dist/styles.css +13 -10
- package/dist/utilities/combineFieldLabel.d.ts.map +1 -1
- package/dist/utilities/combineFieldLabel.js +5 -1
- package/dist/utilities/combineFieldLabel.js.map +1 -1
- package/dist/utilities/generateFieldID.d.ts +1 -1
- package/dist/utilities/generateFieldID.d.ts.map +1 -1
- package/dist/utilities/generateFieldID.js +2 -2
- package/dist/utilities/generateFieldID.js.map +1 -1
- package/dist/utilities/getRequestEmbed.d.ts +14 -0
- package/dist/utilities/getRequestEmbed.d.ts.map +1 -0
- package/dist/utilities/getRequestEmbed.js +10 -0
- package/dist/utilities/getRequestEmbed.js.map +1 -0
- package/dist/utilities/handleServerFunctions.d.ts +32 -8
- package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
- package/dist/utilities/handleServerFunctions.js +17 -37
- package/dist/utilities/handleServerFunctions.js.map +1 -1
- package/dist/utilities/renderTable.d.ts.map +1 -1
- package/dist/utilities/renderTable.js +18 -2
- package/dist/utilities/renderTable.js.map +1 -1
- package/dist/utilities/serverFunctionRegistry.d.ts +12 -7
- package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -1
- package/dist/utilities/serverFunctionRegistry.js +25 -7
- package/dist/utilities/serverFunctionRegistry.js.map +1 -1
- package/dist/utilities/slugify.d.ts.map +1 -1
- package/dist/utilities/slugify.js +49 -6
- package/dist/utilities/slugify.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/index.css +0 -8
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js +4 -4
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/RenderWidget.js.map +1 -1
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +10 -10
- package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
- package/dist/views/Edit/index.css +61 -53
- package/dist/views/HierarchyList/index.css +1 -1
- package/dist/views/List/index.css +1 -1
- package/dist/views/List/index.d.ts.map +1 -1
- package/dist/views/List/index.js +4 -0
- package/dist/views/List/index.js.map +1 -1
- package/dist/views/Logout/index.d.ts.map +1 -1
- package/dist/views/Logout/index.js +11 -0
- package/dist/views/Logout/index.js.map +1 -1
- package/dist/views/Root/index.d.ts +12 -1
- package/dist/views/Root/index.d.ts.map +1 -1
- package/dist/views/Root/index.js +10 -3
- package/dist/views/Root/index.js.map +1 -1
- package/package.json +6 -11
- package/dist/elements/RelationshipTable/Pagination.css +0 -39
- package/dist/scss/app.scss +0 -183
- package/dist/scss/colors.scss +0 -191
- package/dist/scss/custom.css +0 -1
- package/dist/scss/queries.scss +0 -27
- package/dist/scss/styles.scss +0 -9
- package/dist/scss/svg.scss +0 -10
- package/dist/scss/toastify.scss +0 -61
- package/dist/scss/vars.scss +0 -192
- 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":"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","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
|
-
|
|
4
|
-
|
|
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;
|
|
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"}
|