@jetbrains/ring-ui 6.0.6-beta.0 → 6.0.6
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/README.md +1 -1
- package/components/alert/alert.css +146 -0
- package/components/alert/alert.d.ts +113 -0
- package/components/alert/alert.js +186 -0
- package/components/alert/container.css +26 -0
- package/components/alert/container.d.ts +15 -0
- package/components/alert/container.js +30 -0
- package/components/alert-service/alert-service.d.ts +36 -0
- package/components/alert-service/alert-service.js +108 -0
- package/components/alert-service/alert-service.stories.css +17 -0
- package/components/analytics/analytics.d.ts +18 -0
- package/components/analytics/analytics.js +18 -0
- package/components/analytics/analytics__custom-plugin.d.ts +28 -0
- package/components/analytics/analytics__custom-plugin.js +58 -0
- package/components/auth/auth.d.ts +3 -0
- package/components/auth/auth.js +42 -0
- package/components/auth/auth__core.d.ts +236 -0
- package/components/auth/auth__core.js +834 -0
- package/components/auth/background-flow.d.ts +31 -0
- package/components/auth/background-flow.js +97 -0
- package/components/auth/down-notification.css +15 -0
- package/components/auth/down-notification.d.ts +15 -0
- package/components/auth/down-notification.js +52 -0
- package/components/auth/iframe-flow.d.ts +20 -0
- package/components/auth/iframe-flow.js +81 -0
- package/components/auth/request-builder.d.ts +48 -0
- package/components/auth/request-builder.js +64 -0
- package/components/auth/response-parser.d.ts +70 -0
- package/components/auth/response-parser.js +99 -0
- package/components/auth/storage.d.ts +112 -0
- package/components/auth/storage.js +224 -0
- package/components/auth/token-validator.d.ts +93 -0
- package/components/auth/token-validator.js +169 -0
- package/components/auth/window-flow.d.ts +26 -0
- package/components/auth/window-flow.js +102 -0
- package/components/auth-dialog/auth-dialog.css +54 -0
- package/components/auth-dialog/auth-dialog.d.ts +60 -0
- package/components/auth-dialog/auth-dialog.js +93 -0
- package/components/auth-dialog-service/auth-dialog-service.d.ts +6 -0
- package/components/auth-dialog-service/auth-dialog-service.js +26 -0
- package/components/avatar/avatar-example-datauri.d.ts +1 -0
- package/components/avatar/avatar-example-datauri.js +24 -0
- package/components/avatar/avatar.css +27 -0
- package/components/avatar/avatar.d.ts +52 -0
- package/components/avatar/avatar.js +98 -0
- package/components/avatar/fallback-avatar.d.ts +17 -0
- package/components/avatar/fallback-avatar.js +113 -0
- package/components/badge/badge.css +42 -0
- package/components/badge/badge.d.ts +24 -0
- package/components/badge/badge.js +35 -0
- package/components/button/button.css +397 -0
- package/components/button/button.d.ts +67 -0
- package/components/button/button.js +70 -0
- package/components/button/button__classes.d.ts +2 -0
- package/components/button/button__classes.js +18 -0
- package/components/button-group/button-group.css +236 -0
- package/components/button-group/button-group.d.ts +18 -0
- package/components/button-group/button-group.js +21 -0
- package/components/button-group/caption.d.ts +8 -0
- package/components/button-group/caption.js +14 -0
- package/components/button-set/button-set.css +21 -0
- package/components/button-set/button-set.d.ts +16 -0
- package/components/button-set/button-set.js +22 -0
- package/components/button-toolbar/button-toolbar.css +25 -0
- package/components/button-toolbar/button-toolbar.d.ts +16 -0
- package/components/button-toolbar/button-toolbar.js +20 -0
- package/components/caret/caret.d.ts +66 -0
- package/components/caret/caret.js +216 -0
- package/components/checkbox/checkbox.css +146 -0
- package/components/checkbox/checkbox.d.ts +45 -0
- package/components/checkbox/checkbox.js +72 -0
- package/components/clipboard/clipboard-fallback.d.ts +2 -0
- package/components/clipboard/clipboard-fallback.js +44 -0
- package/components/clipboard/clipboard.d.ts +5 -0
- package/components/clipboard/clipboard.js +41 -0
- package/components/code/code.css +29 -0
- package/components/code/code.d.ts +44 -0
- package/components/code/code.js +94 -0
- package/components/code/highlight.css +112 -0
- package/components/collapse/collapse-content.d.ts +11 -0
- package/components/collapse/collapse-content.js +72 -0
- package/components/collapse/collapse-context.d.ts +10 -0
- package/components/collapse/collapse-context.js +10 -0
- package/components/collapse/collapse-control.d.ts +11 -0
- package/components/collapse/collapse-control.js +22 -0
- package/components/collapse/collapse.css +40 -0
- package/components/collapse/collapse.d.ts +12 -0
- package/components/collapse/collapse.js +26 -0
- package/components/collapse/collapse.stories.css +25 -0
- package/components/collapse/consts.d.ts +4 -0
- package/components/collapse/consts.js +4 -0
- package/components/collapse/utils.d.ts +1 -0
- package/components/collapse/utils.js +1 -0
- package/components/confirm/confirm.css +7 -0
- package/components/confirm/confirm.d.ts +48 -0
- package/components/confirm/confirm.js +59 -0
- package/components/confirm-service/confirm-service.d.ts +21 -0
- package/components/confirm-service/confirm-service.js +52 -0
- package/components/content-layout/content-layout.css +108 -0
- package/components/content-layout/content-layout.d.ts +26 -0
- package/components/content-layout/content-layout.js +45 -0
- package/components/content-layout/sidebar.d.ts +31 -0
- package/components/content-layout/sidebar.js +76 -0
- package/components/contenteditable/contenteditable.d.ts +47 -0
- package/components/contenteditable/contenteditable.js +47 -0
- package/components/control-label/control-label.css +23 -0
- package/components/control-label/control-label.d.ts +11 -0
- package/components/control-label/control-label.js +22 -0
- package/components/data-list/data-list.css +97 -0
- package/components/data-list/data-list.d.ts +85 -0
- package/components/data-list/data-list.js +119 -0
- package/components/data-list/data-list.mock.d.ts +16 -0
- package/components/data-list/data-list.mock.js +207 -0
- package/components/data-list/item.d.ts +50 -0
- package/components/data-list/item.js +114 -0
- package/components/data-list/selection.d.ts +16 -0
- package/components/data-list/selection.js +81 -0
- package/components/data-list/title.d.ts +26 -0
- package/components/data-list/title.js +65 -0
- package/components/date-picker/consts.d.ts +98 -0
- package/components/date-picker/consts.js +44 -0
- package/components/date-picker/date-input.d.ts +47 -0
- package/components/date-picker/date-input.js +91 -0
- package/components/date-picker/date-picker.css +602 -0
- package/components/date-picker/date-picker.d.ts +77 -0
- package/components/date-picker/date-picker.js +218 -0
- package/components/date-picker/date-popup.d.ts +55 -0
- package/components/date-picker/date-popup.js +347 -0
- package/components/date-picker/day.d.ts +30 -0
- package/components/date-picker/day.js +88 -0
- package/components/date-picker/formats.d.ts +2 -0
- package/components/date-picker/formats.js +1 -0
- package/components/date-picker/month-names.d.ts +13 -0
- package/components/date-picker/month-names.js +62 -0
- package/components/date-picker/month-slider.d.ts +29 -0
- package/components/date-picker/month-slider.js +56 -0
- package/components/date-picker/month.d.ts +14 -0
- package/components/date-picker/month.js +33 -0
- package/components/date-picker/months.d.ts +11 -0
- package/components/date-picker/months.js +101 -0
- package/components/date-picker/weekdays.d.ts +13 -0
- package/components/date-picker/weekdays.js +24 -0
- package/components/date-picker/years.d.ts +25 -0
- package/components/date-picker/years.js +87 -0
- package/components/dialog/dialog.css +137 -0
- package/components/dialog/dialog.d.ts +64 -0
- package/components/dialog/dialog.js +128 -0
- package/components/dialog/dialog__body-scroll-preventer.d.ts +9 -0
- package/components/dialog/dialog__body-scroll-preventer.js +43 -0
- package/components/dropdown/anchor.d.ts +11 -0
- package/components/dropdown/anchor.js +16 -0
- package/components/dropdown/dropdown.css +18 -0
- package/components/dropdown/dropdown.d.ts +87 -0
- package/components/dropdown/dropdown.js +159 -0
- package/components/dropdown-menu/dropdown-menu.d.ts +36 -0
- package/components/dropdown-menu/dropdown-menu.js +56 -0
- package/components/editable-heading/editable-heading.css +198 -0
- package/components/editable-heading/editable-heading.d.ts +32 -0
- package/components/editable-heading/editable-heading.js +141 -0
- package/components/error-bubble/error-bubble-legacy.css +77 -0
- package/components/error-bubble/error-bubble.css +54 -0
- package/components/error-bubble/error-bubble.d.ts +18 -0
- package/components/error-bubble/error-bubble.js +28 -0
- package/components/error-message/error-message.css +37 -0
- package/components/error-message/error-message.d.ts +27 -0
- package/components/error-message/error-message.js +37 -0
- package/components/error-page/error-page.css +24 -0
- package/components/error-page/error-page.gif +0 -0
- package/components/footer/footer.css +83 -0
- package/components/footer/footer.d.ts +28 -0
- package/components/footer/footer.js +97 -0
- package/components/form/form.css +266 -0
- package/components/form/form.stories.js +138 -0
- package/components/global/compose.d.ts +7 -0
- package/components/global/compose.js +4 -0
- package/components/global/composeRefs.d.ts +3 -0
- package/components/global/composeRefs.js +8 -0
- package/components/global/controls-height.d.ts +9 -0
- package/components/global/controls-height.js +16 -0
- package/components/global/create-stateful-context.d.ts +27 -0
- package/components/global/create-stateful-context.js +38 -0
- package/components/global/data-tests.d.ts +3 -0
- package/components/global/data-tests.js +17 -0
- package/components/global/dom.d.ts +37 -0
- package/components/global/dom.js +83 -0
- package/components/global/focus-sensor-hoc.d.ts +19 -0
- package/components/global/focus-sensor-hoc.js +102 -0
- package/components/global/fuzzy-highlight.d.ts +11 -0
- package/components/global/fuzzy-highlight.js +58 -0
- package/components/global/get-event-key.d.ts +2 -0
- package/components/global/get-event-key.js +100 -0
- package/components/global/get-uid.d.ts +1 -0
- package/components/global/get-uid.js +16 -0
- package/components/global/global.css +101 -0
- package/components/global/inject-styles.d.ts +3 -0
- package/components/global/inject-styles.js +12 -0
- package/components/global/linear-function.d.ts +6 -0
- package/components/global/linear-function.js +13 -0
- package/components/global/listeners.d.ts +8 -0
- package/components/global/listeners.js +27 -0
- package/components/global/memoize.d.ts +1 -0
- package/components/global/memoize.js +15 -0
- package/components/global/normalize-indent.d.ts +1 -0
- package/components/global/normalize-indent.js +30 -0
- package/components/global/promise-with-timeout.d.ts +5 -0
- package/components/global/promise-with-timeout.js +11 -0
- package/components/global/prop-types.d.ts +4 -0
- package/components/global/prop-types.js +4 -0
- package/components/global/react-dom-renderer.d.ts +16 -0
- package/components/global/react-dom-renderer.js +25 -0
- package/components/global/react-render-adapter.d.ts +1 -0
- package/components/global/react-render-adapter.js +3 -0
- package/components/global/rerender-hoc.d.ts +10 -0
- package/components/global/rerender-hoc.js +14 -0
- package/components/global/schedule-raf.d.ts +1 -0
- package/components/global/schedule-raf.js +27 -0
- package/components/global/sniffer.d.ts +3 -0
- package/components/global/sniffer.js +4 -0
- package/components/global/theme.d.ts +21 -0
- package/components/global/theme.js +70 -0
- package/components/global/trivial-template-tag.d.ts +1 -0
- package/components/global/trivial-template-tag.js +9 -0
- package/components/global/typescript-utils.d.ts +2 -0
- package/components/global/typescript-utils.js +2 -0
- package/components/global/url.d.ts +57 -0
- package/components/global/url.js +136 -0
- package/components/global/use-event-callback.d.ts +1 -0
- package/components/global/use-event-callback.js +14 -0
- package/components/global/variables.css +179 -0
- package/components/global/variables.d.ts +89 -0
- package/components/global/variables.js +1 -0
- package/components/global/variables_dark.css +132 -0
- package/components/grid/col.d.ts +31 -0
- package/components/grid/col.js +49 -0
- package/components/grid/grid.css +915 -0
- package/components/grid/grid.d.ts +14 -0
- package/components/grid/grid.js +22 -0
- package/components/grid/row.d.ts +40 -0
- package/components/grid/row.js +51 -0
- package/components/group/group.css +7 -0
- package/components/group/group.d.ts +12 -0
- package/components/group/group.js +20 -0
- package/components/header/header.css +169 -0
- package/components/header/header.d.ts +34 -0
- package/components/header/header.js +46 -0
- package/components/header/logo.d.ts +14 -0
- package/components/header/logo.js +22 -0
- package/components/header/profile.d.ts +75 -0
- package/components/header/profile.js +119 -0
- package/components/header/services-link.d.ts +25 -0
- package/components/header/services-link.js +26 -0
- package/components/header/services.css +97 -0
- package/components/header/services.d.ts +33 -0
- package/components/header/services.js +62 -0
- package/components/header/smart-profile.d.ts +36 -0
- package/components/header/smart-profile.js +86 -0
- package/components/header/smart-services.d.ts +26 -0
- package/components/header/smart-services.js +49 -0
- package/components/header/tray-icon.d.ts +32 -0
- package/components/header/tray-icon.js +20 -0
- package/components/header/tray.d.ts +9 -0
- package/components/header/tray.js +18 -0
- package/components/heading/heading.css +68 -0
- package/components/heading/heading.d.ts +25 -0
- package/components/heading/heading.js +52 -0
- package/components/http/http.d.ts +61 -0
- package/components/http/http.js +192 -0
- package/components/http/http.mock.d.ts +20 -0
- package/components/http/http.mock.js +52 -0
- package/components/hub-source/hub-source.d.ts +44 -0
- package/components/hub-source/hub-source.js +107 -0
- package/components/hub-source/hub-source__user.d.ts +4 -0
- package/components/hub-source/hub-source__user.js +20 -0
- package/components/hub-source/hub-source__users-groups.d.ts +24 -0
- package/components/hub-source/hub-source__users-groups.js +53 -0
- package/components/i18n/README.md +46 -0
- package/components/i18n/i18n-context.d.ts +13 -0
- package/components/i18n/i18n-context.js +14 -0
- package/components/i18n/i18n.d.ts +59 -0
- package/components/i18n/i18n.js +26 -0
- package/components/i18n/messages.json +53 -0
- package/components/icon/icon.css +100 -0
- package/components/icon/icon.d.ts +43 -0
- package/components/icon/icon.js +69 -0
- package/components/icon/icon__constants.d.ts +30 -0
- package/components/icon/icon__constants.js +32 -0
- package/components/icon/icon__svg.d.ts +15 -0
- package/components/icon/icon__svg.js +58 -0
- package/components/icon/index.d.ts +2 -0
- package/components/icon/index.js +2 -0
- package/components/input/input-legacy.css +123 -0
- package/components/input/input.css +194 -0
- package/components/input/input.d.ts +77 -0
- package/components/input/input.js +165 -0
- package/components/input-size/input-size.css +82 -0
- package/components/input-size/input-size.stories.js +73 -0
- package/components/island/adaptive-island-hoc.d.ts +61 -0
- package/components/island/adaptive-island-hoc.js +28 -0
- package/components/island/content.d.ts +43 -0
- package/components/island/content.js +100 -0
- package/components/island/header.d.ts +8 -0
- package/components/island/header.js +78 -0
- package/components/island/island.css +131 -0
- package/components/island/island.d.ts +78 -0
- package/components/island/island.js +31 -0
- package/components/island-legacy/content-legacy.d.ts +10 -0
- package/components/island-legacy/content-legacy.js +17 -0
- package/components/island-legacy/header-legacy.d.ts +10 -0
- package/components/island-legacy/header-legacy.js +19 -0
- package/components/island-legacy/island-legacy.css +98 -0
- package/components/island-legacy/island-legacy.d.ts +12 -0
- package/components/island-legacy/island-legacy.js +19 -0
- package/components/line/line.css +14 -0
- package/components/link/clickableLink.d.ts +20 -0
- package/components/link/clickableLink.js +33 -0
- package/components/link/link.css +64 -0
- package/components/link/link.d.ts +138 -0
- package/components/link/link.js +44 -0
- package/components/list/consts.d.ts +77 -0
- package/components/list/consts.js +25 -0
- package/components/list/list.css +298 -0
- package/components/list/list.d.ts +205 -0
- package/components/list/list.js +590 -0
- package/components/list/list.stories.css +3 -0
- package/components/list/list__custom.d.ts +6 -0
- package/components/list/list__custom.js +52 -0
- package/components/list/list__hint.d.ts +15 -0
- package/components/list/list__hint.js +16 -0
- package/components/list/list__item.d.ts +8 -0
- package/components/list/list__item.js +130 -0
- package/components/list/list__link.d.ts +9 -0
- package/components/list/list__link.js +43 -0
- package/components/list/list__separator.d.ts +5 -0
- package/components/list/list__separator.js +21 -0
- package/components/list/list__title.d.ts +5 -0
- package/components/list/list__title.js +28 -0
- package/components/list/list__users-groups-source.d.ts +27 -0
- package/components/list/list__users-groups-source.js +74 -0
- package/components/loader/loader.css +27 -0
- package/components/loader/loader.d.ts +28 -0
- package/components/loader/loader.js +44 -0
- package/components/loader/loader__core.d.ts +75 -0
- package/components/loader/loader__core.js +219 -0
- package/components/loader-inline/loader-inline.css +73 -0
- package/components/loader-inline/loader-inline.d.ts +18 -0
- package/components/loader-inline/loader-inline.js +27 -0
- package/components/loader-screen/loader-screen.css +29 -0
- package/components/loader-screen/loader-screen.d.ts +17 -0
- package/components/loader-screen/loader-screen.js +25 -0
- package/components/login-dialog/login-dialog.css +23 -0
- package/components/login-dialog/login-dialog.d.ts +47 -0
- package/components/login-dialog/login-dialog.js +84 -0
- package/components/login-dialog/service.d.ts +2 -0
- package/components/login-dialog/service.js +24 -0
- package/components/markdown/markdown.css +126 -0
- package/components/markdown/markdown.d.ts +12 -0
- package/components/markdown/markdown.js +25 -0
- package/components/message/message.css +61 -0
- package/components/message/message.d.ts +55 -0
- package/components/message/message.js +129 -0
- package/components/old-browsers-message/old-browsers-message.css +26 -0
- package/components/old-browsers-message/old-browsers-message.d.ts +2 -0
- package/components/old-browsers-message/old-browsers-message.js +83 -0
- package/components/old-browsers-message/old-browsers-message__stop.d.ts +1 -0
- package/components/old-browsers-message/old-browsers-message__stop.js +2 -0
- package/components/old-browsers-message/white-list.d.ts +2 -0
- package/components/old-browsers-message/white-list.js +25 -0
- package/components/pager/pager.css +19 -0
- package/components/pager/pager.d.ts +78 -0
- package/components/pager/pager.js +223 -0
- package/components/palette/palette.css +216 -0
- package/components/panel/panel.css +20 -0
- package/components/panel/panel.d.ts +12 -0
- package/components/panel/panel.js +20 -0
- package/components/permissions/permissions.d.ts +111 -0
- package/components/permissions/permissions.js +177 -0
- package/components/permissions/permissions__cache.d.ts +93 -0
- package/components/permissions/permissions__cache.js +228 -0
- package/components/popup/popup.consts.d.ts +37 -0
- package/components/popup/popup.consts.js +45 -0
- package/components/popup/popup.css +34 -0
- package/components/popup/popup.d.ts +147 -0
- package/components/popup/popup.js +312 -0
- package/components/popup/popup.target.d.ts +7 -0
- package/components/popup/popup.target.js +15 -0
- package/components/popup/position.d.ts +30 -0
- package/components/popup/position.js +202 -0
- package/components/popup-menu/popup-menu.d.ts +80 -0
- package/components/popup-menu/popup-menu.js +41 -0
- package/components/progress-bar/progress-bar.css +82 -0
- package/components/progress-bar/progress-bar.d.ts +64 -0
- package/components/progress-bar/progress-bar.js +76 -0
- package/components/query-assist/query-assist.css +275 -0
- package/components/query-assist/query-assist.d.ts +306 -0
- package/components/query-assist/query-assist.js +847 -0
- package/components/query-assist/query-assist__suggestions.d.ts +29 -0
- package/components/query-assist/query-assist__suggestions.js +60 -0
- package/components/radio/radio.css +122 -0
- package/components/radio/radio.d.ts +18 -0
- package/components/radio/radio.js +27 -0
- package/components/radio/radio__item.d.ts +28 -0
- package/components/radio/radio__item.js +41 -0
- package/components/select/select-popup.css +103 -0
- package/components/select/select.css +235 -0
- package/components/select/select.d.ts +276 -0
- package/components/select/select.js +957 -0
- package/components/select/select__filter.d.ts +19 -0
- package/components/select/select__filter.js +49 -0
- package/components/select/select__popup.d.ts +166 -0
- package/components/select/select__popup.js +408 -0
- package/components/shortcuts/core.d.ts +74 -0
- package/components/shortcuts/core.js +191 -0
- package/components/shortcuts/shortcut-title.d.ts +1 -0
- package/components/shortcuts/shortcut-title.js +50 -0
- package/components/shortcuts/shortcuts-hoc.d.ts +65 -0
- package/components/shortcuts/shortcuts-hoc.js +19 -0
- package/components/shortcuts/shortcuts.d.ts +28 -0
- package/components/shortcuts/shortcuts.js +50 -0
- package/components/sidebar/sidebar.css +157 -0
- package/components/storage/storage.d.ts +18 -0
- package/components/storage/storage.js +22 -0
- package/components/storage/storage__fallback.d.ts +79 -0
- package/components/storage/storage__fallback.js +181 -0
- package/components/storage/storage__local.d.ts +38 -0
- package/components/storage/storage__local.js +119 -0
- package/components/tab-trap/tab-trap.css +6 -0
- package/components/tab-trap/tab-trap.d.ts +43 -0
- package/components/tab-trap/tab-trap.js +125 -0
- package/components/table/cell.d.ts +13 -0
- package/components/table/cell.js +16 -0
- package/components/table/disable-hover-hoc.d.ts +64 -0
- package/components/table/disable-hover-hoc.js +32 -0
- package/components/table/header-cell.d.ts +43 -0
- package/components/table/header-cell.js +56 -0
- package/components/table/header.d.ts +56 -0
- package/components/table/header.js +67 -0
- package/components/table/multitable.d.ts +25 -0
- package/components/table/multitable.js +81 -0
- package/components/table/row-with-focus-sensor.d.ts +18 -0
- package/components/table/row-with-focus-sensor.js +25 -0
- package/components/table/row.d.ts +59 -0
- package/components/table/row.js +154 -0
- package/components/table/selection-adapter.d.ts +5 -0
- package/components/table/selection-adapter.js +10 -0
- package/components/table/selection-shortcuts-hoc.d.ts +17 -0
- package/components/table/selection-shortcuts-hoc.js +146 -0
- package/components/table/selection.d.ts +47 -0
- package/components/table/selection.js +150 -0
- package/components/table/smart-table.d.ts +64 -0
- package/components/table/smart-table.js +40 -0
- package/components/table/table.css +259 -0
- package/components/table/table.d.ts +159 -0
- package/components/table/table.examples2.json +19 -0
- package/components/table/table.js +231 -0
- package/components/table/table.stories.json +45 -0
- package/components/table-legacy/table-legacy.css +346 -0
- package/components/table-legacy/table-legacy__toolbar.css +25 -0
- package/components/tabs/collapsible-more.d.ts +29 -0
- package/components/tabs/collapsible-more.js +97 -0
- package/components/tabs/collapsible-tab.d.ts +16 -0
- package/components/tabs/collapsible-tab.js +34 -0
- package/components/tabs/collapsible-tabs.d.ts +43 -0
- package/components/tabs/collapsible-tabs.js +196 -0
- package/components/tabs/custom-item.d.ts +9 -0
- package/components/tabs/custom-item.js +5 -0
- package/components/tabs/dumb-tabs.d.ts +35 -0
- package/components/tabs/dumb-tabs.js +56 -0
- package/components/tabs/smart-tabs.d.ts +20 -0
- package/components/tabs/smart-tabs.js +25 -0
- package/components/tabs/tab-link.d.ts +18 -0
- package/components/tabs/tab-link.js +24 -0
- package/components/tabs/tab.d.ts +27 -0
- package/components/tabs/tab.js +19 -0
- package/components/tabs/tabs.css +223 -0
- package/components/tabs/tabs.d.ts +7 -0
- package/components/tabs/tabs.js +7 -0
- package/components/tag/tag.css +184 -0
- package/components/tag/tag.d.ts +64 -0
- package/components/tag/tag.js +130 -0
- package/components/tags-input/tags-input.css +100 -0
- package/components/tags-input/tags-input.d.ts +138 -0
- package/components/tags-input/tags-input.js +275 -0
- package/components/tags-list/tags-list.d.ts +46 -0
- package/components/tags-list/tags-list.js +45 -0
- package/components/text/text.css +21 -0
- package/components/text/text.d.ts +23 -0
- package/components/text/text.js +31 -0
- package/components/toggle/toggle.css +198 -0
- package/components/toggle/toggle.d.ts +39 -0
- package/components/toggle/toggle.js +46 -0
- package/components/tooltip/tooltip.css +17 -0
- package/components/tooltip/tooltip.d.ts +65 -0
- package/components/tooltip/tooltip.js +126 -0
- package/components/user-agreement/service.d.ts +69 -0
- package/components/user-agreement/service.js +242 -0
- package/components/user-agreement/toolbox.eula.d.ts +2 -0
- package/components/user-agreement/toolbox.eula.js +160 -0
- package/components/user-agreement/user-agreement.css +29 -0
- package/components/user-agreement/user-agreement.d.ts +60 -0
- package/components/user-agreement/user-agreement.js +80 -0
- package/components/user-card/card.d.ts +70 -0
- package/components/user-card/card.js +89 -0
- package/components/user-card/smart-user-card-tooltip.d.ts +20 -0
- package/components/user-card/smart-user-card-tooltip.js +47 -0
- package/components/user-card/tooltip.d.ts +36 -0
- package/components/user-card/tooltip.js +43 -0
- package/components/user-card/user-card.css +123 -0
- package/components/user-card/user-card.d.ts +11 -0
- package/components/user-card/user-card.js +11 -0
- package/package.json +61 -61
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { StorageClass, StorageInterface } from '../storage/storage';
|
|
2
|
+
import { AuthUser } from './auth__core';
|
|
3
|
+
import { AuthResponse } from './response-parser';
|
|
4
|
+
export interface StoredToken {
|
|
5
|
+
accessToken: string;
|
|
6
|
+
scopes?: string[];
|
|
7
|
+
expires?: number;
|
|
8
|
+
lifeTime?: number;
|
|
9
|
+
waitForRedirectTimeout?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface AuthState extends AuthResponse {
|
|
12
|
+
restoreLocation?: string;
|
|
13
|
+
scopes?: string[];
|
|
14
|
+
nonRedirect?: boolean | null | undefined;
|
|
15
|
+
created?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface AuthStorageConfig {
|
|
18
|
+
stateKeyPrefix?: string | null | undefined;
|
|
19
|
+
tokenKey?: string | null | undefined;
|
|
20
|
+
messagePrefix?: string | null | undefined;
|
|
21
|
+
userKey?: string | null | undefined;
|
|
22
|
+
stateTTL?: number | null | undefined;
|
|
23
|
+
storage?: StorageClass | null | undefined;
|
|
24
|
+
stateQuota?: number | null | undefined;
|
|
25
|
+
}
|
|
26
|
+
export default class AuthStorage<M = unknown> {
|
|
27
|
+
messagePrefix: string;
|
|
28
|
+
stateKeyPrefix: string;
|
|
29
|
+
tokenKey: string;
|
|
30
|
+
userKey: string;
|
|
31
|
+
stateTTL: number;
|
|
32
|
+
stateQuota: number;
|
|
33
|
+
private _lastMessage;
|
|
34
|
+
_stateStorage: StorageInterface;
|
|
35
|
+
_tokenStorage: StorageInterface;
|
|
36
|
+
_messagesStorage: StorageInterface;
|
|
37
|
+
private _currentUserStorage;
|
|
38
|
+
/**
|
|
39
|
+
* Custom storage for Auth
|
|
40
|
+
* @param {{stateKeyPrefix: string, tokenKey: string, onTokenRemove: Function}} config
|
|
41
|
+
*/
|
|
42
|
+
constructor(config: AuthStorageConfig);
|
|
43
|
+
/**
|
|
44
|
+
* Add token change listener
|
|
45
|
+
* @param {function(string)} fn Token change listener
|
|
46
|
+
* @return {function()} remove listener function
|
|
47
|
+
*/
|
|
48
|
+
onTokenChange(fn: (token: StoredToken | null) => void): () => void;
|
|
49
|
+
/**
|
|
50
|
+
* Add state change listener
|
|
51
|
+
* @param {string} stateKey State key
|
|
52
|
+
* @param {function(string)} fn State change listener
|
|
53
|
+
* @return {function()} remove listener function
|
|
54
|
+
*/
|
|
55
|
+
onStateChange(stateKey: string, fn: (state: AuthState | null) => void): () => void;
|
|
56
|
+
/**
|
|
57
|
+
* Add state change listener
|
|
58
|
+
* @param {string} key State key
|
|
59
|
+
* @param {function(string)} fn State change listener
|
|
60
|
+
* @return {function()} remove listener function
|
|
61
|
+
*/
|
|
62
|
+
onMessage(key: string, fn: (message: M | null) => void): () => void;
|
|
63
|
+
sendMessage(key: string, message?: M | null): void;
|
|
64
|
+
/**
|
|
65
|
+
* Save authentication request state.
|
|
66
|
+
*
|
|
67
|
+
* @param {string} id Unique state identifier
|
|
68
|
+
* @param {StoredState} state State to store
|
|
69
|
+
* @param {boolean=} dontCleanAndRetryOnFail If falsy then remove all stored states and try again to save state
|
|
70
|
+
*/
|
|
71
|
+
saveState(id: string, state: AuthState, dontCleanAndRetryOnFail?: boolean): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Remove all stored states
|
|
74
|
+
*
|
|
75
|
+
* @return {Promise} promise that is resolved when OLD states [and some selected] are removed
|
|
76
|
+
*/
|
|
77
|
+
cleanStates(removeStateId?: string): Promise<0 | void[] | undefined>;
|
|
78
|
+
/**
|
|
79
|
+
* Get state by id and remove stored states from the storage.
|
|
80
|
+
*
|
|
81
|
+
* @param {string} id unique state identifier
|
|
82
|
+
* @return {Promise.<StoredState>}
|
|
83
|
+
*/
|
|
84
|
+
getState(id: string): Promise<AuthState | null>;
|
|
85
|
+
/**
|
|
86
|
+
* @param {StoredToken} token
|
|
87
|
+
* @return {Promise} promise that is resolved when the token is saved
|
|
88
|
+
*/
|
|
89
|
+
saveToken(token: StoredToken): Promise<StoredToken | null>;
|
|
90
|
+
/**
|
|
91
|
+
* @return {Promise.<StoredToken>} promise that is resolved to the stored token
|
|
92
|
+
*/
|
|
93
|
+
getToken(): Promise<StoredToken | null>;
|
|
94
|
+
/**
|
|
95
|
+
* Remove stored token if any.
|
|
96
|
+
* @return {Promise} promise that is resolved when the token is wiped.
|
|
97
|
+
*/
|
|
98
|
+
wipeToken(): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* @param {function} loadUser user loader
|
|
101
|
+
* @return {Promise.<object>>} promise that is resolved to stored current user
|
|
102
|
+
*/
|
|
103
|
+
getCachedUser(loadUser: () => Promise<AuthUser | null>): Promise<AuthUser | null>;
|
|
104
|
+
/**
|
|
105
|
+
* Remove cached user if any
|
|
106
|
+
*/
|
|
107
|
+
wipeCachedCurrentUser(): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Wipes cache if user has changed
|
|
110
|
+
*/
|
|
111
|
+
onUserChanged(): void;
|
|
112
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import Storage from '../storage/storage';
|
|
2
|
+
/**
|
|
3
|
+
* @typedef {Object} StoredToken
|
|
4
|
+
* @property {string} accessToken
|
|
5
|
+
* @property {string[]} scopes
|
|
6
|
+
* @property {number} expires
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {Object} StoredState
|
|
10
|
+
* @property {Date} created
|
|
11
|
+
* @property {string} restoreLocation
|
|
12
|
+
* @property {string[]} scopes
|
|
13
|
+
*/
|
|
14
|
+
const DEFAULT_STATE_QUOTA = 102400; // 100 kb ~~ 200 tabs with a large list of scopes
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
|
|
16
|
+
const DEFAULT_STATE_TTL = 1000 * 60 * 60 * 24; // nobody will need auth state after a day
|
|
17
|
+
const UPDATE_USER_TIMEOUT = 1000;
|
|
18
|
+
export default class AuthStorage {
|
|
19
|
+
messagePrefix;
|
|
20
|
+
stateKeyPrefix;
|
|
21
|
+
tokenKey;
|
|
22
|
+
userKey;
|
|
23
|
+
stateTTL;
|
|
24
|
+
stateQuota;
|
|
25
|
+
_lastMessage;
|
|
26
|
+
_stateStorage;
|
|
27
|
+
_tokenStorage;
|
|
28
|
+
_messagesStorage;
|
|
29
|
+
_currentUserStorage;
|
|
30
|
+
/**
|
|
31
|
+
* Custom storage for Auth
|
|
32
|
+
* @param {{stateKeyPrefix: string, tokenKey: string, onTokenRemove: Function}} config
|
|
33
|
+
*/
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.messagePrefix = config.messagePrefix || '';
|
|
36
|
+
this.stateKeyPrefix = config.stateKeyPrefix || '';
|
|
37
|
+
this.tokenKey = config.tokenKey || '';
|
|
38
|
+
this.userKey = config.userKey || 'user-key';
|
|
39
|
+
this.stateTTL = config.stateTTL || DEFAULT_STATE_TTL;
|
|
40
|
+
this._lastMessage = null;
|
|
41
|
+
const StorageConstructor = config.storage || Storage;
|
|
42
|
+
this.stateQuota = Math.min(config.stateQuota ||
|
|
43
|
+
DEFAULT_STATE_QUOTA, StorageConstructor.QUOTA || Infinity);
|
|
44
|
+
this._stateStorage = new StorageConstructor({
|
|
45
|
+
cookieName: 'ring-state'
|
|
46
|
+
});
|
|
47
|
+
this._tokenStorage = new StorageConstructor({
|
|
48
|
+
cookieName: 'ring-token'
|
|
49
|
+
});
|
|
50
|
+
this._messagesStorage = new StorageConstructor({
|
|
51
|
+
cookieName: 'ring-message'
|
|
52
|
+
});
|
|
53
|
+
this._currentUserStorage = new StorageConstructor({
|
|
54
|
+
cookieName: 'ring-user'
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Add token change listener
|
|
59
|
+
* @param {function(string)} fn Token change listener
|
|
60
|
+
* @return {function()} remove listener function
|
|
61
|
+
*/
|
|
62
|
+
onTokenChange(fn) {
|
|
63
|
+
return this._tokenStorage.on(this.tokenKey, fn);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Add state change listener
|
|
67
|
+
* @param {string} stateKey State key
|
|
68
|
+
* @param {function(string)} fn State change listener
|
|
69
|
+
* @return {function()} remove listener function
|
|
70
|
+
*/
|
|
71
|
+
onStateChange(stateKey, fn) {
|
|
72
|
+
return this._stateStorage.on(this.stateKeyPrefix + stateKey, fn);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Add state change listener
|
|
76
|
+
* @param {string} key State key
|
|
77
|
+
* @param {function(string)} fn State change listener
|
|
78
|
+
* @return {function()} remove listener function
|
|
79
|
+
*/
|
|
80
|
+
onMessage(key, fn) {
|
|
81
|
+
return this._messagesStorage.on(this.messagePrefix + key, message => fn(message));
|
|
82
|
+
}
|
|
83
|
+
sendMessage(key, message = null) {
|
|
84
|
+
this._lastMessage = message;
|
|
85
|
+
this._messagesStorage.set(this.messagePrefix + key, message);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Save authentication request state.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} id Unique state identifier
|
|
91
|
+
* @param {StoredState} state State to store
|
|
92
|
+
* @param {boolean=} dontCleanAndRetryOnFail If falsy then remove all stored states and try again to save state
|
|
93
|
+
*/
|
|
94
|
+
async saveState(id, state, dontCleanAndRetryOnFail) {
|
|
95
|
+
state.created = Date.now();
|
|
96
|
+
try {
|
|
97
|
+
await this._stateStorage.set(this.stateKeyPrefix + id, state);
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
if (!dontCleanAndRetryOnFail) {
|
|
101
|
+
await this.cleanStates();
|
|
102
|
+
return this.saveState(id, state, true);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
throw e;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Remove all stored states
|
|
112
|
+
*
|
|
113
|
+
* @return {Promise} promise that is resolved when OLD states [and some selected] are removed
|
|
114
|
+
*/
|
|
115
|
+
async cleanStates(removeStateId) {
|
|
116
|
+
const now = Date.now();
|
|
117
|
+
const removalResult = await this._stateStorage.each((key, value) => {
|
|
118
|
+
if (value == null) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
// Remove requested state
|
|
122
|
+
if (key === this.stateKeyPrefix + removeStateId) {
|
|
123
|
+
return this._stateStorage.remove(key);
|
|
124
|
+
}
|
|
125
|
+
if (key.indexOf(this.stateKeyPrefix) === 0) {
|
|
126
|
+
// Clean old states
|
|
127
|
+
const state = value;
|
|
128
|
+
const created = state.created ?? Date.now();
|
|
129
|
+
if (created + this.stateTTL < now) {
|
|
130
|
+
return this._stateStorage.remove(key);
|
|
131
|
+
}
|
|
132
|
+
// Data to clean up due quota
|
|
133
|
+
return {
|
|
134
|
+
key,
|
|
135
|
+
created,
|
|
136
|
+
size: JSON.stringify(state).length
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
});
|
|
141
|
+
const currentStates = removalResult.filter((state) => state != null);
|
|
142
|
+
let stateStorageSize = currentStates.
|
|
143
|
+
reduce((overallSize, state) => state.size + overallSize, 0);
|
|
144
|
+
if (stateStorageSize > this.stateQuota) {
|
|
145
|
+
currentStates.sort((a, b) => a.created - b.created);
|
|
146
|
+
const removalPromises = currentStates.filter(state => {
|
|
147
|
+
if (stateStorageSize > this.stateQuota) {
|
|
148
|
+
stateStorageSize -= state.size;
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}).map(state => this._stateStorage.remove(state.key));
|
|
153
|
+
return removalPromises.length && Promise.all(removalPromises);
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get state by id and remove stored states from the storage.
|
|
159
|
+
*
|
|
160
|
+
* @param {string} id unique state identifier
|
|
161
|
+
* @return {Promise.<StoredState>}
|
|
162
|
+
*/
|
|
163
|
+
async getState(id) {
|
|
164
|
+
try {
|
|
165
|
+
const result = await this._stateStorage.get(this.stateKeyPrefix + id);
|
|
166
|
+
await this.cleanStates(id);
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
await this.cleanStates(id);
|
|
171
|
+
throw e;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* @param {StoredToken} token
|
|
176
|
+
* @return {Promise} promise that is resolved when the token is saved
|
|
177
|
+
*/
|
|
178
|
+
saveToken(token) {
|
|
179
|
+
return this._tokenStorage.set(this.tokenKey, token);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* @return {Promise.<StoredToken>} promise that is resolved to the stored token
|
|
183
|
+
*/
|
|
184
|
+
getToken() {
|
|
185
|
+
return this._tokenStorage.get(this.tokenKey);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Remove stored token if any.
|
|
189
|
+
* @return {Promise} promise that is resolved when the token is wiped.
|
|
190
|
+
*/
|
|
191
|
+
wipeToken() {
|
|
192
|
+
return this._tokenStorage.remove(this.tokenKey);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* @param {function} loadUser user loader
|
|
196
|
+
* @return {Promise.<object>>} promise that is resolved to stored current user
|
|
197
|
+
*/
|
|
198
|
+
async getCachedUser(loadUser) {
|
|
199
|
+
const user = await this._currentUserStorage.get(this.userKey);
|
|
200
|
+
const loadAndCache = () => loadUser().then(response => {
|
|
201
|
+
this._currentUserStorage.set(this.userKey, response);
|
|
202
|
+
return response;
|
|
203
|
+
});
|
|
204
|
+
if (user && user.id) {
|
|
205
|
+
setTimeout(loadAndCache, UPDATE_USER_TIMEOUT);
|
|
206
|
+
return user;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
return loadAndCache();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Remove cached user if any
|
|
214
|
+
*/
|
|
215
|
+
wipeCachedCurrentUser() {
|
|
216
|
+
return this._currentUserStorage.remove(this.userKey);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Wipes cache if user has changed
|
|
220
|
+
*/
|
|
221
|
+
onUserChanged() {
|
|
222
|
+
this.wipeCachedCurrentUser();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import ExtendableError from 'es6-error';
|
|
2
|
+
import AuthStorage, { StoredToken } from './storage';
|
|
3
|
+
export interface TokenValidatorConfig {
|
|
4
|
+
scope: string[];
|
|
5
|
+
optionalScopes?: readonly string[] | null | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare class TokenValidationError extends ExtendableError {
|
|
8
|
+
cause: Error | undefined;
|
|
9
|
+
authRedirect: true;
|
|
10
|
+
constructor(message: string, cause?: Error);
|
|
11
|
+
}
|
|
12
|
+
export default class TokenValidator {
|
|
13
|
+
private _getUser;
|
|
14
|
+
private _config;
|
|
15
|
+
private _storage;
|
|
16
|
+
constructor(config: TokenValidatorConfig, getUser: (accessToken: string) => Promise<void>, storage: AuthStorage);
|
|
17
|
+
/**
|
|
18
|
+
* Returns epoch - seconds since 1970.
|
|
19
|
+
* Used for calculation of expire times.
|
|
20
|
+
* @return {number} epoch, seconds since 1970
|
|
21
|
+
* @private
|
|
22
|
+
*/
|
|
23
|
+
static _epoch(): number;
|
|
24
|
+
/**
|
|
25
|
+
* @const {number}
|
|
26
|
+
*/
|
|
27
|
+
static DEFAULT_REFRESH_BEFORE: number;
|
|
28
|
+
/**
|
|
29
|
+
* Error class for auth token validation
|
|
30
|
+
*
|
|
31
|
+
* @param {string} message Error message
|
|
32
|
+
* @param {Error=} cause Error that caused this error
|
|
33
|
+
*/
|
|
34
|
+
static TokenValidationError: typeof TokenValidationError;
|
|
35
|
+
/**
|
|
36
|
+
* Check token validity against all conditions.
|
|
37
|
+
* @returns {Promise.<string>}
|
|
38
|
+
*/
|
|
39
|
+
validateTokenLocally(): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Check token validity against all conditions.
|
|
42
|
+
* @returns {Promise.<string>}
|
|
43
|
+
*/
|
|
44
|
+
validateToken(): Promise<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Check if there is a token
|
|
47
|
+
* @param {StoredToken} storedToken
|
|
48
|
+
* @return {Promise.<StoredToken>}
|
|
49
|
+
* @private
|
|
50
|
+
*/
|
|
51
|
+
private static _validateExistence;
|
|
52
|
+
/**
|
|
53
|
+
* Check expiration
|
|
54
|
+
* @param {StoredToken} storedToken
|
|
55
|
+
* @return {Promise.<StoredToken>}
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
private static _validateExpiration;
|
|
59
|
+
/**
|
|
60
|
+
* Check scopes
|
|
61
|
+
* @param {StoredToken} storedToken
|
|
62
|
+
* @return {Promise.<StoredToken>}
|
|
63
|
+
* @private
|
|
64
|
+
*/
|
|
65
|
+
private _validateScopes;
|
|
66
|
+
/**
|
|
67
|
+
* Check by error code if token should be refreshed
|
|
68
|
+
* @param {string} error
|
|
69
|
+
* @return {boolean}
|
|
70
|
+
*/
|
|
71
|
+
static shouldRefreshToken(error: string | undefined): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Check scopes
|
|
74
|
+
* @param {StoredToken} storedToken
|
|
75
|
+
* @return {Promise.<StoredToken>}
|
|
76
|
+
* @private
|
|
77
|
+
*/
|
|
78
|
+
_validateAgainstUser(storedToken: StoredToken): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Token Validator function
|
|
81
|
+
* @typedef {(function(StoredToken): Promise<StoredToken>)} TokenValidator
|
|
82
|
+
*/
|
|
83
|
+
/**
|
|
84
|
+
* Gets stored token and applies provided validators
|
|
85
|
+
* @param {TokenValidator[]} validators An array of validation
|
|
86
|
+
* functions to check the stored token against.
|
|
87
|
+
* @return {Promise.<string>} promise that is resolved to access token if the stored token is valid. If it is
|
|
88
|
+
* invalid then the promise is rejected. If invalid token should be re-requested then rejection object will
|
|
89
|
+
* have {authRedirect: true}.
|
|
90
|
+
* @private
|
|
91
|
+
*/
|
|
92
|
+
_getValidatedToken(validators: ((token: StoredToken) => void | Promise<void>)[]): Promise<string>;
|
|
93
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import ExtendableError from 'es6-error';
|
|
2
|
+
import { CODE } from '../http/http';
|
|
3
|
+
export class TokenValidationError extends ExtendableError {
|
|
4
|
+
cause;
|
|
5
|
+
authRedirect;
|
|
6
|
+
constructor(message, cause) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.cause = cause;
|
|
9
|
+
this.authRedirect = true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export default class TokenValidator {
|
|
13
|
+
_getUser;
|
|
14
|
+
_config;
|
|
15
|
+
_storage;
|
|
16
|
+
constructor(config, getUser, storage) {
|
|
17
|
+
this._getUser = getUser;
|
|
18
|
+
this._config = config;
|
|
19
|
+
this._storage = storage;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns epoch - seconds since 1970.
|
|
23
|
+
* Used for calculation of expire times.
|
|
24
|
+
* @return {number} epoch, seconds since 1970
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
27
|
+
static _epoch() {
|
|
28
|
+
const milliseconds = 1000.0;
|
|
29
|
+
return Math.round(Date.now() / milliseconds);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @const {number}
|
|
33
|
+
*/
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
|
|
35
|
+
static DEFAULT_REFRESH_BEFORE = 10 * 60; // 20 min in s
|
|
36
|
+
/**
|
|
37
|
+
* Error class for auth token validation
|
|
38
|
+
*
|
|
39
|
+
* @param {string} message Error message
|
|
40
|
+
* @param {Error=} cause Error that caused this error
|
|
41
|
+
*/
|
|
42
|
+
static TokenValidationError = TokenValidationError;
|
|
43
|
+
/**
|
|
44
|
+
* Check token validity against all conditions.
|
|
45
|
+
* @returns {Promise.<string>}
|
|
46
|
+
*/
|
|
47
|
+
validateTokenLocally() {
|
|
48
|
+
return this._getValidatedToken([
|
|
49
|
+
TokenValidator._validateExistence,
|
|
50
|
+
TokenValidator._validateExpiration,
|
|
51
|
+
this._validateScopes.bind(this)
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check token validity against all conditions.
|
|
56
|
+
* @returns {Promise.<string>}
|
|
57
|
+
*/
|
|
58
|
+
validateToken() {
|
|
59
|
+
return this._getValidatedToken([
|
|
60
|
+
TokenValidator._validateExistence,
|
|
61
|
+
TokenValidator._validateExpiration,
|
|
62
|
+
this._validateScopes.bind(this),
|
|
63
|
+
this._validateAgainstUser.bind(this)
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if there is a token
|
|
68
|
+
* @param {StoredToken} storedToken
|
|
69
|
+
* @return {Promise.<StoredToken>}
|
|
70
|
+
* @private
|
|
71
|
+
*/
|
|
72
|
+
static _validateExistence(storedToken) {
|
|
73
|
+
if (!storedToken || !storedToken.accessToken) {
|
|
74
|
+
throw new TokenValidator.TokenValidationError('Token not found');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check expiration
|
|
79
|
+
* @param {StoredToken} storedToken
|
|
80
|
+
* @return {Promise.<StoredToken>}
|
|
81
|
+
* @private
|
|
82
|
+
*/
|
|
83
|
+
static _validateExpiration({ expires, lifeTime }) {
|
|
84
|
+
const REFRESH_BEFORE_RATIO = 6;
|
|
85
|
+
const refreshBefore = lifeTime
|
|
86
|
+
? Math.ceil(lifeTime / REFRESH_BEFORE_RATIO)
|
|
87
|
+
: TokenValidator.DEFAULT_REFRESH_BEFORE;
|
|
88
|
+
if (expires && expires < (TokenValidator._epoch() + refreshBefore)) {
|
|
89
|
+
throw new TokenValidator.TokenValidationError('Token expired');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check scopes
|
|
94
|
+
* @param {StoredToken} storedToken
|
|
95
|
+
* @return {Promise.<StoredToken>}
|
|
96
|
+
* @private
|
|
97
|
+
*/
|
|
98
|
+
_validateScopes(storedToken) {
|
|
99
|
+
const { scope, optionalScopes } = this._config;
|
|
100
|
+
const requiredScopes = optionalScopes
|
|
101
|
+
? scope.filter(scopeId => !optionalScopes.includes(scopeId))
|
|
102
|
+
: scope;
|
|
103
|
+
const hasAllScopes = requiredScopes.every(scopeId => storedToken.scopes?.includes(scopeId));
|
|
104
|
+
if (!hasAllScopes) {
|
|
105
|
+
throw new TokenValidator.TokenValidationError('Token doesn\'t match required scopes');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check by error code if token should be refreshed
|
|
110
|
+
* @param {string} error
|
|
111
|
+
* @return {boolean}
|
|
112
|
+
*/
|
|
113
|
+
static shouldRefreshToken(error) {
|
|
114
|
+
return error === 'invalid_grant' ||
|
|
115
|
+
error === 'invalid_request' ||
|
|
116
|
+
error === 'invalid_token';
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Check scopes
|
|
120
|
+
* @param {StoredToken} storedToken
|
|
121
|
+
* @return {Promise.<StoredToken>}
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
async _validateAgainstUser(storedToken) {
|
|
125
|
+
try {
|
|
126
|
+
return await this._getUser(storedToken.accessToken);
|
|
127
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
128
|
+
}
|
|
129
|
+
catch (errorResponse) {
|
|
130
|
+
let response = {};
|
|
131
|
+
try {
|
|
132
|
+
response = await errorResponse.response.json();
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
// Skip JSON parsing errors
|
|
136
|
+
}
|
|
137
|
+
if (errorResponse.status === CODE.UNAUTHORIZED ||
|
|
138
|
+
TokenValidator.shouldRefreshToken(response.error)) {
|
|
139
|
+
// Token expired
|
|
140
|
+
throw new TokenValidator.TokenValidationError(response.error || errorResponse.message, errorResponse.data?.error ? new Error(errorResponse.data?.error) : undefined);
|
|
141
|
+
}
|
|
142
|
+
// Request unexpectedly failed
|
|
143
|
+
throw errorResponse;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Token Validator function
|
|
148
|
+
* @typedef {(function(StoredToken): Promise<StoredToken>)} TokenValidator
|
|
149
|
+
*/
|
|
150
|
+
/**
|
|
151
|
+
* Gets stored token and applies provided validators
|
|
152
|
+
* @param {TokenValidator[]} validators An array of validation
|
|
153
|
+
* functions to check the stored token against.
|
|
154
|
+
* @return {Promise.<string>} promise that is resolved to access token if the stored token is valid. If it is
|
|
155
|
+
* invalid then the promise is rejected. If invalid token should be re-requested then rejection object will
|
|
156
|
+
* have {authRedirect: true}.
|
|
157
|
+
* @private
|
|
158
|
+
*/
|
|
159
|
+
async _getValidatedToken(validators) {
|
|
160
|
+
const storedToken = await this._storage.getToken();
|
|
161
|
+
if (storedToken == null) {
|
|
162
|
+
throw new TokenValidator.TokenValidationError('Token not found');
|
|
163
|
+
}
|
|
164
|
+
for (let i = 0; i < validators.length; i++) {
|
|
165
|
+
await validators[i](storedToken);
|
|
166
|
+
}
|
|
167
|
+
return storedToken.accessToken;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LoginFlow } from './auth__core';
|
|
2
|
+
import AuthRequestBuilder from './request-builder';
|
|
3
|
+
import AuthStorage from './storage';
|
|
4
|
+
export default class WindowFlow implements LoginFlow {
|
|
5
|
+
private _timeoutId;
|
|
6
|
+
private _requestBuilder;
|
|
7
|
+
private _storage;
|
|
8
|
+
reject?: (reason: unknown) => void;
|
|
9
|
+
private _loginWindow?;
|
|
10
|
+
private _promise?;
|
|
11
|
+
constructor(requestBuilder: AuthRequestBuilder, storage: AuthStorage);
|
|
12
|
+
/**
|
|
13
|
+
* Opens window with the given URL
|
|
14
|
+
* @param {string} url
|
|
15
|
+
* @private
|
|
16
|
+
*/
|
|
17
|
+
private _openWindow;
|
|
18
|
+
/**
|
|
19
|
+
* Initiates authorization in window
|
|
20
|
+
*/
|
|
21
|
+
private _load;
|
|
22
|
+
checkIsClosed: () => void;
|
|
23
|
+
_reset: () => void;
|
|
24
|
+
stop(): void;
|
|
25
|
+
authorize(): Promise<string>;
|
|
26
|
+
}
|