@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,31 @@
|
|
|
1
|
+
import AuthRequestBuilder from './request-builder';
|
|
2
|
+
import AuthStorage from './storage';
|
|
3
|
+
export declare const HUB_AUTH_PAGE_OPENED = "HUB_AUTH_PAGE_OPENED";
|
|
4
|
+
export default class BackgroundFlow {
|
|
5
|
+
_requestBuilder: AuthRequestBuilder;
|
|
6
|
+
_storage: AuthStorage;
|
|
7
|
+
_timeout: number;
|
|
8
|
+
private _promise?;
|
|
9
|
+
constructor(requestBuilder: AuthRequestBuilder, storage: AuthStorage, timeout: number);
|
|
10
|
+
/**
|
|
11
|
+
* Creates a hidden iframe
|
|
12
|
+
* @return {HTMLIFrameElement}
|
|
13
|
+
* @private
|
|
14
|
+
*/
|
|
15
|
+
private _createHiddenFrame;
|
|
16
|
+
/**
|
|
17
|
+
* Redirects the given iframe to the given URL
|
|
18
|
+
* @param {HTMLIFrameElement} iframe
|
|
19
|
+
* @param {string} url
|
|
20
|
+
* @private
|
|
21
|
+
*/
|
|
22
|
+
_redirectFrame(iframe: HTMLIFrameElement, url: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Refreshes the access token in an iframe.
|
|
25
|
+
*
|
|
26
|
+
* @return {Promise.<string>} promise that is resolved to access the token when it is loaded in a background iframe. The
|
|
27
|
+
* promise is rejected if no token was received after {@link BackgroundToken.BACKGROUND_TIMEOUT} ms.
|
|
28
|
+
*/
|
|
29
|
+
private _load;
|
|
30
|
+
authorize(): Promise<string>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import AuthResponseParser from './response-parser';
|
|
2
|
+
export const HUB_AUTH_PAGE_OPENED = 'HUB_AUTH_PAGE_OPENED';
|
|
3
|
+
export default class BackgroundFlow {
|
|
4
|
+
_requestBuilder;
|
|
5
|
+
_storage;
|
|
6
|
+
_timeout;
|
|
7
|
+
_promise;
|
|
8
|
+
constructor(requestBuilder, storage, timeout) {
|
|
9
|
+
this._requestBuilder = requestBuilder;
|
|
10
|
+
this._storage = storage;
|
|
11
|
+
this._timeout = timeout;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates a hidden iframe
|
|
15
|
+
* @return {HTMLIFrameElement}
|
|
16
|
+
* @private
|
|
17
|
+
*/
|
|
18
|
+
_createHiddenFrame() {
|
|
19
|
+
const iframe = document.createElement('iframe');
|
|
20
|
+
iframe.style.border = iframe.style.width = iframe.style.height = '0px';
|
|
21
|
+
iframe.style.visibility = 'hidden';
|
|
22
|
+
iframe.style.position = 'fixed';
|
|
23
|
+
iframe.style.left = '-10000px';
|
|
24
|
+
window.document.body.appendChild(iframe);
|
|
25
|
+
return iframe;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Redirects the given iframe to the given URL
|
|
29
|
+
* @param {HTMLIFrameElement} iframe
|
|
30
|
+
* @param {string} url
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
_redirectFrame(iframe, url) {
|
|
34
|
+
iframe.src = `${url}&rnd=${Math.random()}`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Refreshes the access token in an iframe.
|
|
38
|
+
*
|
|
39
|
+
* @return {Promise.<string>} promise that is resolved to access the token when it is loaded in a background iframe. The
|
|
40
|
+
* promise is rejected if no token was received after {@link BackgroundToken.BACKGROUND_TIMEOUT} ms.
|
|
41
|
+
*/
|
|
42
|
+
async _load() {
|
|
43
|
+
const authRequest = await this._requestBuilder.
|
|
44
|
+
// eslint-disable-next-line camelcase
|
|
45
|
+
prepareAuthRequest({ request_credentials: 'silent' }, { nonRedirect: true });
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
function onMessage(e) {
|
|
48
|
+
if (e.data === HUB_AUTH_PAGE_OPENED) {
|
|
49
|
+
reject(new Error('Failed to obtain/refresh token in background'));
|
|
50
|
+
cleanUp();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
window.addEventListener('message', onMessage);
|
|
54
|
+
const iframe = this._createHiddenFrame();
|
|
55
|
+
let cleanRun;
|
|
56
|
+
const timeout = setTimeout(() => {
|
|
57
|
+
reject(new Error('Failed to refresh authorization'));
|
|
58
|
+
cleanUp();
|
|
59
|
+
}, this._timeout);
|
|
60
|
+
const removeTokenListener = this._storage.onTokenChange(token => {
|
|
61
|
+
if (token) {
|
|
62
|
+
cleanUp();
|
|
63
|
+
resolve(token.accessToken);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const removeStateListener = this._storage.onStateChange(authRequest.stateId, state => {
|
|
67
|
+
if (state && state.error) {
|
|
68
|
+
cleanUp();
|
|
69
|
+
reject(new AuthResponseParser.AuthError(state));
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
function cleanUp() {
|
|
73
|
+
if (cleanRun) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
cleanRun = true;
|
|
77
|
+
clearTimeout(timeout);
|
|
78
|
+
removeStateListener();
|
|
79
|
+
removeTokenListener();
|
|
80
|
+
window.removeEventListener('message', onMessage);
|
|
81
|
+
window.document.body.removeChild(iframe);
|
|
82
|
+
}
|
|
83
|
+
this._redirectFrame(iframe, authRequest.url);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
authorize() {
|
|
87
|
+
if (this._promise) {
|
|
88
|
+
return this._promise;
|
|
89
|
+
}
|
|
90
|
+
const resetPromise = () => {
|
|
91
|
+
this._promise = null;
|
|
92
|
+
};
|
|
93
|
+
this._promise = this._load();
|
|
94
|
+
this._promise.then(resetPromise, resetPromise);
|
|
95
|
+
return this._promise;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface BackendDownTranslations {
|
|
3
|
+
backendIsNotAvailable: string;
|
|
4
|
+
checkAgain: string;
|
|
5
|
+
errorMessage: string;
|
|
6
|
+
}
|
|
7
|
+
export interface BackendDownMessageProps {
|
|
8
|
+
translations: BackendDownTranslations;
|
|
9
|
+
onCheckAgain: (e: React.MouseEvent) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface OnBackendDownParams {
|
|
12
|
+
translations: BackendDownTranslations;
|
|
13
|
+
onCheckAgain: () => void;
|
|
14
|
+
}
|
|
15
|
+
export default function onBackendDown({ onCheckAgain, translations }: OnBackendDownParams): () => void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import alertService from '../alert-service/alert-service';
|
|
4
|
+
import Alert from '../alert/alert';
|
|
5
|
+
import Link from '../link/link';
|
|
6
|
+
import Group from '../group/group';
|
|
7
|
+
import styles from './down-notification.css';
|
|
8
|
+
let key = null;
|
|
9
|
+
function renderAlert(message, type = Alert.Type.WARNING) {
|
|
10
|
+
const existingAlert = alertService.showingAlerts.filter(alert => alert.key === key)[0];
|
|
11
|
+
if (!existingAlert) {
|
|
12
|
+
key = alertService.addAlert(message, type, 0, { closeable: false });
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
existingAlert.message = message;
|
|
16
|
+
existingAlert.type = type;
|
|
17
|
+
alertService.renderAlerts();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function Message({ translations, onCheckAgain }) {
|
|
21
|
+
const { backendIsNotAvailable, checkAgain, errorMessage } = translations;
|
|
22
|
+
return (<div data-test="ring-backend-down-notification">
|
|
23
|
+
<Group>
|
|
24
|
+
<div className={styles.title}>{backendIsNotAvailable}</div>
|
|
25
|
+
</Group>
|
|
26
|
+
<span className={styles.error}>{errorMessage} </span>
|
|
27
|
+
<Link onClick={onCheckAgain} data-test="check-again">{checkAgain}</Link>
|
|
28
|
+
</div>);
|
|
29
|
+
}
|
|
30
|
+
Message.propTypes = {
|
|
31
|
+
translations: PropTypes.shape({
|
|
32
|
+
backendIsNotAvailable: PropTypes.string,
|
|
33
|
+
checkAgain: PropTypes.string,
|
|
34
|
+
errorMessage: PropTypes.string
|
|
35
|
+
}),
|
|
36
|
+
onCheckAgain: PropTypes.func
|
|
37
|
+
};
|
|
38
|
+
export default function onBackendDown({ onCheckAgain, translations }) {
|
|
39
|
+
async function checkAgainWithoutClosing(e) {
|
|
40
|
+
// Alert has weird behaviour of handling clicks by "a" tags
|
|
41
|
+
e.stopPropagation();
|
|
42
|
+
try {
|
|
43
|
+
renderAlert('Connecting...', Alert.Type.LOADING);
|
|
44
|
+
await onCheckAgain();
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
renderAlert(<Message translations={translations} onCheckAgain={checkAgainWithoutClosing}/>);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
renderAlert(<Message translations={translations} onCheckAgain={checkAgainWithoutClosing}/>);
|
|
51
|
+
return () => alertService.remove(key);
|
|
52
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AuthTranslations, LoginFlow } from './auth__core';
|
|
2
|
+
import AuthRequestBuilder from './request-builder';
|
|
3
|
+
import AuthStorage from './storage';
|
|
4
|
+
export default class IFrameFlow implements LoginFlow {
|
|
5
|
+
hideDialog: (() => void) | null;
|
|
6
|
+
private _requestBuilder;
|
|
7
|
+
private _storage;
|
|
8
|
+
private _translations;
|
|
9
|
+
reject?: (reason: unknown) => void;
|
|
10
|
+
private _promise?;
|
|
11
|
+
private _loginWindow?;
|
|
12
|
+
constructor(requestBuilder: AuthRequestBuilder, storage: AuthStorage, translations: AuthTranslations);
|
|
13
|
+
/**
|
|
14
|
+
* Initiates authorization in window
|
|
15
|
+
*/
|
|
16
|
+
private _load;
|
|
17
|
+
_reset: () => void;
|
|
18
|
+
stop(): void;
|
|
19
|
+
authorize(): Promise<string>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import loginDialogService from '../login-dialog/service';
|
|
3
|
+
import Link from '../link/link';
|
|
4
|
+
import AuthResponseParser from './response-parser';
|
|
5
|
+
export default class IFrameFlow {
|
|
6
|
+
hideDialog = null;
|
|
7
|
+
_requestBuilder;
|
|
8
|
+
_storage;
|
|
9
|
+
_translations;
|
|
10
|
+
reject;
|
|
11
|
+
_promise;
|
|
12
|
+
_loginWindow;
|
|
13
|
+
constructor(requestBuilder, storage, translations) {
|
|
14
|
+
this._requestBuilder = requestBuilder;
|
|
15
|
+
this._storage = storage;
|
|
16
|
+
this._translations = translations;
|
|
17
|
+
this._reset();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initiates authorization in window
|
|
21
|
+
*/
|
|
22
|
+
async _load() {
|
|
23
|
+
const authRequest = await this._requestBuilder.prepareAuthRequest(
|
|
24
|
+
// eslint-disable-next-line camelcase
|
|
25
|
+
{ request_credentials: 'required', auth_mode: 'bypass_to_login' }, { nonRedirect: false });
|
|
26
|
+
const renderFallbackLink = () => (<Link href={authRequest.url} target="_self">{this._translations.nothingHappensLink}</Link>);
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
this.hideDialog = loginDialogService({
|
|
29
|
+
url: authRequest.url,
|
|
30
|
+
loader: true,
|
|
31
|
+
onCancel: () => {
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
33
|
+
cleanUp();
|
|
34
|
+
this.stop();
|
|
35
|
+
},
|
|
36
|
+
renderFallbackLink
|
|
37
|
+
});
|
|
38
|
+
this.reject = reject;
|
|
39
|
+
const removeTokenListener = this._storage.onTokenChange(token => {
|
|
40
|
+
if (token) {
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
42
|
+
cleanUp();
|
|
43
|
+
resolve(token.accessToken);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
const removeStateListener = this._storage.onStateChange(authRequest.stateId, state => {
|
|
47
|
+
if (state && state.error) {
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
49
|
+
cleanUp();
|
|
50
|
+
reject(new AuthResponseParser.AuthError(state));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const cleanUp = () => {
|
|
54
|
+
this.hideDialog?.();
|
|
55
|
+
removeStateListener();
|
|
56
|
+
removeTokenListener();
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
_reset = () => {
|
|
61
|
+
this._promise = null;
|
|
62
|
+
this.hideDialog = null;
|
|
63
|
+
};
|
|
64
|
+
stop() {
|
|
65
|
+
if (this.hideDialog) {
|
|
66
|
+
this.hideDialog();
|
|
67
|
+
}
|
|
68
|
+
if (this.reject) {
|
|
69
|
+
this.reject('Login form closed');
|
|
70
|
+
}
|
|
71
|
+
this._reset();
|
|
72
|
+
}
|
|
73
|
+
authorize() {
|
|
74
|
+
if (this._promise != null && this._loginWindow != null && !this._loginWindow.closed) {
|
|
75
|
+
return this._promise;
|
|
76
|
+
}
|
|
77
|
+
this._promise = this._load();
|
|
78
|
+
this._promise.then(this._reset, this._reset);
|
|
79
|
+
return this._promise;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/// <reference types="typings" />
|
|
2
|
+
import uuid from 'simply-uuid';
|
|
3
|
+
import AuthStorage, { AuthState } from './storage';
|
|
4
|
+
export interface AuthRequestBuilderConfig {
|
|
5
|
+
authorization: string;
|
|
6
|
+
redirectUri?: string | null | undefined;
|
|
7
|
+
requestCredentials?: string | null | undefined;
|
|
8
|
+
clientId?: string | null | undefined;
|
|
9
|
+
scopes: readonly string[];
|
|
10
|
+
redirect?: boolean | null | undefined;
|
|
11
|
+
}
|
|
12
|
+
export default class AuthRequestBuilder {
|
|
13
|
+
config: AuthRequestBuilderConfig;
|
|
14
|
+
storage: AuthStorage | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* @param {{
|
|
17
|
+
* authorization: string,
|
|
18
|
+
* redirectUri: string?,
|
|
19
|
+
* requestCredentials: string?,
|
|
20
|
+
* clientId: string?,
|
|
21
|
+
* scopes: string[]
|
|
22
|
+
* }} config
|
|
23
|
+
* @param {AuthStorage} storage
|
|
24
|
+
*/
|
|
25
|
+
constructor(config: AuthRequestBuilderConfig, storage?: AuthStorage);
|
|
26
|
+
/**
|
|
27
|
+
* @return {string} random string used for state
|
|
28
|
+
*/
|
|
29
|
+
static _uuid: typeof uuid.generate;
|
|
30
|
+
/**
|
|
31
|
+
* Save state and build an auth server redirect URL.
|
|
32
|
+
*
|
|
33
|
+
* @param {object=} extraParams additional query parameters for auth request
|
|
34
|
+
* @param {object=} extraState additional state parameters to save
|
|
35
|
+
* @return {Promise.<string>} promise that is resolved to authURL
|
|
36
|
+
*/
|
|
37
|
+
prepareAuthRequest(extraParams?: Record<string, unknown> | null | undefined, extraState?: Partial<AuthState>): Promise<{
|
|
38
|
+
url: string;
|
|
39
|
+
stateId: string;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* @param {string} id
|
|
43
|
+
* @param {StoredState} storedState
|
|
44
|
+
* @return {Promise}
|
|
45
|
+
* @private
|
|
46
|
+
*/
|
|
47
|
+
_saveState(id: string, storedState: AuthState): Promise<void> | undefined;
|
|
48
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import uuid from 'simply-uuid';
|
|
2
|
+
import { encodeURL } from '../global/url';
|
|
3
|
+
export default class AuthRequestBuilder {
|
|
4
|
+
config;
|
|
5
|
+
storage;
|
|
6
|
+
/**
|
|
7
|
+
* @param {{
|
|
8
|
+
* authorization: string,
|
|
9
|
+
* redirectUri: string?,
|
|
10
|
+
* requestCredentials: string?,
|
|
11
|
+
* clientId: string?,
|
|
12
|
+
* scopes: string[]
|
|
13
|
+
* }} config
|
|
14
|
+
* @param {AuthStorage} storage
|
|
15
|
+
*/
|
|
16
|
+
constructor(config, storage) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.storage = storage;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @return {string} random string used for state
|
|
22
|
+
*/
|
|
23
|
+
static _uuid = uuid.generate;
|
|
24
|
+
/**
|
|
25
|
+
* Save state and build an auth server redirect URL.
|
|
26
|
+
*
|
|
27
|
+
* @param {object=} extraParams additional query parameters for auth request
|
|
28
|
+
* @param {object=} extraState additional state parameters to save
|
|
29
|
+
* @return {Promise.<string>} promise that is resolved to authURL
|
|
30
|
+
*/
|
|
31
|
+
async prepareAuthRequest(extraParams, extraState) {
|
|
32
|
+
const stateId = AuthRequestBuilder._uuid();
|
|
33
|
+
const scopes = this.config.scopes.map(scope => encodeURIComponent(scope));
|
|
34
|
+
/* eslint-disable camelcase */
|
|
35
|
+
const request = Object.assign({
|
|
36
|
+
response_type: 'token',
|
|
37
|
+
state: stateId,
|
|
38
|
+
redirect_uri: this.config.redirectUri,
|
|
39
|
+
request_credentials: this.config.requestCredentials,
|
|
40
|
+
client_id: this.config.clientId,
|
|
41
|
+
scope: scopes.join(' ')
|
|
42
|
+
}, extraParams || {});
|
|
43
|
+
/* eslint-enable camelcase */
|
|
44
|
+
const authURL = encodeURL(this.config.authorization, request);
|
|
45
|
+
const state = Object.assign({
|
|
46
|
+
restoreLocation: window.location.href,
|
|
47
|
+
scopes: this.config.scopes
|
|
48
|
+
}, extraState || {});
|
|
49
|
+
await this._saveState(stateId, state);
|
|
50
|
+
return ({
|
|
51
|
+
url: authURL,
|
|
52
|
+
stateId
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @param {string} id
|
|
57
|
+
* @param {StoredState} storedState
|
|
58
|
+
* @return {Promise}
|
|
59
|
+
* @private
|
|
60
|
+
*/
|
|
61
|
+
_saveState(id, storedState) {
|
|
62
|
+
return this.storage?.saveState(id, storedState);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import ExtendableError from 'es6-error';
|
|
2
|
+
export interface AuthResponse {
|
|
3
|
+
accessToken?: string;
|
|
4
|
+
state?: string;
|
|
5
|
+
token_type?: string;
|
|
6
|
+
expiresIn?: string;
|
|
7
|
+
scope?: string;
|
|
8
|
+
error?: string | Error;
|
|
9
|
+
errorDescription?: string;
|
|
10
|
+
errorUri?: string;
|
|
11
|
+
restoreAuthState?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class AuthError extends ExtendableError {
|
|
14
|
+
code: string | Error | AuthError | undefined;
|
|
15
|
+
uri: string | undefined;
|
|
16
|
+
stateId: string | undefined;
|
|
17
|
+
constructor(authResponse?: AuthResponse);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {Object} AuthResponse
|
|
21
|
+
* @property {?string} accessToken
|
|
22
|
+
* @property {?string} state
|
|
23
|
+
* @property {?string} token_type
|
|
24
|
+
* @property {?string} expiresIn
|
|
25
|
+
* @property {?string} scope
|
|
26
|
+
* @property {?string} error
|
|
27
|
+
*/
|
|
28
|
+
export default class AuthResponseParser {
|
|
29
|
+
readonly _authResponse: AuthResponse;
|
|
30
|
+
constructor();
|
|
31
|
+
static AuthError: typeof AuthError;
|
|
32
|
+
static convertKey(key: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Check if the hash contains an access token.
|
|
35
|
+
* If it does, return auth response. Otherwise return undefined.
|
|
36
|
+
* Always clears the hash part of the URL.
|
|
37
|
+
*
|
|
38
|
+
* @throws {Error} if the auth server returned an error
|
|
39
|
+
* @return {?AuthResponse}
|
|
40
|
+
*/
|
|
41
|
+
getAuthResponseFromURL(): AuthResponse | null;
|
|
42
|
+
/**
|
|
43
|
+
* Validates given authResponse.
|
|
44
|
+
* If it contains a token - returns the token, if an error is found - throws the error,
|
|
45
|
+
* otherwise - null
|
|
46
|
+
* Always clears the hash part of the URL.
|
|
47
|
+
*
|
|
48
|
+
* @param authResponse {AuthResponse} parsed authResponse
|
|
49
|
+
* @throws {Error} if the auth server returned an error
|
|
50
|
+
* @return {?AuthResponse}
|
|
51
|
+
*/
|
|
52
|
+
validateAuthResponse(authResponse: AuthResponse): AuthResponse | null;
|
|
53
|
+
/**
|
|
54
|
+
* Reads the current accessToken from the URL.
|
|
55
|
+
* Doesn't modify URL
|
|
56
|
+
*
|
|
57
|
+
* @return {AuthResponse}
|
|
58
|
+
*/
|
|
59
|
+
readAuthResponseFromURL(): AuthResponse;
|
|
60
|
+
/**
|
|
61
|
+
* @return {string} part of the URL after # sign.
|
|
62
|
+
* @private
|
|
63
|
+
*/
|
|
64
|
+
getHash(): string | null;
|
|
65
|
+
/**
|
|
66
|
+
* Current page location.
|
|
67
|
+
* @return {string}
|
|
68
|
+
*/
|
|
69
|
+
getLocation(): string | null;
|
|
70
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import ExtendableError from 'es6-error';
|
|
2
|
+
import { parseQueryString } from '../global/url';
|
|
3
|
+
export class AuthError extends ExtendableError {
|
|
4
|
+
code;
|
|
5
|
+
uri;
|
|
6
|
+
stateId;
|
|
7
|
+
// Supports weird IE 11 failing test issue
|
|
8
|
+
constructor(authResponse = {}) {
|
|
9
|
+
super(authResponse.errorDescription);
|
|
10
|
+
this.code = authResponse.error;
|
|
11
|
+
this.uri = authResponse.errorUri;
|
|
12
|
+
this.stateId = authResponse.state;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} AuthResponse
|
|
17
|
+
* @property {?string} accessToken
|
|
18
|
+
* @property {?string} state
|
|
19
|
+
* @property {?string} token_type
|
|
20
|
+
* @property {?string} expiresIn
|
|
21
|
+
* @property {?string} scope
|
|
22
|
+
* @property {?string} error
|
|
23
|
+
*/
|
|
24
|
+
export default class AuthResponseParser {
|
|
25
|
+
_authResponse;
|
|
26
|
+
constructor() {
|
|
27
|
+
this._authResponse = this.readAuthResponseFromURL();
|
|
28
|
+
}
|
|
29
|
+
static AuthError = AuthError;
|
|
30
|
+
static convertKey(key) {
|
|
31
|
+
return key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if the hash contains an access token.
|
|
35
|
+
* If it does, return auth response. Otherwise return undefined.
|
|
36
|
+
* Always clears the hash part of the URL.
|
|
37
|
+
*
|
|
38
|
+
* @throws {Error} if the auth server returned an error
|
|
39
|
+
* @return {?AuthResponse}
|
|
40
|
+
*/
|
|
41
|
+
getAuthResponseFromURL() {
|
|
42
|
+
return this.validateAuthResponse(this._authResponse);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validates given authResponse.
|
|
46
|
+
* If it contains a token - returns the token, if an error is found - throws the error,
|
|
47
|
+
* otherwise - null
|
|
48
|
+
* Always clears the hash part of the URL.
|
|
49
|
+
*
|
|
50
|
+
* @param authResponse {AuthResponse} parsed authResponse
|
|
51
|
+
* @throws {Error} if the auth server returned an error
|
|
52
|
+
* @return {?AuthResponse}
|
|
53
|
+
*/
|
|
54
|
+
validateAuthResponse(authResponse) {
|
|
55
|
+
// Check for errors
|
|
56
|
+
if (authResponse.error) {
|
|
57
|
+
throw new AuthResponseParser.AuthError(authResponse);
|
|
58
|
+
}
|
|
59
|
+
// If there is no token in the hash
|
|
60
|
+
if (!authResponse.accessToken) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return { ...authResponse, accessToken: authResponse.accessToken };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Reads the current accessToken from the URL.
|
|
67
|
+
* Doesn't modify URL
|
|
68
|
+
*
|
|
69
|
+
* @return {AuthResponse}
|
|
70
|
+
*/
|
|
71
|
+
readAuthResponseFromURL() {
|
|
72
|
+
const authResponse = {};
|
|
73
|
+
const rawAuthResponse = parseQueryString(this.getHash());
|
|
74
|
+
Object.keys(rawAuthResponse).forEach(key => {
|
|
75
|
+
if (key.indexOf('_') !== -1) {
|
|
76
|
+
authResponse[AuthResponseParser.convertKey(key)] = rawAuthResponse[key];
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
authResponse[key] = rawAuthResponse[key];
|
|
80
|
+
});
|
|
81
|
+
return authResponse;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* @return {string} part of the URL after # sign.
|
|
85
|
+
* @private
|
|
86
|
+
*/
|
|
87
|
+
getHash() {
|
|
88
|
+
// Because of stupid Firefox bug — https://bugzilla.mozilla.org/show_bug.cgi?id=483304
|
|
89
|
+
const location = this.getLocation();
|
|
90
|
+
return location && location.replace(/^[^#]*#?/, '');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Current page location.
|
|
94
|
+
* @return {string}
|
|
95
|
+
*/
|
|
96
|
+
getLocation() {
|
|
97
|
+
return window.location.toString();
|
|
98
|
+
}
|
|
99
|
+
}
|