studiokit-scaffolding-js 4.3.20 → 4.3.21

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 (334) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +127 -127
  3. package/lib/components/ActionList.d.ts +20 -20
  4. package/lib/components/ActionList.js +94 -94
  5. package/lib/components/AlertDialog.d.ts +18 -18
  6. package/lib/components/AlertDialog.js +21 -21
  7. package/lib/components/AlertWithIcon.d.ts +7 -7
  8. package/lib/components/AlertWithIcon.js +57 -57
  9. package/lib/components/Blots/CustomImageSpec.d.ts +14 -14
  10. package/lib/components/Blots/CustomImageSpec.js +45 -45
  11. package/lib/components/Blots/CustomVideoSpec.d.ts +16 -16
  12. package/lib/components/Blots/CustomVideoSpec.js +47 -47
  13. package/lib/components/ConnectedModal.d.ts +6 -6
  14. package/lib/components/ConnectedModal.js +11 -11
  15. package/lib/components/Dropdowns/GroupsDropdown.d.ts +18 -18
  16. package/lib/components/Dropdowns/GroupsDropdown.js +90 -90
  17. package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +32 -32
  18. package/lib/components/Dropdowns/ManagedNavDropdown.js +118 -118
  19. package/lib/components/Dropdowns/UserDropdown.d.ts +6 -6
  20. package/lib/components/Dropdowns/UserDropdown.js +76 -76
  21. package/lib/components/Dropdowns/index.d.ts +3 -3
  22. package/lib/components/Dropdowns/index.js +12 -12
  23. package/lib/components/EntityOwnerList.d.ts +11 -11
  24. package/lib/components/EntityOwnerList.js +63 -63
  25. package/lib/components/ErrorBoundary.d.ts +11 -11
  26. package/lib/components/ErrorBoundary.js +74 -74
  27. package/lib/components/Forms/DateField.d.ts +13 -13
  28. package/lib/components/Forms/DateField.js +99 -99
  29. package/lib/components/Forms/TimeField.d.ts +11 -11
  30. package/lib/components/Forms/TimeField.js +112 -112
  31. package/lib/components/Forms/index.d.ts +2 -2
  32. package/lib/components/Forms/index.js +14 -14
  33. package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +10 -10
  34. package/lib/components/Groups/CreateEditCopySaveButtons.js +18 -18
  35. package/lib/components/Groups/GroupCreateOrEditCommonProps.d.ts +6 -6
  36. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
  37. package/lib/components/Groups/RosterSyncInfo.d.ts +5 -5
  38. package/lib/components/Groups/RosterSyncInfo.js +54 -54
  39. package/lib/components/HOC/AccessibleAppComponent.d.ts +15 -15
  40. package/lib/components/HOC/AccessibleAppComponent.js +135 -135
  41. package/lib/components/HOC/ActivityRequiredComponent.d.ts +105 -105
  42. package/lib/components/HOC/ActivityRequiredComponent.js +101 -101
  43. package/lib/components/HOC/AsyncComponent.d.ts +37 -37
  44. package/lib/components/HOC/AsyncComponent.js +136 -136
  45. package/lib/components/HOC/AuthenticatedComponent.d.ts +10 -10
  46. package/lib/components/HOC/AuthenticatedComponent.js +104 -104
  47. package/lib/components/HOC/CollectionComponent.d.ts +61 -61
  48. package/lib/components/HOC/CollectionComponent.js +175 -175
  49. package/lib/components/HOC/CollectionFirstItemComponent.d.ts +67 -67
  50. package/lib/components/HOC/CollectionFirstItemComponent.js +94 -94
  51. package/lib/components/HOC/CollectionItemComponent.d.ts +61 -61
  52. package/lib/components/HOC/CollectionItemComponent.js +172 -172
  53. package/lib/components/HOC/ConnectedModalComponent.d.ts +26 -26
  54. package/lib/components/HOC/ConnectedModalComponent.js +110 -110
  55. package/lib/components/HOC/DataDependentComponent.d.ts +61 -61
  56. package/lib/components/HOC/DataDependentComponent.js +90 -90
  57. package/lib/components/HOC/EntityComponent.d.ts +83 -83
  58. package/lib/components/HOC/EntityComponent.js +120 -120
  59. package/lib/components/HOC/FullscreenModalComponent.d.ts +74 -74
  60. package/lib/components/HOC/FullscreenModalComponent.js +173 -173
  61. package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +29 -29
  62. package/lib/components/HOC/GroupActivityRequiredComponent.js +49 -49
  63. package/lib/components/HOC/GuidComponent.d.ts +14 -14
  64. package/lib/components/HOC/GuidComponent.js +72 -72
  65. package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +172 -172
  66. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +72 -72
  67. package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +69 -69
  68. package/lib/components/HOC/ModelErrorRedirectComponent.js +101 -101
  69. package/lib/components/HOC/SearchPersistorComponent.d.ts +85 -85
  70. package/lib/components/HOC/SearchPersistorComponent.js +198 -198
  71. package/lib/components/HOC/UnauthenticatedComponent.d.ts +62 -62
  72. package/lib/components/HOC/UnauthenticatedComponent.js +90 -90
  73. package/lib/components/HOC/UserComponent.d.ts +3 -3
  74. package/lib/components/HOC/UserComponent.js +12 -12
  75. package/lib/components/Icons/IconExternalUser.d.ts +3 -3
  76. package/lib/components/Icons/IconExternalUser.js +24 -24
  77. package/lib/components/Icons/IconImpersonation.d.ts +3 -3
  78. package/lib/components/Icons/IconImpersonation.js +24 -24
  79. package/lib/components/Icons/IconStopImpersonating.d.ts +3 -3
  80. package/lib/components/Icons/IconStopImpersonating.js +24 -24
  81. package/lib/components/Impersonation/Button.d.ts +7 -7
  82. package/lib/components/Impersonation/Button.js +61 -61
  83. package/lib/components/Impersonation/Link.d.ts +7 -7
  84. package/lib/components/Impersonation/Link.js +58 -58
  85. package/lib/components/Impersonation/UserDetail.css +22 -22
  86. package/lib/components/Impersonation/UserDetail.d.ts +22 -22
  87. package/lib/components/Impersonation/UserDetail.js +23 -23
  88. package/lib/components/Loading.d.ts +4 -4
  89. package/lib/components/Loading.js +24 -24
  90. package/lib/components/Lti/Confirm.d.ts +8 -8
  91. package/lib/components/Lti/Confirm.js +37 -37
  92. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +15 -15
  93. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +83 -83
  94. package/lib/components/Lti/Launch.d.ts +21 -21
  95. package/lib/components/Lti/Launch.js +52 -52
  96. package/lib/components/Lti/LaunchGroup.d.ts +9 -9
  97. package/lib/components/Lti/LaunchGroup.js +45 -45
  98. package/lib/components/NewVersionAlert.d.ts +18 -18
  99. package/lib/components/NewVersionAlert.js +97 -97
  100. package/lib/components/NotFound.d.ts +3 -3
  101. package/lib/components/NotFound.js +28 -28
  102. package/lib/components/Notifications.d.ts +39 -39
  103. package/lib/components/Notifications.js +175 -175
  104. package/lib/components/RefreshIndicator/Bordered.d.ts +7 -7
  105. package/lib/components/RefreshIndicator/Bordered.js +35 -35
  106. package/lib/components/RefreshIndicator/Inline.d.ts +4 -4
  107. package/lib/components/RefreshIndicator/Inline.js +36 -36
  108. package/lib/components/RefreshIndicator/index.d.ts +21 -21
  109. package/lib/components/RefreshIndicator/index.js +116 -116
  110. package/lib/components/SearchControls.d.ts +14 -14
  111. package/lib/components/SearchControls.js +34 -34
  112. package/lib/components/SentryRoute.d.ts +3 -3
  113. package/lib/components/SentryRoute.js +25 -25
  114. package/lib/components/Tables/RoleFilter.d.ts +14 -14
  115. package/lib/components/Tables/RoleFilter.js +53 -53
  116. package/lib/components/Tables/TextFilter.d.ts +7 -7
  117. package/lib/components/Tables/TextFilter.js +26 -26
  118. package/lib/components/UserRoles/Add.d.ts +31 -31
  119. package/lib/components/UserRoles/Add.js +165 -165
  120. package/lib/components/UserRoles/RoleCell.d.ts +21 -21
  121. package/lib/components/UserRoles/RoleCell.js +53 -53
  122. package/lib/components/UserRoles/Select.d.ts +27 -27
  123. package/lib/components/UserRoles/Select.js +44 -44
  124. package/lib/components/UserRoles/Table.d.ts +16 -16
  125. package/lib/components/UserRoles/Table.js +99 -99
  126. package/lib/components/UserRoles/index.d.ts +76 -76
  127. package/lib/components/UserRoles/index.js +361 -361
  128. package/lib/constants/baseActivity.d.ts +25 -25
  129. package/lib/constants/baseActivity.js +29 -29
  130. package/lib/constants/baseRole.d.ts +9 -9
  131. package/lib/constants/baseRole.js +13 -13
  132. package/lib/constants/configuration.d.ts +8 -8
  133. package/lib/constants/configuration.js +39 -39
  134. package/lib/constants/externalProviderType.d.ts +5 -5
  135. package/lib/constants/externalProviderType.js +9 -9
  136. package/lib/constants/index.d.ts +8 -8
  137. package/lib/constants/index.js +20 -20
  138. package/lib/constants/mockData.d.ts +82 -84
  139. package/lib/constants/mockData.js +379 -379
  140. package/lib/constants/modelStatus.d.ts +10 -10
  141. package/lib/constants/modelStatus.js +14 -14
  142. package/lib/constants/notificationType.d.ts +7 -7
  143. package/lib/constants/notificationType.js +11 -11
  144. package/lib/constants/shard.d.ts +6 -6
  145. package/lib/constants/shard.js +10 -10
  146. package/lib/constants/tier.d.ts +6 -6
  147. package/lib/constants/tier.js +10 -10
  148. package/lib/constants/userRole.d.ts +2 -2
  149. package/lib/constants/userRole.js +21 -21
  150. package/lib/css/base/_base.css +98 -98
  151. package/lib/css/base/_typography.css +130 -130
  152. package/lib/css/components/_alert.css +85 -85
  153. package/lib/css/components/_bootstrap-grid.css +28 -28
  154. package/lib/css/components/_buttons.css +325 -325
  155. package/lib/css/components/_forms.css +91 -91
  156. package/lib/css/components/_menu.css +56 -56
  157. package/lib/css/components/_modals.css +41 -41
  158. package/lib/css/components/_tables.css +426 -426
  159. package/lib/css/components/_tags.css +12 -12
  160. package/lib/css/index-with-variables.css +14 -14
  161. package/lib/css/index.css +13 -13
  162. package/lib/css/utils/_border.css +463 -463
  163. package/lib/css/utils/_color.css +271 -271
  164. package/lib/css/utils/_display.css +312 -312
  165. package/lib/css/utils/_general.css +48 -48
  166. package/lib/css/utils/_icon.css +16 -16
  167. package/lib/css/utils/_text.css +24 -24
  168. package/lib/css/utils/_width.css +60 -60
  169. package/lib/css/variables.css +70 -70
  170. package/lib/endpointMappings.d.ts +4 -4
  171. package/lib/endpointMappings.js +173 -173
  172. package/lib/hooks/useCollection.d.ts +6 -6
  173. package/lib/hooks/useCollection.js +61 -61
  174. package/lib/hooks/useCollectionConfiguration.d.ts +27 -27
  175. package/lib/hooks/useCollectionConfiguration.js +67 -67
  176. package/lib/hooks/useCollectionItem.d.ts +6 -6
  177. package/lib/hooks/useCollectionItem.js +54 -54
  178. package/lib/hooks/useGuid.d.ts +4 -4
  179. package/lib/hooks/useGuid.js +14 -14
  180. package/lib/hooks/usePrevious.d.ts +5 -5
  181. package/lib/hooks/usePrevious.js +18 -18
  182. package/lib/index.d.ts +8 -8
  183. package/lib/index.js +30 -30
  184. package/lib/redux/actionCreator.d.ts +5 -5
  185. package/lib/redux/actionCreator.js +16 -16
  186. package/lib/redux/actions.d.ts +12 -12
  187. package/lib/redux/actions.js +30 -30
  188. package/lib/redux/configureReducers.d.ts +22 -22
  189. package/lib/redux/configureReducers.js +94 -94
  190. package/lib/redux/configureStore.d.ts +14 -14
  191. package/lib/redux/configureStore.js +118 -118
  192. package/lib/redux/helpers.d.ts +2 -2
  193. package/lib/redux/helpers.js +7 -7
  194. package/lib/redux/reducers/index.d.ts +4 -4
  195. package/lib/redux/reducers/index.js +12 -12
  196. package/lib/redux/reducers/modalsReducer.d.ts +8 -8
  197. package/lib/redux/reducers/modalsReducer.js +54 -54
  198. package/lib/redux/reducers/notificationsReducer.d.ts +9 -9
  199. package/lib/redux/reducers/notificationsReducer.js +27 -27
  200. package/lib/redux/reducers/searchReducer.d.ts +17 -17
  201. package/lib/redux/reducers/searchReducer.js +26 -26
  202. package/lib/redux/sagas/caliperSaga.d.ts +2 -2
  203. package/lib/redux/sagas/caliperSaga.js +296 -296
  204. package/lib/redux/sagas/clockOffsetSaga.d.ts +10 -10
  205. package/lib/redux/sagas/clockOffsetSaga.js +81 -81
  206. package/lib/redux/sagas/configurationSaga.d.ts +1 -1
  207. package/lib/redux/sagas/configurationSaga.js +48 -48
  208. package/lib/redux/sagas/errorSaga.d.ts +2 -2
  209. package/lib/redux/sagas/errorSaga.js +66 -66
  210. package/lib/redux/sagas/identityProviderSaga.d.ts +2 -2
  211. package/lib/redux/sagas/identityProviderSaga.js +91 -91
  212. package/lib/redux/sagas/initialDataLoadSaga.d.ts +1 -1
  213. package/lib/redux/sagas/initialDataLoadSaga.js +33 -33
  214. package/lib/redux/sagas/postLoginDataSaga.d.ts +9 -9
  215. package/lib/redux/sagas/postLoginDataSaga.js +87 -87
  216. package/lib/redux/sagas/postLoginRedirectSaga.d.ts +6 -6
  217. package/lib/redux/sagas/postLoginRedirectSaga.js +96 -96
  218. package/lib/redux/sagas/rootSaga.d.ts +5 -5
  219. package/lib/redux/sagas/rootSaga.js +144 -144
  220. package/lib/redux/sagas/sentrySaga.d.ts +1 -1
  221. package/lib/redux/sagas/sentrySaga.js +103 -103
  222. package/lib/services/codeProviderService.d.ts +3 -3
  223. package/lib/services/codeProviderService.js +36 -36
  224. package/lib/services/documentService.d.ts +10 -10
  225. package/lib/services/documentService.js +17 -17
  226. package/lib/services/persistenceService.d.ts +13 -13
  227. package/lib/services/persistenceService.js +45 -45
  228. package/lib/services/ticketProviderService.d.ts +3 -3
  229. package/lib/services/ticketProviderService.js +40 -40
  230. package/lib/services/windowService.d.ts +9 -9
  231. package/lib/services/windowService.js +15 -15
  232. package/lib/setupTests.d.ts +1 -1
  233. package/lib/setupTests.js +25 -25
  234. package/lib/startup.d.ts +29 -29
  235. package/lib/startup.js +128 -128
  236. package/lib/types/AppConfiguration.d.ts +32 -32
  237. package/lib/types/AppConfiguration.js +2 -2
  238. package/lib/types/Artifact.d.ts +14 -14
  239. package/lib/types/Artifact.js +9 -9
  240. package/lib/types/BaseReduxState.d.ts +57 -57
  241. package/lib/types/BaseReduxState.js +2 -2
  242. package/lib/types/Client.d.ts +6 -6
  243. package/lib/types/Client.js +2 -2
  244. package/lib/types/Collection.d.ts +175 -175
  245. package/lib/types/Collection.js +2 -2
  246. package/lib/types/Configuration.d.ts +12 -12
  247. package/lib/types/Configuration.js +2 -2
  248. package/lib/types/DeepLinkingResponseRequest.d.ts +4 -4
  249. package/lib/types/DeepLinkingResponseRequest.js +2 -2
  250. package/lib/types/DeletableModel.d.ts +4 -4
  251. package/lib/types/DeletableModel.js +2 -2
  252. package/lib/types/External.d.ts +31 -31
  253. package/lib/types/External.js +2 -2
  254. package/lib/types/Group.d.ts +19 -19
  255. package/lib/types/Group.js +2 -2
  256. package/lib/types/IdentityProvider.d.ts +11 -11
  257. package/lib/types/IdentityProvider.js +2 -2
  258. package/lib/types/LtiLaunch.d.ts +20 -20
  259. package/lib/types/LtiLaunch.js +2 -2
  260. package/lib/types/NameOnlyEntity.d.ts +3 -3
  261. package/lib/types/NameOnlyEntity.js +2 -2
  262. package/lib/types/Notification.d.ts +15 -15
  263. package/lib/types/Notification.js +2 -2
  264. package/lib/types/OptionalRecord.d.ts +4 -4
  265. package/lib/types/OptionalRecord.js +2 -2
  266. package/lib/types/OwnerSchedule.d.ts +9 -9
  267. package/lib/types/OwnerSchedule.js +2 -2
  268. package/lib/types/PropertyOfType.d.ts +12 -12
  269. package/lib/types/PropertyOfType.js +2 -2
  270. package/lib/types/RoleDescription.d.ts +4 -4
  271. package/lib/types/RoleDescription.js +2 -2
  272. package/lib/types/Search.d.ts +11 -11
  273. package/lib/types/Search.js +2 -2
  274. package/lib/types/SimpleLocation.d.ts +46 -46
  275. package/lib/types/SimpleLocation.js +2 -2
  276. package/lib/types/UniTime.d.ts +17 -17
  277. package/lib/types/UniTime.js +2 -2
  278. package/lib/types/User.d.ts +68 -68
  279. package/lib/types/User.js +2 -2
  280. package/lib/types/UserRole.d.ts +19 -19
  281. package/lib/types/UserRole.js +2 -2
  282. package/lib/types/index.d.ts +21 -21
  283. package/lib/types/index.js +33 -33
  284. package/lib/utils/baseActivity.d.ts +63 -63
  285. package/lib/utils/baseActivity.js +155 -155
  286. package/lib/utils/baseRole.d.ts +2 -2
  287. package/lib/utils/baseRole.js +38 -38
  288. package/lib/utils/collection.d.ts +43 -43
  289. package/lib/utils/collection.js +337 -337
  290. package/lib/utils/date.d.ts +162 -162
  291. package/lib/utils/date.js +401 -401
  292. package/lib/utils/domainIdentifier.d.ts +2 -2
  293. package/lib/utils/domainIdentifier.js +12 -12
  294. package/lib/utils/entityUserRole.d.ts +3 -3
  295. package/lib/utils/entityUserRole.js +7 -7
  296. package/lib/utils/externalGroup.d.ts +4 -4
  297. package/lib/utils/externalGroup.js +32 -32
  298. package/lib/utils/externalProviders.d.ts +2 -2
  299. package/lib/utils/externalProviders.js +11 -11
  300. package/lib/utils/externalTerms.d.ts +2 -2
  301. package/lib/utils/externalTerms.js +10 -10
  302. package/lib/utils/group.d.ts +15 -15
  303. package/lib/utils/group.js +15 -15
  304. package/lib/utils/groupDates.d.ts +9 -9
  305. package/lib/utils/groupDates.js +52 -52
  306. package/lib/utils/groupRoles.d.ts +8 -8
  307. package/lib/utils/groupRoles.js +42 -42
  308. package/lib/utils/logger.d.ts +10 -10
  309. package/lib/utils/logger.js +34 -34
  310. package/lib/utils/lti.d.ts +3 -3
  311. package/lib/utils/lti.js +9 -9
  312. package/lib/utils/model.d.ts +15 -15
  313. package/lib/utils/model.js +58 -58
  314. package/lib/utils/number.d.ts +13 -13
  315. package/lib/utils/number.js +32 -32
  316. package/lib/utils/promise.d.ts +5 -5
  317. package/lib/utils/promise.js +17 -17
  318. package/lib/utils/route.d.ts +5 -5
  319. package/lib/utils/route.js +69 -69
  320. package/lib/utils/shard.d.ts +3 -3
  321. package/lib/utils/shard.js +45 -45
  322. package/lib/utils/sort.d.ts +11 -11
  323. package/lib/utils/sort.js +69 -69
  324. package/lib/utils/string.d.ts +2 -2
  325. package/lib/utils/string.js +16 -16
  326. package/lib/utils/timezone.d.ts +2 -2
  327. package/lib/utils/timezone.js +32 -32
  328. package/lib/utils/url.d.ts +23 -23
  329. package/lib/utils/url.js +163 -163
  330. package/lib/utils/user.d.ts +8 -8
  331. package/lib/utils/user.js +73 -73
  332. package/lib/utils/userRole.d.ts +21 -21
  333. package/lib/utils/userRole.js +48 -48
  334. package/package.json +192 -192
