studiokit-scaffolding-js 7.0.12-next.1.4 → 7.0.12-next.2.2

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 +170 -34
  2. package/lib/components/AlertDialog.js +133 -9
  3. package/lib/components/AlertWithIcon.js +92 -25
  4. package/lib/components/ConnectedModal.js +43 -13
  5. package/lib/components/Dropdowns/GroupsDropdown.js +69 -44
  6. package/lib/components/Dropdowns/ManagedNavDropdown.js +100 -67
  7. package/lib/components/Dropdowns/UserDropdown.js +111 -21
  8. package/lib/components/Dropdowns/index.js +27 -9
  9. package/lib/components/EntityOwnerList.js +52 -18
  10. package/lib/components/Error.js +106 -11
  11. package/lib/components/ErrorBoundary.js +134 -35
  12. package/lib/components/ErrorMessage.js +44 -9
  13. package/lib/components/Forms/DateField.js +61 -42
  14. package/lib/components/Forms/TimeField.js +81 -42
  15. package/lib/components/Forms/index.js +27 -4
  16. package/lib/components/Groups/CreateEditCopySaveButtons.js +114 -11
  17. package/lib/components/Groups/ExternalGroups/Attach.js +212 -148
  18. package/lib/components/Groups/ExternalGroups/Table.js +181 -45
  19. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
  20. package/lib/components/Groups/RosterSyncInfo.js +147 -20
  21. package/lib/components/HOC/AccessibleAppComponent.js +98 -73
  22. package/lib/components/HOC/ActivityRequiredComponent.js +92 -49
  23. package/lib/components/HOC/AsyncComponent.js +54 -39
  24. package/lib/components/HOC/AuthenticatedComponent.js +58 -38
  25. package/lib/components/HOC/CollectionComponent.js +170 -110
  26. package/lib/components/HOC/CollectionFirstItemComponent.js +51 -38
  27. package/lib/components/HOC/CollectionItemComponent.js +168 -106
  28. package/lib/components/HOC/ConnectedModalComponent.js +109 -80
  29. package/lib/components/HOC/DataDependentComponent.js +29 -21
  30. package/lib/components/HOC/EntityComponent.js +71 -57
  31. package/lib/components/HOC/FullscreenModalComponent.js +163 -123
  32. package/lib/components/HOC/GroupActivityRequiredComponent.js +45 -31
  33. package/lib/components/HOC/GuidComponent.js +29 -22
  34. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +41 -31
  35. package/lib/components/HOC/ModelErrorRedirectComponent.js +51 -47
  36. package/lib/components/HOC/SearchPersistorComponent.js +240 -166
  37. package/lib/components/HOC/UnauthenticatedComponent.js +37 -25
  38. package/lib/components/HOC/UserComponent.js +12 -7
  39. package/lib/components/Icons/IconAlphaList.js +33 -5
  40. package/lib/components/Icons/IconExternalUser.js +33 -5
  41. package/lib/components/Icons/IconImpersonation.js +33 -5
  42. package/lib/components/Icons/IconStopImpersonating.js +33 -5
  43. package/lib/components/Icons/IconTable.js +35 -7
  44. package/lib/components/Icons/IconTableDeleteCol.js +33 -5
  45. package/lib/components/Icons/IconTableDeleteRow.js +33 -5
  46. package/lib/components/Icons/IconTableInsertCol.js +33 -5
  47. package/lib/components/Icons/IconTableInsertRow.js +33 -5
  48. package/lib/components/Impersonation/Button.js +77 -13
  49. package/lib/components/Impersonation/Link.js +77 -13
  50. package/lib/components/Impersonation/UserDetail.js +66 -9
  51. package/lib/components/Loading.js +26 -4
  52. package/lib/components/LockDownBrowser/Check.js +194 -49
  53. package/lib/components/LockDownBrowser/ExitButton.js +26 -9
  54. package/lib/components/LockDownBrowser/Launch.js +70 -62
  55. package/lib/components/Lti/Confirm.js +152 -11
  56. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -33
  57. package/lib/components/Lti/Launch.js +105 -24
  58. package/lib/components/Lti/LaunchGroup.js +85 -13
  59. package/lib/components/ManageTable.js +309 -87
  60. package/lib/components/ManageTableNoDataComponent.js +42 -4
  61. package/lib/components/NewVersionAlert.js +82 -46
  62. package/lib/components/NotFound.js +86 -10
  63. package/lib/components/Notifications.js +185 -126
  64. package/lib/components/PaginationNextButton.js +33 -6
  65. package/lib/components/PaginationPreviousButton.js +33 -6
  66. package/lib/components/Quill/CustomToolbar.js +432 -218
  67. package/lib/components/Quill/Formats/Image.js +73 -63
  68. package/lib/components/Quill/Formats/List.js +45 -45
  69. package/lib/components/Quill/Formats/Video.js +28 -24
  70. package/lib/components/Quill/ImageDropModule.js +147 -117
  71. package/lib/components/Quill/ImageWarning.js +47 -9
  72. package/lib/components/Quill/ImageWithAltTextModal.js +425 -86
  73. package/lib/components/Quill/Specs/CustomImageSpec.js +42 -34
  74. package/lib/components/Quill/Specs/CustomVideoSpec.js +34 -28
  75. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +98 -98
  76. package/lib/components/Quill/TableModule/Blots/TableBlot.js +52 -47
  77. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +53 -48
  78. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +224 -221
  79. package/lib/components/Quill/TableModule/Blots/TableContainer.js +80 -83
  80. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +75 -70
  81. package/lib/components/Quill/TableModule/constants.js +45 -41
  82. package/lib/components/Quill/TableModule/index.js +362 -301
  83. package/lib/components/Quill/TableModule/utils.js +42 -38
  84. package/lib/components/Quill/accessibilityFix.js +234 -232
  85. package/lib/components/Quill/index.js +34 -28
  86. package/lib/components/RefreshIndicator/Bordered.js +47 -6
  87. package/lib/components/RefreshIndicator/Inline.js +47 -8
  88. package/lib/components/RefreshIndicator/index.js +263 -59
  89. package/lib/components/SearchControls.js +216 -11
  90. package/lib/components/SentryRoute.js +11 -6
  91. package/lib/components/Tables/RoleFilter.js +69 -32
  92. package/lib/components/Tables/TextFilter.js +62 -13
  93. package/lib/components/UserRoles/Add.js +199 -96
  94. package/lib/components/UserRoles/Context.js +11 -7
  95. package/lib/components/UserRoles/RoleCell.js +181 -72
  96. package/lib/components/UserRoles/Select.js +157 -17
  97. package/lib/components/UserRoles/Table.js +221 -80
  98. package/lib/components/UserRoles/index.js +534 -384
  99. package/lib/config/eslint/index.js +32 -28
  100. package/lib/config/eslint/lib/order.js +26 -27
  101. package/lib/config/eslint/lib/prettier.js +20 -18
  102. package/lib/config/eslint/lib/typescript.js +93 -112
  103. package/lib/config/eslint/react.js +24 -14
  104. package/lib/constants/baseActivity.js +30 -26
  105. package/lib/constants/baseRole.js +14 -10
  106. package/lib/constants/configuration.js +33 -29
  107. package/lib/constants/externalProviderType.js +10 -6
  108. package/lib/constants/fetchErrorData.js +15 -11
  109. package/lib/constants/index.js +137 -14
  110. package/lib/constants/lockDownBrowser.js +28 -24
  111. package/lib/constants/mockData.js +382 -297
  112. package/lib/constants/modelStatus.js +15 -11
  113. package/lib/constants/notificationType.js +12 -8
  114. package/lib/constants/operatingSystem.js +12 -8
  115. package/lib/constants/shard.js +11 -7
  116. package/lib/constants/table.js +21 -21
  117. package/lib/constants/tier.js +12 -8
  118. package/lib/constants/userRole.js +15 -5
  119. package/lib/endpointMappings.js +197 -181
  120. package/lib/hooks/useCollection.js +82 -62
  121. package/lib/hooks/useCollectionConfiguration.js +228 -83
  122. package/lib/hooks/useCollectionItem.js +154 -54
  123. package/lib/hooks/useGuid.js +20 -8
  124. package/lib/hooks/usePrevious.js +19 -13
  125. package/lib/index.js +157 -25
  126. package/lib/redux/actionCreator.js +50 -28
  127. package/lib/redux/actions/AuthAction.js +44 -31
  128. package/lib/redux/actions/ModalAction.js +10 -6
  129. package/lib/redux/actions/ModelAction.js +77 -39
  130. package/lib/redux/actions/NotificationAction.js +10 -6
  131. package/lib/redux/actions/SearchAction.js +9 -5
  132. package/lib/redux/actions/index.js +60 -7
  133. package/lib/redux/configureReducers.js +60 -49
  134. package/lib/redux/configureStore.js +83 -87
  135. package/lib/redux/helpers.js +6 -2
  136. package/lib/redux/reducers/authReducer.js +50 -43
  137. package/lib/redux/reducers/index.js +41 -13
  138. package/lib/redux/reducers/modalsReducer.js +47 -29
  139. package/lib/redux/reducers/modelsReducer.js +178 -173
  140. package/lib/redux/reducers/notificationsReducer.js +24 -18
  141. package/lib/redux/reducers/searchReducer.js +25 -19
  142. package/lib/redux/sagas/appInsightsSaga.js +22 -18
  143. package/lib/redux/sagas/authSaga.js +253 -218
  144. package/lib/redux/sagas/caliperSaga.js +159 -143
  145. package/lib/redux/sagas/clockOffsetSaga.js +34 -31
  146. package/lib/redux/sagas/configurationSaga.js +11 -7
  147. package/lib/redux/sagas/downtimeApiErrorSaga.js +20 -17
  148. package/lib/redux/sagas/errorSaga.js +27 -21
  149. package/lib/redux/sagas/googleAnalyticsSaga.js +28 -24
  150. package/lib/redux/sagas/identityProviderSaga.js +22 -18
  151. package/lib/redux/sagas/initialDataLoadSaga.js +37 -28
  152. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +29 -20
  153. package/lib/redux/sagas/modelFetchSaga.js +355 -322
  154. package/lib/redux/sagas/noStoreSaga.js +61 -48
  155. package/lib/redux/sagas/postLoginDataSaga.js +45 -34
  156. package/lib/redux/sagas/postLoginRedirectSaga.js +27 -27
  157. package/lib/redux/sagas/rootSaga.js +82 -57
  158. package/lib/redux/sagas/sentrySaga.js +29 -25
  159. package/lib/redux/sagas/userIdSaga.js +16 -12
  160. package/lib/services/codeProviderService.js +25 -19
  161. package/lib/services/dateService.js +12 -7
  162. package/lib/services/documentService.js +17 -12
  163. package/lib/services/fetchService.js +129 -112
  164. package/lib/services/persistenceService.js +33 -29
  165. package/lib/services/ticketProviderService.js +29 -23
  166. package/lib/services/tokenPersistenceService.js +12 -8
  167. package/lib/services/windowService.js +18 -14
  168. package/lib/startup.js +132 -114
  169. package/lib/types/AppConfiguration.js +5 -1
  170. package/lib/types/Artifact.js +11 -7
  171. package/lib/types/BaseReduxState.js +5 -1
  172. package/lib/types/Client.js +5 -1
  173. package/lib/types/Collection.js +5 -1
  174. package/lib/types/Configuration.js +5 -1
  175. package/lib/types/DeepLinkingResponseRequest.js +5 -1
  176. package/lib/types/DeletableModel.js +5 -1
  177. package/lib/types/Event.js +5 -1
  178. package/lib/types/ExternalGroup.js +5 -1
  179. package/lib/types/ExternalProvider.js +5 -1
  180. package/lib/types/ExternalTerm.js +5 -1
  181. package/lib/types/Group.js +5 -1
  182. package/lib/types/IdentityProvider.js +5 -1
  183. package/lib/types/LtiLaunch.js +5 -1
  184. package/lib/types/NameOnlyEntity.js +5 -1
  185. package/lib/types/Notification.js +5 -1
  186. package/lib/types/OptionalRecord.js +5 -1
  187. package/lib/types/OwnerSchedule.js +5 -1
  188. package/lib/types/PropertyOfType.js +5 -1
  189. package/lib/types/Quill.js +5 -1
  190. package/lib/types/RoleDescription.js +5 -1
  191. package/lib/types/Search.js +5 -1
  192. package/lib/types/SimpleLocation.js +5 -1
  193. package/lib/types/UniTime.js +5 -1
  194. package/lib/types/User.js +5 -1
  195. package/lib/types/UserRole.js +5 -1
  196. package/lib/types/auth/AuthState.js +5 -1
  197. package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
  198. package/lib/types/auth/ClientCredentials.js +5 -1
  199. package/lib/types/auth/CodeProviderService.js +5 -1
  200. package/lib/types/auth/LocalLoginRequestBody.js +5 -1
  201. package/lib/types/auth/TicketProviderService.js +5 -1
  202. package/lib/types/auth/TokenPersistenceService.js +5 -1
  203. package/lib/types/auth/index.js +82 -9
  204. package/lib/types/externals.d.js +2 -0
  205. package/lib/types/index.js +313 -30
  206. package/lib/types/net/EndpointConfig.js +5 -1
  207. package/lib/types/net/EndpointMapping.js +5 -1
  208. package/lib/types/net/EndpointMappings.js +5 -1
  209. package/lib/types/net/ErrorHandler.js +5 -1
  210. package/lib/types/net/FetchConfig.js +5 -1
  211. package/lib/types/net/FetchErrorData.js +10 -6
  212. package/lib/types/net/FetchResult.js +5 -1
  213. package/lib/types/net/HTTPMethod.js +5 -1
  214. package/lib/types/net/HTTPStatusCode.js +16 -12
  215. package/lib/types/net/Metadata.js +5 -1
  216. package/lib/types/net/Model.js +5 -1
  217. package/lib/types/net/ModelCollection.js +5 -1
  218. package/lib/types/net/ModelsState.js +5 -1
  219. package/lib/types/net/OAuthToken.js +5 -1
  220. package/lib/types/net/OAuthTokenOrNull.js +5 -1
  221. package/lib/types/net/TokenAccessFunction.js +5 -1
  222. package/lib/types/net/index.js +181 -18
  223. package/lib/utils/baseActivity.js +133 -123
  224. package/lib/utils/baseRole.js +37 -33
  225. package/lib/utils/collection.js +425 -298
  226. package/lib/utils/cookies.js +22 -19
  227. package/lib/utils/date.js +303 -279
  228. package/lib/utils/dom.js +176 -165
  229. package/lib/utils/domainIdentifier.js +9 -5
  230. package/lib/utils/entityUserRole.js +6 -2
  231. package/lib/utils/error.js +17 -15
  232. package/lib/utils/events.js +40 -31
  233. package/lib/utils/externalGroup.js +22 -18
  234. package/lib/utils/externalProviders.js +8 -4
  235. package/lib/utils/externalTerms.js +10 -3
  236. package/lib/utils/fetch.js +179 -180
  237. package/lib/utils/group.js +18 -7
  238. package/lib/utils/groupDates.js +37 -33
  239. package/lib/utils/groupRoles.js +25 -21
  240. package/lib/utils/lockDownBrowser.js +15 -11
  241. package/lib/utils/logger.js +26 -22
  242. package/lib/utils/lti.js +9 -4
  243. package/lib/utils/model.js +36 -41
  244. package/lib/utils/number.js +21 -18
  245. package/lib/utils/promise.js +28 -21
  246. package/lib/utils/quill.js +65 -62
  247. package/lib/utils/route.js +58 -55
  248. package/lib/utils/search.js +76 -80
  249. package/lib/utils/shard.js +37 -37
  250. package/lib/utils/sort.js +50 -42
  251. package/lib/utils/string.js +13 -8
  252. package/lib/utils/table.js +38 -33
  253. package/lib/utils/timezone.js +10 -6
  254. package/lib/utils/url.js +142 -142
  255. package/lib/utils/user.js +58 -55
  256. package/lib/utils/userAgent.js +10 -10
  257. package/lib/utils/userRole.js +57 -49
  258. package/package.json +17 -3
