@jetbrains/ring-ui 4.1.3 → 5.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1134) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/babel.config.js +1 -0
  3. package/components/alert/alert.examples.tsx +149 -0
  4. package/components/alert/alert.test.tsx +63 -0
  5. package/components/alert/alert.tsx +267 -0
  6. package/components/alert/{container.test.js → container.test.tsx} +0 -0
  7. package/components/alert/container.tsx +53 -0
  8. package/components/alert-service/alert-service.examples.tsx +94 -0
  9. package/components/alert-service/alert-service.test.ts +90 -0
  10. package/components/alert-service/alert-service.tsx +152 -0
  11. package/components/analytics/analytics.examples.tsx +50 -0
  12. package/components/analytics/analytics.test.ts +421 -0
  13. package/components/analytics/analytics.ts +130 -0
  14. package/components/analytics/analytics__custom-plugin.ts +151 -0
  15. package/components/analytics/analytics__fus-plugin.ts +144 -0
  16. package/components/analytics/analytics__ga-plugin.ts +61 -0
  17. package/components/analytics/analytics__plugin-utils.ts +79 -0
  18. package/components/analytics-ng/analytics-ng.examples.js +2 -2
  19. package/components/auth/auth.examples.ts +141 -0
  20. package/components/auth/auth.test.ts +801 -0
  21. package/components/auth/{auth.js → auth.ts} +0 -0
  22. package/components/auth/auth__core.ts +1030 -0
  23. package/components/auth/background-flow.ts +120 -0
  24. package/components/auth/down-notification.tsx +87 -0
  25. package/components/auth/iframe-flow.tsx +112 -0
  26. package/components/auth/{landing-entry.js → landing-entry.ts} +0 -0
  27. package/components/auth/landing.html +1 -1
  28. package/components/auth/landing.ts +34 -0
  29. package/components/auth/{request-builder.test.js → request-builder.test.ts} +0 -0
  30. package/components/auth/request-builder.ts +87 -0
  31. package/components/auth/response-parser.test.ts +94 -0
  32. package/components/auth/response-parser.ts +129 -0
  33. package/components/auth/storage.test.ts +182 -0
  34. package/components/auth/storage.ts +291 -0
  35. package/components/auth/token-validator.test.ts +206 -0
  36. package/components/auth/token-validator.ts +207 -0
  37. package/components/auth/window-flow.ts +131 -0
  38. package/components/auth-dialog/auth-dialog.examples.tsx +86 -0
  39. package/components/auth-dialog/auth-dialog.test.tsx +11 -0
  40. package/components/auth-dialog/auth-dialog.tsx +131 -0
  41. package/components/auth-dialog-service/auth-dialog-service.examples.tsx +68 -0
  42. package/components/auth-dialog-service/auth-dialog-service.test.ts +91 -0
  43. package/components/auth-dialog-service/auth-dialog-service.tsx +30 -0
  44. package/components/auth-ng/auth-ng.examples.js +1 -1
  45. package/components/autofocus-ng/autofocus-ng.examples.js +3 -3
  46. package/components/avatar/{avatar-example-datauri.js → avatar-example-datauri.tsx} +0 -0
  47. package/components/avatar/avatar.examples.tsx +48 -0
  48. package/components/avatar/avatar.test.tsx +63 -0
  49. package/components/avatar/avatar.tsx +180 -0
  50. package/components/avatar/fallback-avatar.tsx +158 -0
  51. package/components/avatar-editor-ng/avatar-editor-ng.examples.js +1 -1
  52. package/components/avatar-ng/avatar-ng.examples.js +3 -3
  53. package/components/badge/badge.examples.tsx +26 -0
  54. package/components/badge/{badge.test.js → badge.test.tsx} +0 -0
  55. package/components/badge/badge.tsx +67 -0
  56. package/components/badge-ng/badge-ng.examples.js +2 -2
  57. package/components/breadcrumb-ng/breadcrumb-ng.examples.js +1 -1
  58. package/components/button/button.examples.tsx +219 -0
  59. package/components/button/button.test.tsx +64 -0
  60. package/components/button/button.tsx +166 -0
  61. package/components/button/button__classes.ts +54 -0
  62. package/components/button-group/button-group.examples.tsx +58 -0
  63. package/components/button-group/{button-group.test.js → button-group.test.tsx} +0 -0
  64. package/components/button-group/button-group.tsx +30 -0
  65. package/components/button-group/caption.tsx +23 -0
  66. package/components/button-group-ng/button-group-ng.examples.js +2 -2
  67. package/components/button-ng/button-ng.examples.js +5 -5
  68. package/components/button-set/button-set.examples.tsx +24 -0
  69. package/components/button-set/{button-set.test.js → button-set.test.tsx} +0 -0
  70. package/components/button-set/button-set.tsx +27 -0
  71. package/components/button-set-ng/button-set-ng.examples.js +2 -2
  72. package/components/button-toolbar/button-toolbar.examples.tsx +31 -0
  73. package/components/button-toolbar/button-toolbar.test.tsx +23 -0
  74. package/components/button-toolbar/button-toolbar.tsx +29 -0
  75. package/components/button-toolbar-ng/button-toolbar-ng.examples.js +3 -3
  76. package/components/caret/caret.examples.ts +40 -0
  77. package/components/caret/caret.test.ts +142 -0
  78. package/components/caret/caret.ts +239 -0
  79. package/components/checkbox/checkbox.examples.tsx +67 -0
  80. package/components/checkbox/checkbox.test.tsx +85 -0
  81. package/components/checkbox/checkbox.tsx +114 -0
  82. package/components/checkbox-ng/checkbox-ng.examples.js +2 -2
  83. package/components/code/code.examples.tsx +92 -0
  84. package/components/code/code.test.tsx +104 -0
  85. package/components/code/code.tsx +128 -0
  86. package/components/compiler-ng/compiler-ng.examples.js +1 -1
  87. package/components/confirm/confirm.examples.tsx +109 -0
  88. package/components/confirm/confirm.test.tsx +30 -0
  89. package/components/confirm/confirm.tsx +116 -0
  90. package/components/confirm-ng/confirm-ng.examples.js +2 -2
  91. package/components/confirm-service/confirm-service.examples.tsx +65 -0
  92. package/components/confirm-service/confirm-service.test.ts +73 -0
  93. package/components/confirm-service/confirm-service.tsx +74 -0
  94. package/components/content-layout/content-layout.examples.tsx +188 -0
  95. package/components/content-layout/content-layout.test.tsx +46 -0
  96. package/components/content-layout/content-layout.tsx +74 -0
  97. package/components/content-layout/sidebar.tsx +115 -0
  98. package/components/contenteditable/contenteditable.examples.tsx +45 -0
  99. package/components/contenteditable/contenteditable.test.tsx +74 -0
  100. package/components/contenteditable/contenteditable.tsx +80 -0
  101. package/components/data-list/data-list.examples.tsx +120 -0
  102. package/components/data-list/data-list.mock.tsx +257 -0
  103. package/components/data-list/data-list.test.tsx +41 -0
  104. package/components/data-list/data-list.tsx +224 -0
  105. package/components/data-list/item.tsx +247 -0
  106. package/components/data-list/selection.ts +107 -0
  107. package/components/data-list/title.tsx +112 -0
  108. package/components/data-list-ng/data-list-ng.examples.js +3 -3
  109. package/components/date-picker/consts.ts +136 -0
  110. package/components/date-picker/date-input.tsx +150 -0
  111. package/components/date-picker/date-picker.examples.tsx +346 -0
  112. package/components/date-picker/date-picker.test.tsx +91 -0
  113. package/components/date-picker/date-picker.tsx +315 -0
  114. package/components/date-picker/date-popup.tsx +466 -0
  115. package/components/date-picker/day.tsx +129 -0
  116. package/components/date-picker/{formats.js → formats.ts} +0 -0
  117. package/components/date-picker/month-names.tsx +111 -0
  118. package/components/date-picker/month-slider.tsx +91 -0
  119. package/components/date-picker/month.tsx +52 -0
  120. package/components/date-picker/months.tsx +113 -0
  121. package/components/date-picker/weekdays.tsx +45 -0
  122. package/components/date-picker/years.tsx +116 -0
  123. package/components/dialog/dialog.examples.tsx +214 -0
  124. package/components/dialog/dialog.test.tsx +67 -0
  125. package/components/dialog/dialog.tsx +201 -0
  126. package/components/dialog/dialog__body-scroll-preventer.ts +59 -0
  127. package/components/dialog-ng/dialog-ng.examples.js +5 -5
  128. package/components/docked-panel-ng/docked-panel-ng.examples.js +3 -3
  129. package/components/dropdown/anchor.tsx +32 -0
  130. package/components/dropdown/dropdown.examples.tsx +152 -0
  131. package/components/dropdown/dropdown.test.tsx +189 -0
  132. package/components/dropdown/dropdown.tsx +224 -0
  133. package/components/dropdown-menu/dropdown-menu.examples.tsx +47 -0
  134. package/components/dropdown-menu/dropdown-menu.test.tsx +80 -0
  135. package/components/dropdown-menu/dropdown-menu.tsx +156 -0
  136. package/components/error-bubble/error-bubble.examples.tsx +96 -0
  137. package/components/error-bubble/error-bubble.test.tsx +42 -0
  138. package/components/error-bubble/error-bubble.tsx +57 -0
  139. package/components/error-message/error-message.examples.tsx +33 -0
  140. package/components/error-message/error-message.test.tsx +21 -0
  141. package/components/error-message/error-message.tsx +62 -0
  142. package/components/error-message-ng/error-message-ng.examples.js +1 -1
  143. package/components/error-page-ng/error-page-ng.examples.js +2 -2
  144. package/components/footer/footer.examples.tsx +56 -0
  145. package/components/footer/footer.test.tsx +78 -0
  146. package/components/footer/footer.tsx +175 -0
  147. package/components/footer-ng/footer-ng.examples.js +2 -2
  148. package/components/form/form.examples.js +4 -4
  149. package/components/form-ng/form-ng.examples.js +6 -6
  150. package/components/global/compose.ts +41 -0
  151. package/components/global/composeRefs.ts +9 -0
  152. package/components/global/conic-gradient.ts +43 -0
  153. package/components/global/create-stateful-context.tsx +55 -0
  154. package/components/global/{data-tests.test.js → data-tests.test.ts} +0 -0
  155. package/components/global/data-tests.ts +23 -0
  156. package/components/global/dom.examples.ts +43 -0
  157. package/components/global/dom.test.ts +99 -0
  158. package/components/global/dom.ts +145 -0
  159. package/components/global/focus-sensor-hoc.tsx +157 -0
  160. package/components/global/{fuzzy-highlight.test.js → fuzzy-highlight.test.ts} +0 -0
  161. package/components/global/fuzzy-highlight.ts +46 -0
  162. package/components/global/get-event-key.ts +113 -0
  163. package/components/global/get-uid.test.ts +22 -0
  164. package/components/global/get-uid.ts +15 -0
  165. package/components/global/inject-styles.ts +16 -0
  166. package/components/global/linear-function.ts +21 -0
  167. package/components/global/listeners.test.ts +80 -0
  168. package/components/global/listeners.ts +44 -0
  169. package/components/global/memoize.ts +23 -0
  170. package/components/global/normalize-indent.ts +34 -0
  171. package/components/global/promise-with-timeout.ts +18 -0
  172. package/components/global/prop-types.ts +5 -0
  173. package/components/global/radial-gradient-mask.ts +52 -0
  174. package/components/global/react-dom-renderer.tsx +40 -0
  175. package/components/global/rerender-hoc.ts +42 -0
  176. package/components/global/schedule-raf.ts +27 -0
  177. package/components/global/{sniffer.js → sniffer.ts} +0 -0
  178. package/components/global/supports-css.ts +20 -0
  179. package/components/global/theme.tsx +86 -0
  180. package/components/global/trivial-template-tag.ts +11 -0
  181. package/components/global/typescript-utils.ts +3 -0
  182. package/components/global/url.test.ts +138 -0
  183. package/components/global/url.ts +162 -0
  184. package/components/global/variables.examples.tsx +160 -0
  185. package/components/global/variables.ts +112 -0
  186. package/components/global/variables_dark.ts +59 -0
  187. package/components/grid/col.tsx +72 -0
  188. package/components/grid/grid.examples.tsx +291 -0
  189. package/components/grid/grid.test.tsx +74 -0
  190. package/components/grid/grid.tsx +33 -0
  191. package/components/grid/row.tsx +79 -0
  192. package/components/group/group.examples.tsx +27 -0
  193. package/components/group/group.test.tsx +21 -0
  194. package/components/group/group.tsx +30 -0
  195. package/components/group-ng/group.examples.js +2 -2
  196. package/components/header/header.examples.tsx +124 -0
  197. package/components/header/header.test.tsx +21 -0
  198. package/components/header/header.tsx +57 -0
  199. package/components/header/logo.tsx +31 -0
  200. package/components/header/profile.tsx +226 -0
  201. package/components/header/services-link.tsx +57 -0
  202. package/components/header/services.tsx +122 -0
  203. package/components/header/smart-profile.tsx +136 -0
  204. package/components/header/smart-services.tsx +79 -0
  205. package/components/header/tray-icon.tsx +35 -0
  206. package/components/header/tray.tsx +30 -0
  207. package/components/heading/heading.examples.tsx +64 -0
  208. package/components/heading/heading.test.tsx +24 -0
  209. package/components/heading/heading.tsx +90 -0
  210. package/components/http/http.examples.ts +37 -0
  211. package/components/http/http.mock.ts +69 -0
  212. package/components/http/http.test.ts +191 -0
  213. package/components/http/http.ts +237 -0
  214. package/components/hub-source/hub-source.test.ts +200 -0
  215. package/components/hub-source/hub-source.ts +148 -0
  216. package/components/hub-source/hub-source__user.ts +33 -0
  217. package/components/hub-source/hub-source__users-groups.test.ts +91 -0
  218. package/components/hub-source/hub-source__users-groups.ts +78 -0
  219. package/components/icon/icon.examples.tsx +146 -0
  220. package/components/icon/icon.test.tsx +51 -0
  221. package/components/icon/icon.tsx +111 -0
  222. package/components/icon/icon__constants.ts +31 -0
  223. package/components/icon/icon__svg.tsx +81 -0
  224. package/components/icon/{index.js → index.ts} +0 -0
  225. package/components/icon-ng/icon-ng.examples.js +1 -1
  226. package/components/input/input.css +1 -0
  227. package/components/input/input.examples.tsx +140 -0
  228. package/components/input/input.test.tsx +42 -0
  229. package/components/input/input.tsx +311 -0
  230. package/components/input-ng/input-ng.examples.js +1 -1
  231. package/components/input-size/input-size.examples.js +5 -5
  232. package/components/island/adaptive-island-hoc.tsx +40 -0
  233. package/components/island/content.tsx +156 -0
  234. package/components/island/header.tsx +112 -0
  235. package/components/island/island.examples.tsx +74 -0
  236. package/components/island/island.test.tsx +59 -0
  237. package/components/island/island.tsx +59 -0
  238. package/components/island-legacy/content-legacy.tsx +26 -0
  239. package/components/island-legacy/header-legacy.tsx +28 -0
  240. package/components/island-legacy/island-legacy.examples.ts +33 -0
  241. package/components/island-legacy/island-legacy.test.tsx +21 -0
  242. package/components/island-legacy/island-legacy.tsx +29 -0
  243. package/components/island-ng/island-ng.examples.js +1 -1
  244. package/components/link/clickableLink.tsx +58 -0
  245. package/components/link/link.examples.tsx +93 -0
  246. package/components/link/link.test.tsx +185 -0
  247. package/components/link/link.tsx +149 -0
  248. package/components/link-ng/link-ng.examples.js +1 -1
  249. package/components/list/consts.ts +89 -0
  250. package/components/list/list.examples.tsx +278 -0
  251. package/components/list/list.test.tsx +432 -0
  252. package/components/list/list.tsx +841 -0
  253. package/components/list/list__custom.tsx +89 -0
  254. package/components/list/list__hint.tsx +28 -0
  255. package/components/list/list__item.test.tsx +64 -0
  256. package/components/list/list__item.tsx +236 -0
  257. package/components/list/list__link.tsx +74 -0
  258. package/components/list/list__separator.tsx +31 -0
  259. package/components/list/list__title.tsx +45 -0
  260. package/components/list/list__users-groups-source.test.ts +129 -0
  261. package/components/list/list__users-groups-source.ts +101 -0
  262. package/components/loader/loader.examples.tsx +24 -0
  263. package/components/loader/loader.tsx +69 -0
  264. package/components/loader/loader__core.test.ts +228 -0
  265. package/components/loader/loader__core.ts +296 -0
  266. package/components/loader-inline/inject-styles.ts +28 -0
  267. package/components/loader-inline/loader-inline.examples.tsx +106 -0
  268. package/components/loader-inline/loader-inline.test.tsx +21 -0
  269. package/components/loader-inline/loader-inline.tsx +63 -0
  270. package/components/loader-inline-ng/loader-inline-ng.examples.js +1 -1
  271. package/components/loader-ng/loader-ng.examples.js +1 -1
  272. package/components/loader-screen/loader-screen.examples.tsx +40 -0
  273. package/components/loader-screen/loader-screen.tsx +42 -0
  274. package/components/loader-screen-ng/loader-screen-ng.examples.js +1 -1
  275. package/components/login-dialog/login-dialog.tsx +139 -0
  276. package/components/login-dialog/service.tsx +25 -0
  277. package/components/markdown/code.tsx +26 -0
  278. package/components/markdown/heading.tsx +19 -0
  279. package/components/markdown/link.tsx +21 -0
  280. package/components/markdown/markdown.examples.tsx +110 -0
  281. package/components/markdown/markdown.test.tsx +60 -0
  282. package/components/markdown/markdown.tsx +65 -0
  283. package/components/message/message.examples.tsx +80 -0
  284. package/components/message/message.test.tsx +26 -0
  285. package/components/message/message.tsx +184 -0
  286. package/components/old-browsers-message/old-browsers-message.examples.ts +38 -0
  287. package/components/old-browsers-message/old-browsers-message.ts +103 -0
  288. package/components/old-browsers-message/{old-browsers-message__stop.js → old-browsers-message__stop.ts} +0 -0
  289. package/components/old-browsers-message/white-list.ts +33 -0
  290. package/components/pager/pager.examples.tsx +299 -0
  291. package/components/pager/pager.test.tsx +57 -0
  292. package/components/pager/pager.tsx +372 -0
  293. package/components/pager-ng/pager-ng.examples.js +1 -1
  294. package/components/palette/palette.examples.js +1 -1
  295. package/components/panel/panel.examples.tsx +33 -0
  296. package/components/panel/{panel.test.js → panel.test.tsx} +0 -0
  297. package/components/panel/panel.tsx +28 -0
  298. package/components/permissions/permissions.test.ts +440 -0
  299. package/components/permissions/permissions.ts +229 -0
  300. package/components/permissions/permissions__cache.test.ts +79 -0
  301. package/components/permissions/permissions__cache.ts +290 -0
  302. package/components/permissions-ng/permissions-ng.examples.js +2 -2
  303. package/components/place-under-ng/place-under-ng.examples.js +2 -2
  304. package/components/popup/popup.consts.ts +45 -0
  305. package/components/popup/popup.examples.tsx +346 -0
  306. package/components/popup/popup.target.tsx +29 -0
  307. package/components/popup/popup.test.tsx +257 -0
  308. package/components/popup/popup.tsx +477 -0
  309. package/components/popup/position.test.ts +203 -0
  310. package/components/popup/position.ts +315 -0
  311. package/components/popup-menu/popup-menu.examples.tsx +38 -0
  312. package/components/popup-menu/popup-menu.test.tsx +37 -0
  313. package/components/popup-menu/popup-menu.tsx +69 -0
  314. package/components/progress-bar/progress-bar.examples.tsx +60 -0
  315. package/components/progress-bar/progress-bar.test.tsx +115 -0
  316. package/components/progress-bar/progress-bar.tsx +115 -0
  317. package/components/progress-bar-ng/progress-bar-ng.examples.js +1 -1
  318. package/components/promised-click-ng/promised-click-ng.examples.js +2 -2
  319. package/components/query-assist/query-assist.examples.tsx +312 -0
  320. package/components/query-assist/query-assist.test.tsx +688 -0
  321. package/components/query-assist/query-assist.tsx +1121 -0
  322. package/components/query-assist/query-assist__suggestions.tsx +124 -0
  323. package/components/query-assist-ng/query-assist-ng.examples.js +2 -2
  324. package/components/radio/radio.examples.tsx +58 -0
  325. package/components/radio/radio.test.tsx +102 -0
  326. package/components/radio/radio.tsx +37 -0
  327. package/components/radio/radio__item.test.tsx +100 -0
  328. package/components/radio/radio__item.tsx +85 -0
  329. package/components/radio-ng/radio-ng.examples.js +1 -1
  330. package/components/save-field-ng/save-field-ng.examples.js +2 -2
  331. package/components/select/select.examples.tsx +1061 -0
  332. package/components/select/select.test.tsx +1200 -0
  333. package/components/select/select.tsx +1488 -0
  334. package/components/select/select__filter.tsx +76 -0
  335. package/components/select/select__popup.test.tsx +159 -0
  336. package/components/select/select__popup.tsx +654 -0
  337. package/components/select-ng/select-ng.examples.js +3 -3
  338. package/components/shortcuts/core.test.ts +297 -0
  339. package/components/shortcuts/core.ts +260 -0
  340. package/components/shortcuts/shortcut-title.ts +56 -0
  341. package/components/shortcuts/shortcuts-hoc.test.tsx +61 -0
  342. package/components/shortcuts/shortcuts-hoc.tsx +43 -0
  343. package/components/shortcuts/shortcuts.test.tsx +48 -0
  344. package/components/shortcuts/shortcuts.ts +64 -0
  345. package/components/shortcuts-hint-ng/shortcuts-hint-ng.examples.js +1 -1
  346. package/components/sidebar-ng/sidebar-ng.examples.js +3 -3
  347. package/components/storage/storage.examples.ts +37 -0
  348. package/components/storage/storage.test.ts +254 -0
  349. package/components/storage/storage.ts +44 -0
  350. package/components/storage/storage__fallback.ts +211 -0
  351. package/components/storage/storage__local.ts +132 -0
  352. package/components/tab-trap/tab-trap.examples.tsx +49 -0
  353. package/components/tab-trap/tab-trap.tsx +189 -0
  354. package/components/table/cell.tsx +30 -0
  355. package/components/table/disable-hover-hoc.tsx +52 -0
  356. package/components/table/header-cell.tsx +104 -0
  357. package/components/table/header.tsx +196 -0
  358. package/components/table/multitable.tsx +106 -0
  359. package/components/table/row-with-focus-sensor.tsx +56 -0
  360. package/components/table/row.tsx +276 -0
  361. package/components/table/selection-adapter.ts +12 -0
  362. package/components/table/selection-shortcuts-hoc.tsx +210 -0
  363. package/components/table/selection.ts +212 -0
  364. package/components/table/smart-table.tsx +59 -0
  365. package/components/table/table.examples.tsx +367 -0
  366. package/components/table/table.tsx +379 -0
  367. package/components/table-legacy-ng/table-legacy-ng.examples.js +4 -4
  368. package/components/table-ng/table-ng.examples.js +4 -4
  369. package/components/tabs/collapsible-more.tsx +199 -0
  370. package/components/tabs/collapsible-tab.tsx +102 -0
  371. package/components/tabs/collapsible-tabs.tsx +295 -0
  372. package/components/tabs/custom-item.tsx +10 -0
  373. package/components/tabs/dumb-tabs.tsx +119 -0
  374. package/components/tabs/smart-tabs.tsx +38 -0
  375. package/components/tabs/tab-link.tsx +39 -0
  376. package/components/tabs/tab.tsx +38 -0
  377. package/components/tabs/tabs.examples.tsx +275 -0
  378. package/components/tabs/tabs.test.tsx +27 -0
  379. package/components/tabs/{tabs.js → tabs.ts} +0 -0
  380. package/components/tabs-ng/tabs-ng.examples.js +1 -1
  381. package/components/tag/tag.examples.tsx +50 -0
  382. package/components/tag/tag.test.tsx +21 -0
  383. package/components/tag/tag.tsx +213 -0
  384. package/components/tags-input/tag-input.examples.tsx +133 -0
  385. package/components/tags-input/tags-input.test.tsx +234 -0
  386. package/components/tags-input/tags-input.tsx +394 -0
  387. package/components/tags-input-ng/tags-input-ng.examples.js +1 -1
  388. package/components/tags-list/tags-list.examples.tsx +41 -0
  389. package/components/tags-list/tags-list.test.tsx +45 -0
  390. package/components/tags-list/tags-list.tsx +107 -0
  391. package/components/template-ng/template-ng.examples.js +1 -1
  392. package/components/text/text.examples.tsx +25 -0
  393. package/components/text/text.test.tsx +25 -0
  394. package/components/text/text.tsx +34 -0
  395. package/components/title-ng/title-ng.examples.js +1 -1
  396. package/components/toggle/toggle.examples.tsx +79 -0
  397. package/components/toggle/toggle.test.tsx +34 -0
  398. package/components/toggle/toggle.tsx +87 -0
  399. package/components/toggle-ng/toggle-ng.examples.js +1 -1
  400. package/components/tooltip/tooltip.examples.tsx +118 -0
  401. package/components/tooltip/tooltip.test.tsx +130 -0
  402. package/components/tooltip/tooltip.tsx +187 -0
  403. package/components/tooltip-ng/tooltip-ng.examples.js +2 -2
  404. package/components/user-agreement/service.tsx +340 -0
  405. package/components/user-agreement/{toolbox.eula.js → toolbox.eula.ts} +0 -0
  406. package/components/user-agreement/user-agreement.examples.tsx +130 -0
  407. package/components/user-agreement/user-agreement.tsx +146 -0
  408. package/components/user-card/card.tsx +119 -0
  409. package/components/user-card/smart-user-card-tooltip.tsx +70 -0
  410. package/components/user-card/tooltip.tsx +68 -0
  411. package/components/user-card/user-card.examples.tsx +91 -0
  412. package/components/user-card/user-card.test.tsx +106 -0
  413. package/components/user-card/{user-card.js → user-card.ts} +0 -0
  414. package/components/user-card-ng/user-card-ng.examples.js +4 -4
  415. package/components/welcome.examples.tsx +25 -0
  416. package/dist/_helpers/anchor.js +3 -2
  417. package/dist/_helpers/dialog__body-scroll-preventer.js +1 -1
  418. package/dist/_helpers/footer.js +2 -2
  419. package/dist/_helpers/inject-styles.js +1 -1
  420. package/dist/_helpers/input.js +1 -1
  421. package/dist/_helpers/query-assist__suggestions.js +2 -2
  422. package/dist/_helpers/select__filter.js +11 -9
  423. package/dist/_helpers/sidebar.js +6 -3
  424. package/dist/_helpers/title.js +13 -13
  425. package/dist/alert/alert.d.ts +110 -0
  426. package/dist/alert/alert.js +40 -36
  427. package/dist/alert/container.d.ts +15 -0
  428. package/dist/alert/container.js +5 -7
  429. package/dist/alert-service/alert-service.d.ts +34 -0
  430. package/dist/analytics/analytics.d.ts +24 -0
  431. package/dist/analytics/analytics.js +10 -15
  432. package/dist/analytics/analytics__custom-plugin.d.ts +39 -0
  433. package/dist/analytics/analytics__custom-plugin.js +30 -9
  434. package/dist/analytics/analytics__fus-plugin.d.ts +62 -0
  435. package/dist/analytics/analytics__fus-plugin.js +23 -6
  436. package/dist/analytics/analytics__ga-plugin.d.ts +17 -0
  437. package/dist/analytics/analytics__ga-plugin.js +12 -6
  438. package/dist/analytics/analytics__plugin-utils.d.ts +15 -0
  439. package/dist/analytics/analytics__plugin-utils.js +58 -59
  440. package/dist/analytics-ng/analytics-ng.js +1 -0
  441. package/dist/auth/auth.d.ts +3 -0
  442. package/dist/auth/auth__core.d.ts +233 -0
  443. package/dist/auth/auth__core.js +205 -116
  444. package/dist/auth/background-flow.d.ts +31 -0
  445. package/dist/auth/background-flow.js +9 -1
  446. package/dist/auth/down-notification.d.ts +15 -0
  447. package/dist/auth/iframe-flow.d.ts +20 -0
  448. package/dist/auth/iframe-flow.js +19 -5
  449. package/dist/auth/landing-entry.d.ts +3 -0
  450. package/dist/auth/landing.d.ts +2 -0
  451. package/dist/auth/landing.js +13 -7
  452. package/dist/auth/request-builder.d.ts +47 -0
  453. package/dist/auth/request-builder.js +7 -1
  454. package/dist/auth/response-parser.d.ts +70 -0
  455. package/dist/auth/response-parser.js +25 -13
  456. package/dist/auth/storage.d.ts +112 -0
  457. package/dist/auth/storage.js +41 -10
  458. package/dist/auth/token-validator.d.ts +93 -0
  459. package/dist/auth/token-validator.js +32 -12
  460. package/dist/auth/window-flow.d.ts +26 -0
  461. package/dist/auth/window-flow.js +24 -11
  462. package/dist/auth-dialog/auth-dialog.d.ts +49 -0
  463. package/dist/auth-dialog/auth-dialog.js +4 -8
  464. package/dist/auth-dialog-service/auth-dialog-service.d.ts +5 -0
  465. package/dist/avatar/avatar-example-datauri.d.ts +1 -0
  466. package/dist/avatar/avatar.d.ts +51 -0
  467. package/dist/avatar/avatar.js +13 -10
  468. package/dist/avatar/fallback-avatar.d.ts +17 -0
  469. package/dist/badge/badge.d.ts +24 -0
  470. package/dist/button/button.d.ts +255 -0
  471. package/dist/button/button.js +13 -12
  472. package/dist/button/button__classes.d.ts +2 -0
  473. package/dist/button-group/button-group.d.ts +14 -0
  474. package/dist/button-group/caption.d.ts +8 -0
  475. package/dist/button-set/button-set.d.ts +12 -0
  476. package/dist/button-toolbar/button-toolbar.d.ts +12 -0
  477. package/dist/caret/caret.d.ts +66 -0
  478. package/dist/caret/caret.js +35 -19
  479. package/dist/checkbox/checkbox.d.ts +41 -0
  480. package/dist/checkbox/checkbox.js +6 -0
  481. package/dist/code/code.d.ts +43 -0
  482. package/dist/code/code.js +12 -8
  483. package/dist/confirm/confirm.d.ts +48 -0
  484. package/dist/confirm/confirm.js +4 -4
  485. package/dist/confirm-service/confirm-service.d.ts +15 -0
  486. package/dist/content-layout/content-layout.d.ts +26 -0
  487. package/dist/content-layout/content-layout.js +4 -2
  488. package/dist/content-layout/sidebar.d.ts +31 -0
  489. package/dist/contenteditable/contenteditable.d.ts +47 -0
  490. package/dist/contenteditable/contenteditable.js +6 -4
  491. package/dist/data-list/data-list.d.ts +89 -0
  492. package/dist/data-list/data-list.js +52 -23
  493. package/dist/data-list/data-list.mock.d.ts +16 -0
  494. package/dist/data-list/data-list.mock.js +2 -2
  495. package/dist/data-list/item.d.ts +50 -0
  496. package/dist/data-list/item.js +34 -28
  497. package/dist/data-list/selection.d.ts +16 -0
  498. package/dist/data-list/selection.js +13 -0
  499. package/dist/data-list/title.d.ts +26 -0
  500. package/dist/data-list/title.js +1 -0
  501. package/dist/data-list-ng/data-list-ng.js +4 -2
  502. package/dist/date-picker/consts.d.ts +99 -0
  503. package/dist/date-picker/consts.js +2 -21
  504. package/dist/date-picker/date-input.d.ts +57 -0
  505. package/dist/date-picker/date-input.js +7 -3
  506. package/dist/date-picker/date-picker.d.ts +70 -0
  507. package/dist/date-picker/date-picker.js +38 -38
  508. package/dist/date-picker/date-popup.d.ts +56 -0
  509. package/dist/date-picker/date-popup.js +43 -26
  510. package/dist/date-picker/day.d.ts +30 -0
  511. package/dist/date-picker/day.js +8 -4
  512. package/dist/date-picker/formats.d.ts +2 -0
  513. package/dist/date-picker/month-names.d.ts +13 -0
  514. package/dist/date-picker/month-names.js +6 -5
  515. package/dist/date-picker/month-slider.d.ts +29 -0
  516. package/dist/date-picker/month-slider.js +2 -2
  517. package/dist/date-picker/month.d.ts +14 -0
  518. package/dist/date-picker/months.d.ts +11 -0
  519. package/dist/date-picker/months.js +3 -3
  520. package/dist/date-picker/weekdays.d.ts +13 -0
  521. package/dist/date-picker/weekdays.js +1 -1
  522. package/dist/date-picker/years.d.ts +21 -0
  523. package/dist/date-picker/years.js +8 -6
  524. package/dist/dialog/dialog.d.ts +73 -0
  525. package/dist/dialog/dialog.js +4 -2
  526. package/dist/dialog/dialog__body-scroll-preventer.d.ts +9 -0
  527. package/dist/dropdown/anchor.d.ts +90 -0
  528. package/dist/dropdown/dropdown.d.ts +77 -0
  529. package/dist/dropdown/dropdown.js +13 -6
  530. package/dist/dropdown-menu/dropdown-menu.d.ts +26 -0
  531. package/dist/dropdown-menu/dropdown-menu.js +8 -5
  532. package/dist/error-bubble/error-bubble.d.ts +18 -0
  533. package/dist/error-bubble/error-bubble.js +3 -1
  534. package/dist/error-message/error-message.d.ts +25 -0
  535. package/dist/footer/footer.d.ts +28 -0
  536. package/dist/global/compose.d.ts +7 -0
  537. package/dist/global/compose.js +2 -2
  538. package/dist/global/composeRefs.d.ts +3 -0
  539. package/dist/global/conic-gradient.d.ts +796 -0
  540. package/dist/global/conic-gradient.js +1 -1
  541. package/dist/global/create-stateful-context.d.ts +27 -0
  542. package/dist/global/data-tests.d.ts +3 -0
  543. package/dist/global/data-tests.js +5 -1
  544. package/dist/global/dom.d.ts +37 -0
  545. package/dist/global/dom.js +4 -4
  546. package/dist/global/focus-sensor-hoc.d.ts +18 -0
  547. package/dist/global/focus-sensor-hoc.js +58 -20
  548. package/dist/global/fuzzy-highlight.d.ts +5 -0
  549. package/dist/global/get-event-key.d.ts +2 -0
  550. package/dist/global/get-event-key.js +0 -1
  551. package/dist/global/get-uid.d.ts +1 -0
  552. package/dist/global/inject-styles.d.ts +3 -0
  553. package/dist/global/linear-function.d.ts +6 -0
  554. package/dist/global/listeners.d.ts +8 -0
  555. package/dist/global/listeners.js +10 -2
  556. package/dist/global/memoize.d.ts +1 -0
  557. package/dist/global/memoize.js +7 -6
  558. package/dist/global/normalize-indent.d.ts +1 -0
  559. package/dist/global/normalize-indent.js +5 -1
  560. package/dist/global/promise-with-timeout.d.ts +4 -0
  561. package/dist/global/prop-types.d.ts +4 -0
  562. package/dist/global/prop-types.js +7 -0
  563. package/dist/global/radial-gradient-mask.d.ts +9 -0
  564. package/dist/global/react-dom-renderer.d.ts +16 -0
  565. package/dist/global/react-dom-renderer.js +2 -0
  566. package/dist/global/rerender-hoc.d.ts +45 -0
  567. package/dist/global/rerender-hoc.js +5 -14
  568. package/dist/global/schedule-raf.d.ts +1 -0
  569. package/dist/global/schedule-raf.js +3 -1
  570. package/dist/global/sniffer.d.ts +3 -0
  571. package/dist/global/supports-css.d.ts +2 -0
  572. package/dist/global/theme.d.ts +26 -0
  573. package/dist/global/theme.js +22 -14
  574. package/dist/global/trivial-template-tag.d.ts +1 -0
  575. package/dist/global/typescript-utils.d.ts +2 -0
  576. package/dist/global/typescript-utils.js +4 -0
  577. package/dist/global/url.d.ts +57 -0
  578. package/dist/global/url.js +1 -1
  579. package/dist/global/variables.d.ts +88 -0
  580. package/dist/global/variables.js +1 -0
  581. package/dist/global/variables_dark.d.ts +3 -0
  582. package/dist/global/variables_dark.js +2 -2
  583. package/dist/grid/col.d.ts +31 -0
  584. package/dist/grid/col.js +7 -1
  585. package/dist/grid/grid.d.ts +14 -0
  586. package/dist/grid/row.d.ts +40 -0
  587. package/dist/grid/row.js +1 -4
  588. package/dist/group/group.d.ts +12 -0
  589. package/dist/header/header.d.ts +96 -0
  590. package/dist/header/header.js +3 -4
  591. package/dist/header/logo.d.ts +14 -0
  592. package/dist/header/profile.d.ts +73 -0
  593. package/dist/header/profile.js +4 -4
  594. package/dist/header/services-link.d.ts +25 -0
  595. package/dist/header/services.d.ts +28 -0
  596. package/dist/header/services.js +1 -0
  597. package/dist/header/smart-profile.d.ts +36 -0
  598. package/dist/header/smart-profile.js +1 -0
  599. package/dist/header/smart-services.d.ts +25 -0
  600. package/dist/header/smart-services.js +12 -3
  601. package/dist/header/tray-icon.d.ts +33 -0
  602. package/dist/header/tray-icon.js +3 -6
  603. package/dist/header/tray.d.ts +9 -0
  604. package/dist/heading/heading.d.ts +25 -0
  605. package/dist/heading/heading.js +14 -13
  606. package/dist/http/http.d.ts +49 -0
  607. package/dist/http/http.js +47 -12
  608. package/dist/http/http.mock.d.ts +20 -0
  609. package/dist/http/http.mock.js +12 -5
  610. package/dist/hub-source/hub-source.d.ts +42 -0
  611. package/dist/hub-source/hub-source.js +14 -1
  612. package/dist/hub-source/hub-source__user.d.ts +4 -0
  613. package/dist/hub-source/hub-source__user.js +4 -2
  614. package/dist/hub-source/hub-source__users-groups.d.ts +24 -0
  615. package/dist/hub-source/hub-source__users-groups.js +9 -1
  616. package/dist/icon/icon.d.ts +43 -0
  617. package/dist/icon/icon.js +2 -2
  618. package/dist/icon/icon__constants.d.ts +30 -0
  619. package/dist/icon/icon__constants.js +28 -23
  620. package/dist/icon/icon__svg.d.ts +15 -0
  621. package/dist/icon/index.d.ts +2 -0
  622. package/dist/icon/index.js +1 -1
  623. package/dist/input/input.d.ts +73 -0
  624. package/dist/input/input.js +75 -60
  625. package/dist/island/adaptive-island-hoc.d.ts +65 -0
  626. package/dist/island/adaptive-island-hoc.js +2 -2
  627. package/dist/island/content.d.ts +12 -0
  628. package/dist/island/content.js +11 -2
  629. package/dist/island/header.d.ts +8 -0
  630. package/dist/island/header.js +11 -6
  631. package/dist/island/island.d.ts +82 -0
  632. package/dist/island-legacy/content-legacy.d.ts +10 -0
  633. package/dist/island-legacy/header-legacy.d.ts +10 -0
  634. package/dist/island-legacy/island-legacy.d.ts +12 -0
  635. package/dist/link/clickableLink.d.ts +20 -0
  636. package/dist/link/link.d.ts +157 -0
  637. package/dist/link/link.js +9 -5
  638. package/dist/list/consts.d.ts +74 -0
  639. package/dist/list/consts.js +26 -20
  640. package/dist/list/list.d.ts +191 -0
  641. package/dist/list/list.js +32 -26
  642. package/dist/list/list__custom.d.ts +6 -0
  643. package/dist/list/list__custom.js +8 -13
  644. package/dist/list/list__hint.d.ts +15 -0
  645. package/dist/list/list__item.d.ts +8 -0
  646. package/dist/list/list__item.js +3 -4
  647. package/dist/list/list__link.d.ts +9 -0
  648. package/dist/list/list__link.js +5 -6
  649. package/dist/list/list__separator.d.ts +5 -0
  650. package/dist/list/list__separator.js +2 -4
  651. package/dist/list/list__title.d.ts +5 -0
  652. package/dist/list/list__title.js +2 -4
  653. package/dist/list/list__users-groups-source.d.ts +27 -0
  654. package/dist/list/list__users-groups-source.js +22 -12
  655. package/dist/loader/loader.d.ts +28 -0
  656. package/dist/loader/loader.js +5 -1
  657. package/dist/loader/loader__core.d.ts +75 -0
  658. package/dist/loader/loader__core.js +89 -47
  659. package/dist/loader-inline/inject-styles.d.ts +2 -0
  660. package/dist/loader-inline/loader-inline.d.ts +55 -0
  661. package/dist/loader-inline/loader-inline.js +2 -2
  662. package/dist/loader-screen/loader-screen.d.ts +17 -0
  663. package/dist/login-dialog/login-dialog.d.ts +47 -0
  664. package/dist/login-dialog/login-dialog.js +3 -1
  665. package/dist/login-dialog/service.d.ts +2 -0
  666. package/dist/login-dialog/service.js +5 -1
  667. package/dist/markdown/code.d.ts +16 -0
  668. package/dist/markdown/heading.d.ts +15 -0
  669. package/dist/markdown/link.d.ts +16 -0
  670. package/dist/markdown/link.js +2 -2
  671. package/dist/markdown/markdown.d.ts +23 -0
  672. package/dist/message/message.d.ts +72 -0
  673. package/dist/message/message.js +9 -8
  674. package/dist/old-browsers-message/old-browsers-message.d.ts +2 -0
  675. package/dist/old-browsers-message/old-browsers-message.js +10 -6
  676. package/dist/old-browsers-message/old-browsers-message__stop.d.ts +1 -0
  677. package/dist/old-browsers-message/white-list.d.ts +2 -0
  678. package/dist/old-browsers-message/white-list.js +3 -3
  679. package/dist/pager/pager.d.ts +102 -0
  680. package/dist/pager/pager.js +20 -9
  681. package/dist/pager-ng/pager-ng.js +3 -0
  682. package/dist/panel/panel.d.ts +12 -0
  683. package/dist/permissions/permissions.d.ts +111 -0
  684. package/dist/permissions/permissions.js +23 -4
  685. package/dist/permissions/permissions__cache.d.ts +93 -0
  686. package/dist/permissions/permissions__cache.js +10 -3
  687. package/dist/popup/popup.consts.d.ts +37 -0
  688. package/dist/popup/popup.consts.js +43 -29
  689. package/dist/popup/popup.d.ts +141 -0
  690. package/dist/popup/popup.js +83 -53
  691. package/dist/popup/popup.target.d.ts +6 -0
  692. package/dist/popup/popup.target.js +3 -4
  693. package/dist/popup/position.d.ts +30 -0
  694. package/dist/popup/position.js +11 -6
  695. package/dist/popup-menu/popup-menu.d.ts +59 -0
  696. package/dist/popup-menu/popup-menu.js +7 -6
  697. package/dist/progress-bar/progress-bar.d.ts +62 -0
  698. package/dist/progress-bar/progress-bar.js +5 -1
  699. package/dist/query-assist/query-assist.d.ts +332 -0
  700. package/dist/query-assist/query-assist.js +134 -70
  701. package/dist/query-assist/query-assist__suggestions.d.ts +29 -0
  702. package/dist/radio/radio.d.ts +18 -0
  703. package/dist/radio/radio__item.d.ts +28 -0
  704. package/dist/radio/radio__item.js +5 -2
  705. package/dist/select/select.d.ts +289 -0
  706. package/dist/select/select.js +179 -175
  707. package/dist/select/select__filter.d.ts +20 -0
  708. package/dist/select/select__filter.js +2 -0
  709. package/dist/select/select__popup.d.ts +123 -0
  710. package/dist/select/select__popup.js +97 -72
  711. package/dist/select-ng/select-ng.js +3 -0
  712. package/dist/select-ng/select-ng__lazy.js +3 -0
  713. package/dist/shortcuts/core.d.ts +74 -0
  714. package/dist/shortcuts/core.js +16 -10
  715. package/dist/shortcuts/shortcut-title.d.ts +1 -0
  716. package/dist/shortcuts/shortcuts-hoc.d.ts +69 -0
  717. package/dist/shortcuts/shortcuts.d.ts +28 -0
  718. package/dist/storage/storage.d.ts +18 -0
  719. package/dist/storage/storage.js +1 -1
  720. package/dist/storage/storage__fallback.d.ts +79 -0
  721. package/dist/storage/storage__fallback.js +31 -19
  722. package/dist/storage/storage__local.d.ts +38 -0
  723. package/dist/storage/storage__local.js +34 -19
  724. package/dist/style.css +1 -1
  725. package/dist/tab-trap/tab-trap.d.ts +43 -0
  726. package/dist/tab-trap/tab-trap.js +16 -4
  727. package/dist/table/cell.d.ts +13 -0
  728. package/dist/table/disable-hover-hoc.d.ts +68 -0
  729. package/dist/table/disable-hover-hoc.js +1 -1
  730. package/dist/table/header-cell.d.ts +43 -0
  731. package/dist/table/header-cell.js +4 -0
  732. package/dist/table/header.d.ts +60 -0
  733. package/dist/table/header.js +9 -5
  734. package/dist/table/multitable.d.ts +25 -0
  735. package/dist/table/multitable.js +21 -7
  736. package/dist/table/row-with-focus-sensor.d.ts +18 -0
  737. package/dist/table/row-with-focus-sensor.js +7 -4
  738. package/dist/table/row.d.ts +56 -0
  739. package/dist/table/row.js +29 -27
  740. package/dist/table/selection-adapter.d.ts +5 -0
  741. package/dist/table/selection-shortcuts-hoc.d.ts +17 -0
  742. package/dist/table/selection-shortcuts-hoc.js +44 -19
  743. package/dist/table/selection.d.ts +47 -0
  744. package/dist/table/selection.js +18 -1
  745. package/dist/table/smart-table.d.ts +60 -0
  746. package/dist/table/smart-table.js +5 -3
  747. package/dist/table/table.d.ts +160 -0
  748. package/dist/table/table.js +58 -38
  749. package/dist/table-legacy-ng/table-legacy-ng.js +3 -0
  750. package/dist/table-legacy-ng/table-legacy-ng__pager.js +3 -0
  751. package/dist/table-ng/smart-table-ng.js +1 -0
  752. package/dist/table-ng/table-ng.js +3 -2
  753. package/dist/tabs/collapsible-more.d.ts +29 -0
  754. package/dist/tabs/collapsible-more.js +1 -0
  755. package/dist/tabs/collapsible-tab.d.ts +16 -0
  756. package/dist/tabs/collapsible-tab.js +6 -8
  757. package/dist/tabs/collapsible-tabs.d.ts +43 -0
  758. package/dist/tabs/collapsible-tabs.js +57 -106
  759. package/dist/tabs/custom-item.d.ts +11 -0
  760. package/dist/tabs/dumb-tabs.d.ts +134 -0
  761. package/dist/tabs/dumb-tabs.js +3 -2
  762. package/dist/tabs/smart-tabs.d.ts +20 -0
  763. package/dist/tabs/smart-tabs.js +3 -2
  764. package/dist/tabs/tab-link.d.ts +18 -0
  765. package/dist/tabs/tab.d.ts +25 -0
  766. package/dist/tabs/tabs.d.ts +7 -0
  767. package/dist/tabs/tabs.js +1 -0
  768. package/dist/tag/tag.d.ts +63 -0
  769. package/dist/tag/tag.js +7 -3
  770. package/dist/tags-input/tags-input.d.ts +154 -0
  771. package/dist/tags-input/tags-input.js +63 -30
  772. package/dist/tags-input-ng/tags-input-ng.js +3 -0
  773. package/dist/tags-list/tags-list.d.ts +46 -0
  774. package/dist/tags-list/tags-list.js +1 -7
  775. package/dist/text/text.d.ts +17 -0
  776. package/dist/toggle/toggle.d.ts +119 -0
  777. package/dist/toggle/toggle.js +3 -5
  778. package/dist/toggle-ng/toggle-ng.js +2 -2
  779. package/dist/tooltip/tooltip.d.ts +64 -0
  780. package/dist/tooltip/tooltip.js +13 -4
  781. package/dist/user-agreement/service.d.ts +161 -0
  782. package/dist/user-agreement/service.js +20 -13
  783. package/dist/user-agreement/toolbox.eula.d.ts +2 -0
  784. package/dist/user-agreement/user-agreement.d.ts +69 -0
  785. package/dist/user-agreement/user-agreement.js +6 -7
  786. package/dist/user-card/card.d.ts +52 -0
  787. package/dist/user-card/smart-user-card-tooltip.d.ts +20 -0
  788. package/dist/user-card/smart-user-card-tooltip.js +3 -2
  789. package/dist/user-card/tooltip.d.ts +31 -0
  790. package/dist/user-card/tooltip.js +5 -1
  791. package/dist/user-card/user-card.d.ts +11 -0
  792. package/dist/user-card/user-card.js +1 -0
  793. package/dist/user-card-ng/user-card-ng.js +1 -0
  794. package/package.json +55 -32
  795. package/typings.d.ts +97 -0
  796. package/webpack.config.js +4 -1
  797. package/components/alert/alert.examples.js +0 -143
  798. package/components/alert/alert.js +0 -242
  799. package/components/alert/alert.test.js +0 -61
  800. package/components/alert/container.js +0 -47
  801. package/components/alert-service/alert-service.examples.js +0 -91
  802. package/components/alert-service/alert-service.js +0 -137
  803. package/components/alert-service/alert-service.test.js +0 -88
  804. package/components/analytics/analytics.examples.js +0 -47
  805. package/components/analytics/analytics.js +0 -101
  806. package/components/analytics/analytics.test.js +0 -419
  807. package/components/analytics/analytics__custom-plugin.js +0 -122
  808. package/components/analytics/analytics__fus-plugin.js +0 -93
  809. package/components/analytics/analytics__ga-plugin.js +0 -53
  810. package/components/analytics/analytics__plugin-utils.js +0 -74
  811. package/components/auth/auth.examples.js +0 -122
  812. package/components/auth/auth.test.js +0 -774
  813. package/components/auth/auth__core.js +0 -879
  814. package/components/auth/background-flow.js +0 -114
  815. package/components/auth/down-notification.js +0 -72
  816. package/components/auth/iframe-flow.js +0 -99
  817. package/components/auth/landing.js +0 -30
  818. package/components/auth/request-builder.js +0 -71
  819. package/components/auth/response-parser.js +0 -109
  820. package/components/auth/response-parser.test.js +0 -89
  821. package/components/auth/storage.js +0 -239
  822. package/components/auth/storage.test.js +0 -178
  823. package/components/auth/token-validator.js +0 -181
  824. package/components/auth/token-validator.test.js +0 -199
  825. package/components/auth/window-flow.js +0 -123
  826. package/components/auth-dialog/auth-dialog.examples.js +0 -76
  827. package/components/auth-dialog/auth-dialog.js +0 -115
  828. package/components/auth-dialog/auth-dialog.test.js +0 -11
  829. package/components/auth-dialog-service/auth-dialog-service.examples.js +0 -66
  830. package/components/auth-dialog-service/auth-dialog-service.js +0 -28
  831. package/components/auth-dialog-service/auth-dialog-service.test.js +0 -75
  832. package/components/avatar/avatar.examples.js +0 -46
  833. package/components/avatar/avatar.js +0 -169
  834. package/components/avatar/avatar.test.js +0 -59
  835. package/components/avatar/fallback-avatar.js +0 -136
  836. package/components/badge/badge.examples.js +0 -26
  837. package/components/badge/badge.js +0 -59
  838. package/components/button/button.examples.js +0 -219
  839. package/components/button/button.js +0 -122
  840. package/components/button/button.test.js +0 -64
  841. package/components/button/button__classes.js +0 -40
  842. package/components/button-group/button-group.examples.js +0 -58
  843. package/components/button-group/button-group.js +0 -30
  844. package/components/button-group/caption.js +0 -23
  845. package/components/button-set/button-set.examples.js +0 -24
  846. package/components/button-set/button-set.js +0 -27
  847. package/components/button-toolbar/button-toolbar.examples.js +0 -31
  848. package/components/button-toolbar/button-toolbar.js +0 -29
  849. package/components/button-toolbar/button-toolbar.test.js +0 -21
  850. package/components/caret/caret.examples.js +0 -39
  851. package/components/caret/caret.js +0 -225
  852. package/components/caret/caret.test.js +0 -137
  853. package/components/checkbox/checkbox.examples.js +0 -67
  854. package/components/checkbox/checkbox.js +0 -100
  855. package/components/checkbox/checkbox.test.js +0 -78
  856. package/components/code/code.examples.js +0 -92
  857. package/components/code/code.js +0 -118
  858. package/components/code/code.test.js +0 -100
  859. package/components/confirm/confirm.examples.js +0 -93
  860. package/components/confirm/confirm.js +0 -101
  861. package/components/confirm/confirm.test.js +0 -28
  862. package/components/confirm-service/confirm-service.examples.js +0 -61
  863. package/components/confirm-service/confirm-service.js +0 -65
  864. package/components/confirm-service/confirm-service.test.js +0 -59
  865. package/components/content-layout/content-layout.examples.js +0 -188
  866. package/components/content-layout/content-layout.js +0 -64
  867. package/components/content-layout/content-layout.test.js +0 -41
  868. package/components/content-layout/sidebar.js +0 -105
  869. package/components/contenteditable/contenteditable.examples.js +0 -45
  870. package/components/contenteditable/contenteditable.js +0 -66
  871. package/components/contenteditable/contenteditable.test.js +0 -73
  872. package/components/data-list/data-list.examples.js +0 -116
  873. package/components/data-list/data-list.js +0 -170
  874. package/components/data-list/data-list.mock.js +0 -248
  875. package/components/data-list/data-list.test.js +0 -40
  876. package/components/data-list/item.js +0 -214
  877. package/components/data-list/selection.js +0 -96
  878. package/components/data-list/title.js +0 -96
  879. package/components/date-picker/consts.js +0 -71
  880. package/components/date-picker/date-input.js +0 -132
  881. package/components/date-picker/date-picker.examples.js +0 -345
  882. package/components/date-picker/date-picker.js +0 -285
  883. package/components/date-picker/date-picker.test.js +0 -89
  884. package/components/date-picker/date-popup.js +0 -441
  885. package/components/date-picker/day.js +0 -121
  886. package/components/date-picker/month-names.js +0 -104
  887. package/components/date-picker/month-slider.js +0 -83
  888. package/components/date-picker/month.js +0 -48
  889. package/components/date-picker/months.js +0 -113
  890. package/components/date-picker/weekdays.js +0 -40
  891. package/components/date-picker/years.js +0 -111
  892. package/components/dialog/dialog.examples.js +0 -209
  893. package/components/dialog/dialog.js +0 -183
  894. package/components/dialog/dialog.test.js +0 -62
  895. package/components/dialog/dialog__body-scroll-preventer.js +0 -59
  896. package/components/dropdown/anchor.js +0 -31
  897. package/components/dropdown/dropdown.examples.js +0 -151
  898. package/components/dropdown/dropdown.js +0 -185
  899. package/components/dropdown/dropdown.test.js +0 -175
  900. package/components/dropdown-menu/dropdown-menu.examples.js +0 -47
  901. package/components/dropdown-menu/dropdown-menu.js +0 -117
  902. package/components/dropdown-menu/dropdown-menu.test.js +0 -76
  903. package/components/error-bubble/error-bubble.examples.js +0 -96
  904. package/components/error-bubble/error-bubble.js +0 -50
  905. package/components/error-bubble/error-bubble.test.js +0 -41
  906. package/components/error-message/error-message.examples.js +0 -33
  907. package/components/error-message/error-message.js +0 -54
  908. package/components/error-message/error-message.test.js +0 -21
  909. package/components/footer/footer.examples.js +0 -56
  910. package/components/footer/footer.js +0 -138
  911. package/components/footer/footer.test.js +0 -78
  912. package/components/global/compose.js +0 -4
  913. package/components/global/composeRefs.js +0 -7
  914. package/components/global/conic-gradient.js +0 -31
  915. package/components/global/create-stateful-context.js +0 -46
  916. package/components/global/data-tests.js +0 -17
  917. package/components/global/dom.examples.js +0 -39
  918. package/components/global/dom.js +0 -105
  919. package/components/global/dom.test.js +0 -99
  920. package/components/global/focus-sensor-hoc.js +0 -112
  921. package/components/global/fuzzy-highlight.js +0 -46
  922. package/components/global/get-event-key.js +0 -112
  923. package/components/global/get-uid.js +0 -15
  924. package/components/global/get-uid.test.js +0 -21
  925. package/components/global/inject-styles.js +0 -14
  926. package/components/global/linear-function.js +0 -16
  927. package/components/global/listeners.js +0 -38
  928. package/components/global/listeners.test.js +0 -78
  929. package/components/global/memoize.js +0 -14
  930. package/components/global/normalize-indent.js +0 -34
  931. package/components/global/promise-with-timeout.js +0 -10
  932. package/components/global/radial-gradient-mask.js +0 -43
  933. package/components/global/react-dom-renderer.js +0 -34
  934. package/components/global/rerender-hoc.js +0 -35
  935. package/components/global/schedule-raf.js +0 -27
  936. package/components/global/supports-css.js +0 -17
  937. package/components/global/theme.js +0 -51
  938. package/components/global/trivial-template-tag.js +0 -11
  939. package/components/global/url.js +0 -162
  940. package/components/global/url.test.js +0 -138
  941. package/components/global/variables.examples.js +0 -160
  942. package/components/global/variables_dark.js +0 -55
  943. package/components/grid/col.js +0 -58
  944. package/components/grid/grid.examples.js +0 -291
  945. package/components/grid/grid.js +0 -33
  946. package/components/grid/grid.test.js +0 -72
  947. package/components/grid/row.js +0 -60
  948. package/components/group/group.examples.js +0 -27
  949. package/components/group/group.js +0 -30
  950. package/components/group/group.test.js +0 -21
  951. package/components/header/header.examples.js +0 -118
  952. package/components/header/header.js +0 -55
  953. package/components/header/header.test.js +0 -21
  954. package/components/header/logo.js +0 -31
  955. package/components/header/profile.js +0 -181
  956. package/components/header/services-link.js +0 -45
  957. package/components/header/services.js +0 -115
  958. package/components/header/smart-profile.js +0 -121
  959. package/components/header/smart-services.js +0 -73
  960. package/components/header/tray-icon.js +0 -33
  961. package/components/header/tray.js +0 -30
  962. package/components/heading/heading.examples.js +0 -64
  963. package/components/heading/heading.js +0 -82
  964. package/components/heading/heading.test.js +0 -29
  965. package/components/http/http.examples.js +0 -34
  966. package/components/http/http.js +0 -196
  967. package/components/http/http.mock.js +0 -62
  968. package/components/http/http.test.js +0 -187
  969. package/components/hub-source/hub-source.js +0 -123
  970. package/components/hub-source/hub-source.test.js +0 -200
  971. package/components/hub-source/hub-source__user.js +0 -27
  972. package/components/hub-source/hub-source__users-groups.js +0 -60
  973. package/components/hub-source/hub-source__users-groups.test.js +0 -91
  974. package/components/icon/icon.examples.js +0 -146
  975. package/components/icon/icon.js +0 -97
  976. package/components/icon/icon.test.js +0 -51
  977. package/components/icon/icon__constants.js +0 -31
  978. package/components/icon/icon__svg.js +0 -77
  979. package/components/input/input.examples.js +0 -140
  980. package/components/input/input.js +0 -228
  981. package/components/input/input.test.js +0 -40
  982. package/components/island/adaptive-island-hoc.js +0 -38
  983. package/components/island/content.js +0 -141
  984. package/components/island/header.js +0 -102
  985. package/components/island/island.examples.js +0 -74
  986. package/components/island/island.js +0 -53
  987. package/components/island/island.test.js +0 -59
  988. package/components/island-legacy/content-legacy.js +0 -26
  989. package/components/island-legacy/header-legacy.js +0 -28
  990. package/components/island-legacy/island-legacy.examples.js +0 -33
  991. package/components/island-legacy/island-legacy.js +0 -29
  992. package/components/island-legacy/island-legacy.test.js +0 -21
  993. package/components/link/clickableLink.js +0 -48
  994. package/components/link/link.examples.js +0 -86
  995. package/components/link/link.js +0 -119
  996. package/components/link/link.test.js +0 -182
  997. package/components/list/consts.js +0 -26
  998. package/components/list/list.examples.js +0 -271
  999. package/components/list/list.js +0 -765
  1000. package/components/list/list.test.js +0 -428
  1001. package/components/list/list__custom.js +0 -90
  1002. package/components/list/list__hint.js +0 -24
  1003. package/components/list/list__item.js +0 -233
  1004. package/components/list/list__item.test.js +0 -60
  1005. package/components/list/list__link.js +0 -72
  1006. package/components/list/list__separator.js +0 -30
  1007. package/components/list/list__title.js +0 -44
  1008. package/components/list/list__users-groups-source.js +0 -89
  1009. package/components/list/list__users-groups-source.test.js +0 -125
  1010. package/components/loader/loader.examples.js +0 -22
  1011. package/components/loader/loader.js +0 -64
  1012. package/components/loader/loader__core.js +0 -251
  1013. package/components/loader/loader__core.test.js +0 -232
  1014. package/components/loader-inline/inject-styles.js +0 -28
  1015. package/components/loader-inline/loader-inline.examples.js +0 -106
  1016. package/components/loader-inline/loader-inline.js +0 -57
  1017. package/components/loader-inline/loader-inline.test.js +0 -21
  1018. package/components/loader-screen/loader-screen.examples.js +0 -40
  1019. package/components/loader-screen/loader-screen.js +0 -38
  1020. package/components/login-dialog/login-dialog.js +0 -125
  1021. package/components/login-dialog/service.js +0 -24
  1022. package/components/markdown/code.js +0 -20
  1023. package/components/markdown/heading.js +0 -13
  1024. package/components/markdown/link.js +0 -14
  1025. package/components/markdown/markdown.examples.js +0 -110
  1026. package/components/markdown/markdown.js +0 -58
  1027. package/components/markdown/markdown.test.js +0 -60
  1028. package/components/message/message.examples.js +0 -78
  1029. package/components/message/message.js +0 -156
  1030. package/components/message/message.test.js +0 -26
  1031. package/components/old-browsers-message/old-browsers-message.examples.js +0 -37
  1032. package/components/old-browsers-message/old-browsers-message.js +0 -99
  1033. package/components/old-browsers-message/white-list.js +0 -32
  1034. package/components/pager/pager.examples.js +0 -291
  1035. package/components/pager/pager.js +0 -337
  1036. package/components/pager/pager.test.js +0 -56
  1037. package/components/panel/panel.examples.js +0 -33
  1038. package/components/panel/panel.js +0 -28
  1039. package/components/permissions/permissions.js +0 -193
  1040. package/components/permissions/permissions.test.js +0 -435
  1041. package/components/permissions/permissions__cache.js +0 -259
  1042. package/components/permissions/permissions__cache.test.js +0 -75
  1043. package/components/popup/popup.consts.js +0 -45
  1044. package/components/popup/popup.examples.js +0 -340
  1045. package/components/popup/popup.js +0 -395
  1046. package/components/popup/popup.target.js +0 -27
  1047. package/components/popup/popup.test.js +0 -242
  1048. package/components/popup/position.js +0 -252
  1049. package/components/popup/position.test.js +0 -192
  1050. package/components/popup-menu/popup-menu.examples.js +0 -38
  1051. package/components/popup-menu/popup-menu.js +0 -58
  1052. package/components/popup-menu/popup-menu.test.js +0 -29
  1053. package/components/progress-bar/progress-bar.examples.js +0 -56
  1054. package/components/progress-bar/progress-bar.js +0 -103
  1055. package/components/progress-bar/progress-bar.test.js +0 -114
  1056. package/components/query-assist/query-assist.examples.js +0 -305
  1057. package/components/query-assist/query-assist.js +0 -992
  1058. package/components/query-assist/query-assist.test.js +0 -690
  1059. package/components/query-assist/query-assist__suggestions.js +0 -100
  1060. package/components/radio/radio.examples.js +0 -58
  1061. package/components/radio/radio.js +0 -37
  1062. package/components/radio/radio.test.js +0 -90
  1063. package/components/radio/radio__item.js +0 -69
  1064. package/components/radio/radio__item.test.js +0 -98
  1065. package/components/select/select.examples.js +0 -1023
  1066. package/components/select/select.js +0 -1284
  1067. package/components/select/select.test.js +0 -1201
  1068. package/components/select/select__filter.js +0 -70
  1069. package/components/select/select__popup.js +0 -556
  1070. package/components/select/select__popup.test.js +0 -156
  1071. package/components/shortcuts/core.js +0 -232
  1072. package/components/shortcuts/core.test.js +0 -282
  1073. package/components/shortcuts/shortcut-title.js +0 -56
  1074. package/components/shortcuts/shortcuts-hoc.js +0 -33
  1075. package/components/shortcuts/shortcuts-hoc.test.js +0 -53
  1076. package/components/shortcuts/shortcuts.js +0 -56
  1077. package/components/shortcuts/shortcuts.test.js +0 -45
  1078. package/components/storage/storage.examples.js +0 -37
  1079. package/components/storage/storage.js +0 -25
  1080. package/components/storage/storage.test.js +0 -248
  1081. package/components/storage/storage__fallback.js +0 -199
  1082. package/components/storage/storage__local.js +0 -115
  1083. package/components/tab-trap/tab-trap.examples.js +0 -49
  1084. package/components/tab-trap/tab-trap.js +0 -175
  1085. package/components/table/cell.js +0 -26
  1086. package/components/table/disable-hover-hoc.js +0 -44
  1087. package/components/table/header-cell.js +0 -77
  1088. package/components/table/header.js +0 -178
  1089. package/components/table/multitable.js +0 -99
  1090. package/components/table/row-with-focus-sensor.js +0 -39
  1091. package/components/table/row.js +0 -242
  1092. package/components/table/selection-adapter.js +0 -10
  1093. package/components/table/selection-shortcuts-hoc.js +0 -177
  1094. package/components/table/selection.js +0 -185
  1095. package/components/table/smart-table.js +0 -55
  1096. package/components/table/table.examples.js +0 -346
  1097. package/components/table/table.js +0 -315
  1098. package/components/tabs/collapsible-more.js +0 -183
  1099. package/components/tabs/collapsible-tab.js +0 -90
  1100. package/components/tabs/collapsible-tabs.js +0 -314
  1101. package/components/tabs/custom-item.js +0 -6
  1102. package/components/tabs/dumb-tabs.js +0 -107
  1103. package/components/tabs/smart-tabs.js +0 -32
  1104. package/components/tabs/tab-link.js +0 -34
  1105. package/components/tabs/tab.js +0 -25
  1106. package/components/tabs/tabs.examples.js +0 -275
  1107. package/components/tabs/tabs.test.js +0 -26
  1108. package/components/tag/tag.examples.js +0 -50
  1109. package/components/tag/tag.js +0 -182
  1110. package/components/tag/tag.test.js +0 -21
  1111. package/components/tags-input/tag-input.examples.js +0 -133
  1112. package/components/tags-input/tags-input.js +0 -347
  1113. package/components/tags-input/tags-input.test.js +0 -234
  1114. package/components/tags-list/tags-list.examples.js +0 -41
  1115. package/components/tags-list/tags-list.js +0 -93
  1116. package/components/tags-list/tags-list.test.js +0 -43
  1117. package/components/text/text.examples.js +0 -25
  1118. package/components/text/text.js +0 -29
  1119. package/components/text/text.test.js +0 -25
  1120. package/components/toggle/toggle.examples.js +0 -79
  1121. package/components/toggle/toggle.js +0 -77
  1122. package/components/toggle/toggle.test.js +0 -34
  1123. package/components/tooltip/tooltip.examples.js +0 -118
  1124. package/components/tooltip/tooltip.js +0 -168
  1125. package/components/tooltip/tooltip.test.js +0 -128
  1126. package/components/user-agreement/service.js +0 -292
  1127. package/components/user-agreement/user-agreement.examples.js +0 -112
  1128. package/components/user-agreement/user-agreement.js +0 -124
  1129. package/components/user-card/card.js +0 -98
  1130. package/components/user-card/smart-user-card-tooltip.js +0 -66
  1131. package/components/user-card/tooltip.js +0 -58
  1132. package/components/user-card/user-card.examples.js +0 -88
  1133. package/components/user-card/user-card.test.js +0 -102
  1134. package/components/welcome.examples.js +0 -25