package/lib/utils/sort.js CHANGED
@@ -1,69 +1,69 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sort = exports.sortByNameNatural = exports.sortByNames = exports.sortByAttributeNumeric = exports.sortByAttribute = void 0;
4
- var sortByAttribute = function (attributeName, shouldSortAscending) {
5
- if (shouldSortAscending === void 0) { shouldSortAscending = true; }
6
- return function (a, b) {
7
- // Typescript doesn't seem to recognize type guards with generics
8
- var attrA = a[attributeName] ? a[attributeName].toUpperCase() : '';
9
- var attrB = b[attributeName] ? b[attributeName].toUpperCase() : '';
10
- var sortResult = 0;
11
- if (attrA === '') {
12
- sortResult = 1;
13
- }
14
- else if (attrB === '') {
15
- sortResult = -1;
16
- }
17
- else if (attrA === attrB) {
18
- return 0;
19
- }
20
- if (attrA < attrB) {
21
- sortResult = -1;
22
- }
23
- else if (attrA > attrB) {
24
- sortResult = 1;
25
- }
26
- return shouldSortAscending ? sortResult : -1 * sortResult;
27
- };
28
- };
29
- exports.sortByAttribute = sortByAttribute;
30
- var sortByAttributeNumeric = function (attribute) { return function (a, b) {
31
- if (a[attribute] === b[attribute]) {
32
- return 0;
33
- }
34
- if (a[attribute] > b[attribute]) {
35
- return 1;
36
- }
37
- if (a[attribute] < b[attribute]) {
38
- return -1;
39
- }
40
- return 0;
41
- }; };
42
- exports.sortByAttributeNumeric = sortByAttributeNumeric;
43
- // Requires at least last name or email address for each user
44
- var sortByNames = function (a, b) {
45
- if ((!a.lastName && !a.email) || (!b.lastName && !b.email)) {
46
- throw new Error('Last name or email required');
47
- }
48
- // (last name or email) => first name
49
- var lastNameA = a.lastName ? a.lastName.toLowerCase() : a.email ? a.email : '';
50
- var lastNameB = b.lastName ? b.lastName.toLowerCase() : b.email ? b.email : '';
51
- if (lastNameA !== lastNameB) {
52
- return lastNameA > lastNameB ? 1 : -1;
53
- }
54
- var firstNameA = a.firstName ? a.firstName.toLowerCase() : '';
55
- var firstNameB = b.firstName ? b.firstName.toLowerCase() : '';
56
- if (firstNameA !== firstNameB) {
57
- return firstNameA > firstNameB ? 1 : -1;
58
- }
59
- return 0;
60
- };
61
- exports.sortByNames = sortByNames;
62
- var sortByNameNatural = function (a, b) {
63
- return a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' });
64
- };
65
- exports.sortByNameNatural = sortByNameNatural;
66
- var sort = function (array, attributeName, shouldSortAscending) {
67
- return array.slice().sort(exports.sortByAttribute(attributeName, shouldSortAscending));
68
- };
69
- exports.sort = sort;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sort = exports.sortByNameNatural = exports.sortByNames = exports.sortByAttributeNumeric = exports.sortByAttribute = void 0;
4
+ var sortByAttribute = function (attributeName, shouldSortAscending) {
5
+ if (shouldSortAscending === void 0) { shouldSortAscending = true; }
6
+ return function (a, b) {
7
+ // Typescript doesn't seem to recognize type guards with generics
8
+ var attrA = a[attributeName] ? a[attributeName].toUpperCase() : '';
9
+ var attrB = b[attributeName] ? b[attributeName].toUpperCase() : '';
10
+ var sortResult = 0;
11
+ if (attrA === '') {
12
+ sortResult = 1;
13
+ }
14
+ else if (attrB === '') {
15
+ sortResult = -1;
16
+ }
17
+ else if (attrA === attrB) {
18
+ return 0;
19
+ }
20
+ if (attrA < attrB) {
21
+ sortResult = -1;
22
+ }
23
+ else if (attrA > attrB) {
24
+ sortResult = 1;
25
+ }
26
+ return shouldSortAscending ? sortResult : -1 * sortResult;
27
+ };
28
+ };
29
+ exports.sortByAttribute = sortByAttribute;
30
+ var sortByAttributeNumeric = function (attribute) { return function (a, b) {
31
+ if (a[attribute] === b[attribute]) {
32
+ return 0;
33
+ }
34
+ if (a[attribute] > b[attribute]) {
35
+ return 1;
36
+ }
37
+ if (a[attribute] < b[attribute]) {
38
+ return -1;
39
+ }
40
+ return 0;
41
+ }; };
42
+ exports.sortByAttributeNumeric = sortByAttributeNumeric;
43
+ // Requires at least last name or email address for each user
44
+ var sortByNames = function (a, b) {
45
+ if ((!a.lastName && !a.email) || (!b.lastName && !b.email)) {
46
+ throw new Error('Last name or email required');
47
+ }
48
+ // (last name or email) => first name
49
+ var lastNameA = a.lastName ? a.lastName.toLowerCase() : a.email ? a.email : '';
50
+ var lastNameB = b.lastName ? b.lastName.toLowerCase() : b.email ? b.email : '';
51
+ if (lastNameA !== lastNameB) {
52
+ return lastNameA > lastNameB ? 1 : -1;
53
+ }
54
+ var firstNameA = a.firstName ? a.firstName.toLowerCase() : '';
55
+ var firstNameB = b.firstName ? b.firstName.toLowerCase() : '';
56
+ if (firstNameA !== firstNameB) {
57
+ return firstNameA > firstNameB ? 1 : -1;
58
+ }
59
+ return 0;
60
+ };
61
+ exports.sortByNames = sortByNames;
62
+ var sortByNameNatural = function (a, b) {
63
+ return a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' });
64
+ };
65
+ exports.sortByNameNatural = sortByNameNatural;
66
+ var sort = function (array, attributeName, shouldSortAscending) {
67
+ return array.slice().sort(exports.sortByAttribute(attributeName, shouldSortAscending));
68
+ };
69
+ exports.sort = sort;
@@ -1,2 +1,2 @@
1
- export declare function isPurdueAliasOrPuid(aliasOrPuid: string): boolean;
2
- export declare function isEmail(email: string): boolean;
1
+ export declare function isPurdueAliasOrPuid(aliasOrPuid: string): boolean;
2
+ export declare function isEmail(email: string): boolean;
@@ -1,16 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isEmail = exports.isPurdueAliasOrPuid = void 0;
4
- function isPurdueAliasOrPuid(aliasOrPuid) {
5
- var isPuid = /^\d{10}$/.test(aliasOrPuid);
6
- var isAlias = /^[a-z0-9]{2,8}$/i.test(aliasOrPuid);
7
- return isPuid || isAlias;
8
- }
9
- exports.isPurdueAliasOrPuid = isPurdueAliasOrPuid;
10
- // https://stackoverflow.com/a/1373724
11
- function isEmail(email) {
12
- // eslint-disable-next-line
13
- var regexEmail = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
14
- return regexEmail.test(email);
15
- }
16
- exports.isEmail = isEmail;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isEmail = exports.isPurdueAliasOrPuid = void 0;
4
+ function isPurdueAliasOrPuid(aliasOrPuid) {
5
+ var isPuid = /^\d{10}$/.test(aliasOrPuid);
6
+ var isAlias = /^[a-z0-9]{2,8}$/i.test(aliasOrPuid);
7
+ return isPuid || isAlias;
8
+ }
9
+ exports.isPurdueAliasOrPuid = isPurdueAliasOrPuid;
10
+ // https://stackoverflow.com/a/1373724
11
+ function isEmail(email) {
12
+ // eslint-disable-next-line
13
+ var regexEmail = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
14
+ return regexEmail.test(email);
15
+ }
16
+ exports.isEmail = isEmail;
@@ -1,2 +1,2 @@
1
- export declare const getDefaultTimeZoneId: () => string;
2
- export declare const guessTimeZoneId: () => string;
1
+ export declare const getDefaultTimeZoneId: () => string;
2
+ export declare const guessTimeZoneId: () => string;
@@ -1,32 +1,32 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.guessTimeZoneId = exports.getDefaultTimeZoneId = void 0;
23
- var moment = __importStar(require("moment-timezone"));
24
- var configuration_1 = require("../constants/configuration");
25
- var defaultTimeZoneId = 'America/Indianapolis';
26
- var getDefaultTimeZoneId = function () {
27
- var shardConfig = configuration_1.getShardConfig();
28
- return !!shardConfig && !!shardConfig.defaultTimeZoneId ? shardConfig.defaultTimeZoneId : defaultTimeZoneId;
29
- };
30
- exports.getDefaultTimeZoneId = getDefaultTimeZoneId;
31
- var guessTimeZoneId = function () { return moment.tz.guess(); };
32
- exports.guessTimeZoneId = guessTimeZoneId;
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.guessTimeZoneId = exports.getDefaultTimeZoneId = void 0;
23
+ var moment = __importStar(require("moment-timezone"));
24
+ var configuration_1 = require("../constants/configuration");
25
+ var defaultTimeZoneId = 'America/Indianapolis';
26
+ var getDefaultTimeZoneId = function () {
27
+ var shardConfig = configuration_1.getShardConfig();
28
+ return !!shardConfig && !!shardConfig.defaultTimeZoneId ? shardConfig.defaultTimeZoneId : defaultTimeZoneId;
29
+ };
30
+ exports.getDefaultTimeZoneId = getDefaultTimeZoneId;
31
+ var guessTimeZoneId = function () { return moment.tz.guess(); };
32
+ exports.guessTimeZoneId = guessTimeZoneId;
@@ -1,23 +1,23 @@
1
- import _ from 'lodash';
2
- import TIER from '../constants/tier';
3
- import { AppConfiguration } from '../types';
4
- export declare function getApiBaseUrl(tier: TIER, apiUrlString: string): string;
5
- export declare function getStorageUrl(config: AppConfiguration, url: string): string;
6
- export declare function hasHttpProtocol(url: string): boolean;
7
- export declare function isUrlValid(url: string): boolean;
8
- export declare function fetchText(url: string, options?: RequestInit): Promise<string>;
9
- export declare enum X_FRAME_OPTIONS {
10
- DENY = "DENY",
11
- SAMEORIGIN = "SAMEORIGIN",
12
- ALLOW_FROM = "ALLOW-FROM"
13
- }
14
- export interface ParsedHeadersResponse {
15
- isValid: boolean;
16
- iFrameAllowed?: boolean;
17
- }
18
- /**
19
- * Using the given headers, determine if a url is allowed to be displayed in an iFrame.
20
- * @param headers An array of request headers.
21
- * @returns The parsed result
22
- */
23
- export declare const parseHeadersResponse: (headers?: _.Dictionary<any> | undefined) => ParsedHeadersResponse;
1
+ import _ from 'lodash';
2
+ import TIER from '../constants/tier';
3
+ import { AppConfiguration } from '../types';
4
+ export declare function getApiBaseUrl(tier: TIER, apiUrlString: string): string;
5
+ export declare function getStorageUrl(config: AppConfiguration, url: string): string;
6
+ export declare function hasHttpProtocol(url: string): boolean;
7
+ export declare function isUrlValid(url: string): boolean;
8
+ export declare function fetchText(url: string, options?: RequestInit): Promise<string>;
9
+ export declare enum X_FRAME_OPTIONS {
10
+ DENY = "DENY",
11
+ SAMEORIGIN = "SAMEORIGIN",
12
+ ALLOW_FROM = "ALLOW-FROM"
13
+ }
14
+ export interface ParsedHeadersResponse {
15
+ isValid: boolean;
16
+ iFrameAllowed?: boolean;
17
+ }
18
+ /**
19
+ * Using the given headers, determine if a url is allowed to be displayed in an iFrame.
20
+ * @param headers An array of request headers.
21
+ * @returns The parsed result
22
+ */
23
+ export declare const parseHeadersResponse: (headers?: _.Dictionary<any> | undefined) => ParsedHeadersResponse;
package/lib/utils/url.js CHANGED
@@ -1,163 +1,163 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- var __importDefault = (this && this.__importDefault) || function (mod) {
39
- return (mod && mod.__esModule) ? mod : { "default": mod };
40
- };
41
- Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.parseHeadersResponse = exports.X_FRAME_OPTIONS = exports.fetchText = exports.isUrlValid = exports.hasHttpProtocol = exports.getStorageUrl = exports.getApiBaseUrl = void 0;
43
- var lodash_1 = __importDefault(require("lodash"));
44
- var shard_1 = __importDefault(require("../constants/shard"));
45
- var tier_1 = __importDefault(require("../constants/tier"));
46
- var windowService_1 = __importDefault(require("../services/windowService"));
47
- var shard_2 = require("./shard");
48
- function getApiBaseUrl(tier, apiUrlString) {
49
- // skip shard logic on LOCAL or if not using a custom domain (e.g. staging)
50
- if (tier === tier_1.default.LOCAL || lodash_1.default.includes(apiUrlString, 'azurewebsites.net')) {
51
- return apiUrlString;
52
- }
53
- var shardKey = shard_2.getShardKey();
54
- // TODO: default ROOT to point to Purdue, until we have a landing marketing page
55
- if (shardKey === shard_1.default.ROOT) {
56
- shardKey = shard_1.default.PURDUE;
57
- }
58
- var protocol = apiUrlString.substring(0, apiUrlString.indexOf('//'));
59
- var host = apiUrlString.substring(apiUrlString.indexOf('://') + 3);
60
- return protocol + "//" + shardKey + (tier === tier_1.default.DEV ? '.dev' : '') + "." + host;
61
- }
62
- exports.getApiBaseUrl = getApiBaseUrl;
63
- function getStorageUrl(config, url) {
64
- return config.TIER === tier_1.default.LOCAL && !!config.STORAGE_URL
65
- ? url.replace('http://127.0.0.1:10000', config.STORAGE_URL)
66
- : url;
67
- }
68
- exports.getStorageUrl = getStorageUrl;
69
- function hasHttpProtocol(url) {
70
- return /^(http|https):\/\//.test(url);
71
- }
72
- exports.hasHttpProtocol = hasHttpProtocol;
73
- function isUrlValid(url) {
74
- return /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=]+$/.test(url);
75
- }
76
- exports.isUrlValid = isUrlValid;
77
- function fetchText(url, options) {
78
- return __awaiter(this, void 0, void 0, function () {
79
- var resp;
80
- return __generator(this, function (_a) {
81
- switch (_a.label) {
82
- case 0: return [4 /*yield*/, fetch(url, options)];
83
- case 1:
84
- resp = _a.sent();
85
- return [2 /*return*/, resp.text()];
86
- }
87
- });
88
- });
89
- }
90
- exports.fetchText = fetchText;
91
- var X_FRAME_OPTIONS;
92
- (function (X_FRAME_OPTIONS) {
93
- X_FRAME_OPTIONS["DENY"] = "DENY";
94
- X_FRAME_OPTIONS["SAMEORIGIN"] = "SAMEORIGIN";
95
- X_FRAME_OPTIONS["ALLOW_FROM"] = "ALLOW-FROM";
96
- })(X_FRAME_OPTIONS = exports.X_FRAME_OPTIONS || (exports.X_FRAME_OPTIONS = {}));
97
- /**
98
- * Using the given headers, determine if a url is allowed to be displayed in an iFrame.
99
- * @param headers An array of request headers.
100
- * @returns The parsed result
101
- */
102
- var parseHeadersResponse = function (headers) {
103
- // default result
104
- var result = {
105
- isValid: false,
106
- iFrameAllowed: undefined
107
- };
108
- if (!headers) {
109
- return result;
110
- }
111
- result.isValid = true;
112
- result.iFrameAllowed = true;
113
- var location = windowService_1.default.getLocation();
114
- // content-security-policy / x-content-security-policy
115
- // can contain 'frame-ancestors <source> <source>' with one or many sources
116
- // iFrameAllowed if it does not contain 'frame-ancestors' or if it does with an acceptable source
117
- var xContentSecurityPolicy = lodash_1.default.find(headers, function (value, key) {
118
- return key.toLowerCase() === 'content-security-policy' || key.toLowerCase() === 'x-content-security-policy';
119
- });
120
- if (xContentSecurityPolicy) {
121
- // define all acceptable frame-ancestors sources
122
- // protocol, full location host, host, and all wildcard permutations
123
- var acceptableSources_1 = [location.protocol, location.protocol + "//" + location.host, location.host];
124
- var hostParts = location.host.split('.');
125
- while (hostParts.length > 2) {
126
- hostParts.shift();
127
- var tempHost = "*." + hostParts.join('.');
128
- acceptableSources_1.push(tempHost);
129
- acceptableSources_1.push(location.protocol + "//" + tempHost);
130
- }
131
- result.iFrameAllowed =
132
- !xContentSecurityPolicy.some(function (x) { return x.indexOf('frame-ancestors ') >= 0; }) ||
133
- xContentSecurityPolicy.some(function (x) {
134
- /**
135
- * Matches
136
- * * the string `frame-ancestors `
137
- * * one or many of the following, followed by a space, semicolon, or end of string
138
- * * `http:`
139
- * * `https:`
140
- * * `'self'`
141
- * * `'none'`
142
- * * url with optional scheme and optional asterisk wildcards
143
- */
144
- var frameAncestorsRegex = /frame-ancestors ((?:(?:(?:http:)|(?:https:)|(?:'self')|(?:'none')|(?:(?:https?:\/\/)?[\w*.-]+(?:\.[\w*.-]+)+[\w-._~:/?#[\]@!$&'()*+,=]+))(?:[ ;]|$))+)/g;
145
- var results = frameAncestorsRegex.exec(x);
146
- if (!results) {
147
- return false;
148
- }
149
- var sources = results[1].split(' ');
150
- return sources.some(function (source) { return acceptableSources_1.some(function (acceptableSource) { return acceptableSource === source; }); });
151
- });
152
- }
153
- // x-frame-options can be ['SAMEORIGIN', 'DENY', 'ALLOW-FROM...']
154
- // iFrameAllowed if the the x-frame-options is 'ALLOW-FROM {app web url}'
155
- var xFrameOptions = lodash_1.default.find(headers, function (value, key) { return key.toLowerCase() === 'x-frame-options'; });
156
- if (xFrameOptions) {
157
- result.iFrameAllowed =
158
- !xFrameOptions.some(function (x) { return x === X_FRAME_OPTIONS.DENY || x === X_FRAME_OPTIONS.SAMEORIGIN; }) &&
159
- xFrameOptions.some(function (x) { return x === X_FRAME_OPTIONS.ALLOW_FROM + " " + location.protocol + "//" + location.host; });
160
- }
161
- return result;
162
- };
163
- exports.parseHeadersResponse = parseHeadersResponse;
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.parseHeadersResponse = exports.X_FRAME_OPTIONS = exports.fetchText = exports.isUrlValid = exports.hasHttpProtocol = exports.getStorageUrl = exports.getApiBaseUrl = void 0;
43
+ var lodash_1 = __importDefault(require("lodash"));
44
+ var shard_1 = __importDefault(require("../constants/shard"));
45
+ var tier_1 = __importDefault(require("../constants/tier"));
46
+ var windowService_1 = __importDefault(require("../services/windowService"));
47
+ var shard_2 = require("./shard");
48
+ function getApiBaseUrl(tier, apiUrlString) {
49
+ // skip shard logic on LOCAL or if not using a custom domain (e.g. staging)
50
+ if (tier === tier_1.default.LOCAL || lodash_1.default.includes(apiUrlString, 'azurewebsites.net')) {
51
+ return apiUrlString;
52
+ }
53
+ var shardKey = shard_2.getShardKey();
54
+ // TODO: default ROOT to point to Purdue, until we have a landing marketing page
55
+ if (shardKey === shard_1.default.ROOT) {
56
+ shardKey = shard_1.default.PURDUE;
57
+ }
58
+ var protocol = apiUrlString.substring(0, apiUrlString.indexOf('//'));
59
+ var host = apiUrlString.substring(apiUrlString.indexOf('://') + 3);
60
+ return protocol + "//" + shardKey + (tier === tier_1.default.DEV ? '.dev' : '') + "." + host;
61
+ }
62
+ exports.getApiBaseUrl = getApiBaseUrl;
63
+ function getStorageUrl(config, url) {
64
+ return config.TIER === tier_1.default.LOCAL && !!config.STORAGE_URL
65
+ ? url.replace('http://127.0.0.1:10000', config.STORAGE_URL)
66
+ : url;
67
+ }
68
+ exports.getStorageUrl = getStorageUrl;
69
+ function hasHttpProtocol(url) {
70
+ return /^(http|https):\/\//.test(url);
71
+ }
72
+ exports.hasHttpProtocol = hasHttpProtocol;
73
+ function isUrlValid(url) {
74
+ return /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=]+$/.test(url);
75
+ }
76
+ exports.isUrlValid = isUrlValid;
77
+ function fetchText(url, options) {
78
+ return __awaiter(this, void 0, void 0, function () {
79
+ var resp;
80
+ return __generator(this, function (_a) {
81
+ switch (_a.label) {
82
+ case 0: return [4 /*yield*/, fetch(url, options)];
83
+ case 1:
84
+ resp = _a.sent();
85
+ return [2 /*return*/, resp.text()];
86
+ }
87
+ });
88
+ });
89
+ }
90
+ exports.fetchText = fetchText;
91
+ var X_FRAME_OPTIONS;
92
+ (function (X_FRAME_OPTIONS) {
93
+ X_FRAME_OPTIONS["DENY"] = "DENY";
94
+ X_FRAME_OPTIONS["SAMEORIGIN"] = "SAMEORIGIN";
95
+ X_FRAME_OPTIONS["ALLOW_FROM"] = "ALLOW-FROM";
96
+ })(X_FRAME_OPTIONS = exports.X_FRAME_OPTIONS || (exports.X_FRAME_OPTIONS = {}));
97
+ /**
98
+ * Using the given headers, determine if a url is allowed to be displayed in an iFrame.
99
+ * @param headers An array of request headers.
100
+ * @returns The parsed result
101
+ */
102
+ var parseHeadersResponse = function (headers) {
103
+ // default result
104
+ var result = {
105
+ isValid: false,
106
+ iFrameAllowed: undefined
107
+ };
108
+ if (!headers) {
109
+ return result;
110
+ }
111
+ result.isValid = true;
112
+ result.iFrameAllowed = true;
113
+ var location = windowService_1.default.getLocation();
114
+ // content-security-policy / x-content-security-policy
115
+ // can contain 'frame-ancestors <source> <source>' with one or many sources
116
+ // iFrameAllowed if it does not contain 'frame-ancestors' or if it does with an acceptable source
117
+ var xContentSecurityPolicy = lodash_1.default.find(headers, function (value, key) {
118
+ return key.toLowerCase() === 'content-security-policy' || key.toLowerCase() === 'x-content-security-policy';
119
+ });
120
+ if (xContentSecurityPolicy) {
121
+ // define all acceptable frame-ancestors sources
122
+ // protocol, full location host, host, and all wildcard permutations
123
+ var acceptableSources_1 = [location.protocol, location.protocol + "//" + location.host, location.host];
124
+ var hostParts = location.host.split('.');
125
+ while (hostParts.length > 2) {
126
+ hostParts.shift();
127
+ var tempHost = "*." + hostParts.join('.');
128
+ acceptableSources_1.push(tempHost);
129
+ acceptableSources_1.push(location.protocol + "//" + tempHost);
130
+ }
131
+ result.iFrameAllowed =
132
+ !xContentSecurityPolicy.some(function (x) { return x.indexOf('frame-ancestors ') >= 0; }) ||
133
+ xContentSecurityPolicy.some(function (x) {
134
+ /**
135
+ * Matches
136
+ * * the string `frame-ancestors `
137
+ * * one or many of the following, followed by a space, semicolon, or end of string
138
+ * * `http:`
139
+ * * `https:`
140
+ * * `'self'`
141
+ * * `'none'`
142
+ * * url with optional scheme and optional asterisk wildcards
143
+ */
144
+ var frameAncestorsRegex = /frame-ancestors ((?:(?:(?:http:)|(?:https:)|(?:'self')|(?:'none')|(?:(?:https?:\/\/)?[\w*.-]+(?:\.[\w*.-]+)+[\w-._~:/?#[\]@!$&'()*+,=]+))(?:[ ;]|$))+)/g;
145
+ var results = frameAncestorsRegex.exec(x);
146
+ if (!results) {
147
+ return false;
148
+ }
149
+ var sources = results[1].split(' ');
150
+ return sources.some(function (source) { return acceptableSources_1.some(function (acceptableSource) { return acceptableSource === source; }); });
151
+ });
152
+ }
153
+ // x-frame-options can be ['SAMEORIGIN', 'DENY', 'ALLOW-FROM...']
154
+ // iFrameAllowed if the the x-frame-options is 'ALLOW-FROM {app web url}'
155
+ var xFrameOptions = lodash_1.default.find(headers, function (value, key) { return key.toLowerCase() === 'x-frame-options'; });
156
+ if (xFrameOptions) {
157
+ result.iFrameAllowed =
158
+ !xFrameOptions.some(function (x) { return x === X_FRAME_OPTIONS.DENY || x === X_FRAME_OPTIONS.SAMEORIGIN; }) &&
159
+ xFrameOptions.some(function (x) { return x === X_FRAME_OPTIONS.ALLOW_FROM + " " + location.protocol + "//" + location.host; });
160
+ }
161
+ return result;
162
+ };
163
+ exports.parseHeadersResponse = parseHeadersResponse;