package/lib/utils/dom.js CHANGED
@@ -1,202 +1,213 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setupMobileEventListeners = exports.isTextInput = exports.hasExternalKeyboard = exports.isMobileDevice = exports.getFirstParentElementWithClassName = exports.getVerticallyScrollableParent = void 0;
4
- const logger_1 = require("./logger");
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setupMobileEventListeners = exports.isTextInput = exports.isMobileDevice = exports.hasExternalKeyboard = exports.getVerticallyScrollableParent = exports.getFirstParentElementWithClassName = void 0;
7
+ var _logger = require("./logger");
5
8
  const KEYBOARD_ANIMATION_MS = 250;
6
- /**
7
- * Get the nearest vertically scrollable parent of an element
8
- * @param { HTMLElement } element - The element to start with
9
- * @returns The nearest vertically scrollable parent element
9
+
10
+ /**
11
+ * Get the nearest vertically scrollable parent of an element
12
+ * @param { HTMLElement } element - The element to start with
13
+ * @returns The nearest vertically scrollable parent element
10
14
  */
11
- const getVerticallyScrollableParent = (element) => {
12
- let style = getComputedStyle(element);
13
- const excludeStaticParent = style.position === 'absolute';
14
- const overflowRegex = /(auto|scroll|hidden)/;
15
- for (let parent = element; (parent = parent.parentElement);) {
16
- style = getComputedStyle(parent);
17
- if (excludeStaticParent && style.position === 'static')
18
- continue;
19
- if (overflowRegex.test(style.overflow + style.overflowY) && parent.scrollHeight > parent.clientHeight)
20
- return parent;
21
- }
22
- return document.scrollingElement;
15
+ const getVerticallyScrollableParent = element => {
16
+ let style = getComputedStyle(element);
17
+ const excludeStaticParent = style.position === 'absolute';
18
+ const overflowRegex = /(auto|scroll|hidden)/;
19
+ for (let parent = element; parent = parent.parentElement;) {
20
+ style = getComputedStyle(parent);
21
+ if (excludeStaticParent && style.position === 'static') continue;
22
+ if (overflowRegex.test(style.overflow + style.overflowY) && parent.scrollHeight > parent.clientHeight) return parent;
23
+ }
24
+ return document.scrollingElement;
23
25
  };
24
- exports.getVerticallyScrollableParent = getVerticallyScrollableParent;
25
- /**
26
- * Get the first parent that has the given className in its classList
27
- * @param element The target element
28
- * @param className The className to match
26
+
27
+ /**
28
+ * Get the first parent that has the given className in its classList
29
+ * @param element The target element
30
+ * @param className The className to match
29
31
  */
32
+ exports.getVerticallyScrollableParent = getVerticallyScrollableParent;
30
33
  const getFirstParentElementWithClassName = (element, className) => {
31
- for (let parent = element; (parent = parent.parentElement);) {
32
- if (parent.classList.contains(className))
33
- return parent;
34
- }
35
- return undefined;
34
+ for (let parent = element; parent = parent.parentElement;) {
35
+ if (parent.classList.contains(className)) return parent;
36
+ }
37
+ return undefined;
36
38
  };
37
- exports.getFirstParentElementWithClassName = getFirstParentElementWithClassName;
38
- /**
39
- * Return whether the device being used is one of several mainstream mobile devices
39
+
40
+ /**
41
+ * Return whether the device being used is one of several mainstream mobile devices
40
42
  */
43
+ exports.getFirstParentElementWithClassName = getFirstParentElementWithClassName;
41
44
  const isMobileDevice = () => {
42
- return (/android|ipad|ipod|iphone/i.test(navigator.userAgent) ||
43
- (/macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints));
45
+ return /android|ipad|ipod|iphone/i.test(navigator.userAgent) || /macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints;
44
46
  };
45
- exports.isMobileDevice = isMobileDevice;
47
+
46
48
  /** Return whether the device is using an external keyboard vs. the native on-screen OS keyboard. */
49
+ exports.isMobileDevice = isMobileDevice;
47
50
  const hasExternalKeyboard = () => window.hasExternalKeyboard;
48
- exports.hasExternalKeyboard = hasExternalKeyboard;
49
- /**
50
- * Sets `window.hasExternalKeyboard`, returned by `hasExternalKeyboard`.
51
+
52
+ /**
53
+ * Sets `window.hasExternalKeyboard`, returned by `hasExternalKeyboard`.
51
54
  */
52
- const setHasExternalKeyboard = (hasExternalKeyboard) => {
53
- (0, logger_1.getLogger)().debug('hasExternalKeyboard', hasExternalKeyboard);
54
- const windowWithoutType = window;
55
- windowWithoutType.hasExternalKeyboard = hasExternalKeyboard;
55
+ exports.hasExternalKeyboard = hasExternalKeyboard;
56
+ const setHasExternalKeyboard = hasExternalKeyboard => {
57
+ (0, _logger.getLogger)().debug('hasExternalKeyboard', hasExternalKeyboard);
58
+ const windowWithoutType = window;
59
+ windowWithoutType.hasExternalKeyboard = hasExternalKeyboard;
56
60
  };
57
- /**
58
- * 100vh is kind of b⊘rked on mobile safari, we have to set it programmatically here
59
- * so we can calculate device-independent viewport heights
60
- * https://allthingssmitty.com/2020/05/11/css-fix-for-100vh-in-mobile-webkit/
61
- *
62
- * Sets the CSS variable `--visual-viewport-height` on the `documentElement`/<html>.
63
- *
61
+
62
+ /**
63
+ * 100vh is kind of b⊘rked on mobile safari, we have to set it programmatically here
64
+ * so we can calculate device-independent viewport heights
65
+ * https://allthingssmitty.com/2020/05/11/css-fix-for-100vh-in-mobile-webkit/
66
+ *
67
+ * Sets the CSS variable `--visual-viewport-height` on the `documentElement`/<html>.
68
+ *
64
69
  */
65
70
  const setVisualViewportHeightVar = () => {
66
- const height = visualViewport ? visualViewport.height : 0;
67
- document.documentElement.style.setProperty('--visual-viewport-height', `${height}px`);
71
+ const height = visualViewport ? visualViewport.height : 0;
72
+ document.documentElement.style.setProperty('--visual-viewport-height', `${height}px`);
68
73
  };
69
- /**
70
- * Is the given element capable of text input?
71
- *
72
- * @param el An HTML element
74
+
75
+ /**
76
+ * Is the given element capable of text input?
77
+ *
78
+ * @param el An HTML element
73
79
  */
74
- const isTextInput = (el) => {
75
- const tagName = el.tagName && el.tagName.toLowerCase();
76
- if (tagName === 'textarea')
77
- return true;
78
- if (tagName === 'input') {
79
- const inputEl = el;
80
- return inputEl.type !== 'button' && inputEl.type !== 'radio' && inputEl.type !== 'checkbox';
81
- }
82
- // Quill editor
83
- return tagName === 'div' && el.className.includes('ql-editor') && el.contentEditable === 'true';
80
+ const isTextInput = el => {
81
+ const tagName = el.tagName && el.tagName.toLowerCase();
82
+ if (tagName === 'textarea') return true;
83
+ if (tagName === 'input') {
84
+ const inputEl = el;
85
+ return inputEl.type !== 'button' && inputEl.type !== 'radio' && inputEl.type !== 'checkbox';
86
+ }
87
+ // Quill editor
88
+ return tagName === 'div' && el.className.includes('ql-editor') && el.contentEditable === 'true';
84
89
  };
85
90
  exports.isTextInput = isTextInput;
86
91
  let updateHasExternalKeyboardAfterFocusTimeout = undefined;
87
92
  let scrollToElementAfterFocusTimeout = undefined;
88
93
  const updateHasExternalKeyboardAfterFocus = () => {
89
- const closedVisualViewportHeight = visualViewport ? visualViewport.height : 0;
90
- // wait for the keyboard animation
91
- updateHasExternalKeyboardAfterFocusTimeout = window.setTimeout(() => {
92
- // find the keyboard height based on the difference in viewport height
93
- const keyboardHeight = closedVisualViewportHeight - (visualViewport ? visualViewport.height : 0);
94
- // on first-load the input focus can fail
95
- // when this happens the height is 0, and this ONLY happens when there is NOT an external keyboard
96
- if (keyboardHeight === 0 && (0, exports.hasExternalKeyboard)() === undefined) {
97
- setHasExternalKeyboard(false);
98
- }
99
- else {
100
- // if the keyboard height is greater than 100, that means the full onscreen keyboard displayed
101
- // otherwise, only the small context menu displayed, meaning there is an external keyboard
102
- setHasExternalKeyboard(keyboardHeight < 100);
103
- }
104
- updateHasExternalKeyboardAfterFocusTimeout = undefined;
105
- }, KEYBOARD_ANIMATION_MS);
94
+ const closedVisualViewportHeight = visualViewport ? visualViewport.height : 0;
95
+ // wait for the keyboard animation
96
+ updateHasExternalKeyboardAfterFocusTimeout = window.setTimeout(() => {
97
+ // find the keyboard height based on the difference in viewport height
98
+ const keyboardHeight = closedVisualViewportHeight - (visualViewport ? visualViewport.height : 0);
99
+ // on first-load the input focus can fail
100
+ // when this happens the height is 0, and this ONLY happens when there is NOT an external keyboard
101
+ if (keyboardHeight === 0 && hasExternalKeyboard() === undefined) {
102
+ setHasExternalKeyboard(false);
103
+ } else {
104
+ // if the keyboard height is greater than 100, that means the full onscreen keyboard displayed
105
+ // otherwise, only the small context menu displayed, meaning there is an external keyboard
106
+ setHasExternalKeyboard(keyboardHeight < 100);
107
+ }
108
+ updateHasExternalKeyboardAfterFocusTimeout = undefined;
109
+ }, KEYBOARD_ANIMATION_MS);
106
110
  };
107
- const scrollToElementAfterFocus = (el) => {
108
- // wait for the keyboard animation
109
- scrollToElementAfterFocusTimeout = window.setTimeout(() => {
110
- // after the keyboard is open, check for the el’s scrollable parent, as it could have just become scrollable
111
- const scrollParent = (0, exports.getVerticallyScrollableParent)(el);
112
- // if the el has a scrollable parent other than the document, scroll it back into view
113
- if (scrollParent && scrollParent !== document.documentElement) {
114
- const scrollRect = scrollParent.getBoundingClientRect();
115
- const rect = el.getBoundingClientRect();
116
- // only scroll into view if outside of the scroll parent bounds
117
- if (rect.bottom < scrollRect.top || rect.top > scrollRect.bottom) {
118
- const newScrollTop = scrollParent.scrollTop + rect.top - scrollRect.top - 10;
119
- (0, logger_1.getLogger)().debug('scrollToEl', newScrollTop);
120
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
121
- if (scrollParent.scrollTo) {
122
- scrollParent.scrollTo({ top: newScrollTop, behavior: 'smooth' });
123
- }
124
- else {
125
- scrollParent.scrollTop = newScrollTop;
126
- }
127
- }
111
+ const scrollToElementAfterFocus = el => {
112
+ // wait for the keyboard animation
113
+ scrollToElementAfterFocusTimeout = window.setTimeout(() => {
114
+ // after the keyboard is open, check for the el’s scrollable parent, as it could have just become scrollable
115
+ const scrollParent = getVerticallyScrollableParent(el);
116
+ // if the el has a scrollable parent other than the document, scroll it back into view
117
+ if (scrollParent && scrollParent !== document.documentElement) {
118
+ const scrollRect = scrollParent.getBoundingClientRect();
119
+ const rect = el.getBoundingClientRect();
120
+ // only scroll into view if outside of the scroll parent bounds
121
+ if (rect.bottom < scrollRect.top || rect.top > scrollRect.bottom) {
122
+ const newScrollTop = scrollParent.scrollTop + rect.top - scrollRect.top - 10;
123
+ (0, _logger.getLogger)().debug('scrollToEl', newScrollTop);
124
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
125
+ if (scrollParent.scrollTo) {
126
+ scrollParent.scrollTo({
127
+ top: newScrollTop,
128
+ behavior: 'smooth'
129
+ });
130
+ } else {
131
+ scrollParent.scrollTop = newScrollTop;
128
132
  }
129
- scrollToElementAfterFocusTimeout = undefined;
130
- }, KEYBOARD_ANIMATION_MS);
133
+ }
134
+ }
135
+ scrollToElementAfterFocusTimeout = undefined;
136
+ }, KEYBOARD_ANIMATION_MS);
131
137
  };
132
- /**
133
- * Event handler for "focusin" event.
134
- *
135
- * "focusin" bubbles up from all focus events, so uses `isTextInput` to only react to "keyboard" focus events.
136
- *
137
- * Checks for external keyboard and scrolls to the focused element after any animations, e.g. keyboard open.
138
- *
138
+
139
+ /**
140
+ * Event handler for "focusin" event.
141
+ *
142
+ * "focusin" bubbles up from all focus events, so uses `isTextInput` to only react to "keyboard" focus events.
143
+ *
144
+ * Checks for external keyboard and scrolls to the focused element after any animations, e.g. keyboard open.
145
+ *
139
146
  */
140
- const onFocusIn = (e) => {
141
- if (!e.target || !(0, exports.isTextInput)(e.target))
142
- return;
143
- updateHasExternalKeyboardAfterFocus();
144
- scrollToElementAfterFocus(e.target);
147
+ const onFocusIn = e => {
148
+ if (!e.target || !isTextInput(e.target)) return;
149
+ updateHasExternalKeyboardAfterFocus();
150
+ scrollToElementAfterFocus(e.target);
145
151
  };
146
- /**
147
- * Event handler for "focusout" event.
148
- *
149
- * "focusout" bubbles up from all focus events, so uses `isTextInput` to only react to "keyboard" focus events.
150
- *
151
- * Clears any pending timeouts from "focusin" events.
152
- *
152
+
153
+ /**
154
+ * Event handler for "focusout" event.
155
+ *
156
+ * "focusout" bubbles up from all focus events, so uses `isTextInput` to only react to "keyboard" focus events.
157
+ *
158
+ * Clears any pending timeouts from "focusin" events.
159
+ *
153
160
  */
154
- const onFocusOut = (e) => {
155
- if (!e.target || !(0, exports.isTextInput)(e.target))
156
- return;
157
- if (updateHasExternalKeyboardAfterFocusTimeout) {
158
- window.clearTimeout(updateHasExternalKeyboardAfterFocusTimeout);
159
- updateHasExternalKeyboardAfterFocusTimeout = undefined;
160
- }
161
- if (scrollToElementAfterFocusTimeout) {
162
- window.clearTimeout(scrollToElementAfterFocusTimeout);
163
- scrollToElementAfterFocusTimeout = undefined;
164
- }
161
+ const onFocusOut = e => {
162
+ if (!e.target || !isTextInput(e.target)) return;
163
+ if (updateHasExternalKeyboardAfterFocusTimeout) {
164
+ window.clearTimeout(updateHasExternalKeyboardAfterFocusTimeout);
165
+ updateHasExternalKeyboardAfterFocusTimeout = undefined;
166
+ }
167
+ if (scrollToElementAfterFocusTimeout) {
168
+ window.clearTimeout(scrollToElementAfterFocusTimeout);
169
+ scrollToElementAfterFocusTimeout = undefined;
170
+ }
165
171
  };
166
- /**
167
- * Check if the device is using an external keyboard by appending an `input` and focusing it.
168
- *
169
- * This will trigger the `onFocusIn` event handler, which updates the `hasExternalKeyboard` global.
172
+
173
+ /**
174
+ * Check if the device is using an external keyboard by appending an `input` and focusing it.
175
+ *
176
+ * This will trigger the `onFocusIn` event handler, which updates the `hasExternalKeyboard` global.
170
177
  */
171
178
  const checkForExternalKeyboard = () => {
172
- const el = document.createElement('input');
173
- el.type = 'text';
174
- el.autofocus = true;
175
- el.addEventListener('focusin', () => {
176
- // remove the input after the keyboard has displayed, plus a small buffer
177
- window.setTimeout(() => {
178
- el.blur();
179
- el.remove();
180
- }, KEYBOARD_ANIMATION_MS + 100);
181
- });
182
- document.documentElement.append(el);
179
+ const el = document.createElement('input');
180
+ el.type = 'text';
181
+ el.autofocus = true;
182
+ el.addEventListener('focusin', () => {
183
+ // remove the input after the keyboard has displayed, plus a small buffer
184
+ window.setTimeout(() => {
185
+ el.blur();
186
+ el.remove();
187
+ }, KEYBOARD_ANIMATION_MS + 100);
188
+ });
189
+ document.documentElement.append(el);
183
190
  };
184
191
  const setupMobileEventListeners = () => {
185
- if (!(0, exports.isMobileDevice)() || !visualViewport)
186
- return;
187
- // set viewport height var at setup
192
+ if (!isMobileDevice() || !visualViewport) return;
193
+
194
+ // set viewport height var at setup
195
+ setVisualViewportHeightVar();
196
+
197
+ // add event listeners
198
+ visualViewport.addEventListener('resize', () => {
188
199
  setVisualViewportHeightVar();
189
- // add event listeners
190
- visualViewport.addEventListener('resize', () => {
191
- setVisualViewportHeightVar();
192
- // keep the document element scrolled to the top if a ReactModal is open
193
- if (document.body.classList.contains('ReactModal__Body--open')) {
194
- document.documentElement.scrollTop = 0;
195
- }
196
- });
197
- window.addEventListener('focusin', onFocusIn);
198
- window.addEventListener('focusout', onFocusOut);
199
- // check for external keyboard at setup
200
- checkForExternalKeyboard();
200
+
201
+ // keep the document element scrolled to the top if a ReactModal is open
202
+ if (document.body.classList.contains('ReactModal__Body--open')) {
203
+ document.documentElement.scrollTop = 0;
204
+ }
205
+ });
206
+ window.addEventListener('focusin', onFocusIn);
207
+ window.addEventListener('focusout', onFocusOut);
208
+
209
+ // check for external keyboard at setup
210
+ checkForExternalKeyboard();
201
211
  };
202
212
  exports.setupMobileEventListeners = setupMobileEventListeners;
213
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIktFWUJPQVJEX0FOSU1BVElPTl9NUyIsImdldFZlcnRpY2FsbHlTY3JvbGxhYmxlUGFyZW50IiwiZWxlbWVudCIsInN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImV4Y2x1ZGVTdGF0aWNQYXJlbnQiLCJwb3NpdGlvbiIsIm92ZXJmbG93UmVnZXgiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50IiwidGVzdCIsIm92ZXJmbG93Iiwib3ZlcmZsb3dZIiwic2Nyb2xsSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiZG9jdW1lbnQiLCJzY3JvbGxpbmdFbGVtZW50IiwiZXhwb3J0cyIsImdldEZpcnN0UGFyZW50RWxlbWVudFdpdGhDbGFzc05hbWUiLCJjbGFzc05hbWUiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsInVuZGVmaW5lZCIsImlzTW9iaWxlRGV2aWNlIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF4VG91Y2hQb2ludHMiLCJoYXNFeHRlcm5hbEtleWJvYXJkIiwid2luZG93Iiwic2V0SGFzRXh0ZXJuYWxLZXlib2FyZCIsImdldExvZ2dlciIsImRlYnVnIiwid2luZG93V2l0aG91dFR5cGUiLCJzZXRWaXN1YWxWaWV3cG9ydEhlaWdodFZhciIsImhlaWdodCIsInZpc3VhbFZpZXdwb3J0IiwiZG9jdW1lbnRFbGVtZW50Iiwic2V0UHJvcGVydHkiLCJpc1RleHRJbnB1dCIsImVsIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiaW5wdXRFbCIsInR5cGUiLCJpbmNsdWRlcyIsImNvbnRlbnRFZGl0YWJsZSIsInVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dCIsInNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXNUaW1lb3V0IiwidXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXMiLCJjbG9zZWRWaXN1YWxWaWV3cG9ydEhlaWdodCIsInNldFRpbWVvdXQiLCJrZXlib2FyZEhlaWdodCIsInNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXMiLCJzY3JvbGxQYXJlbnQiLCJzY3JvbGxSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicmVjdCIsImJvdHRvbSIsInRvcCIsIm5ld1Njcm9sbFRvcCIsInNjcm9sbFRvcCIsInNjcm9sbFRvIiwiYmVoYXZpb3IiLCJvbkZvY3VzSW4iLCJlIiwidGFyZ2V0Iiwib25Gb2N1c091dCIsImNsZWFyVGltZW91dCIsImNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCIsImNyZWF0ZUVsZW1lbnQiLCJhdXRvZm9jdXMiLCJhZGRFdmVudExpc3RlbmVyIiwiYmx1ciIsInJlbW92ZSIsImFwcGVuZCIsInNldHVwTW9iaWxlRXZlbnRMaXN0ZW5lcnMiLCJib2R5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RvbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcclxuXHJcbmNvbnN0IEtFWUJPQVJEX0FOSU1BVElPTl9NUyA9IDI1MFxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgbmVhcmVzdCB2ZXJ0aWNhbGx5IHNjcm9sbGFibGUgcGFyZW50IG9mIGFuIGVsZW1lbnRcclxuICogQHBhcmFtIHsgSFRNTEVsZW1lbnQgfSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgd2l0aFxyXG4gKiBAcmV0dXJucyBUaGUgbmVhcmVzdCB2ZXJ0aWNhbGx5IHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRWZXJ0aWNhbGx5U2Nyb2xsYWJsZVBhcmVudCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xyXG5cdGxldCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcclxuXHRjb25zdCBleGNsdWRlU3RhdGljUGFyZW50ID0gc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZSdcclxuXHRjb25zdCBvdmVyZmxvd1JlZ2V4ID0gLyhhdXRvfHNjcm9sbHxoaWRkZW4pL1xyXG5cclxuXHRmb3IgKGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7IChwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudCk7ICkge1xyXG5cdFx0c3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBhcmVudClcclxuXHRcdGlmIChleGNsdWRlU3RhdGljUGFyZW50ICYmIHN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykgY29udGludWVcclxuXHRcdGlmIChvdmVyZmxvd1JlZ2V4LnRlc3Qoc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kpICYmIHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0KVxyXG5cdFx0XHRyZXR1cm4gcGFyZW50XHJcblx0fVxyXG5cdHJldHVybiBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGZpcnN0IHBhcmVudCB0aGF0IGhhcyB0aGUgZ2l2ZW4gY2xhc3NOYW1lIGluIGl0cyBjbGFzc0xpc3RcclxuICogQHBhcmFtIGVsZW1lbnQgVGhlIHRhcmdldCBlbGVtZW50XHJcbiAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGNsYXNzTmFtZSB0byBtYXRjaFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldEZpcnN0UGFyZW50RWxlbWVudFdpdGhDbGFzc05hbWUgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XHJcblx0Zm9yIChsZXQgcGFyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50OyAocGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQpOyApIHtcclxuXHRcdGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHJldHVybiBwYXJlbnRcclxuXHR9XHJcblx0cmV0dXJuIHVuZGVmaW5lZFxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHdoZXRoZXIgdGhlIGRldmljZSBiZWluZyB1c2VkIGlzIG9uZSBvZiBzZXZlcmFsIG1haW5zdHJlYW0gbW9iaWxlIGRldmljZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc01vYmlsZURldmljZSA9ICgpID0+IHtcclxuXHRyZXR1cm4gKFxyXG5cdFx0L2FuZHJvaWR8aXBhZHxpcG9kfGlwaG9uZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHxcclxuXHRcdCgvbWFjaW50b3NoL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMpXHJcblx0KVxyXG59XHJcblxyXG4vKiogUmV0dXJuIHdoZXRoZXIgdGhlIGRldmljZSBpcyB1c2luZyBhbiBleHRlcm5hbCBrZXlib2FyZCB2cy4gdGhlIG5hdGl2ZSBvbi1zY3JlZW4gT1Mga2V5Ym9hcmQuICovXHJcbmV4cG9ydCBjb25zdCBoYXNFeHRlcm5hbEtleWJvYXJkID0gKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4gKHdpbmRvdyBhcyBhbnkpLmhhc0V4dGVybmFsS2V5Ym9hcmRcclxuXHJcbi8qKlxyXG4gKiBTZXRzIGB3aW5kb3cuaGFzRXh0ZXJuYWxLZXlib2FyZGAsIHJldHVybmVkIGJ5IGBoYXNFeHRlcm5hbEtleWJvYXJkYC5cclxuICovXHJcbmNvbnN0IHNldEhhc0V4dGVybmFsS2V5Ym9hcmQgPSAoaGFzRXh0ZXJuYWxLZXlib2FyZDogYm9vbGVhbikgPT4ge1xyXG5cdGdldExvZ2dlcigpLmRlYnVnKCdoYXNFeHRlcm5hbEtleWJvYXJkJywgaGFzRXh0ZXJuYWxLZXlib2FyZClcclxuXHRjb25zdCB3aW5kb3dXaXRob3V0VHlwZSA9IHdpbmRvdyBhcyBhbnlcclxuXHR3aW5kb3dXaXRob3V0VHlwZS5oYXNFeHRlcm5hbEtleWJvYXJkID0gaGFzRXh0ZXJuYWxLZXlib2FyZFxyXG59XHJcblxyXG4vKipcclxuICogMTAwdmggaXMga2luZCBvZiBi4oqYcmtlZCBvbiBtb2JpbGUgc2FmYXJpLCB3ZSBoYXZlIHRvIHNldCBpdCBwcm9ncmFtbWF0aWNhbGx5IGhlcmVcclxuICogc28gd2UgY2FuIGNhbGN1bGF0ZSBkZXZpY2UtaW5kZXBlbmRlbnQgdmlld3BvcnQgaGVpZ2h0c1xyXG4gKiBodHRwczovL2FsbHRoaW5nc3NtaXR0eS5jb20vMjAyMC8wNS8xMS9jc3MtZml4LWZvci0xMDB2aC1pbi1tb2JpbGUtd2Via2l0L1xyXG4gKlxyXG4gKiBTZXRzIHRoZSBDU1MgdmFyaWFibGUgYC0tdmlzdWFsLXZpZXdwb3J0LWhlaWdodGAgb24gdGhlIGBkb2N1bWVudEVsZW1lbnRgLzxodG1sPi5cclxuICpcclxuICovXHJcbmNvbnN0IHNldFZpc3VhbFZpZXdwb3J0SGVpZ2h0VmFyID0gKCkgPT4ge1xyXG5cdGNvbnN0IGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogMFxyXG5cdGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12aXN1YWwtdmlld3BvcnQtaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBnaXZlbiBlbGVtZW50IGNhcGFibGUgb2YgdGV4dCBpbnB1dD9cclxuICpcclxuICogQHBhcmFtIGVsIEFuIEhUTUwgZWxlbWVudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzVGV4dElucHV0ID0gKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xyXG5cdGNvbnN0IHRhZ05hbWUgPSBlbC50YWdOYW1lICYmIGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxyXG5cdGlmICh0YWdOYW1lID09PSAndGV4dGFyZWEnKSByZXR1cm4gdHJ1ZVxyXG5cdGlmICh0YWdOYW1lID09PSAnaW5wdXQnKSB7XHJcblx0XHRjb25zdCBpbnB1dEVsID0gZWwgYXMgSFRNTElucHV0RWxlbWVudFxyXG5cdFx0cmV0dXJuIGlucHV0RWwudHlwZSAhPT0gJ2J1dHRvbicgJiYgaW5wdXRFbC50eXBlICE9PSAncmFkaW8nICYmIGlucHV0RWwudHlwZSAhPT0gJ2NoZWNrYm94J1xyXG5cdH1cclxuXHQvLyBRdWlsbCBlZGl0b3JcclxuXHRyZXR1cm4gdGFnTmFtZSA9PT0gJ2RpdicgJiYgZWwuY2xhc3NOYW1lLmluY2x1ZGVzKCdxbC1lZGl0b3InKSAmJiBlbC5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJ1xyXG59XHJcblxyXG5sZXQgdXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcclxubGV0IHNjcm9sbFRvRWxlbWVudEFmdGVyRm9jdXNUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcclxuXHJcbmNvbnN0IHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzID0gKCkgPT4ge1xyXG5cdGNvbnN0IGNsb3NlZFZpc3VhbFZpZXdwb3J0SGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAwXHJcblx0Ly8gd2FpdCBmb3IgdGhlIGtleWJvYXJkIGFuaW1hdGlvblxyXG5cdHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdC8vIGZpbmQgdGhlIGtleWJvYXJkIGhlaWdodCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBpbiB2aWV3cG9ydCBoZWlnaHRcclxuXHRcdGNvbnN0IGtleWJvYXJkSGVpZ2h0ID0gY2xvc2VkVmlzdWFsVmlld3BvcnRIZWlnaHQgLSAodmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAwKVxyXG5cdFx0Ly8gb24gZmlyc3QtbG9hZCB0aGUgaW5wdXQgZm9jdXMgY2FuIGZhaWxcclxuXHRcdC8vIHdoZW4gdGhpcyBoYXBwZW5zIHRoZSBoZWlnaHQgaXMgMCwgYW5kIHRoaXMgT05MWSBoYXBwZW5zIHdoZW4gdGhlcmUgaXMgTk9UIGFuIGV4dGVybmFsIGtleWJvYXJkXHJcblx0XHRpZiAoa2V5Ym9hcmRIZWlnaHQgPT09IDAgJiYgaGFzRXh0ZXJuYWxLZXlib2FyZCgpID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0c2V0SGFzRXh0ZXJuYWxLZXlib2FyZChmYWxzZSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIGlmIHRoZSBrZXlib2FyZCBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDEwMCwgdGhhdCBtZWFucyB0aGUgZnVsbCBvbnNjcmVlbiBrZXlib2FyZCBkaXNwbGF5ZWRcclxuXHRcdFx0Ly8gb3RoZXJ3aXNlLCBvbmx5IHRoZSBzbWFsbCBjb250ZXh0IG1lbnUgZGlzcGxheWVkLCBtZWFuaW5nIHRoZXJlIGlzIGFuIGV4dGVybmFsIGtleWJvYXJkXHJcblx0XHRcdHNldEhhc0V4dGVybmFsS2V5Ym9hcmQoa2V5Ym9hcmRIZWlnaHQgPCAxMDApXHJcblx0XHR9XHJcblxyXG5cdFx0dXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0ID0gdW5kZWZpbmVkXHJcblx0fSwgS0VZQk9BUkRfQU5JTUFUSU9OX01TKVxyXG59XHJcblxyXG5jb25zdCBzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzID0gKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xyXG5cdC8vIHdhaXQgZm9yIHRoZSBrZXlib2FyZCBhbmltYXRpb25cclxuXHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdC8vIGFmdGVyIHRoZSBrZXlib2FyZCBpcyBvcGVuLCBjaGVjayBmb3IgdGhlIGVs4oCZcyBzY3JvbGxhYmxlIHBhcmVudCwgYXMgaXQgY291bGQgaGF2ZSBqdXN0IGJlY29tZSBzY3JvbGxhYmxlXHJcblx0XHRjb25zdCBzY3JvbGxQYXJlbnQgPSBnZXRWZXJ0aWNhbGx5U2Nyb2xsYWJsZVBhcmVudChlbClcclxuXHRcdC8vIGlmIHRoZSBlbCBoYXMgYSBzY3JvbGxhYmxlIHBhcmVudCBvdGhlciB0aGFuIHRoZSBkb2N1bWVudCwgc2Nyb2xsIGl0IGJhY2sgaW50byB2aWV3XHJcblx0XHRpZiAoc2Nyb2xsUGFyZW50ICYmIHNjcm9sbFBhcmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcblx0XHRcdGNvbnN0IHNjcm9sbFJlY3QgPSBzY3JvbGxQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuXHRcdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcblx0XHRcdC8vIG9ubHkgc2Nyb2xsIGludG8gdmlldyBpZiBvdXRzaWRlIG9mIHRoZSBzY3JvbGwgcGFyZW50IGJvdW5kc1xyXG5cdFx0XHRpZiAocmVjdC5ib3R0b20gPCBzY3JvbGxSZWN0LnRvcCB8fCByZWN0LnRvcCA+IHNjcm9sbFJlY3QuYm90dG9tKSB7XHJcblx0XHRcdFx0Y29uc3QgbmV3U2Nyb2xsVG9wID0gc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCArIHJlY3QudG9wIC0gc2Nyb2xsUmVjdC50b3AgLSAxMFxyXG5cdFx0XHRcdGdldExvZ2dlcigpLmRlYnVnKCdzY3JvbGxUb0VsJywgbmV3U2Nyb2xsVG9wKVxyXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXHJcblx0XHRcdFx0aWYgKHNjcm9sbFBhcmVudC5zY3JvbGxUbykge1xyXG5cdFx0XHRcdFx0c2Nyb2xsUGFyZW50LnNjcm9sbFRvKHsgdG9wOiBuZXdTY3JvbGxUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0c2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1c1RpbWVvdXQgPSB1bmRlZmluZWRcclxuXHR9LCBLRVlCT0FSRF9BTklNQVRJT05fTVMpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFdmVudCBoYW5kbGVyIGZvciBcImZvY3VzaW5cIiBldmVudC5cclxuICpcclxuICogXCJmb2N1c2luXCIgYnViYmxlcyB1cCBmcm9tIGFsbCBmb2N1cyBldmVudHMsIHNvIHVzZXMgYGlzVGV4dElucHV0YCB0byBvbmx5IHJlYWN0IHRvIFwia2V5Ym9hcmRcIiBmb2N1cyBldmVudHMuXHJcbiAqXHJcbiAqIENoZWNrcyBmb3IgZXh0ZXJuYWwga2V5Ym9hcmQgYW5kIHNjcm9sbHMgdG8gdGhlIGZvY3VzZWQgZWxlbWVudCBhZnRlciBhbnkgYW5pbWF0aW9ucywgZS5nLiBrZXlib2FyZCBvcGVuLlxyXG4gKlxyXG4gKi9cclxuY29uc3Qgb25Gb2N1c0luID0gKGU6IEV2ZW50KSA9PiB7XHJcblx0aWYgKCFlLnRhcmdldCB8fCAhaXNUZXh0SW5wdXQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSByZXR1cm5cclxuXHR1cGRhdGVIYXNFeHRlcm5hbEtleWJvYXJkQWZ0ZXJGb2N1cygpXHJcblx0c2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1cyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIEV2ZW50IGhhbmRsZXIgZm9yIFwiZm9jdXNvdXRcIiBldmVudC5cclxuICpcclxuICogXCJmb2N1c291dFwiIGJ1YmJsZXMgdXAgZnJvbSBhbGwgZm9jdXMgZXZlbnRzLCBzbyB1c2VzIGBpc1RleHRJbnB1dGAgdG8gb25seSByZWFjdCB0byBcImtleWJvYXJkXCIgZm9jdXMgZXZlbnRzLlxyXG4gKlxyXG4gKiBDbGVhcnMgYW55IHBlbmRpbmcgdGltZW91dHMgZnJvbSBcImZvY3VzaW5cIiBldmVudHMuXHJcbiAqXHJcbiAqL1xyXG5jb25zdCBvbkZvY3VzT3V0ID0gKGU6IEV2ZW50KSA9PiB7XHJcblx0aWYgKCFlLnRhcmdldCB8fCAhaXNUZXh0SW5wdXQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSByZXR1cm5cclxuXHRpZiAodXBkYXRlSGFzRXh0ZXJuYWxLZXlib2FyZEFmdGVyRm9jdXNUaW1lb3V0KSB7XHJcblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dClcclxuXHRcdHVwZGF0ZUhhc0V4dGVybmFsS2V5Ym9hcmRBZnRlckZvY3VzVGltZW91dCA9IHVuZGVmaW5lZFxyXG5cdH1cclxuXHRpZiAoc2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1c1RpbWVvdXQpIHtcclxuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoc2Nyb2xsVG9FbGVtZW50QWZ0ZXJGb2N1c1RpbWVvdXQpXHJcblx0XHRzY3JvbGxUb0VsZW1lbnRBZnRlckZvY3VzVGltZW91dCA9IHVuZGVmaW5lZFxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgdXNpbmcgYW4gZXh0ZXJuYWwga2V5Ym9hcmQgYnkgYXBwZW5kaW5nIGFuIGBpbnB1dGAgYW5kIGZvY3VzaW5nIGl0LlxyXG4gKlxyXG4gKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYG9uRm9jdXNJbmAgZXZlbnQgaGFuZGxlciwgd2hpY2ggdXBkYXRlcyB0aGUgYGhhc0V4dGVybmFsS2V5Ym9hcmRgIGdsb2JhbC5cclxuICovXHJcbmNvbnN0IGNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCA9ICgpID0+IHtcclxuXHRjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuXHRlbC50eXBlID0gJ3RleHQnXHJcblx0ZWwuYXV0b2ZvY3VzID0gdHJ1ZVxyXG5cdGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCAoKSA9PiB7XHJcblx0XHQvLyByZW1vdmUgdGhlIGlucHV0IGFmdGVyIHRoZSBrZXlib2FyZCBoYXMgZGlzcGxheWVkLCBwbHVzIGEgc21hbGwgYnVmZmVyXHJcblx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGVsLmJsdXIoKVxyXG5cdFx0XHRlbC5yZW1vdmUoKVxyXG5cdFx0fSwgS0VZQk9BUkRfQU5JTUFUSU9OX01TICsgMTAwKVxyXG5cdH0pXHJcblx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZChlbClcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldHVwTW9iaWxlRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XHJcblx0aWYgKCFpc01vYmlsZURldmljZSgpIHx8ICF2aXN1YWxWaWV3cG9ydCkgcmV0dXJuXHJcblxyXG5cdC8vIHNldCB2aWV3cG9ydCBoZWlnaHQgdmFyIGF0IHNldHVwXHJcblx0c2V0VmlzdWFsVmlld3BvcnRIZWlnaHRWYXIoKVxyXG5cclxuXHQvLyBhZGQgZXZlbnQgbGlzdGVuZXJzXHJcblx0dmlzdWFsVmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xyXG5cdFx0c2V0VmlzdWFsVmlld3BvcnRIZWlnaHRWYXIoKVxyXG5cclxuXHRcdC8vIGtlZXAgdGhlIGRvY3VtZW50IGVsZW1lbnQgc2Nyb2xsZWQgdG8gdGhlIHRvcCBpZiBhIFJlYWN0TW9kYWwgaXMgb3BlblxyXG5cdFx0aWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdSZWFjdE1vZGFsX19Cb2R5LS1vcGVuJykpIHtcclxuXHRcdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDBcclxuXHRcdH1cclxuXHR9KVxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25Gb2N1c0luKVxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXQpXHJcblxyXG5cdC8vIGNoZWNrIGZvciBleHRlcm5hbCBrZXlib2FyZCBhdCBzZXR1cFxyXG5cdGNoZWNrRm9yRXh0ZXJuYWxLZXlib2FyZCgpXHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxP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
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDomainIdentifierTypePluralString = exports.getDomainIdentifierTypeString = void 0;
4
- const shard_1 = require("./shard");
5
- const getDomainIdentifierTypeString = () => (0, shard_1.isPurdueShard)() ? 'Purdue career account alias or PUID' : 'Email Address';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getDomainIdentifierTypeString = exports.getDomainIdentifierTypePluralString = void 0;
7
+ var _shard = require("./shard");
8
+ const getDomainIdentifierTypeString = () => (0, _shard.isPurdueShard)() ? 'Purdue career account alias or PUID' : 'Email Address';
6
9
  exports.getDomainIdentifierTypeString = getDomainIdentifierTypeString;
7
- const getDomainIdentifierTypePluralString = () => (0, shard_1.isPurdueShard)() ? 'Purdue career account aliases or PUIDs' : 'Email Addresses';
10
+ const getDomainIdentifierTypePluralString = () => (0, _shard.isPurdueShard)() ? 'Purdue career account aliases or PUIDs' : 'Email Addresses';
8
11
  exports.getDomainIdentifierTypePluralString = getDomainIdentifierTypePluralString;
12
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2hhcmQiLCJyZXF1aXJlIiwiZ2V0RG9tYWluSWRlbnRpZmllclR5cGVTdHJpbmciLCJpc1B1cmR1ZVNoYXJkIiwiZXhwb3J0cyIsImdldERvbWFpbklkZW50aWZpZXJUeXBlUGx1cmFsU3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RvbWFpbklkZW50aWZpZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQdXJkdWVTaGFyZCB9IGZyb20gJy4vc2hhcmQnXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RG9tYWluSWRlbnRpZmllclR5cGVTdHJpbmcgPSAoKSA9PlxyXG5cdGlzUHVyZHVlU2hhcmQoKSA/ICdQdXJkdWUgY2FyZWVyIGFjY291bnQgYWxpYXMgb3IgUFVJRCcgOiAnRW1haWwgQWRkcmVzcydcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREb21haW5JZGVudGlmaWVyVHlwZVBsdXJhbFN0cmluZyA9ICgpID0+XHJcblx0aXNQdXJkdWVTaGFyZCgpID8gJ1B1cmR1ZSBjYXJlZXIgYWNjb3VudCBhbGlhc2VzIG9yIFBVSURzJyA6ICdFbWFpbCBBZGRyZXNzZXMnXHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBRU8sTUFBTUMsNkJBQTZCLEdBQUdBLENBQUEsS0FDNUMsSUFBQUMsb0JBQWEsRUFBQyxDQUFDLEdBQUcscUNBQXFDLEdBQUcsZUFBZTtBQUFBQyxPQUFBLENBQUFGLDZCQUFBLEdBQUFBLDZCQUFBO0FBRW5FLE1BQU1HLG1DQUFtQyxHQUFHQSxDQUFBLEtBQ2xELElBQUFGLG9CQUFhLEVBQUMsQ0FBQyxHQUFHLHdDQUF3QyxHQUFHLGlCQUFpQjtBQUFBQyxPQUFBLENBQUFDLG1DQUFBLEdBQUFBLG1DQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -1,5 +1,9 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
3
6
  exports.getRootModelName = void 0;
4
- const getRootModelName = (props) => props.modelName.split('.').slice(0, -1).join('.');
7
+ const getRootModelName = props => props.modelName.split('.').slice(0, -1).join('.');
5
8
  exports.getRootModelName = getRootModelName;
9
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRSb290TW9kZWxOYW1lIiwicHJvcHMiLCJtb2RlbE5hbWUiLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZW50aXR5VXNlclJvbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGdldFJvb3RNb2RlbE5hbWUgPSAocHJvcHM6IHsgbW9kZWxOYW1lOiBzdHJpbmcgfSkgPT4gcHJvcHMubW9kZWxOYW1lLnNwbGl0KCcuJykuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLE1BQU1BLGdCQUFnQixHQUFJQyxLQUE0QixJQUFLQSxLQUFLLENBQUNDLFNBQVMsQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFBQUMsT0FBQSxDQUFBTixnQkFBQSxHQUFBQSxnQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,20 +1,22 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
3
6
  exports.constructErrorFromCaughtError = void 0;
4
7
  const constructErrorFromCaughtError = (caughtError, name, message) => {
5
- const error = new Error(message);
6
- error.name = name;
7
- if (caughtError instanceof Error) {
8
- error.message += `${message ? '.\n' : ''}${caughtError.name !== 'Error' ? `${caughtError.name}: ` : ''}${caughtError.message}`;
9
- error.stack = caughtError.stack;
10
- // TODO: use `new Error(message, { cause: caughtError })` once we upgrade TS to allow es2022
11
- }
12
- else if (typeof caughtError === 'string') {
13
- error.message += `${message ? '.\n' : ''}${caughtError}`;
14
- }
15
- else if (caughtError && typeof caughtError === 'object') {
16
- error.message += `${message ? '.\n' : ''}${JSON.stringify(caughtError)}`;
17
- }
18
- return error;
8
+ const error = new Error(message);
9
+ error.name = name;
10
+ if (caughtError instanceof Error) {
11
+ error.message += `${message ? '.\n' : ''}${caughtError.name !== 'Error' ? `${caughtError.name}: ` : ''}${caughtError.message}`;
12
+ error.stack = caughtError.stack;
13
+ // TODO: use `new Error(message, { cause: caughtError })` once we upgrade TS to allow es2022
14
+ } else if (typeof caughtError === 'string') {
15
+ error.message += `${message ? '.\n' : ''}${caughtError}`;
16
+ } else if (caughtError && typeof caughtError === 'object') {
17
+ error.message += `${message ? '.\n' : ''}${JSON.stringify(caughtError)}`;
18
+ }
19
+ return error;
19
20
  };
20
21
  exports.constructErrorFromCaughtError = constructErrorFromCaughtError;
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25zdHJ1Y3RFcnJvckZyb21DYXVnaHRFcnJvciIsImNhdWdodEVycm9yIiwibmFtZSIsIm1lc3NhZ2UiLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJKU09OIiwic3RyaW5naWZ5IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9lcnJvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgY29uc3RydWN0RXJyb3JGcm9tQ2F1Z2h0RXJyb3IgPSAoY2F1Z2h0RXJyb3I6IHVua25vd24sIG5hbWU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykgPT4ge1xyXG5cdGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpXHJcblx0ZXJyb3IubmFtZSA9IG5hbWVcclxuXHRpZiAoY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG5cdFx0ZXJyb3IubWVzc2FnZSArPSBgJHttZXNzYWdlID8gJy5cXG4nIDogJyd9JHtjYXVnaHRFcnJvci5uYW1lICE9PSAnRXJyb3InID8gYCR7Y2F1Z2h0RXJyb3IubmFtZX06IGAgOiAnJ30ke1xyXG5cdFx0XHRjYXVnaHRFcnJvci5tZXNzYWdlXHJcblx0XHR9YFxyXG5cdFx0ZXJyb3Iuc3RhY2sgPSBjYXVnaHRFcnJvci5zdGFja1xyXG5cdFx0Ly8gVE9ETzogdXNlIGBuZXcgRXJyb3IobWVzc2FnZSwgeyBjYXVzZTogY2F1Z2h0RXJyb3IgfSlgIG9uY2Ugd2UgdXBncmFkZSBUUyB0byBhbGxvdyBlczIwMjJcclxuXHR9IGVsc2UgaWYgKHR5cGVvZiBjYXVnaHRFcnJvciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdGVycm9yLm1lc3NhZ2UgKz0gYCR7bWVzc2FnZSA/ICcuXFxuJyA6ICcnfSR7Y2F1Z2h0RXJyb3J9YFxyXG5cdH0gZWxzZSBpZiAoY2F1Z2h0RXJyb3IgJiYgdHlwZW9mIGNhdWdodEVycm9yID09PSAnb2JqZWN0Jykge1xyXG5cdFx0ZXJyb3IubWVzc2FnZSArPSBgJHttZXNzYWdlID8gJy5cXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShjYXVnaHRFcnJvcil9YFxyXG5cdH1cclxuXHRyZXR1cm4gZXJyb3JcclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLE1BQU1BLDZCQUE2QixHQUFHQSxDQUFDQyxXQUFvQixFQUFFQyxJQUFZLEVBQUVDLE9BQWdCLEtBQUs7RUFDdEcsTUFBTUMsS0FBSyxHQUFHLElBQUlDLEtBQUssQ0FBQ0YsT0FBTyxDQUFDO0VBQ2hDQyxLQUFLLENBQUNGLElBQUksR0FBR0EsSUFBSTtFQUNqQixJQUFJRCxXQUFXLFlBQVlJLEtBQUssRUFBRTtJQUNqQ0QsS0FBSyxDQUFDRCxPQUFPLElBQUksR0FBR0EsT0FBTyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUdGLFdBQVcsQ0FBQ0MsSUFBSSxLQUFLLE9BQU8sR0FBRyxHQUFHRCxXQUFXLENBQUNDLElBQUksSUFBSSxHQUFHLEVBQUUsR0FDckdELFdBQVcsQ0FBQ0UsT0FBTyxFQUNsQjtJQUNGQyxLQUFLLENBQUNFLEtBQUssR0FBR0wsV0FBVyxDQUFDSyxLQUFLO0lBQy9CO0VBQ0QsQ0FBQyxNQUFNLElBQUksT0FBT0wsV0FBVyxLQUFLLFFBQVEsRUFBRTtJQUMzQ0csS0FBSyxDQUFDRCxPQUFPLElBQUksR0FBR0EsT0FBTyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUdGLFdBQVcsRUFBRTtFQUN6RCxDQUFDLE1BQU0sSUFBSUEsV0FBVyxJQUFJLE9BQU9BLFdBQVcsS0FBSyxRQUFRLEVBQUU7SUFDMURHLEtBQUssQ0FBQ0QsT0FBTyxJQUFJLEdBQUdBLE9BQU8sR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHSSxJQUFJLENBQUNDLFNBQVMsQ0FBQ1AsV0FBVyxDQUFDLEVBQUU7RUFDekU7RUFDQSxPQUFPRyxLQUFLO0FBQ2IsQ0FBQztBQUFBSyxPQUFBLENBQUFULDZCQUFBLEdBQUFBLDZCQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -1,36 +1,45 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
3
7
  exports.trackCustomEvent = void 0;
4
- const tslib_1 = require("tslib");
5
- const react_ga4_1 = tslib_1.__importDefault(require("react-ga4"));
6
- const constants_1 = require("../constants");
7
- /**
8
- * Send an event to Google Analytics and App Insights
9
- * @param event
8
+ var _reactGa = _interopRequireDefault(require("react-ga4"));
9
+ var _constants = require("../constants");
10
+ /**
11
+ * Send an event to Google Analytics and App Insights
12
+ * @param event
10
13
  */
11
- const trackCustomEvent = (event) => {
12
- const { eventName, category, action, label } = event;
13
- const userId = (0, constants_1.getUserId)();
14
- const appConfig = (0, constants_1.getAppConfig)();
15
- if (appConfig.GOOGLE_ANALYTICS_TRACKING_ID) {
16
- react_ga4_1.default.event(eventName, {
17
- event_category: category,
18
- action: action,
19
- event_label: label,
20
- user_id: userId
21
- });
22
- }
23
- if (appConfig.APP_INSIGHTS_CONNECTION_STRING) {
24
- const appInsights = (0, constants_1.getAppInsights)();
25
- appInsights.trackEvent({
26
- name: eventName,
27
- properties: {
28
- category: category,
29
- action: action,
30
- label: label,
31
- userId: userId
32
- }
33
- });
34
- }
14
+ const trackCustomEvent = event => {
15
+ const {
16
+ eventName,
17
+ category,
18
+ action,
19
+ label
20
+ } = event;
21
+ const userId = (0, _constants.getUserId)();
22
+ const appConfig = (0, _constants.getAppConfig)();
23
+ if (appConfig.GOOGLE_ANALYTICS_TRACKING_ID) {
24
+ _reactGa.default.event(eventName, {
25
+ event_category: category,
26
+ action: action,
27
+ event_label: label,
28
+ user_id: userId
29
+ });
30
+ }
31
+ if (appConfig.APP_INSIGHTS_CONNECTION_STRING) {
32
+ const appInsights = (0, _constants.getAppInsights)();
33
+ appInsights.trackEvent({
34
+ name: eventName,
35
+ properties: {
36
+ category: category,
37
+ action: action,
38
+ label: label,
39
+ userId: userId
40
+ }
41
+ });
42
+ }
35
43
  };
36
44
  exports.trackCustomEvent = trackCustomEvent;
45
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3RHYSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbnN0YW50cyIsInRyYWNrQ3VzdG9tRXZlbnQiLCJldmVudCIsImV2ZW50TmFtZSIsImNhdGVnb3J5IiwiYWN0aW9uIiwibGFiZWwiLCJ1c2VySWQiLCJnZXRVc2VySWQiLCJhcHBDb25maWciLCJnZXRBcHBDb25maWciLCJHT09HTEVfQU5BTFlUSUNTX1RSQUNLSU5HX0lEIiwiZ2EiLCJldmVudF9jYXRlZ29yeSIsImV2ZW50X2xhYmVsIiwidXNlcl9pZCIsIkFQUF9JTlNJR0hUU19DT05ORUNUSU9OX1NUUklORyIsImFwcEluc2lnaHRzIiwiZ2V0QXBwSW5zaWdodHMiLCJ0cmFja0V2ZW50IiwibmFtZSIsInByb3BlcnRpZXMiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2V2ZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2EgZnJvbSAncmVhY3QtZ2E0J1xyXG5pbXBvcnQgeyBnZXRBcHBDb25maWcsIGdldEFwcEluc2lnaHRzLCBnZXRVc2VySWQgfSBmcm9tICcuLi9jb25zdGFudHMnXHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vdHlwZXMvRXZlbnQnXHJcblxyXG4vKipcclxuICogU2VuZCBhbiBldmVudCB0byBHb29nbGUgQW5hbHl0aWNzIGFuZCBBcHAgSW5zaWdodHNcclxuICogQHBhcmFtIGV2ZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhY2tDdXN0b21FdmVudCA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHtcclxuXHRjb25zdCB7IGV2ZW50TmFtZSwgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwgfSA9IGV2ZW50XHJcblx0Y29uc3QgdXNlcklkID0gZ2V0VXNlcklkKClcclxuXHRjb25zdCBhcHBDb25maWcgPSBnZXRBcHBDb25maWcoKVxyXG5cdGlmIChhcHBDb25maWcuR09PR0xFX0FOQUxZVElDU19UUkFDS0lOR19JRCkge1xyXG5cdFx0Z2EuZXZlbnQoZXZlbnROYW1lLCB7XHJcblx0XHRcdGV2ZW50X2NhdGVnb3J5OiBjYXRlZ29yeSxcclxuXHRcdFx0YWN0aW9uOiBhY3Rpb24sXHJcblx0XHRcdGV2ZW50X2xhYmVsOiBsYWJlbCxcclxuXHRcdFx0dXNlcl9pZDogdXNlcklkXHJcblx0XHR9KVxyXG5cdH1cclxuXHRpZiAoYXBwQ29uZmlnLkFQUF9JTlNJR0hUU19DT05ORUNUSU9OX1NUUklORykge1xyXG5cdFx0Y29uc3QgYXBwSW5zaWdodHMgPSBnZXRBcHBJbnNpZ2h0cygpXHJcblx0XHRhcHBJbnNpZ2h0cy50cmFja0V2ZW50KHtcclxuXHRcdFx0bmFtZTogZXZlbnROYW1lLFxyXG5cdFx0XHRwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdFx0Y2F0ZWdvcnk6IGNhdGVnb3J5LFxyXG5cdFx0XHRcdGFjdGlvbjogYWN0aW9uLFxyXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCxcclxuXHRcdFx0XHR1c2VySWQ6IHVzZXJJZFxyXG5cdFx0XHR9XHJcblx0XHR9KVxyXG5cdH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxRQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1FLGdCQUFnQixHQUFJQyxLQUFrQixJQUFLO0VBQ3ZELE1BQU07SUFBRUMsU0FBUztJQUFFQyxRQUFRO0lBQUVDLE1BQU07SUFBRUM7RUFBTSxDQUFDLEdBQUdKLEtBQUs7RUFDcEQsTUFBTUssTUFBTSxHQUFHLElBQUFDLG9CQUFTLEVBQUMsQ0FBQztFQUMxQixNQUFNQyxTQUFTLEdBQUcsSUFBQUMsdUJBQVksRUFBQyxDQUFDO0VBQ2hDLElBQUlELFNBQVMsQ0FBQ0UsNEJBQTRCLEVBQUU7SUFDM0NDLGdCQUFFLENBQUNWLEtBQUssQ0FBQ0MsU0FBUyxFQUFFO01BQ25CVSxjQUFjLEVBQUVULFFBQVE7TUFDeEJDLE1BQU0sRUFBRUEsTUFBTTtNQUNkUyxXQUFXLEVBQUVSLEtBQUs7TUFDbEJTLE9BQU8sRUFBRVI7SUFDVixDQUFDLENBQUM7RUFDSDtFQUNBLElBQUlFLFNBQVMsQ0FBQ08sOEJBQThCLEVBQUU7SUFDN0MsTUFBTUMsV0FBVyxHQUFHLElBQUFDLHlCQUFjLEVBQUMsQ0FBQztJQUNwQ0QsV0FBVyxDQUFDRSxVQUFVLENBQUM7TUFDdEJDLElBQUksRUFBRWpCLFNBQVM7TUFDZmtCLFVBQVUsRUFBRTtRQUNYakIsUUFBUSxFQUFFQSxRQUFRO1FBQ2xCQyxNQUFNLEVBQUVBLE1BQU07UUFDZEMsS0FBSyxFQUFFQSxLQUFLO1FBQ1pDLE1BQU0sRUFBRUE7TUFDVDtJQUNELENBQUMsQ0FBQztFQUNIO0FBQ0QsQ0FBQztBQUFBZSxPQUFBLENBQUFyQixnQkFBQSxHQUFBQSxnQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==