@@ -0,0 +1,1030 @@
1
+ import {fixUrl, getAbsoluteBaseURL} from '../global/url';
2
+ import Listeners, {Handler} from '../global/listeners';
3
+ import HTTP, {HTTPAuth, RequestParams} from '../http/http';
4
+ import promiseWithTimeout from '../global/promise-with-timeout';
5
+ import AuthDialogService from '../auth-dialog-service/auth-dialog-service';
6
+
7
+ import AuthStorage, {AuthState} from './storage';
8
+ import AuthResponseParser, {AuthError} from './response-parser';
9
+ import AuthRequestBuilder from './request-builder';
10
+ import BackgroundFlow from './background-flow';
11
+ import TokenValidator, {TokenValidationError, TokenValidatorConfig} from './token-validator';
12
+
13
+ /* eslint-disable @typescript-eslint/no-magic-numbers */
14
+ export const DEFAULT_EXPIRES_TIMEOUT = 40 * 60;
15
+ export const DEFAULT_BACKGROUND_TIMEOUT = 10 * 1000;
16
+ const DEFAULT_BACKEND_CHECK_TIMEOUT = 10 * 1000;
17
+ const BACKGROUND_REDIRECT_TIMEOUT = 20 * 1000;
18
+ const DEFAULT_WAIT_FOR_REDIRECT_TIMEOUT = 5 * 1000;
19
+ /* eslint-enable @typescript-eslint/no-magic-numbers */
20
+
21
+ export const USER_CHANGED_EVENT = 'userChange';
22
+ export const DOMAIN_USER_CHANGED_EVENT = 'domainUser';
23
+ export const LOGOUT_EVENT = 'logout';
24
+ export const LOGOUT_POSTPONED_EVENT = 'logoutPostponed';
25
+ export const USER_CHANGE_POSTPONED_EVENT = 'changePostponed';
26
+
27
+ function noop() {}
28
+
29
+ export interface AuthUser {
30
+ guest?: boolean
31
+ id: number | string
32
+ name: string
33
+ login: string
34
+ banned?: boolean
35
+ banReason?: string
36
+ profile?: {
37
+ avatar?: {
38
+ url?: string
39
+ }
40
+ email?: {
41
+ email?: string
42
+ }
43
+ }
44
+ }
45
+
46
+ export interface AuthTranslations {
47
+ login: string
48
+ loginTo: string
49
+ cancel: string
50
+ postpone: string
51
+ youHaveLoggedInAs: string
52
+ applyChange: string
53
+ backendIsNotAvailable: string
54
+ checkAgain: string
55
+ nothingHappensLink: string
56
+ errorMessage: string
57
+ }
58
+
59
+ export interface LoginFlow {
60
+ stop(): void
61
+ authorize(): Promise<unknown>
62
+ }
63
+
64
+ export interface LoginFlowClass {
65
+ new (
66
+ requestBuilder: AuthRequestBuilder,
67
+ storage: AuthStorage,
68
+ translations: AuthTranslations,
69
+ ): LoginFlow
70
+ }
71
+
72
+ export interface BackendDownParams {
73
+ onCheckAgain(): Promise<void>
74
+ onPostpone(): void
75
+ backendError: Error
76
+ translations: AuthTranslations
77
+ }
78
+
79
+ export interface AuthConfig extends TokenValidatorConfig {
80
+ serverUri: string
81
+ redirectUri: string
82
+ requestCredentials: string
83
+ clientId: string
84
+ redirect: boolean
85
+ cleanHash: boolean
86
+ userFields: readonly string[]
87
+ fetchCredentials?: RequestCredentials | null | undefined
88
+ cacheCurrentUser: boolean
89
+ reloadOnUserChange: boolean
90
+ embeddedLogin: boolean
91
+ EmbeddedLoginFlow?: LoginFlowClass | null | undefined
92
+ backgroundRefreshTimeout?: number | null | undefined
93
+ onLogout?: (() => void) | null | undefined
94
+ onPostponeChangedUser: (prevUser: AuthUser | null, nextUser: AuthUser | null) => void
95
+ onPostponeLogout: () => void
96
+ enableBackendStatusCheck: boolean
97
+ backendCheckTimeout: number
98
+ checkBackendIsUp: () => Promise<unknown>
99
+ onBackendDown: (params: BackendDownParams) => () => void
100
+ defaultExpiresIn: number
101
+ translations: AuthTranslations
102
+ userParams?: RequestParams | undefined
103
+ waitForRedirectTimeout: number
104
+ }
105
+
106
+ const DEFAULT_CONFIG: Omit<AuthConfig, 'serverUri'> = {
107
+ cacheCurrentUser: false,
108
+ reloadOnUserChange: true,
109
+ embeddedLogin: false,
110
+ EmbeddedLoginFlow: null,
111
+ clientId: '0-0-0-0-0',
112
+ redirectUri: getAbsoluteBaseURL(),
113
+ redirect: false,
114
+ requestCredentials: 'default',
115
+ backgroundRefreshTimeout: null,
116
+ scope: [],
117
+ userFields: ['guest', 'id', 'name', 'login', 'profile/avatar/url'],
118
+ cleanHash: true,
119
+ onLogout: noop,
120
+ onPostponeChangedUser: () => {},
121
+ onPostponeLogout: () => {},
122
+ enableBackendStatusCheck: true,
123
+ backendCheckTimeout: DEFAULT_BACKEND_CHECK_TIMEOUT,
124
+ checkBackendIsUp: () => Promise.resolve(null),
125
+ onBackendDown: () => () => {},
126
+
127
+ defaultExpiresIn: DEFAULT_EXPIRES_TIMEOUT,
128
+ waitForRedirectTimeout: DEFAULT_WAIT_FOR_REDIRECT_TIMEOUT,
129
+ translations: {
130
+ login: 'Log in',
131
+ loginTo: 'Log in to %serviceName%',
132
+ cancel: 'Cancel',
133
+ postpone: 'Postpone',
134
+ youHaveLoggedInAs: 'You have logged in as another user: %userName%',
135
+ applyChange: 'Apply change',
136
+ backendIsNotAvailable: 'Connection lost',
137
+ checkAgain: 'try again',
138
+ nothingHappensLink: 'Click here if nothing happens',
139
+ errorMessage: 'There may be a problem with your network connection. Make sure that you are online and'
140
+ }
141
+ };
142
+
143
+ type AuthPayloadMap = {
144
+ userChange: [AuthUser | undefined | void, void]
145
+ logout: [void, void]
146
+ logoutPostponed: [void, void]
147
+ changePostponed: [void, void]
148
+ }
149
+
150
+ export interface AuthService {
151
+ serviceName: string
152
+ serviceImage: string
153
+ }
154
+
155
+ interface Deferred<T> {
156
+ promise?: Promise<T>
157
+ resolve?: (value: T) => void
158
+ reject?: (reason: unknown) => void
159
+ }
160
+
161
+ interface AuthDialogParams {
162
+ nonInteractive?: boolean
163
+ error?: Error
164
+ canCancel?: boolean
165
+ }
166
+
167
+ interface UserChange {
168
+ userID: number | string | null | undefined,
169
+ serviceID: string
170
+ }
171
+
172
+ interface UserChangedDialogParams {
173
+ newUser: AuthUser
174
+ onApply: () => void
175
+ onPostpone: () => void
176
+ }
177
+
178
+ declare global {
179
+ interface HTMLLinkElement {
180
+ pr?: string
181
+ }
182
+ }
183
+
184
+ export default class Auth implements HTTPAuth {
185
+ static DEFAULT_CONFIG = DEFAULT_CONFIG;
186
+ static API_PATH = 'api/rest/';
187
+ static API_AUTH_PATH = 'oauth2/auth';
188
+ static API_PROFILE_PATH = 'users/me';
189
+ static CLOSE_BACKEND_DOWN_MESSAGE = 'backend-check-succeeded';
190
+ static CLOSE_WINDOW_MESSAGE = 'close-login-window';
191
+ static shouldRefreshToken = TokenValidator.shouldRefreshToken;
192
+ static storageIsUnavailable = !navigator.cookieEnabled;
193
+
194
+ config: AuthConfig;
195
+ listeners = new Listeners<AuthPayloadMap>();
196
+ http: HTTP;
197
+ private _service: Partial<AuthService> = {};
198
+ readonly _storage: AuthStorage<number> | null = null;
199
+ private _responseParser = new AuthResponseParser();
200
+ private readonly _requestBuilder: AuthRequestBuilder | null = null;
201
+ _backgroundFlow: BackgroundFlow | null;
202
+ private _embeddedFlow: LoginFlow | null = null;
203
+ _tokenValidator: TokenValidator | null = null;
204
+ private _postponed = false;
205
+ private _backendCheckPromise: Promise<void> | null = null;
206
+ private _authDialogService: typeof AuthDialogService | undefined = undefined;
207
+ _domainStorage: AuthStorage<UserChange>;
208
+ user: AuthUser | null = null;
209
+ _initDeferred?: Deferred<string | void>;
210
+ private _isLoginWindowOpen?: boolean;
211
+
212
+ constructor(config: Partial<AuthConfig> & Pick<AuthConfig, 'serverUri'>) {
213
+ if (!config) {
214
+ throw new Error('Config is required');
215
+ }
216
+
217
+ if (config.serverUri == null) {
218
+ throw new Error('\"serverUri\" property is required');
219
+ }
220
+
221
+ const unsupportedParams = ['redirect_uri', 'request_credentials', 'client_id'].filter(param => config.hasOwnProperty(param));
222
+ if (unsupportedParams.length !== 0) {
223
+ throw new Error(`The following parameters are no longer supported: ${unsupportedParams.join(', ')}. Please change them from snake_case to camelCase.`);
224
+ }
225
+
226
+ config.userFields = config.userFields || [];
227
+
228
+ this.config = {...Auth.DEFAULT_CONFIG, ...config};
229
+
230
+ const {clientId, redirect, redirectUri, requestCredentials, scope} = this.config;
231
+ const serverUriLength = this.config.serverUri.length;
232
+
233
+ if (serverUriLength > 0 && this.config.serverUri.charAt(serverUriLength - 1) !== '/') {
234
+ this.config.serverUri += '/';
235
+ }
236
+
237
+ this.config.userParams = {
238
+ query: {
239
+ fields: [...new Set(Auth.DEFAULT_CONFIG.userFields.concat(config.userFields))].join()
240
+ }
241
+ };
242
+
243
+ if (!scope.includes(Auth.DEFAULT_CONFIG.clientId)) {
244
+ scope.push(Auth.DEFAULT_CONFIG.clientId);
245
+ }
246
+
247
+ this._storage = new AuthStorage({
248
+ messagePrefix: `${clientId}-message-`,
249
+ stateKeyPrefix: `${clientId}-states-`,
250
+ tokenKey: `${clientId}-token`,
251
+ userKey: `${clientId}-user-`
252
+ });
253
+
254
+ this._domainStorage = new AuthStorage({messagePrefix: 'domain-message-'});
255
+
256
+ this._requestBuilder = new AuthRequestBuilder({
257
+ authorization: this.config.serverUri + Auth.API_PATH + Auth.API_AUTH_PATH,
258
+ clientId,
259
+ redirect,
260
+ redirectUri,
261
+ requestCredentials,
262
+ scopes: scope
263
+ }, this._storage);
264
+
265
+ let {backgroundRefreshTimeout} = this.config;
266
+ if (!backgroundRefreshTimeout) {
267
+ backgroundRefreshTimeout = this.config.embeddedLogin
268
+ ? DEFAULT_BACKGROUND_TIMEOUT
269
+ : BACKGROUND_REDIRECT_TIMEOUT;
270
+ }
271
+
272
+ this._backgroundFlow = new BackgroundFlow(
273
+ this._requestBuilder, this._storage, backgroundRefreshTimeout
274
+ );
275
+ if (this.config.EmbeddedLoginFlow) {
276
+ this._embeddedFlow = new this.config.EmbeddedLoginFlow(
277
+ this._requestBuilder,
278
+ this._storage,
279
+ this.config.translations
280
+ );
281
+ }
282
+
283
+ const API_BASE = this.config.serverUri + Auth.API_PATH;
284
+ const fetchConfig = config.fetchCredentials
285
+ ? {credentials: config.fetchCredentials}
286
+ : undefined;
287
+ this.http = new HTTP(this, API_BASE, fetchConfig);
288
+
289
+ const getUser = async (token: string) => {
290
+ const user = await this.getUser(token);
291
+ this.user = user;
292
+ return user;
293
+ };
294
+
295
+ this._tokenValidator = new TokenValidator(this.config, getUser, this._storage);
296
+
297
+ if (this.config.onLogout) {
298
+ this.addListener(LOGOUT_EVENT, this.config.onLogout);
299
+ }
300
+
301
+ if (this.config.reloadOnUserChange) {
302
+ this.addListener(USER_CHANGED_EVENT, () => this._reloadCurrentPage());
303
+ }
304
+
305
+ this.addListener(LOGOUT_POSTPONED_EVENT, () => this._setPostponed(true));
306
+ this.addListener(USER_CHANGE_POSTPONED_EVENT, () => this._setPostponed(true));
307
+ this.addListener(USER_CHANGED_EVENT, () => this._setPostponed(false));
308
+ this.addListener(USER_CHANGED_EVENT, (user: AuthUser | null | undefined | void) => {
309
+ if (user) {
310
+ this._updateDomainUser(user.id);
311
+ }
312
+ });
313
+ if (this.config.cacheCurrentUser) {
314
+ this.addListener(LOGOUT_EVENT, () => this._storage?.wipeCachedCurrentUser());
315
+ this.addListener(USER_CHANGED_EVENT, () => this._storage?.onUserChanged());
316
+ }
317
+
318
+ this._createInitDeferred();
319
+
320
+ this.setUpPreconnect(config.serverUri);
321
+ }
322
+
323
+ private _setPostponed(postponed = false) {
324
+ this._postponed = postponed;
325
+ }
326
+
327
+ private _updateDomainUser(userID: number | string | null | undefined) {
328
+ this._domainStorage.sendMessage(DOMAIN_USER_CHANGED_EVENT, {
329
+ userID,
330
+ serviceID: this.config.clientId
331
+ });
332
+ }
333
+
334
+ addListener<E extends keyof AuthPayloadMap>(event: E, handler: Handler<AuthPayloadMap, E>) {
335
+ this.listeners.add(event, handler);
336
+ }
337
+
338
+ removeListener<E extends keyof AuthPayloadMap>(event: E, handler: Handler<AuthPayloadMap, E>) {
339
+ this.listeners.remove(event, handler);
340
+ }
341
+
342
+ setAuthDialogService(authDialogService: typeof AuthDialogService) {
343
+ this._authDialogService = authDialogService;
344
+ }
345
+
346
+ setCurrentService(service: AuthService) {
347
+ this._service = service;
348
+ }
349
+
350
+ private _createInitDeferred() {
351
+ const deferred: Deferred<string | void> = {};
352
+ deferred.promise = new Promise((resolve, reject) => {
353
+ deferred.resolve = resolve;
354
+ deferred.reject = reject;
355
+ });
356
+ this._initDeferred = deferred;
357
+ }
358
+
359
+ /**
360
+ * @return {Promise.<string>} absolute URL promise that is resolved to a URL
361
+ * that should be restored after returning back from auth server.
362
+ */
363
+ async init(): Promise<string | null | undefined> {
364
+ this._storage?.onTokenChange(async token => {
365
+ const isGuest = this.user ? this.user.guest : false;
366
+
367
+ if (isGuest && !token) {
368
+ return;
369
+ }
370
+
371
+ if (!token) {
372
+ this.logout();
373
+ } else {
374
+ try {
375
+ await this._detectUserChange(token.accessToken);
376
+ } catch (error) {
377
+ if (!(error instanceof Error)) {
378
+ throw error;
379
+ }
380
+ if (this._canShowDialogs()) {
381
+ this._showAuthDialog({nonInteractive: true, error});
382
+ }
383
+ }
384
+ }
385
+ });
386
+
387
+ this._domainStorage.onMessage(DOMAIN_USER_CHANGED_EVENT, (message: UserChange | null) => {
388
+ const {userID, serviceID} = message || {};
389
+ if (serviceID === this.config.clientId) {
390
+ return;
391
+ }
392
+ if (this.user && userID === this.user.id) {
393
+ return;
394
+ }
395
+ this.forceTokenUpdate();
396
+ });
397
+
398
+ let state: AuthState | undefined;
399
+
400
+ try {
401
+ // Look for token or error in hash
402
+ state = await this._checkForAuthResponse();
403
+ } catch (error) {
404
+ return error instanceof Error ? this.handleInitError(error) : undefined;
405
+ }
406
+
407
+ // Return endless promise in the background to avoid service start
408
+ if (state && state.nonRedirect) {
409
+ return new Promise(noop);
410
+ }
411
+
412
+ try {
413
+ // Check if there is a valid token
414
+ await this._tokenValidator?.validateToken();
415
+
416
+
417
+ // Checking if there is a message left by another app on this domain
418
+ const message = await this._domainStorage._messagesStorage.get<UserChange>(`domain-message-${DOMAIN_USER_CHANGED_EVENT}`);
419
+ if (message) {
420
+ const {userID, serviceID} = message;
421
+ if (serviceID !== this.config.clientId && (!userID || this.user?.id !== userID)) {
422
+ this.forceTokenUpdate();
423
+ }
424
+ }
425
+
426
+ // Access token appears to be valid.
427
+ // We may resolve restoreLocation URL now
428
+ if (!state) {
429
+ // Check if we have requested to restore state anyway
430
+ state = await this._checkForStateRestoration();
431
+ }
432
+ this._initDeferred?.resolve?.(state && state.restoreLocation);
433
+ return state?.restoreLocation;
434
+ } catch (error) {
435
+ if (Auth.storageIsUnavailable) {
436
+ this._initDeferred?.resolve?.(); // No way to handle if cookies are disabled
437
+ await this.requestUser(); // Someone may expect user to be loaded as a part of token validation
438
+ return null;
439
+ }
440
+ return error instanceof Error ? this.handleInitValidationError(error) : undefined;
441
+ }
442
+ }
443
+
444
+ async sendRedirect(error: Error): Promise<undefined> {
445
+ const authRequest = await this._requestBuilder?.prepareAuthRequest();
446
+ if (authRequest != null) {
447
+ this._redirectCurrentPage(authRequest.url);
448
+ }
449
+
450
+ // HUB-10867 Since we already redirecting the page, there is no actual need to throw an error
451
+ // and scare user with flashing error
452
+ // But let's keep it just in case redirect was not successful
453
+ await new Promise(resolve => setTimeout(resolve, this.config.waitForRedirectTimeout));
454
+
455
+ throw error;
456
+ }
457
+
458
+ async handleInitError(error: Error | AuthError): Promise<undefined> {
459
+ if ('stateId' in error && error.stateId) {
460
+ try {
461
+ const state = await this._storage?.getState(error.stateId);
462
+
463
+ if (state && state.nonRedirect) {
464
+ state.error = error;
465
+ this._storage?.saveState(error.stateId, state);
466
+
467
+ // Return endless promise in the background to avoid service start
468
+ return new Promise(noop);
469
+ }
470
+ } catch (e) {
471
+ // Throw the original error instead below
472
+ }
473
+ }
474
+
475
+ throw error;
476
+ }
477
+
478
+ async handleInitValidationError(error: Error | TokenValidationError): Promise<undefined> {
479
+ // Redirect flow
480
+ if ('authRedirect' in error && error.authRedirect && this.config.redirect) {
481
+ return this.sendRedirect(error);
482
+ }
483
+
484
+ // Background flow
485
+ if ('authRedirect' in error && error.authRedirect && !this.config.redirect) {
486
+ try {
487
+ await this._backgroundFlow?.authorize();
488
+ await this._tokenValidator?.validateToken();
489
+ this._initDeferred?.resolve?.();
490
+ return undefined;
491
+ } catch (validationError) {
492
+ // Fallback to redirect flow
493
+ return validationError instanceof Error ? this.sendRedirect(validationError) : undefined;
494
+ }
495
+ }
496
+
497
+ this._initDeferred?.reject?.(error);
498
+ throw error;
499
+ }
500
+
501
+ /**
502
+ * Get token from local storage or request it if necessary.
503
+ * Can redirect to login page.
504
+ * @return {Promise.<string>}
505
+ */
506
+ async requestToken(): Promise<string | null> {
507
+ if (this._postponed) {
508
+ throw new Error('You should log in to be able to make requests');
509
+ }
510
+
511
+ try {
512
+ await this._initDeferred?.promise;
513
+
514
+ if (Auth.storageIsUnavailable) {
515
+ return null; // Forever guest if storage is unavailable
516
+ }
517
+ return await this._tokenValidator?.validateTokenLocally() ?? null;
518
+ } catch (e) {
519
+ return this.forceTokenUpdate();
520
+ }
521
+ }
522
+
523
+ /**
524
+ * Get new token in the background or redirect to the login page.
525
+ * @return {Promise.<string>}
526
+ */
527
+ async forceTokenUpdate(): Promise<string | null> {
528
+ try {
529
+ if (!this._backendCheckPromise) {
530
+ this._backendCheckPromise = this._checkBackendsStatusesIfEnabled();
531
+ }
532
+ await this._backendCheckPromise;
533
+ } catch (e) {
534
+ throw new Error('Cannot refresh token: backend is not available. Postponed by user.');
535
+ } finally {
536
+ this._backendCheckPromise = null;
537
+ }
538
+
539
+ try {
540
+ return await this._backgroundFlow?.authorize() ?? null;
541
+ } catch (error) {
542
+ if (error instanceof Error) {
543
+ if (this._canShowDialogs()) {
544
+ this._showAuthDialog({nonInteractive: true, error});
545
+ return null;
546
+ } else {
547
+ const authRequest = await this._requestBuilder?.prepareAuthRequest();
548
+ if (authRequest != null) {
549
+ this._redirectCurrentPage(authRequest.url);
550
+ }
551
+ }
552
+
553
+ throw new TokenValidator.TokenValidationError(error.message);
554
+ } else {
555
+ return null;
556
+ }
557
+ }
558
+ }
559
+
560
+ async loadCurrentService() {
561
+ if (this._service.serviceName) {
562
+ return;
563
+ }
564
+ try {
565
+ const {serviceName, iconUrl: serviceImage} = await this.http.get(`oauth2/interactive/login/settings?client_id=${this.config.clientId}`) || {};
566
+ this.setCurrentService({serviceImage, serviceName});
567
+ } catch (e) {
568
+ // noop
569
+ }
570
+ }
571
+
572
+ getAPIPath() {
573
+ return this.config.serverUri + Auth.API_PATH;
574
+ }
575
+
576
+ /**
577
+ * @return {Promise.<object>}
578
+ */
579
+ getUser(accessToken?: string | null | undefined) {
580
+ if (this.config.cacheCurrentUser) {
581
+ return this._storage?.getCachedUser(
582
+ () => this.http.authorizedFetch(
583
+ Auth.API_PROFILE_PATH,
584
+ accessToken,
585
+ this.config.userParams
586
+ )
587
+ );
588
+ } else {
589
+ return this.http.authorizedFetch(Auth.API_PROFILE_PATH, accessToken, this.config.userParams);
590
+ }
591
+ }
592
+
593
+ /**
594
+ * @return {Promise.<object>}
595
+ */
596
+ async requestUser() {
597
+ if (this.user) {
598
+ return this.user;
599
+ }
600
+
601
+ const accessToken = await this.requestToken();
602
+
603
+ // If user was fetched during token request
604
+ if (this.user) {
605
+ return this.user;
606
+ }
607
+
608
+ const user = await this.getUser(accessToken);
609
+ this.user = user;
610
+
611
+ return user;
612
+ }
613
+
614
+ async updateUser() {
615
+ this._setPostponed(false);
616
+ const accessToken = await this.requestToken();
617
+ this._storage?.wipeCachedCurrentUser();
618
+ const user = await this.getUser(accessToken);
619
+ this.user = user;
620
+ this.listeners.trigger(USER_CHANGED_EVENT, user);
621
+ }
622
+
623
+ async _detectUserChange(accessToken: string) {
624
+ const windowWasOpen = this._isLoginWindowOpen;
625
+
626
+ const user = await this.getUser(accessToken);
627
+ const onApply = () => {
628
+ this.user = user;
629
+ this.listeners.trigger(USER_CHANGED_EVENT, user);
630
+ };
631
+
632
+ if (user && this.user && this.user.id !== user.id) {
633
+ if (!this._canShowDialogs() || this.user.guest || windowWasOpen) {
634
+ onApply();
635
+ return;
636
+ }
637
+ if (user.guest) {
638
+ this._showAuthDialog({nonInteractive: true});
639
+ return;
640
+ }
641
+
642
+ await this._showUserChangedDialog({
643
+ newUser: user,
644
+ onApply,
645
+ onPostpone: () => {
646
+ this.listeners.trigger(USER_CHANGE_POSTPONED_EVENT);
647
+ this.config.onPostponeChangedUser(this.user, user);
648
+ }
649
+ });
650
+
651
+ }
652
+ }
653
+
654
+ _beforeLogout(params?: AuthDialogParams) {
655
+ if (this._canShowDialogs()) {
656
+ this._showAuthDialog(params);
657
+ return;
658
+ }
659
+
660
+ this.logout();
661
+ }
662
+
663
+ _showAuthDialog({nonInteractive, error, canCancel}: AuthDialogParams = {}) {
664
+ const {embeddedLogin, onPostponeLogout, translations} = this.config;
665
+ const cancelable = this.user?.guest || canCancel;
666
+
667
+ this._createInitDeferred();
668
+
669
+ const closeDialog = () => {
670
+ /* eslint-disable @typescript-eslint/no-use-before-define */
671
+ stopTokenListening?.();
672
+ stopMessageListening?.();
673
+ hide?.();
674
+ /* eslint-enable @typescript-eslint/no-use-before-define */
675
+ };
676
+
677
+ const onConfirm = () => {
678
+ if (!embeddedLogin) {
679
+ closeDialog();
680
+ this.logout();
681
+ return;
682
+ }
683
+ this._runEmbeddedLogin();
684
+ };
685
+
686
+ const onCancel = () => {
687
+ this._embeddedFlow?.stop();
688
+ this._storage?.sendMessage(Auth.CLOSE_WINDOW_MESSAGE, Date.now());
689
+ closeDialog();
690
+ if (!cancelable) {
691
+ this._initDeferred?.resolve?.();
692
+ this.listeners.trigger(LOGOUT_POSTPONED_EVENT);
693
+ onPostponeLogout();
694
+ return;
695
+ }
696
+
697
+ if (this.user?.guest && nonInteractive) {
698
+ this.forceTokenUpdate();
699
+ } else {
700
+ this._initDeferred?.resolve?.();
701
+ }
702
+ };
703
+
704
+ const hide = this._authDialogService?.({
705
+ ...this._service,
706
+ loginCaption: translations.login,
707
+ loginToCaption: translations.loginTo,
708
+ confirmLabel: translations.login,
709
+ cancelLabel: cancelable ? translations.cancel : translations.postpone,
710
+ errorMessage: this._extractErrorMessage(error, true),
711
+ onConfirm,
712
+ onCancel
713
+ });
714
+
715
+ const stopTokenListening = this._storage?.onTokenChange(token => {
716
+ if (token) {
717
+ closeDialog();
718
+ this._initDeferred?.resolve?.();
719
+ }
720
+ });
721
+
722
+ const stopMessageListening = this._storage?.onMessage(
723
+ Auth.CLOSE_WINDOW_MESSAGE,
724
+ () => this._embeddedFlow?.stop()
725
+ );
726
+ }
727
+
728
+ _showUserChangedDialog({newUser, onApply, onPostpone}: UserChangedDialogParams) {
729
+ const {translations} = this.config;
730
+
731
+ this._createInitDeferred();
732
+
733
+ const done = () => {
734
+ this._initDeferred?.resolve?.();
735
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
736
+ hide?.();
737
+ };
738
+
739
+ const hide = this._authDialogService?.({
740
+ ...this._service,
741
+ title: translations.youHaveLoggedInAs.replace('%userName%', newUser.name ?? ''),
742
+ loginCaption: translations.login,
743
+ loginToCaption: translations.loginTo,
744
+ confirmLabel: translations.applyChange,
745
+ cancelLabel: translations.postpone,
746
+ onConfirm: () => {
747
+ done();
748
+ onApply();
749
+ },
750
+ onCancel: () => {
751
+ done();
752
+ onPostpone();
753
+ }
754
+ });
755
+ }
756
+
757
+ private _extractErrorMessage(error: Error | AuthError | undefined, logError = false) {
758
+ if (!error) {
759
+ return null;
760
+ }
761
+ if (logError) {
762
+ // eslint-disable-next-line no-console
763
+ console.error('RingUI Auth error', error);
764
+ }
765
+
766
+ try {
767
+ // We've got some error from this list
768
+ // https://www.jetbrains.com/help/youtrack/devportal/OAuth-2.0-Errors.html
769
+ if ('code' in error && error.code && typeof error.code === 'object' && 'code' in error.code && typeof error.code.code === 'string') {
770
+ const readableCode = error.code.code.split('_').join(' ');
771
+ return `Authorization error: ${readableCode}`;
772
+ }
773
+ } catch {
774
+ // noop
775
+ }
776
+
777
+ return error.toString ? error.toString() : null;
778
+ }
779
+
780
+ private _showBackendDownDialog(backendError: Error) {
781
+ const {onBackendDown, translations} = this.config;
782
+ const REPEAT_TIMEOUT = 5000;
783
+ let timerId: number | undefined;
784
+
785
+ return new Promise<void>((resolve, reject) => {
786
+ const done = () => {
787
+ /* eslint-disable @typescript-eslint/no-use-before-define */
788
+ hide();
789
+ window.removeEventListener('online', onCheckAgain);
790
+ stopListeningCloseMessage?.();
791
+ /* eslint-enable @typescript-eslint/no-use-before-define */
792
+ this._storage?.sendMessage(Auth.CLOSE_BACKEND_DOWN_MESSAGE, Date.now());
793
+ clearTimeout(timerId);
794
+ };
795
+
796
+ const stopListeningCloseMessage = this._storage?.onMessage(
797
+ Auth.CLOSE_BACKEND_DOWN_MESSAGE,
798
+ () => {
799
+ stopListeningCloseMessage?.();
800
+ done();
801
+ resolve();
802
+ }
803
+ );
804
+
805
+ const onCheckAgain = async () => {
806
+ await this._checkBackendsAreUp();
807
+ done();
808
+ resolve();
809
+ };
810
+
811
+ const onPostpone = () => {
812
+ done();
813
+ reject(new Error('Auth(@jetbrains/ring-ui): postponed by user'));
814
+ };
815
+
816
+ const hide = onBackendDown({onCheckAgain, onPostpone, backendError, translations});
817
+
818
+ window.addEventListener('online', onCheckAgain);
819
+
820
+ function networkWatchdog() {
821
+ if (navigator && navigator.onLine) {
822
+ onCheckAgain();
823
+ }
824
+ timerId = window.setTimeout(networkWatchdog, REPEAT_TIMEOUT);
825
+ }
826
+
827
+ timerId = window.setTimeout(networkWatchdog, REPEAT_TIMEOUT);
828
+ });
829
+ }
830
+
831
+ /**
832
+ * Wipe accessToken and redirect to auth page with required authorization
833
+ */
834
+ async logout(extraParams?: Record<string, unknown>) {
835
+ const requestParams = {
836
+ // eslint-disable-next-line camelcase
837
+ request_credentials: 'required',
838
+ ...extraParams
839
+ };
840
+
841
+ await this._checkBackendsStatusesIfEnabled();
842
+ await this.listeners.trigger('logout');
843
+ this._updateDomainUser(null);
844
+ await this._storage?.wipeToken();
845
+
846
+ const authRequest = await this._requestBuilder?.prepareAuthRequest(requestParams);
847
+ if (authRequest != null) {
848
+ this._redirectCurrentPage(authRequest.url);
849
+ }
850
+ }
851
+
852
+ private async _runEmbeddedLogin() {
853
+ this._storage?.sendMessage(Auth.CLOSE_WINDOW_MESSAGE, Date.now());
854
+ try {
855
+ this._isLoginWindowOpen = true;
856
+ return await this._embeddedFlow?.authorize();
857
+ } catch (e) {
858
+ throw e;
859
+ } finally {
860
+ this._isLoginWindowOpen = false;
861
+ }
862
+ }
863
+
864
+ /**
865
+ * Wipe accessToken and redirect to auth page to obtain authorization data
866
+ * if user is logged in or log her in otherwise
867
+ */
868
+ async login() {
869
+ if (this.config.embeddedLogin) {
870
+ await this._runEmbeddedLogin();
871
+ return;
872
+ }
873
+
874
+ await this._checkBackendsStatusesIfEnabled();
875
+ try {
876
+ const accessToken = await this._backgroundFlow?.authorize();
877
+ const user = await this.getUser(accessToken);
878
+
879
+ if (user.guest) {
880
+ this._beforeLogout();
881
+ } else {
882
+ this.user = user;
883
+ this.listeners.trigger(USER_CHANGED_EVENT, user);
884
+ }
885
+ } catch (e) {
886
+ this._beforeLogout();
887
+ }
888
+ }
889
+
890
+ async switchUser() {
891
+ if (!this.config.embeddedLogin) {
892
+ throw new Error('Auth: switchUser only supported for "embeddedLogin" mode');
893
+ }
894
+ await this._runEmbeddedLogin();
895
+ }
896
+
897
+ /**
898
+ * Check if the hash contains an access token.
899
+ * If it does, extract the state, compare with
900
+ * config, and store the auth response for later use.
901
+ *
902
+ * @return {Promise} promise that is resolved to restoreLocation URL, or rejected
903
+ * @private
904
+ */
905
+ private async _checkForAuthResponse() {
906
+ // getAuthResponseURL may throw an exception
907
+ const authResponse = this._responseParser.getAuthResponseFromURL();
908
+ const {scope: defaultScope, defaultExpiresIn, cleanHash} = this.config;
909
+
910
+ if (authResponse && cleanHash) {
911
+ this.setHash('');
912
+ }
913
+
914
+ if (!authResponse) {
915
+ return undefined;
916
+ }
917
+
918
+ const {state: stateId, scope, expiresIn, accessToken} = authResponse;
919
+ const newState: AuthState =
920
+ await (stateId && this._storage?.getState(stateId)) || {};
921
+
922
+ const scopes = scope ? scope.split(' ') : newState.scopes || defaultScope || [];
923
+ const effectiveExpiresIn = expiresIn ? parseInt(expiresIn, 10) : defaultExpiresIn;
924
+ const expires = TokenValidator._epoch() + effectiveExpiresIn;
925
+
926
+ if (accessToken != null) {
927
+ await this._storage?.saveToken({accessToken, scopes, expires, lifeTime: effectiveExpiresIn});
928
+ }
929
+
930
+ return newState;
931
+ }
932
+
933
+ private async _checkForStateRestoration() {
934
+ const authResponse = this._responseParser._authResponse;
935
+ if (authResponse && this.config.cleanHash) {
936
+ this.setHash('');
937
+ }
938
+ const stateId = authResponse?.restoreAuthState;
939
+ return await (stateId && this._storage?.getState(stateId)) || {};
940
+ }
941
+
942
+ _checkBackendsAreUp() {
943
+ const {backendCheckTimeout} = this.config;
944
+ return Promise.all([
945
+ promiseWithTimeout(
946
+ this.http.fetch('settings/public?fields=id'),
947
+ backendCheckTimeout,
948
+ {error: new Error('The authorization server is taking too long to respond. Please try again later.')}
949
+ ),
950
+ this.config.checkBackendIsUp()
951
+ ]).catch(err => {
952
+ if (err instanceof TypeError) {
953
+ throw new TypeError('Could not connect to the server due to network error. Please check your connection and try again.');
954
+ }
955
+ throw err;
956
+ });
957
+ }
958
+
959
+ private async _checkBackendsStatusesIfEnabled() {
960
+ if (!this.config.enableBackendStatusCheck) {
961
+ return;
962
+ }
963
+ try {
964
+ await this._checkBackendsAreUp();
965
+ } catch (backendDownErr) {
966
+ if (backendDownErr instanceof Error) {
967
+ await this._showBackendDownDialog(backendDownErr);
968
+ }
969
+ }
970
+ }
971
+
972
+ /**
973
+ * Adds preconnect tag to help browser to establish connection to URL.
974
+ * See https://w3c.github.io/resource-hints/
975
+ * @param url Url to preconnect to.
976
+ */
977
+ setUpPreconnect(url: string) {
978
+ const linkNode = document.createElement('link');
979
+ linkNode.rel = 'preconnect';
980
+ linkNode.href = url;
981
+ linkNode.pr = '1.0';
982
+ linkNode.crossOrigin = 'use-credentials';
983
+ document.head.appendChild(linkNode);
984
+ }
985
+
986
+ /**
987
+ * Redirects current page to the given URL
988
+ * @param {string} url
989
+ * @private
990
+ */
991
+ _redirectCurrentPage(url: string) {
992
+ if (process.env.NODE_ENV !== 'test') {
993
+ window.location.href = fixUrl(url);
994
+ }
995
+ }
996
+
997
+ /**
998
+ * Reloads current page
999
+ */
1000
+ private _reloadCurrentPage() {
1001
+ this._redirectCurrentPage(window.location.href);
1002
+ }
1003
+
1004
+ _canShowDialogs() {
1005
+ return this.config.embeddedLogin && this._authDialogService;
1006
+ }
1007
+
1008
+ /**
1009
+ * Sets the location hash
1010
+ * @param {string} hash
1011
+ */
1012
+ setHash(hash: string) {
1013
+ if (history.replaceState) {
1014
+ // NB! History.replaceState is used here, because Firefox saves
1015
+ // a record in history.
1016
+ // NB! URL to redirect is formed manually because baseURI could be messed up,
1017
+ // in which case it's not obvious where redirect will lead.
1018
+ const cleanedUrl = [
1019
+ window.location.pathname,
1020
+ window.location.search
1021
+ ].join('');
1022
+
1023
+ const hashIfExist = hash ? `#${hash}` : '';
1024
+
1025
+ history.replaceState(undefined, '', `${cleanedUrl}${hashIfExist}`);
1026
+ } else {
1027
+ window.location.hash = hash;
1028
+ }
1029
+ }
1030
+ }