studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.1

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 (258) hide show
  1. package/lib/components/ActionList.js +164 -37
  2. package/lib/components/AlertDialog.js +128 -12
  3. package/lib/components/AlertWithIcon.js +88 -29
  4. package/lib/components/ConnectedModal.js +35 -12
  5. package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
  6. package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
  7. package/lib/components/Dropdowns/UserDropdown.js +105 -24
  8. package/lib/components/Dropdowns/index.js +4 -10
  9. package/lib/components/EntityOwnerList.js +47 -21
  10. package/lib/components/Error.js +101 -12
  11. package/lib/components/ErrorBoundary.js +127 -38
  12. package/lib/components/ErrorMessage.js +39 -12
  13. package/lib/components/Forms/DateField.js +56 -45
  14. package/lib/components/Forms/TimeField.js +76 -45
  15. package/lib/components/Forms/index.js +3 -5
  16. package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
  17. package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
  18. package/lib/components/Groups/ExternalGroups/Table.js +176 -48
  19. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
  20. package/lib/components/Groups/RosterSyncInfo.js +142 -23
  21. package/lib/components/HOC/AccessibleAppComponent.js +88 -72
  22. package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
  23. package/lib/components/HOC/AsyncComponent.js +49 -41
  24. package/lib/components/HOC/AuthenticatedComponent.js +55 -44
  25. package/lib/components/HOC/CollectionComponent.js +154 -104
  26. package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
  27. package/lib/components/HOC/CollectionItemComponent.js +152 -100
  28. package/lib/components/HOC/ConnectedModalComponent.js +87 -69
  29. package/lib/components/HOC/DataDependentComponent.js +26 -27
  30. package/lib/components/HOC/EntityComponent.js +57 -53
  31. package/lib/components/HOC/FullscreenModalComponent.js +139 -108
  32. package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
  33. package/lib/components/HOC/GuidComponent.js +20 -20
  34. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
  35. package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
  36. package/lib/components/HOC/SearchPersistorComponent.js +237 -173
  37. package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
  38. package/lib/components/HOC/UserComponent.js +6 -8
  39. package/lib/components/Icons/IconAlphaList.js +28 -8
  40. package/lib/components/Icons/IconExternalUser.js +28 -8
  41. package/lib/components/Icons/IconImpersonation.js +28 -8
  42. package/lib/components/Icons/IconStopImpersonating.js +28 -8
  43. package/lib/components/Icons/IconTable.js +29 -9
  44. package/lib/components/Icons/IconTableDeleteCol.js +28 -8
  45. package/lib/components/Icons/IconTableDeleteRow.js +28 -8
  46. package/lib/components/Icons/IconTableInsertCol.js +28 -8
  47. package/lib/components/Icons/IconTableInsertRow.js +28 -8
  48. package/lib/components/Impersonation/Button.js +71 -16
  49. package/lib/components/Impersonation/Link.js +72 -16
  50. package/lib/components/Impersonation/UserDetail.js +60 -11
  51. package/lib/components/Loading.js +23 -8
  52. package/lib/components/LockDownBrowser/Check.js +188 -51
  53. package/lib/components/LockDownBrowser/ExitButton.js +22 -13
  54. package/lib/components/LockDownBrowser/Launch.js +64 -64
  55. package/lib/components/Lti/Confirm.js +147 -14
  56. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
  57. package/lib/components/Lti/Launch.js +99 -25
  58. package/lib/components/Lti/LaunchGroup.js +81 -16
  59. package/lib/components/ManageTable.js +304 -90
  60. package/lib/components/ManageTableNoDataComponent.js +38 -7
  61. package/lib/components/NewVersionAlert.js +76 -49
  62. package/lib/components/NotFound.js +81 -11
  63. package/lib/components/Notifications.js +179 -129
  64. package/lib/components/PaginationNextButton.js +28 -9
  65. package/lib/components/PaginationPreviousButton.js +28 -9
  66. package/lib/components/Quill/CustomToolbar.js +427 -222
  67. package/lib/components/Quill/Formats/Image.js +67 -67
  68. package/lib/components/Quill/Formats/List.js +38 -47
  69. package/lib/components/Quill/Formats/Video.js +23 -26
  70. package/lib/components/Quill/ImageDropModule.js +136 -114
  71. package/lib/components/Quill/ImageWarning.js +41 -12
  72. package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
  73. package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
  74. package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
  75. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
  76. package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
  77. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
  78. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
  79. package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
  80. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
  81. package/lib/components/Quill/TableModule/constants.js +40 -42
  82. package/lib/components/Quill/TableModule/index.js +357 -305
  83. package/lib/components/Quill/TableModule/utils.js +39 -48
  84. package/lib/components/Quill/accessibilityFix.js +219 -223
  85. package/lib/components/Quill/index.js +30 -33
  86. package/lib/components/RefreshIndicator/Bordered.js +44 -10
  87. package/lib/components/RefreshIndicator/Inline.js +43 -12
  88. package/lib/components/RefreshIndicator/index.js +257 -62
  89. package/lib/components/SearchControls.js +211 -14
  90. package/lib/components/SentryRoute.js +5 -7
  91. package/lib/components/Tables/RoleFilter.js +66 -38
  92. package/lib/components/Tables/TextFilter.js +58 -18
  93. package/lib/components/UserRoles/Add.js +193 -99
  94. package/lib/components/UserRoles/Context.js +3 -6
  95. package/lib/components/UserRoles/RoleCell.js +176 -75
  96. package/lib/components/UserRoles/Select.js +151 -20
  97. package/lib/components/UserRoles/Table.js +215 -82
  98. package/lib/components/UserRoles/index.js +526 -386
  99. package/lib/config/eslint/index.js +26 -29
  100. package/lib/config/eslint/lib/order.js +21 -28
  101. package/lib/config/eslint/lib/prettier.js +15 -19
  102. package/lib/config/eslint/lib/typescript.js +87 -113
  103. package/lib/config/eslint/react.js +18 -15
  104. package/lib/constants/baseActivity.js +26 -28
  105. package/lib/constants/baseRole.js +10 -12
  106. package/lib/constants/configuration.js +43 -55
  107. package/lib/constants/externalProviderType.js +6 -8
  108. package/lib/constants/fetchErrorData.js +10 -12
  109. package/lib/constants/index.js +13 -15
  110. package/lib/constants/lockDownBrowser.js +23 -25
  111. package/lib/constants/mockData.js +370 -300
  112. package/lib/constants/modelStatus.js +11 -13
  113. package/lib/constants/notificationType.js +8 -10
  114. package/lib/constants/operatingSystem.js +8 -10
  115. package/lib/constants/shard.js +7 -9
  116. package/lib/constants/table.js +18 -22
  117. package/lib/constants/tier.js +8 -10
  118. package/lib/constants/userRole.js +11 -8
  119. package/lib/endpointMappings.js +191 -182
  120. package/lib/hooks/useCollection.js +79 -65
  121. package/lib/hooks/useCollectionConfiguration.js +220 -80
  122. package/lib/hooks/useCollectionItem.js +151 -57
  123. package/lib/hooks/useGuid.js +16 -9
  124. package/lib/hooks/usePrevious.js +14 -13
  125. package/lib/index.js +11 -26
  126. package/lib/redux/actionCreator.js +44 -35
  127. package/lib/redux/actions/AuthAction.js +45 -32
  128. package/lib/redux/actions/ModalAction.js +6 -8
  129. package/lib/redux/actions/ModelAction.js +95 -43
  130. package/lib/redux/actions/NotificationAction.js +6 -8
  131. package/lib/redux/actions/SearchAction.js +5 -7
  132. package/lib/redux/actions/index.js +6 -8
  133. package/lib/redux/configureReducers.js +48 -46
  134. package/lib/redux/configureStore.js +77 -91
  135. package/lib/redux/helpers.js +2 -5
  136. package/lib/redux/reducers/authReducer.js +44 -43
  137. package/lib/redux/reducers/index.js +7 -14
  138. package/lib/redux/reducers/modalsReducer.js +43 -31
  139. package/lib/redux/reducers/modelsReducer.js +131 -137
  140. package/lib/redux/reducers/notificationsReducer.js +20 -20
  141. package/lib/redux/reducers/searchReducer.js +13 -13
  142. package/lib/redux/sagas/appInsightsSaga.js +19 -21
  143. package/lib/redux/sagas/authSaga.js +248 -234
  144. package/lib/redux/sagas/caliperSaga.js +142 -131
  145. package/lib/redux/sagas/clockOffsetSaga.js +29 -32
  146. package/lib/redux/sagas/configurationSaga.js +8 -10
  147. package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
  148. package/lib/redux/sagas/errorSaga.js +23 -24
  149. package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
  150. package/lib/redux/sagas/identityProviderSaga.js +19 -21
  151. package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
  152. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
  153. package/lib/redux/sagas/modelFetchSaga.js +302 -286
  154. package/lib/redux/sagas/noStoreSaga.js +60 -61
  155. package/lib/redux/sagas/postLoginDataSaga.js +37 -32
  156. package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
  157. package/lib/redux/sagas/rootSaga.js +77 -60
  158. package/lib/redux/sagas/sentrySaga.js +25 -28
  159. package/lib/redux/sagas/userIdSaga.js +13 -15
  160. package/lib/services/codeProviderService.js +21 -21
  161. package/lib/services/dateService.js +6 -8
  162. package/lib/services/documentService.js +10 -11
  163. package/lib/services/fetchService.js +103 -95
  164. package/lib/services/persistenceService.js +27 -30
  165. package/lib/services/ticketProviderService.js +25 -25
  166. package/lib/services/tokenPersistenceService.js +8 -10
  167. package/lib/services/windowService.js +14 -16
  168. package/lib/startup.js +110 -101
  169. package/lib/types/AppConfiguration.js +2 -2
  170. package/lib/types/Artifact.js +7 -9
  171. package/lib/types/BaseReduxState.js +2 -2
  172. package/lib/types/Client.js +2 -2
  173. package/lib/types/Collection.js +2 -2
  174. package/lib/types/Configuration.js +2 -2
  175. package/lib/types/DeepLinkingResponseRequest.js +2 -2
  176. package/lib/types/DeletableModel.js +2 -2
  177. package/lib/types/Event.js +2 -2
  178. package/lib/types/ExternalGroup.js +2 -2
  179. package/lib/types/ExternalProvider.js +2 -2
  180. package/lib/types/ExternalTerm.js +2 -2
  181. package/lib/types/Group.js +2 -2
  182. package/lib/types/IdentityProvider.js +2 -2
  183. package/lib/types/LtiLaunch.js +2 -2
  184. package/lib/types/NameOnlyEntity.js +2 -2
  185. package/lib/types/Notification.js +2 -2
  186. package/lib/types/OptionalRecord.js +2 -2
  187. package/lib/types/OwnerSchedule.js +2 -2
  188. package/lib/types/PropertyOfType.js +2 -2
  189. package/lib/types/Quill.js +2 -2
  190. package/lib/types/RoleDescription.js +2 -2
  191. package/lib/types/Search.js +2 -2
  192. package/lib/types/SimpleLocation.js +2 -2
  193. package/lib/types/UniTime.js +2 -2
  194. package/lib/types/User.js +2 -2
  195. package/lib/types/UserRole.js +2 -2
  196. package/lib/types/auth/AuthState.js +2 -2
  197. package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
  198. package/lib/types/auth/ClientCredentials.js +2 -2
  199. package/lib/types/auth/CodeProviderService.js +2 -2
  200. package/lib/types/auth/LocalLoginRequestBody.js +2 -2
  201. package/lib/types/auth/TicketProviderService.js +2 -2
  202. package/lib/types/auth/TokenPersistenceService.js +2 -2
  203. package/lib/types/auth/index.js +8 -10
  204. package/lib/types/externals.d.js +2 -0
  205. package/lib/types/index.js +29 -31
  206. package/lib/types/net/EndpointConfig.js +2 -2
  207. package/lib/types/net/EndpointMapping.js +2 -2
  208. package/lib/types/net/EndpointMappings.js +2 -2
  209. package/lib/types/net/ErrorHandler.js +2 -2
  210. package/lib/types/net/FetchConfig.js +2 -2
  211. package/lib/types/net/FetchErrorData.js +6 -8
  212. package/lib/types/net/FetchResult.js +2 -2
  213. package/lib/types/net/HTTPMethod.js +2 -2
  214. package/lib/types/net/HTTPStatusCode.js +12 -14
  215. package/lib/types/net/Metadata.js +2 -2
  216. package/lib/types/net/Model.js +2 -2
  217. package/lib/types/net/ModelCollection.js +2 -2
  218. package/lib/types/net/ModelsState.js +2 -2
  219. package/lib/types/net/OAuthToken.js +2 -2
  220. package/lib/types/net/OAuthTokenOrNull.js +2 -2
  221. package/lib/types/net/TokenAccessFunction.js +2 -2
  222. package/lib/types/net/index.js +17 -19
  223. package/lib/utils/baseActivity.js +83 -85
  224. package/lib/utils/baseRole.js +32 -36
  225. package/lib/utils/collection.js +403 -297
  226. package/lib/utils/cookies.js +19 -23
  227. package/lib/utils/date.js +188 -205
  228. package/lib/utils/dom.js +130 -131
  229. package/lib/utils/domainIdentifier.js +4 -8
  230. package/lib/utils/entityUserRole.js +2 -5
  231. package/lib/utils/error.js +14 -19
  232. package/lib/utils/events.js +32 -31
  233. package/lib/utils/externalGroup.js +20 -25
  234. package/lib/utils/externalProviders.js +4 -7
  235. package/lib/utils/externalTerms.js +6 -6
  236. package/lib/utils/fetch.js +168 -176
  237. package/lib/utils/group.js +14 -11
  238. package/lib/utils/groupDates.js +38 -46
  239. package/lib/utils/groupRoles.js +23 -32
  240. package/lib/utils/lockDownBrowser.js +12 -15
  241. package/lib/utils/logger.js +23 -28
  242. package/lib/utils/lti.js +4 -7
  243. package/lib/utils/model.js +28 -43
  244. package/lib/utils/number.js +9 -13
  245. package/lib/utils/promise.js +23 -26
  246. package/lib/utils/quill.js +55 -60
  247. package/lib/utils/route.js +52 -60
  248. package/lib/utils/search.js +72 -87
  249. package/lib/utils/shard.js +33 -42
  250. package/lib/utils/sort.js +47 -50
  251. package/lib/utils/string.js +10 -12
  252. package/lib/utils/table.js +29 -33
  253. package/lib/utils/timezone.js +7 -12
  254. package/lib/utils/url.js +130 -144
  255. package/lib/utils/user.js +54 -64
  256. package/lib/utils/userAgent.js +7 -14
  257. package/lib/utils/userRole.js +36 -39
  258. package/package.json +17 -3
@@ -1,40 +1,36 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPageSizeOptions = exports.getGroupManageTableTabName = exports.getManageTableTabName = void 0;
4
- const table_1 = require("../constants/table");
5
- const getManageTableTabName = (selectedTab) => {
6
- switch (selectedTab) {
7
- case table_1.MANAGE_TABLE_TAB.AVAILABLE:
8
- return 'Available';
9
- case table_1.MANAGE_TABLE_TAB.DELETED:
10
- return 'Deleted';
11
- default:
12
- return '';
13
- }
1
+ import { GROUP_MANAGE_TABLE_TAB, MANAGE_TABLE_TAB, TABLE_PAGE_SIZE_OPTIONS } from '../constants/table';
2
+ export const getManageTableTabName = selectedTab => {
3
+ switch (selectedTab) {
4
+ case MANAGE_TABLE_TAB.AVAILABLE:
5
+ return 'Available';
6
+ case MANAGE_TABLE_TAB.DELETED:
7
+ return 'Deleted';
8
+ default:
9
+ return '';
10
+ }
14
11
  };
15
- exports.getManageTableTabName = getManageTableTabName;
16
- const getGroupManageTableTabName = (selectedTab) => {
17
- switch (selectedTab) {
18
- case table_1.GROUP_MANAGE_TABLE_TAB.CURRENT:
19
- return 'Current';
20
- case table_1.GROUP_MANAGE_TABLE_TAB.DELETED:
21
- return 'Deleted';
22
- case table_1.GROUP_MANAGE_TABLE_TAB.PAST:
23
- return 'Past';
24
- default:
25
- return '';
26
- }
12
+ export const getGroupManageTableTabName = selectedTab => {
13
+ switch (selectedTab) {
14
+ case GROUP_MANAGE_TABLE_TAB.CURRENT:
15
+ return 'Current';
16
+ case GROUP_MANAGE_TABLE_TAB.DELETED:
17
+ return 'Deleted';
18
+ case GROUP_MANAGE_TABLE_TAB.PAST:
19
+ return 'Past';
20
+ default:
21
+ return '';
22
+ }
27
23
  };
28
- exports.getGroupManageTableTabName = getGroupManageTableTabName;
24
+
29
25
  /**
30
26
  * return page size options that are less than or equal to the total data length,
31
27
  * and one that is greater (if it exists) to allow viewing all data on one page.
32
28
  * */
33
- const getPageSizeOptions = (dataLength) => table_1.TABLE_PAGE_SIZE_OPTIONS.reduce((options, option, currentIndex) => {
34
- const prevOption = currentIndex > 0 ? options[currentIndex - 1] : undefined;
35
- if (!dataLength || option < dataLength || (prevOption && prevOption < dataLength)) {
36
- options.push(option);
37
- }
38
- return options;
29
+ export const getPageSizeOptions = dataLength => TABLE_PAGE_SIZE_OPTIONS.reduce((options, option, currentIndex) => {
30
+ const prevOption = currentIndex > 0 ? options[currentIndex - 1] : undefined;
31
+ if (!dataLength || option < dataLength || prevOption && prevOption < dataLength) {
32
+ options.push(option);
33
+ }
34
+ return options;
39
35
  }, []);
40
- exports.getPageSizeOptions = getPageSizeOptions;
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJHUk9VUF9NQU5BR0VfVEFCTEVfVEFCIiwiTUFOQUdFX1RBQkxFX1RBQiIsIlRBQkxFX1BBR0VfU0laRV9PUFRJT05TIiwiZ2V0TWFuYWdlVGFibGVUYWJOYW1lIiwic2VsZWN0ZWRUYWIiLCJBVkFJTEFCTEUiLCJERUxFVEVEIiwiZ2V0R3JvdXBNYW5hZ2VUYWJsZVRhYk5hbWUiLCJDVVJSRU5UIiwiUEFTVCIsImdldFBhZ2VTaXplT3B0aW9ucyIsImRhdGFMZW5ndGgiLCJyZWR1Y2UiLCJvcHRpb25zIiwib3B0aW9uIiwiY3VycmVudEluZGV4IiwicHJldk9wdGlvbiIsInVuZGVmaW5lZCIsInB1c2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR1JPVVBfTUFOQUdFX1RBQkxFX1RBQiwgTUFOQUdFX1RBQkxFX1RBQiwgVEFCTEVfUEFHRV9TSVpFX09QVElPTlMgfSBmcm9tICcuLi9jb25zdGFudHMvdGFibGUnXG5cbmV4cG9ydCBjb25zdCBnZXRNYW5hZ2VUYWJsZVRhYk5hbWUgPSAoc2VsZWN0ZWRUYWI/OiBudW1iZXIpID0+IHtcblx0c3dpdGNoIChzZWxlY3RlZFRhYikge1xuXHRcdGNhc2UgTUFOQUdFX1RBQkxFX1RBQi5BVkFJTEFCTEU6XG5cdFx0XHRyZXR1cm4gJ0F2YWlsYWJsZSdcblx0XHRjYXNlIE1BTkFHRV9UQUJMRV9UQUIuREVMRVRFRDpcblx0XHRcdHJldHVybiAnRGVsZXRlZCdcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuICcnXG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwTWFuYWdlVGFibGVUYWJOYW1lID0gKHNlbGVjdGVkVGFiPzogbnVtYmVyKSA9PiB7XG5cdHN3aXRjaCAoc2VsZWN0ZWRUYWIpIHtcblx0XHRjYXNlIEdST1VQX01BTkFHRV9UQUJMRV9UQUIuQ1VSUkVOVDpcblx0XHRcdHJldHVybiAnQ3VycmVudCdcblx0XHRjYXNlIEdST1VQX01BTkFHRV9UQUJMRV9UQUIuREVMRVRFRDpcblx0XHRcdHJldHVybiAnRGVsZXRlZCdcblx0XHRjYXNlIEdST1VQX01BTkFHRV9UQUJMRV9UQUIuUEFTVDpcblx0XHRcdHJldHVybiAnUGFzdCdcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuICcnXG5cdH1cbn1cblxuLyoqXG4gKiByZXR1cm4gcGFnZSBzaXplIG9wdGlvbnMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCxcbiAqIGFuZCBvbmUgdGhhdCBpcyBncmVhdGVyIChpZiBpdCBleGlzdHMpIHRvIGFsbG93IHZpZXdpbmcgYWxsIGRhdGEgb24gb25lIHBhZ2UuXG4gKiAqL1xuZXhwb3J0IGNvbnN0IGdldFBhZ2VTaXplT3B0aW9ucyA9IChkYXRhTGVuZ3RoPzogbnVtYmVyKSA9PlxuXHRUQUJMRV9QQUdFX1NJWkVfT1BUSU9OUy5yZWR1Y2U8bnVtYmVyW10+KChvcHRpb25zLCBvcHRpb24sIGN1cnJlbnRJbmRleCkgPT4ge1xuXHRcdGNvbnN0IHByZXZPcHRpb24gPSBjdXJyZW50SW5kZXggPiAwID8gb3B0aW9uc1tjdXJyZW50SW5kZXggLSAxXSA6IHVuZGVmaW5lZFxuXHRcdGlmICghZGF0YUxlbmd0aCB8fCBvcHRpb24gPCBkYXRhTGVuZ3RoIHx8IChwcmV2T3B0aW9uICYmIHByZXZPcHRpb24gPCBkYXRhTGVuZ3RoKSkge1xuXHRcdFx0b3B0aW9ucy5wdXNoKG9wdGlvbilcblx0XHR9XG5cdFx0cmV0dXJuIG9wdGlvbnNcblx0fSwgW10pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLHNCQUFzQixFQUFFQyxnQkFBZ0IsRUFBRUMsdUJBQXVCLFFBQVEsb0JBQW9CO0FBRXRHLE9BQU8sTUFBTUMscUJBQXFCLEdBQUlDLFdBQW9CLElBQUs7RUFDOUQsUUFBUUEsV0FBVztJQUNsQixLQUFLSCxnQkFBZ0IsQ0FBQ0ksU0FBUztNQUM5QixPQUFPLFdBQVc7SUFDbkIsS0FBS0osZ0JBQWdCLENBQUNLLE9BQU87TUFDNUIsT0FBTyxTQUFTO0lBQ2pCO01BQ0MsT0FBTyxFQUFFO0VBQ1g7QUFDRCxDQUFDO0FBRUQsT0FBTyxNQUFNQywwQkFBMEIsR0FBSUgsV0FBb0IsSUFBSztFQUNuRSxRQUFRQSxXQUFXO0lBQ2xCLEtBQUtKLHNCQUFzQixDQUFDUSxPQUFPO01BQ2xDLE9BQU8sU0FBUztJQUNqQixLQUFLUixzQkFBc0IsQ0FBQ00sT0FBTztNQUNsQyxPQUFPLFNBQVM7SUFDakIsS0FBS04sc0JBQXNCLENBQUNTLElBQUk7TUFDL0IsT0FBTyxNQUFNO0lBQ2Q7TUFDQyxPQUFPLEVBQUU7RUFDWDtBQUNELENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU1DLGtCQUFrQixHQUFJQyxVQUFtQixJQUNyRFQsdUJBQXVCLENBQUNVLE1BQU0sQ0FBVyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsWUFBWSxLQUFLO0VBQzNFLE1BQU1DLFVBQVUsR0FBR0QsWUFBWSxHQUFHLENBQUMsR0FBR0YsT0FBTyxDQUFDRSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUdFLFNBQVM7RUFDM0UsSUFBSSxDQUFDTixVQUFVLElBQUlHLE1BQU0sR0FBR0gsVUFBVSxJQUFLSyxVQUFVLElBQUlBLFVBQVUsR0FBR0wsVUFBVyxFQUFFO0lBQ2xGRSxPQUFPLENBQUNLLElBQUksQ0FBQ0osTUFBTSxDQUFDO0VBQ3JCO0VBQ0EsT0FBT0QsT0FBTztBQUNmLENBQUMsRUFBRSxFQUFFLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -1,14 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.guessTimeZoneId = exports.getDefaultTimeZoneId = void 0;
4
- const tslib_1 = require("tslib");
5
- const moment = tslib_1.__importStar(require("moment-timezone"));
6
- const configuration_1 = require("../constants/configuration");
1
+ import * as moment from 'moment-timezone';
2
+ import { getShardConfig } from '../constants/configuration';
7
3
  const defaultTimeZoneId = 'America/Indianapolis';
8
- const getDefaultTimeZoneId = () => {
9
- const shardConfig = (0, configuration_1.getShardConfig)();
10
- return shardConfig.defaultTimeZoneId ? shardConfig.defaultTimeZoneId : defaultTimeZoneId;
4
+ export const getDefaultTimeZoneId = () => {
5
+ const shardConfig = getShardConfig();
6
+ return shardConfig.defaultTimeZoneId ? shardConfig.defaultTimeZoneId : defaultTimeZoneId;
11
7
  };
12
- exports.getDefaultTimeZoneId = getDefaultTimeZoneId;
13
- const guessTimeZoneId = () => moment.tz.guess();
14
- exports.guessTimeZoneId = guessTimeZoneId;
8
+ export const guessTimeZoneId = () => moment.tz.guess();
9
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb21lbnQiLCJnZXRTaGFyZENvbmZpZyIsImRlZmF1bHRUaW1lWm9uZUlkIiwiZ2V0RGVmYXVsdFRpbWVab25lSWQiLCJzaGFyZENvbmZpZyIsImd1ZXNzVGltZVpvbmVJZCIsInR6IiwiZ3Vlc3MiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdGltZXpvbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSdcbmltcG9ydCB7IGdldFNoYXJkQ29uZmlnIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbmZpZ3VyYXRpb24nXG5cbmNvbnN0IGRlZmF1bHRUaW1lWm9uZUlkID0gJ0FtZXJpY2EvSW5kaWFuYXBvbGlzJ1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFRpbWVab25lSWQgPSAoKSA9PiB7XG5cdGNvbnN0IHNoYXJkQ29uZmlnID0gZ2V0U2hhcmRDb25maWcoKVxuXHRyZXR1cm4gc2hhcmRDb25maWcuZGVmYXVsdFRpbWVab25lSWQgPyBzaGFyZENvbmZpZy5kZWZhdWx0VGltZVpvbmVJZCA6IGRlZmF1bHRUaW1lWm9uZUlkXG59XG5cbmV4cG9ydCBjb25zdCBndWVzc1RpbWVab25lSWQgPSAoKSA9PiBtb21lbnQudHouZ3Vlc3MoKVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUtBLE1BQU0sTUFBTSxpQkFBaUI7QUFDekMsU0FBU0MsY0FBYyxRQUFRLDRCQUE0QjtBQUUzRCxNQUFNQyxpQkFBaUIsR0FBRyxzQkFBc0I7QUFFaEQsT0FBTyxNQUFNQyxvQkFBb0IsR0FBR0EsQ0FBQSxLQUFNO0VBQ3pDLE1BQU1DLFdBQVcsR0FBR0gsY0FBYyxDQUFDLENBQUM7RUFDcEMsT0FBT0csV0FBVyxDQUFDRixpQkFBaUIsR0FBR0UsV0FBVyxDQUFDRixpQkFBaUIsR0FBR0EsaUJBQWlCO0FBQ3pGLENBQUM7QUFFRCxPQUFPLE1BQU1HLGVBQWUsR0FBR0EsQ0FBQSxLQUFNTCxNQUFNLENBQUNNLEVBQUUsQ0FBQ0MsS0FBSyxDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
package/lib/utils/url.js CHANGED
@@ -1,166 +1,152 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseLocation = exports.parseHeadersResponse = exports.X_FRAME_OPTIONS = void 0;
4
- exports.getApiBaseUrl = getApiBaseUrl;
5
- exports.getStorageUrl = getStorageUrl;
6
- exports.hasHttpProtocol = hasHttpProtocol;
7
- exports.isUrlValid = isUrlValid;
8
- exports.fetchText = fetchText;
9
- const tslib_1 = require("tslib");
10
- const lodash_1 = require("lodash");
11
- const shard_1 = require("../constants/shard");
12
- const tier_1 = require("../constants/tier");
13
- const windowService_1 = require("../services/windowService");
14
- const logger_1 = require("./logger");
15
- const shard_2 = require("./shard");
16
- function getApiBaseUrl(tier, apiUrlString) {
17
- // skip shard logic on LOCAL or if not using a custom domain (e.g. staging)
18
- if (tier === tier_1.TIER.LOCAL || apiUrlString.includes('azurewebsites.net')) {
19
- return apiUrlString;
20
- }
21
- let shardKey = (0, shard_2.getShardKey)();
22
- // TODO: default ROOT to point to Purdue, until we have a landing marketing page
23
- if (shardKey === shard_1.SHARD.ROOT) {
24
- shardKey = shard_1.SHARD.PURDUE;
25
- }
26
- const protocol = apiUrlString.substring(0, apiUrlString.indexOf('//'));
27
- const host = apiUrlString.substring(apiUrlString.indexOf('://') + 3);
28
- let tierSubdomainPart = '';
29
- switch (tier) {
30
- case tier_1.TIER.DEV:
31
- tierSubdomainPart = '.dev';
32
- break;
33
- case tier_1.TIER.QA:
34
- tierSubdomainPart = '.qa';
35
- break;
36
- }
37
- return `${protocol}//${shardKey}${tierSubdomainPart}.${host}`;
1
+ import { find, isArray } from 'lodash';
2
+ import { SHARD } from '../constants/shard';
3
+ import { TIER } from '../constants/tier';
4
+ import { windowService } from '../services/windowService';
5
+ import { getLogger } from './logger';
6
+ import { getShardKey } from './shard';
7
+ export function getApiBaseUrl(tier, apiUrlString) {
8
+ // skip shard logic on LOCAL or if not using a custom domain (e.g. staging)
9
+ if (tier === TIER.LOCAL || apiUrlString.includes('azurewebsites.net')) {
10
+ return apiUrlString;
11
+ }
12
+ let shardKey = getShardKey();
13
+
14
+ // TODO: default ROOT to point to Purdue, until we have a landing marketing page
15
+ if (shardKey === SHARD.ROOT) {
16
+ shardKey = SHARD.PURDUE;
17
+ }
18
+ const protocol = apiUrlString.substring(0, apiUrlString.indexOf('//'));
19
+ const host = apiUrlString.substring(apiUrlString.indexOf('://') + 3);
20
+ let tierSubdomainPart = '';
21
+ switch (tier) {
22
+ case TIER.DEV:
23
+ tierSubdomainPart = '.dev';
24
+ break;
25
+ case TIER.QA:
26
+ tierSubdomainPart = '.qa';
27
+ break;
28
+ }
29
+ return `${protocol}//${shardKey}${tierSubdomainPart}.${host}`;
38
30
  }
39
- function getStorageUrl(config, url) {
40
- return config.TIER === tier_1.TIER.LOCAL && !!config.STORAGE_URL
41
- ? url.replace('http://127.0.0.1:10000', config.STORAGE_URL)
42
- : url;
31
+ export function getStorageUrl(config, url) {
32
+ return config.TIER === TIER.LOCAL && !!config.STORAGE_URL ? url.replace('http://127.0.0.1:10000', config.STORAGE_URL) : url;
43
33
  }
44
- function hasHttpProtocol(url) {
45
- return /^(http|https):\/\//.test(url);
34
+ export function hasHttpProtocol(url) {
35
+ return /^(http|https):\/\//.test(url);
46
36
  }
47
- function isUrlValid(url) {
48
- return /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=]+$/.test(url);
37
+ export function isUrlValid(url) {
38
+ return /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=]+$/.test(url);
49
39
  }
40
+
50
41
  /** The total number of tries for `fetchText`, including the initial request. */
51
42
  const TRY_LIMIT = 5;
52
43
  function wait(time) {
53
- return new Promise(resolve => {
54
- setTimeout(resolve, time);
55
- });
44
+ return new Promise(resolve => {
45
+ setTimeout(resolve, time);
46
+ });
56
47
  }
57
- function fetchText(url, options) {
58
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
59
- let tryCount = 0;
60
- do {
61
- tryCount++;
62
- try {
63
- const resp = yield fetch(url, options);
64
- const text = yield resp.text();
65
- return text;
66
- }
67
- catch (error) {
68
- (0, logger_1.getLogger)().error(`Failed to fetch ${url}. attempt: ${tryCount}, error: ${error}`);
69
- if (tryCount < TRY_LIMIT) {
70
- yield wait(Math.pow(2, (tryCount - 1)) * 100); // 100, 200, 400, 800
71
- }
72
- }
73
- } while (tryCount < TRY_LIMIT);
74
- throw new Error(`Failed to fetch ${url} after ${TRY_LIMIT} attempts.`);
75
- });
48
+ export async function fetchText(url, options) {
49
+ let tryCount = 0;
50
+ do {
51
+ tryCount++;
52
+ try {
53
+ const resp = await fetch(url, options);
54
+ const text = await resp.text();
55
+ return text;
56
+ } catch (error) {
57
+ getLogger().error(`Failed to fetch ${url}. attempt: ${tryCount}, error: ${error}`);
58
+ if (tryCount < TRY_LIMIT) {
59
+ await wait(2 ** (tryCount - 1) * 100); // 100, 200, 400, 800
60
+ }
61
+ }
62
+ } while (tryCount < TRY_LIMIT);
63
+ throw new Error(`Failed to fetch ${url} after ${TRY_LIMIT} attempts.`);
76
64
  }
77
- var X_FRAME_OPTIONS;
78
- (function (X_FRAME_OPTIONS) {
79
- X_FRAME_OPTIONS["DENY"] = "DENY";
80
- X_FRAME_OPTIONS["SAMEORIGIN"] = "SAMEORIGIN";
81
- X_FRAME_OPTIONS["ALLOW_FROM"] = "ALLOW-FROM";
82
- })(X_FRAME_OPTIONS || (exports.X_FRAME_OPTIONS = X_FRAME_OPTIONS = {}));
65
+ export let X_FRAME_OPTIONS = /*#__PURE__*/function (X_FRAME_OPTIONS) {
66
+ X_FRAME_OPTIONS["DENY"] = "DENY";
67
+ X_FRAME_OPTIONS["SAMEORIGIN"] = "SAMEORIGIN";
68
+ X_FRAME_OPTIONS["ALLOW_FROM"] = "ALLOW-FROM";
69
+ return X_FRAME_OPTIONS;
70
+ }({});
83
71
  /**
84
72
  * Using the given headers, determine if a url is allowed to be displayed in an iFrame.
85
73
  * @param headers An array of request headers.
86
74
  * @returns The parsed result
87
75
  */
88
- const parseHeadersResponse = (headers) => {
89
- // default result
90
- const result = {
91
- isValid: false,
92
- iFrameAllowed: undefined
93
- };
94
- if (!headers) {
95
- return result;
96
- }
97
- result.isValid = true;
98
- result.iFrameAllowed = true;
99
- const location = windowService_1.windowService.getLocation();
100
- // content-security-policy / x-content-security-policy
101
- // can contain 'frame-ancestors <source> <source>' with one or many sources
102
- // iFrameAllowed if it does not contain 'frame-ancestors' or if it does with an acceptable source
103
- const xContentSecurityPolicy = (0, lodash_1.find)(headers, (value, key) => key.toLowerCase() === 'content-security-policy' || key.toLowerCase() === 'x-content-security-policy');
104
- if (xContentSecurityPolicy && (0, lodash_1.isArray)(xContentSecurityPolicy)) {
105
- // define all acceptable frame-ancestors sources
106
- // protocol, full location host, host, and all wildcard permutations
107
- const acceptableSources = [location.protocol, `${location.protocol}//${location.host}`, location.host];
108
- const hostParts = location.host.split('.');
109
- while (hostParts.length > 2) {
110
- hostParts.shift();
111
- const tempHost = `*.${hostParts.join('.')}`;
112
- acceptableSources.push(tempHost);
113
- acceptableSources.push(`${location.protocol}//${tempHost}`);
114
- }
115
- result.iFrameAllowed =
116
- !xContentSecurityPolicy.some(x => x.indexOf('frame-ancestors ') >= 0) ||
117
- xContentSecurityPolicy.some(x => {
118
- /**
119
- * Matches
120
- * * the string `frame-ancestors `
121
- * * one or many of the following, followed by a space, semicolon, or end of string
122
- * * `http:`
123
- * * `https:`
124
- * * `'self'`
125
- * * `'none'`
126
- * * url with optional scheme and optional asterisk wildcards
127
- */
128
- const frameAncestorsRegex = /frame-ancestors ((?:(?:(?:http:)|(?:https:)|(?:'self')|(?:'none')|(?:(?:https?:\/\/)?[\w*.-]+(?:\.[\w*.-]+)+[\w-._~:/?#[\]@!$&'()*+,=]+))(?:[ ;]|$))+)/g;
129
- const results = frameAncestorsRegex.exec(x);
130
- if (!results) {
131
- return false;
132
- }
133
- const sources = results[1].split(' ');
134
- return sources.some(source => acceptableSources.some(acceptableSource => acceptableSource === source));
135
- });
136
- }
137
- // x-frame-options can be ['SAMEORIGIN', 'DENY', 'ALLOW-FROM...']
138
- // iFrameAllowed if the the x-frame-options is 'ALLOW-FROM {app web url}'
139
- const xFrameOptions = (0, lodash_1.find)(headers, (value, key) => key.toLowerCase() === 'x-frame-options');
140
- if (xFrameOptions && (0, lodash_1.isArray)(xFrameOptions)) {
141
- result.iFrameAllowed =
142
- !xFrameOptions.some(x => x === X_FRAME_OPTIONS.DENY || x === X_FRAME_OPTIONS.SAMEORIGIN) &&
143
- xFrameOptions.some(x => x === `${X_FRAME_OPTIONS.ALLOW_FROM} ${location.protocol}//${location.host}`);
144
- }
76
+ export const parseHeadersResponse = headers => {
77
+ // default result
78
+ const result = {
79
+ isValid: false,
80
+ iFrameAllowed: undefined
81
+ };
82
+ if (!headers) {
145
83
  return result;
84
+ }
85
+ result.isValid = true;
86
+ result.iFrameAllowed = true;
87
+ const location = windowService.getLocation();
88
+
89
+ // content-security-policy / x-content-security-policy
90
+ // can contain 'frame-ancestors <source> <source>' with one or many sources
91
+ // iFrameAllowed if it does not contain 'frame-ancestors' or if it does with an acceptable source
92
+ const xContentSecurityPolicy = find(headers, (value, key) => key.toLowerCase() === 'content-security-policy' || key.toLowerCase() === 'x-content-security-policy');
93
+ if (xContentSecurityPolicy && isArray(xContentSecurityPolicy)) {
94
+ // define all acceptable frame-ancestors sources
95
+ // protocol, full location host, host, and all wildcard permutations
96
+ const acceptableSources = [location.protocol, `${location.protocol}//${location.host}`, location.host];
97
+ const hostParts = location.host.split('.');
98
+ while (hostParts.length > 2) {
99
+ hostParts.shift();
100
+ const tempHost = `*.${hostParts.join('.')}`;
101
+ acceptableSources.push(tempHost);
102
+ acceptableSources.push(`${location.protocol}//${tempHost}`);
103
+ }
104
+ result.iFrameAllowed = !xContentSecurityPolicy.some(x => x.indexOf('frame-ancestors ') >= 0) || xContentSecurityPolicy.some(x => {
105
+ /**
106
+ * Matches
107
+ * * the string `frame-ancestors `
108
+ * * one or many of the following, followed by a space, semicolon, or end of string
109
+ * * `http:`
110
+ * * `https:`
111
+ * * `'self'`
112
+ * * `'none'`
113
+ * * url with optional scheme and optional asterisk wildcards
114
+ */
115
+ const frameAncestorsRegex = /frame-ancestors ((?:(?:(?:http:)|(?:https:)|(?:'self')|(?:'none')|(?:(?:https?:\/\/)?[\w*.-]+(?:\.[\w*.-]+)+[\w-._~:/?#[\]@!$&'()*+,=]+))(?:[ ;]|$))+)/g;
116
+ const results = frameAncestorsRegex.exec(x);
117
+ if (!results) {
118
+ return false;
119
+ }
120
+ const sources = results[1].split(' ');
121
+ return sources.some(source => acceptableSources.some(acceptableSource => acceptableSource === source));
122
+ });
123
+ }
124
+
125
+ // x-frame-options can be ['SAMEORIGIN', 'DENY', 'ALLOW-FROM...']
126
+ // iFrameAllowed if the the x-frame-options is 'ALLOW-FROM {app web url}'
127
+ const xFrameOptions = find(headers, (value, key) => key.toLowerCase() === 'x-frame-options');
128
+ if (xFrameOptions && isArray(xFrameOptions)) {
129
+ result.iFrameAllowed = !xFrameOptions.some(x => x === X_FRAME_OPTIONS.DENY || x === X_FRAME_OPTIONS.SAMEORIGIN) && xFrameOptions.some(x => x === `${X_FRAME_OPTIONS.ALLOW_FROM} ${location.protocol}//${location.host}`);
130
+ }
131
+ return result;
146
132
  };
147
- exports.parseHeadersResponse = parseHeadersResponse;
133
+
148
134
  /**
149
135
  * Parse a path string into a location with separate pathname, search, and hash components.
150
136
  * @param path A path string
151
137
  * @returns The parsed result
152
138
  */
153
- const parseLocation = (path) => {
154
- const searchStart = path.indexOf('?');
155
- const hashStart = path.indexOf('#');
156
- const searchEnd = hashStart > -1 ? hashStart : undefined;
157
- const pathname = searchStart > -1 ? path.substring(0, searchStart) : hashStart > -1 ? path.substring(0, hashStart) : path;
158
- const search = searchStart > -1 ? path.substring(searchStart, searchEnd) : undefined;
159
- const hash = hashStart > -1 ? path.substring(hashStart) : undefined;
160
- return {
161
- pathname: pathname || '/',
162
- search: search,
163
- hash: hash
164
- };
139
+ export const parseLocation = path => {
140
+ const searchStart = path.indexOf('?');
141
+ const hashStart = path.indexOf('#');
142
+ const searchEnd = hashStart > -1 ? hashStart : undefined;
143
+ const pathname = searchStart > -1 ? path.substring(0, searchStart) : hashStart > -1 ? path.substring(0, hashStart) : path;
144
+ const search = searchStart > -1 ? path.substring(searchStart, searchEnd) : undefined;
145
+ const hash = hashStart > -1 ? path.substring(hashStart) : undefined;
146
+ return {
147
+ pathname: pathname || '/',
148
+ search: search,
149
+ hash: hash
150
+ };
165
151
  };
166
- exports.parseLocation = parseLocation;
152
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaW5kIiwiaXNBcnJheSIsIlNIQVJEIiwiVElFUiIsIndpbmRvd1NlcnZpY2UiLCJnZXRMb2dnZXIiLCJnZXRTaGFyZEtleSIsImdldEFwaUJhc2VVcmwiLCJ0aWVyIiwiYXBpVXJsU3RyaW5nIiwiTE9DQUwiLCJpbmNsdWRlcyIsInNoYXJkS2V5IiwiUk9PVCIsIlBVUkRVRSIsInByb3RvY29sIiwic3Vic3RyaW5nIiwiaW5kZXhPZiIsImhvc3QiLCJ0aWVyU3ViZG9tYWluUGFydCIsIkRFViIsIlFBIiwiZ2V0U3RvcmFnZVVybCIsImNvbmZpZyIsInVybCIsIlNUT1JBR0VfVVJMIiwicmVwbGFjZSIsImhhc0h0dHBQcm90b2NvbCIsInRlc3QiLCJpc1VybFZhbGlkIiwiVFJZX0xJTUlUIiwid2FpdCIsInRpbWUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJmZXRjaFRleHQiLCJvcHRpb25zIiwidHJ5Q291bnQiLCJyZXNwIiwiZmV0Y2giLCJ0ZXh0IiwiZXJyb3IiLCJFcnJvciIsIlhfRlJBTUVfT1BUSU9OUyIsInBhcnNlSGVhZGVyc1Jlc3BvbnNlIiwiaGVhZGVycyIsInJlc3VsdCIsImlzVmFsaWQiLCJpRnJhbWVBbGxvd2VkIiwidW5kZWZpbmVkIiwibG9jYXRpb24iLCJnZXRMb2NhdGlvbiIsInhDb250ZW50U2VjdXJpdHlQb2xpY3kiLCJ2YWx1ZSIsImtleSIsInRvTG93ZXJDYXNlIiwiYWNjZXB0YWJsZVNvdXJjZXMiLCJob3N0UGFydHMiLCJzcGxpdCIsImxlbmd0aCIsInNoaWZ0IiwidGVtcEhvc3QiLCJqb2luIiwicHVzaCIsInNvbWUiLCJ4IiwiZnJhbWVBbmNlc3RvcnNSZWdleCIsInJlc3VsdHMiLCJleGVjIiwic291cmNlcyIsInNvdXJjZSIsImFjY2VwdGFibGVTb3VyY2UiLCJ4RnJhbWVPcHRpb25zIiwiREVOWSIsIlNBTUVPUklHSU4iLCJBTExPV19GUk9NIiwicGFyc2VMb2NhdGlvbiIsInBhdGgiLCJzZWFyY2hTdGFydCIsImhhc2hTdGFydCIsInNlYXJjaEVuZCIsInBhdGhuYW1lIiwic2VhcmNoIiwiaGFzaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91cmwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgaHR0cCBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgeyBMb2NhdGlvbkRlc2NyaXB0b3IgfSBmcm9tICdoaXN0b3J5J1xuaW1wb3J0IHsgZmluZCwgaXNBcnJheSB9IGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IFNIQVJEIH0gZnJvbSAnLi4vY29uc3RhbnRzL3NoYXJkJ1xuaW1wb3J0IHsgVElFUiB9IGZyb20gJy4uL2NvbnN0YW50cy90aWVyJ1xuaW1wb3J0IHsgd2luZG93U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3dpbmRvd1NlcnZpY2UnXG5pbXBvcnQgeyBBcHBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmltcG9ydCB7IGdldFNoYXJkS2V5IH0gZnJvbSAnLi9zaGFyZCdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaUJhc2VVcmwodGllcjogVElFUiwgYXBpVXJsU3RyaW5nOiBzdHJpbmcpIHtcblx0Ly8gc2tpcCBzaGFyZCBsb2dpYyBvbiBMT0NBTCBvciBpZiBub3QgdXNpbmcgYSBjdXN0b20gZG9tYWluIChlLmcuIHN0YWdpbmcpXG5cdGlmICh0aWVyID09PSBUSUVSLkxPQ0FMIHx8IGFwaVVybFN0cmluZy5pbmNsdWRlcygnYXp1cmV3ZWJzaXRlcy5uZXQnKSkge1xuXHRcdHJldHVybiBhcGlVcmxTdHJpbmdcblx0fVxuXHRsZXQgc2hhcmRLZXkgPSBnZXRTaGFyZEtleSgpXG5cblx0Ly8gVE9ETzogZGVmYXVsdCBST09UIHRvIHBvaW50IHRvIFB1cmR1ZSwgdW50aWwgd2UgaGF2ZSBhIGxhbmRpbmcgbWFya2V0aW5nIHBhZ2Vcblx0aWYgKHNoYXJkS2V5ID09PSBTSEFSRC5ST09UKSB7XG5cdFx0c2hhcmRLZXkgPSBTSEFSRC5QVVJEVUVcblx0fVxuXG5cdGNvbnN0IHByb3RvY29sID0gYXBpVXJsU3RyaW5nLnN1YnN0cmluZygwLCBhcGlVcmxTdHJpbmcuaW5kZXhPZignLy8nKSlcblx0Y29uc3QgaG9zdCA9IGFwaVVybFN0cmluZy5zdWJzdHJpbmcoYXBpVXJsU3RyaW5nLmluZGV4T2YoJzovLycpICsgMylcblx0bGV0IHRpZXJTdWJkb21haW5QYXJ0ID0gJydcblx0c3dpdGNoICh0aWVyKSB7XG5cdFx0Y2FzZSBUSUVSLkRFVjpcblx0XHRcdHRpZXJTdWJkb21haW5QYXJ0ID0gJy5kZXYnXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgVElFUi5RQTpcblx0XHRcdHRpZXJTdWJkb21haW5QYXJ0ID0gJy5xYSdcblx0XHRcdGJyZWFrXG5cdH1cblx0cmV0dXJuIGAke3Byb3RvY29sfS8vJHtzaGFyZEtleX0ke3RpZXJTdWJkb21haW5QYXJ0fS4ke2hvc3R9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVVybChjb25maWc6IEFwcENvbmZpZ3VyYXRpb24sIHVybDogc3RyaW5nKSB7XG5cdHJldHVybiBjb25maWcuVElFUiA9PT0gVElFUi5MT0NBTCAmJiAhIWNvbmZpZy5TVE9SQUdFX1VSTFxuXHRcdD8gdXJsLnJlcGxhY2UoJ2h0dHA6Ly8xMjcuMC4wLjE6MTAwMDAnLCBjb25maWcuU1RPUkFHRV9VUkwpXG5cdFx0OiB1cmxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0h0dHBQcm90b2NvbCh1cmw6IHN0cmluZykge1xuXHRyZXR1cm4gL14oaHR0cHxodHRwcyk6XFwvXFwvLy50ZXN0KHVybClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXJsVmFsaWQodXJsOiBzdHJpbmcpIHtcblx0cmV0dXJuIC9eKD86aHR0cChzKT86XFwvXFwvKT9bXFx3Li1dKyg/OlxcLltcXHcuLV0rKStbXFx3XFwtLl9+Oi8/I1tcXF1AISQmJygpKissOz1dKyQvLnRlc3QodXJsKVxufVxuXG4vKiogVGhlIHRvdGFsIG51bWJlciBvZiB0cmllcyBmb3IgYGZldGNoVGV4dGAsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCByZXF1ZXN0LiAqL1xuY29uc3QgVFJZX0xJTUlUID0gNVxuXG5mdW5jdGlvbiB3YWl0KHRpbWU6IG51bWJlcikge1xuXHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0c2V0VGltZW91dChyZXNvbHZlLCB0aW1lKVxuXHR9KVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hUZXh0KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpIHtcblx0bGV0IHRyeUNvdW50ID0gMFxuXHRkbyB7XG5cdFx0dHJ5Q291bnQrK1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKVxuXHRcdFx0Y29uc3QgdGV4dCA9IGF3YWl0IHJlc3AudGV4dCgpXG5cdFx0XHRyZXR1cm4gdGV4dFxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRnZXRMb2dnZXIoKS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfS4gYXR0ZW1wdDogJHt0cnlDb3VudH0sIGVycm9yOiAke2Vycm9yfWApXG5cdFx0XHRpZiAodHJ5Q291bnQgPCBUUllfTElNSVQpIHtcblx0XHRcdFx0YXdhaXQgd2FpdCgyICoqICh0cnlDb3VudCAtIDEpICogMTAwKSAvLyAxMDAsIDIwMCwgNDAwLCA4MDBcblx0XHRcdH1cblx0XHR9XG5cdH0gd2hpbGUgKHRyeUNvdW50IDwgVFJZX0xJTUlUKVxuXG5cdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfSBhZnRlciAke1RSWV9MSU1JVH0gYXR0ZW1wdHMuYClcbn1cblxuZXhwb3J0IGVudW0gWF9GUkFNRV9PUFRJT05TIHtcblx0REVOWSA9ICdERU5ZJyxcblx0U0FNRU9SSUdJTiA9ICdTQU1FT1JJR0lOJyxcblx0QUxMT1dfRlJPTSA9ICdBTExPVy1GUk9NJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEhlYWRlcnNSZXNwb25zZSB7XG5cdGlzVmFsaWQ6IGJvb2xlYW5cblx0aUZyYW1lQWxsb3dlZD86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBVc2luZyB0aGUgZ2l2ZW4gaGVhZGVycywgZGV0ZXJtaW5lIGlmIGEgdXJsIGlzIGFsbG93ZWQgdG8gYmUgZGlzcGxheWVkIGluIGFuIGlGcmFtZS5cbiAqIEBwYXJhbSBoZWFkZXJzIEFuIGFycmF5IG9mIHJlcXVlc3QgaGVhZGVycy5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgcmVzdWx0XG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZUhlYWRlcnNSZXNwb25zZSA9IChoZWFkZXJzPzogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzKSA9PiB7XG5cdC8vIGRlZmF1bHQgcmVzdWx0XG5cdGNvbnN0IHJlc3VsdDogUGFyc2VkSGVhZGVyc1Jlc3BvbnNlID0ge1xuXHRcdGlzVmFsaWQ6IGZhbHNlLFxuXHRcdGlGcmFtZUFsbG93ZWQ6IHVuZGVmaW5lZFxuXHR9XG5cblx0aWYgKCFoZWFkZXJzKSB7XG5cdFx0cmV0dXJuIHJlc3VsdFxuXHR9XG5cblx0cmVzdWx0LmlzVmFsaWQgPSB0cnVlXG5cdHJlc3VsdC5pRnJhbWVBbGxvd2VkID0gdHJ1ZVxuXG5cdGNvbnN0IGxvY2F0aW9uID0gd2luZG93U2VydmljZS5nZXRMb2NhdGlvbigpXG5cblx0Ly8gY29udGVudC1zZWN1cml0eS1wb2xpY3kgLyB4LWNvbnRlbnQtc2VjdXJpdHktcG9saWN5XG5cdC8vIGNhbiBjb250YWluICdmcmFtZS1hbmNlc3RvcnMgPHNvdXJjZT4gPHNvdXJjZT4nIHdpdGggb25lIG9yIG1hbnkgc291cmNlc1xuXHQvLyBpRnJhbWVBbGxvd2VkIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gJ2ZyYW1lLWFuY2VzdG9ycycgb3IgaWYgaXQgZG9lcyB3aXRoIGFuIGFjY2VwdGFibGUgc291cmNlXG5cdGNvbnN0IHhDb250ZW50U2VjdXJpdHlQb2xpY3kgPSBmaW5kKFxuXHRcdGhlYWRlcnMsXG5cdFx0KHZhbHVlLCBrZXkpID0+XG5cdFx0XHRrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtc2VjdXJpdHktcG9saWN5JyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3gtY29udGVudC1zZWN1cml0eS1wb2xpY3knXG5cdClcblx0aWYgKHhDb250ZW50U2VjdXJpdHlQb2xpY3kgJiYgaXNBcnJheSh4Q29udGVudFNlY3VyaXR5UG9saWN5KSkge1xuXHRcdC8vIGRlZmluZSBhbGwgYWNjZXB0YWJsZSBmcmFtZS1hbmNlc3RvcnMgc291cmNlc1xuXHRcdC8vIHByb3RvY29sLCBmdWxsIGxvY2F0aW9uIGhvc3QsIGhvc3QsIGFuZCBhbGwgd2lsZGNhcmQgcGVybXV0YXRpb25zXG5cdFx0Y29uc3QgYWNjZXB0YWJsZVNvdXJjZXMgPSBbbG9jYXRpb24ucHJvdG9jb2wsIGAke2xvY2F0aW9uLnByb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0fWAsIGxvY2F0aW9uLmhvc3RdXG5cdFx0Y29uc3QgaG9zdFBhcnRzID0gbG9jYXRpb24uaG9zdC5zcGxpdCgnLicpXG5cdFx0d2hpbGUgKGhvc3RQYXJ0cy5sZW5ndGggPiAyKSB7XG5cdFx0XHRob3N0UGFydHMuc2hpZnQoKVxuXHRcdFx0Y29uc3QgdGVtcEhvc3QgPSBgKi4ke2hvc3RQYXJ0cy5qb2luKCcuJyl9YFxuXHRcdFx0YWNjZXB0YWJsZVNvdXJjZXMucHVzaCh0ZW1wSG9zdClcblx0XHRcdGFjY2VwdGFibGVTb3VyY2VzLnB1c2goYCR7bG9jYXRpb24ucHJvdG9jb2x9Ly8ke3RlbXBIb3N0fWApXG5cdFx0fVxuXHRcdHJlc3VsdC5pRnJhbWVBbGxvd2VkID1cblx0XHRcdCF4Q29udGVudFNlY3VyaXR5UG9saWN5LnNvbWUoeCA9PiB4LmluZGV4T2YoJ2ZyYW1lLWFuY2VzdG9ycyAnKSA+PSAwKSB8fFxuXHRcdFx0eENvbnRlbnRTZWN1cml0eVBvbGljeS5zb21lKHggPT4ge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogTWF0Y2hlc1xuXHRcdFx0XHQgKiAqIHRoZSBzdHJpbmcgYGZyYW1lLWFuY2VzdG9ycyBgXG5cdFx0XHRcdCAqICogb25lIG9yIG1hbnkgb2YgdGhlIGZvbGxvd2luZywgZm9sbG93ZWQgYnkgYSBzcGFjZSwgc2VtaWNvbG9uLCBvciBlbmQgb2Ygc3RyaW5nXG5cdFx0XHRcdCAqICAgICAqIGBodHRwOmBcblx0XHRcdFx0ICogICAgICogYGh0dHBzOmBcblx0XHRcdFx0ICogICAgICogYCdzZWxmJ2Bcblx0XHRcdFx0ICogICAgICogYCdub25lJ2Bcblx0XHRcdFx0ICogICAgICogdXJsIHdpdGggb3B0aW9uYWwgc2NoZW1lIGFuZCBvcHRpb25hbCBhc3RlcmlzayB3aWxkY2FyZHNcblx0XHRcdFx0ICovXG5cdFx0XHRcdGNvbnN0IGZyYW1lQW5jZXN0b3JzUmVnZXggPVxuXHRcdFx0XHRcdC9mcmFtZS1hbmNlc3RvcnMgKCg/Oig/Oig/Omh0dHA6KXwoPzpodHRwczopfCg/OidzZWxmJyl8KD86J25vbmUnKXwoPzooPzpodHRwcz86XFwvXFwvKT9bXFx3Ki4tXSsoPzpcXC5bXFx3Ki4tXSspK1tcXHctLl9+Oi8/I1tcXF1AISQmJygpKissPV0rKSkoPzpbIDtdfCQpKSspL2dcblx0XHRcdFx0Y29uc3QgcmVzdWx0cyA9IGZyYW1lQW5jZXN0b3JzUmVnZXguZXhlYyh4KVxuXHRcdFx0XHRpZiAoIXJlc3VsdHMpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBzb3VyY2VzID0gcmVzdWx0c1sxXS5zcGxpdCgnICcpXG5cdFx0XHRcdHJldHVybiBzb3VyY2VzLnNvbWUoc291cmNlID0+IGFjY2VwdGFibGVTb3VyY2VzLnNvbWUoYWNjZXB0YWJsZVNvdXJjZSA9PiBhY2NlcHRhYmxlU291cmNlID09PSBzb3VyY2UpKVxuXHRcdFx0fSlcblx0fVxuXG5cdC8vIHgtZnJhbWUtb3B0aW9ucyBjYW4gYmUgWydTQU1FT1JJR0lOJywgJ0RFTlknLCAnQUxMT1ctRlJPTS4uLiddXG5cdC8vIGlGcmFtZUFsbG93ZWQgaWYgdGhlIHRoZSB4LWZyYW1lLW9wdGlvbnMgaXMgJ0FMTE9XLUZST00ge2FwcCB3ZWIgdXJsfSdcblx0Y29uc3QgeEZyYW1lT3B0aW9ucyA9IGZpbmQoaGVhZGVycywgKHZhbHVlLCBrZXkpID0+IGtleS50b0xvd2VyQ2FzZSgpID09PSAneC1mcmFtZS1vcHRpb25zJylcblx0aWYgKHhGcmFtZU9wdGlvbnMgJiYgaXNBcnJheSh4RnJhbWVPcHRpb25zKSkge1xuXHRcdHJlc3VsdC5pRnJhbWVBbGxvd2VkID1cblx0XHRcdCF4RnJhbWVPcHRpb25zLnNvbWUoeCA9PiB4ID09PSBYX0ZSQU1FX09QVElPTlMuREVOWSB8fCB4ID09PSBYX0ZSQU1FX09QVElPTlMuU0FNRU9SSUdJTikgJiZcblx0XHRcdHhGcmFtZU9wdGlvbnMuc29tZSh4ID0+IHggPT09IGAke1hfRlJBTUVfT1BUSU9OUy5BTExPV19GUk9NfSAke2xvY2F0aW9uLnByb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0fWApXG5cdH1cblx0cmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFBhcnNlIGEgcGF0aCBzdHJpbmcgaW50byBhIGxvY2F0aW9uIHdpdGggc2VwYXJhdGUgcGF0aG5hbWUsIHNlYXJjaCwgYW5kIGhhc2ggY29tcG9uZW50cy5cbiAqIEBwYXJhbSBwYXRoIEEgcGF0aCBzdHJpbmdcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgcmVzdWx0XG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZUxvY2F0aW9uID0gKHBhdGg6IHN0cmluZyk6IExvY2F0aW9uRGVzY3JpcHRvciA9PiB7XG5cdGNvbnN0IHNlYXJjaFN0YXJ0ID0gcGF0aC5pbmRleE9mKCc/Jylcblx0Y29uc3QgaGFzaFN0YXJ0ID0gcGF0aC5pbmRleE9mKCcjJylcblx0Y29uc3Qgc2VhcmNoRW5kID0gaGFzaFN0YXJ0ID4gLTEgPyBoYXNoU3RhcnQgOiB1bmRlZmluZWRcblx0Y29uc3QgcGF0aG5hbWUgPVxuXHRcdHNlYXJjaFN0YXJ0ID4gLTEgPyBwYXRoLnN1YnN0cmluZygwLCBzZWFyY2hTdGFydCkgOiBoYXNoU3RhcnQgPiAtMSA/IHBhdGguc3Vic3RyaW5nKDAsIGhhc2hTdGFydCkgOiBwYXRoXG5cdGNvbnN0IHNlYXJjaCA9IHNlYXJjaFN0YXJ0ID4gLTEgPyBwYXRoLnN1YnN0cmluZyhzZWFyY2hTdGFydCwgc2VhcmNoRW5kKSA6IHVuZGVmaW5lZFxuXHRjb25zdCBoYXNoID0gaGFzaFN0YXJ0ID4gLTEgPyBwYXRoLnN1YnN0cmluZyhoYXNoU3RhcnQpIDogdW5kZWZpbmVkXG5cdHJldHVybiB7XG5cdFx0cGF0aG5hbWU6IHBhdGhuYW1lIHx8ICcvJyxcblx0XHRzZWFyY2g6IHNlYXJjaCxcblx0XHRoYXNoOiBoYXNoXG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBRUEsU0FBU0EsSUFBSSxFQUFFQyxPQUFPLFFBQVEsUUFBUTtBQUN0QyxTQUFTQyxLQUFLLFFBQVEsb0JBQW9CO0FBQzFDLFNBQVNDLElBQUksUUFBUSxtQkFBbUI7QUFDeEMsU0FBU0MsYUFBYSxRQUFRLDJCQUEyQjtBQUV6RCxTQUFTQyxTQUFTLFFBQVEsVUFBVTtBQUNwQyxTQUFTQyxXQUFXLFFBQVEsU0FBUztBQUVyQyxPQUFPLFNBQVNDLGFBQWFBLENBQUNDLElBQVUsRUFBRUMsWUFBb0IsRUFBRTtFQUMvRDtFQUNBLElBQUlELElBQUksS0FBS0wsSUFBSSxDQUFDTyxLQUFLLElBQUlELFlBQVksQ0FBQ0UsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7SUFDdEUsT0FBT0YsWUFBWTtFQUNwQjtFQUNBLElBQUlHLFFBQVEsR0FBR04sV0FBVyxDQUFDLENBQUM7O0VBRTVCO0VBQ0EsSUFBSU0sUUFBUSxLQUFLVixLQUFLLENBQUNXLElBQUksRUFBRTtJQUM1QkQsUUFBUSxHQUFHVixLQUFLLENBQUNZLE1BQU07RUFDeEI7RUFFQSxNQUFNQyxRQUFRLEdBQUdOLFlBQVksQ0FBQ08sU0FBUyxDQUFDLENBQUMsRUFBRVAsWUFBWSxD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
package/lib/utils/user.js CHANGED
@@ -1,67 +1,57 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stopImpersonation = exports.startImpersonation = exports.filterUsersByRole = exports.displayFirstNamePossessive = exports.displayFirstName = exports.displayNamePossessive = exports.displayName = void 0;
4
- const constants_1 = require("../constants");
5
- const actionCreator_1 = require("../redux/actionCreator");
6
- const noStoreSaga_1 = require("../redux/sagas/noStoreSaga");
7
- const fetch_1 = require("./fetch");
8
- const makePossessive = (word) => (word.endsWith('s') ? `${word}’` : `${word}’s`);
9
- const displayName = (u, shouldReverse = false) => !!u.firstName && !!u.lastName
10
- ? shouldReverse
11
- ? `${u.lastName}, ${u.firstName}`
12
- : `${u.firstName} ${u.lastName}`
13
- : u.email;
14
- exports.displayName = displayName;
15
- const displayNamePossessive = (u) => !!u.firstName && !!u.lastName ? `${u.firstName} ${makePossessive(u.lastName)}` : `${u.email}’s`;
16
- exports.displayNamePossessive = displayNamePossessive;
17
- const displayFirstName = (u) => (u.firstName ? u.firstName : u.email);
18
- exports.displayFirstName = displayFirstName;
19
- const displayFirstNamePossessive = (u) => (u.firstName ? makePossessive(u.firstName) : `${u.email}’s`);
20
- exports.displayFirstNamePossessive = displayFirstNamePossessive;
21
- const filterUsersByRole = (role) => (userRoles) => {
22
- return userRoles.filter(userRole => userRole.roles.some(r => r.role === role));
1
+ import { NOTIFICATION_TYPE } from '../constants';
2
+ import { addNotification, dispatchModelFetchRequest } from '../redux/actionCreator';
3
+ import { registerNoStoreActionHook, unregisterNoStoreActionHook } from '../redux/sagas/noStoreSaga';
4
+ import { isFetchErrorData } from './fetch';
5
+ const makePossessive = word => word.endsWith('s') ? `${word}’` : `${word}’s`;
6
+ export const displayName = function (u) {
7
+ let shouldReverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
8
+ return !!u.firstName && !!u.lastName ? shouldReverse ? `${u.lastName}, ${u.firstName}` : `${u.firstName} ${u.lastName}` : u.email;
23
9
  };
24
- exports.filterUsersByRole = filterUsersByRole;
25
- const startImpersonation = (guid, userId) => {
26
- (0, noStoreSaga_1.registerNoStoreActionHook)(guid, (data) => {
27
- (0, noStoreSaga_1.unregisterNoStoreActionHook)(guid);
28
- if (!data || (0, fetch_1.isFetchErrorData)(data)) {
29
- (0, actionCreator_1.addNotification)({
30
- text: (data === null || data === void 0 ? void 0 : data.detail) || 'Could not start impersonation',
31
- type: constants_1.NOTIFICATION_TYPE.ERROR
32
- });
33
- }
34
- else {
35
- const response = data;
36
- window.location.href = `/?code=${encodeURIComponent(response.code)}`;
37
- }
38
- });
39
- (0, actionCreator_1.dispatchModelFetchRequest)({
40
- modelName: 'startImpersonation',
41
- noStore: true,
42
- guid,
43
- queryParams: { userId }
44
- });
10
+ export const displayNamePossessive = u => !!u.firstName && !!u.lastName ? `${u.firstName} ${makePossessive(u.lastName)}` : `${u.email}’s`;
11
+ export const displayFirstName = u => u.firstName ? u.firstName : u.email;
12
+ export const displayFirstNamePossessive = u => u.firstName ? makePossessive(u.firstName) : `${u.email}’s`;
13
+ export const filterUsersByRole = role => userRoles => {
14
+ return userRoles.filter(userRole => userRole.roles.some(r => r.role === role));
45
15
  };
46
- exports.startImpersonation = startImpersonation;
47
- const stopImpersonation = (guid) => {
48
- (0, noStoreSaga_1.registerNoStoreActionHook)(guid, (data) => {
49
- (0, noStoreSaga_1.unregisterNoStoreActionHook)(guid);
50
- if (!data || (0, fetch_1.isFetchErrorData)(data)) {
51
- (0, actionCreator_1.addNotification)({
52
- text: (data === null || data === void 0 ? void 0 : data.detail) || 'Could not stop impersonation',
53
- type: constants_1.NOTIFICATION_TYPE.ERROR
54
- });
55
- }
56
- else {
57
- const response = data;
58
- window.location.href = `/?code=${encodeURIComponent(response.code)}`;
59
- }
60
- });
61
- (0, actionCreator_1.dispatchModelFetchRequest)({
62
- modelName: 'stopImpersonation',
63
- noStore: true,
64
- guid
65
- });
16
+ export const startImpersonation = (guid, userId) => {
17
+ registerNoStoreActionHook(guid, data => {
18
+ unregisterNoStoreActionHook(guid);
19
+ if (!data || isFetchErrorData(data)) {
20
+ addNotification({
21
+ text: data?.detail || 'Could not start impersonation',
22
+ type: NOTIFICATION_TYPE.ERROR
23
+ });
24
+ } else {
25
+ const response = data;
26
+ window.location.href = `/?code=${encodeURIComponent(response.code)}`;
27
+ }
28
+ });
29
+ dispatchModelFetchRequest({
30
+ modelName: 'startImpersonation',
31
+ noStore: true,
32
+ guid,
33
+ queryParams: {
34
+ userId
35
+ }
36
+ });
66
37
  };
67
- exports.stopImpersonation = stopImpersonation;
38
+ export const stopImpersonation = guid => {
39
+ registerNoStoreActionHook(guid, data => {
40
+ unregisterNoStoreActionHook(guid);
41
+ if (!data || isFetchErrorData(data)) {
42
+ addNotification({
43
+ text: data?.detail || 'Could not stop impersonation',
44
+ type: NOTIFICATION_TYPE.ERROR
45
+ });
46
+ } else {
47
+ const response = data;
48
+ window.location.href = `/?code=${encodeURIComponent(response.code)}`;
49
+ }
50
+ });
51
+ dispatchModelFetchRequest({
52
+ modelName: 'stopImpersonation',
53
+ noStore: true,
54
+ guid
55
+ });
56
+ };
57
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOT1RJRklDQVRJT05fVFlQRSIsImFkZE5vdGlmaWNhdGlvbiIsImRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QiLCJyZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rIiwidW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rIiwiaXNGZXRjaEVycm9yRGF0YSIsIm1ha2VQb3NzZXNzaXZlIiwid29yZCIsImVuZHNXaXRoIiwiZGlzcGxheU5hbWUiLCJ1Iiwic2hvdWxkUmV2ZXJzZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJkaXNwbGF5TmFtZVBvc3Nlc3NpdmUiLCJkaXNwbGF5Rmlyc3ROYW1lIiwiZGlzcGxheUZpcnN0TmFtZVBvc3Nlc3NpdmUiLCJmaWx0ZXJVc2Vyc0J5Um9sZSIsInJvbGUiLCJ1c2VyUm9sZXMiLCJmaWx0ZXIiLCJ1c2VyUm9sZSIsInJvbGVzIiwic29tZSIsInIiLCJzdGFydEltcGVyc29uYXRpb24iLCJndWlkIiwidXNlcklkIiwiZGF0YSIsInRleHQiLCJkZXRhaWwiLCJ0eXBlIiwiRVJST1IiLCJyZXNwb25zZSIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsImVuY29kZVVSSUNvbXBvbmVudCIsImNvZGUiLCJtb2RlbE5hbWUiLCJub1N0b3JlIiwicXVlcnlQYXJhbXMiLCJzdG9wSW1wZXJzb25hdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91c2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5PVElGSUNBVElPTl9UWVBFIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgYWRkTm90aWZpY2F0aW9uLCBkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0IH0gZnJvbSAnLi4vcmVkdXgvYWN0aW9uQ3JlYXRvcidcbmltcG9ydCB7IHJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2ssIHVucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayB9IGZyb20gJy4uL3JlZHV4L3NhZ2FzL25vU3RvcmVTYWdhJ1xuaW1wb3J0IHsgRmV0Y2hFcnJvckRhdGEsIFVzZXIsIFVzZXJXaXRoUm9sZXMgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IGlzRmV0Y2hFcnJvckRhdGEgfSBmcm9tICcuL2ZldGNoJ1xuXG5jb25zdCBtYWtlUG9zc2Vzc2l2ZSA9ICh3b3JkOiBzdHJpbmcpID0+ICh3b3JkLmVuZHNXaXRoKCdzJykgPyBgJHt3b3JkfeKAmWAgOiBgJHt3b3JkfeKAmXNgKVxuXG5leHBvcnQgY29uc3QgZGlzcGxheU5hbWUgPSAodTogVXNlciwgc2hvdWxkUmV2ZXJzZSA9IGZhbHNlKSA9PlxuXHQhIXUuZmlyc3ROYW1lICYmICEhdS5sYXN0TmFtZVxuXHRcdD8gc2hvdWxkUmV2ZXJzZVxuXHRcdFx0PyBgJHt1Lmxhc3ROYW1lfSwgJHt1LmZpcnN0TmFtZX1gXG5cdFx0XHQ6IGAke3UuZmlyc3ROYW1lfSAke3UubGFzdE5hbWV9YFxuXHRcdDogdS5lbWFpbFxuXG5leHBvcnQgY29uc3QgZGlzcGxheU5hbWVQb3NzZXNzaXZlID0gKHU6IFVzZXIpID0+XG5cdCEhdS5maXJzdE5hbWUgJiYgISF1Lmxhc3ROYW1lID8gYCR7dS5maXJzdE5hbWV9ICR7bWFrZVBvc3Nlc3NpdmUodS5sYXN0TmFtZSl9YCA6IGAke3UuZW1haWx94oCZc2BcblxuZXhwb3J0IGNvbnN0IGRpc3BsYXlGaXJzdE5hbWUgPSAodTogVXNlcikgPT4gKHUuZmlyc3ROYW1lID8gdS5maXJzdE5hbWUgOiB1LmVtYWlsKVxuXG5leHBvcnQgY29uc3QgZGlzcGxheUZpcnN0TmFtZVBvc3Nlc3NpdmUgPSAodTogVXNlcikgPT4gKHUuZmlyc3ROYW1lID8gbWFrZVBvc3Nlc3NpdmUodS5maXJzdE5hbWUpIDogYCR7dS5lbWFpbH3igJlzYClcblxuZXhwb3J0IGNvbnN0IGZpbHRlclVzZXJzQnlSb2xlID0gKHJvbGU6IHN0cmluZykgPT4gKHVzZXJSb2xlczogVXNlcldpdGhSb2xlc1tdKSA9PiB7XG5cdHJldHVybiB1c2VyUm9sZXMuZmlsdGVyKHVzZXJSb2xlID0+IHVzZXJSb2xlLnJvbGVzLnNvbWUociA9PiByLnJvbGUgPT09IHJvbGUpKVxufVxuXG5leHBvcnQgY29uc3Qgc3RhcnRJbXBlcnNvbmF0aW9uID0gKGd1aWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpID0+IHtcblx0cmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhndWlkLCAoZGF0YTogeyBjb2RlOiBzdHJpbmcgfSB8IEZldGNoRXJyb3JEYXRhIHwgbnVsbCkgPT4ge1xuXHRcdHVucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhndWlkKVxuXHRcdGlmICghZGF0YSB8fCBpc0ZldGNoRXJyb3JEYXRhKGRhdGEpKSB7XG5cdFx0XHRhZGROb3RpZmljYXRpb24oe1xuXHRcdFx0XHR0ZXh0OiBkYXRhPy5kZXRhaWwgfHwgJ0NvdWxkIG5vdCBzdGFydCBpbXBlcnNvbmF0aW9uJyxcblx0XHRcdFx0dHlwZTogTk9USUZJQ0FUSU9OX1RZUEUuRVJST1Jcblx0XHRcdH0pXG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gZGF0YSBhcyB7IGNvZGU6IHN0cmluZyB9XG5cdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvP2NvZGU9JHtlbmNvZGVVUklDb21wb25lbnQocmVzcG9uc2UuY29kZSl9YFxuXHRcdH1cblx0fSlcblxuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcblx0XHRtb2RlbE5hbWU6ICdzdGFydEltcGVyc29uYXRpb24nLFxuXHRcdG5vU3RvcmU6IHRydWUsXG5cdFx0Z3VpZCxcblx0XHRxdWVyeVBhcmFtczogeyB1c2VySWQgfVxuXHR9KVxufVxuXG5leHBvcnQgY29uc3Qgc3RvcEltcGVyc29uYXRpb24gPSAoZ3VpZDogc3RyaW5nKSA9PiB7XG5cdHJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2soZ3VpZCwgKGRhdGE6IHsgY29kZTogc3RyaW5nIH0gfCBGZXRjaEVycm9yRGF0YSB8IG51bGwpID0+IHtcblx0XHR1bnJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2soZ3VpZClcblx0XHRpZiAoIWRhdGEgfHwgaXNGZXRjaEVycm9yRGF0YShkYXRhKSkge1xuXHRcdFx0YWRkTm90aWZpY2F0aW9uKHtcblx0XHRcdFx0dGV4dDogZGF0YT8uZGV0YWlsIHx8ICdDb3VsZCBub3Qgc3RvcCBpbXBlcnNvbmF0aW9uJyxcblx0XHRcdFx0dHlwZTogTk9USUZJQ0FUSU9OX1RZUEUuRVJST1Jcblx0XHRcdH0pXG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gZGF0YSBhcyB7IGNvZGU6IHN0cmluZyB9XG5cdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvP2NvZGU9JHtlbmNvZGVVUklDb21wb25lbnQocmVzcG9uc2UuY29kZSl9YFxuXHRcdH1cblx0fSlcblxuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcblx0XHRtb2RlbE5hbWU6ICdzdG9wSW1wZXJzb25hdGlvbicsXG5cdFx0bm9TdG9yZTogdHJ1ZSxcblx0XHRndWlkXG5cdH0pXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGlCQUFpQixRQUFRLGNBQWM7QUFDaEQsU0FBU0MsZUFBZSxFQUFFQyx5QkFBeUIsUUFBUSx3QkFBd0I7QUFDbkYsU0FBU0MseUJBQXlCLEVBQUVDLDJCQUEyQixRQUFRLDRCQUE0QjtBQUVuRyxTQUFTQyxnQkFBZ0IsUUFBUSxTQUFTO0FBRTFDLE1BQU1DLGNBQWMsR0FBSUMsSUFBWSxJQUFNQSxJQUFJLENBQUNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHRCxJQUFJLEdBQUcsR0FBRyxHQUFHQSxJQUFJLElBQUs7QUFFeEYsT0FBTyxNQUFNRSxXQUFXLEdBQUcsU0FBQUEsQ0FBQ0MsQ0FBTztFQUFBLElBQUVDLGFBQWEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsS0FBSztFQUFBLE9BQ3pELENBQUMs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
@@ -1,15 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getOperatingSystem = void 0;
4
- const operatingSystem_1 = require("../constants/operatingSystem");
5
- const getOperatingSystem = () => {
6
- const userAgent = window.navigator.userAgent.toLowerCase();
7
- const macOSPlatforms = /(macintosh|macintel|macppc|mac68k|macos)/i;
8
- const windowsPlatforms = /(win32|win64|windows|wince)/i;
9
- return macOSPlatforms.test(userAgent)
10
- ? operatingSystem_1.OPERATING_SYSTEM.MAC
11
- : windowsPlatforms.test(userAgent)
12
- ? operatingSystem_1.OPERATING_SYSTEM.WINDOWS
13
- : operatingSystem_1.OPERATING_SYSTEM.UNKNOWN;
1
+ import { OPERATING_SYSTEM } from '../constants/operatingSystem';
2
+ export const getOperatingSystem = () => {
3
+ const userAgent = window.navigator.userAgent.toLowerCase();
4
+ const macOSPlatforms = /(macintosh|macintel|macppc|mac68k|macos)/i;
5
+ const windowsPlatforms = /(win32|win64|windows|wince)/i;
6
+ return macOSPlatforms.test(userAgent) ? OPERATING_SYSTEM.MAC : windowsPlatforms.test(userAgent) ? OPERATING_SYSTEM.WINDOWS : OPERATING_SYSTEM.UNKNOWN;
14
7
  };
15
- exports.getOperatingSystem = getOperatingSystem;
8
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPUEVSQVRJTkdfU1lTVEVNIiwiZ2V0T3BlcmF0aW5nU3lzdGVtIiwidXNlckFnZW50Iiwid2luZG93IiwibmF2aWdhdG9yIiwidG9Mb3dlckNhc2UiLCJtYWNPU1BsYXRmb3JtcyIsIndpbmRvd3NQbGF0Zm9ybXMiLCJ0ZXN0IiwiTUFDIiwiV0lORE9XUyIsIlVOS05PV04iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdXNlckFnZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9QRVJBVElOR19TWVNURU0gfSBmcm9tICcuLi9jb25zdGFudHMvb3BlcmF0aW5nU3lzdGVtJ1xuXG5leHBvcnQgY29uc3QgZ2V0T3BlcmF0aW5nU3lzdGVtID0gKCkgPT4ge1xuXHRjb25zdCB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpXG5cdGNvbnN0IG1hY09TUGxhdGZvcm1zID0gLyhtYWNpbnRvc2h8bWFjaW50ZWx8bWFjcHBjfG1hYzY4a3xtYWNvcykvaVxuXHRjb25zdCB3aW5kb3dzUGxhdGZvcm1zID0gLyh3aW4zMnx3aW42NHx3aW5kb3dzfHdpbmNlKS9pXG5cblx0cmV0dXJuIG1hY09TUGxhdGZvcm1zLnRlc3QodXNlckFnZW50KVxuXHRcdD8gT1BFUkFUSU5HX1NZU1RFTS5NQUNcblx0XHQ6IHdpbmRvd3NQbGF0Zm9ybXMudGVzdCh1c2VyQWdlbnQpXG5cdFx0XHQ/IE9QRVJBVElOR19TWVNURU0uV0lORE9XU1xuXHRcdFx0OiBPUEVSQVRJTkdfU1lTVEVNLlVOS05PV05cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQWdCLFFBQVEsOEJBQThCO0FBRS9ELE9BQU8sTUFBTUMsa0JBQWtCLEdBQUdBLENBQUEsS0FBTTtFQUN2QyxNQUFNQyxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDRixTQUFTLENBQUNHLFdBQVcsQ0FBQyxDQUFDO0VBQzFELE1BQU1DLGNBQWMsR0FBRywyQ0FBMkM7RUFDbEUsTUFBTUMsZ0JBQWdCLEdBQUcsOEJBQThCO0VBRXZELE9BQU9ELGNBQWMsQ0FBQ0UsSUFBSSxDQUFDTixTQUFTLENBQUMsR0FDbENGLGdCQUFnQixDQUFDUyxHQUFHLEdBQ3BCRixnQkFBZ0IsQ0FBQ0MsSUFBSSxDQUFDTixTQUFTLENBQUMsR0FDL0JGLGdCQUFnQixDQUFDVSxPQUFPLEdBQ3hCVixnQkFBZ0IsQ0FBQ1csT0FBTztBQUM3QixDQUFDIiwiaWdub3JlTGlzdCI6W119