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.
- package/LICENSE +21 -21
- package/README.md +127 -127
- package/lib/components/ActionList.d.ts +20 -20
- package/lib/components/ActionList.js +94 -94
- package/lib/components/AlertDialog.d.ts +18 -18
- package/lib/components/AlertDialog.js +21 -21
- package/lib/components/AlertWithIcon.d.ts +7 -7
- package/lib/components/AlertWithIcon.js +57 -57
- package/lib/components/Blots/CustomImageSpec.d.ts +14 -14
- package/lib/components/Blots/CustomImageSpec.js +45 -45
- package/lib/components/Blots/CustomVideoSpec.d.ts +16 -16
- package/lib/components/Blots/CustomVideoSpec.js +47 -47
- package/lib/components/ConnectedModal.d.ts +6 -6
- package/lib/components/ConnectedModal.js +11 -11
- package/lib/components/Dropdowns/GroupsDropdown.d.ts +18 -18
- package/lib/components/Dropdowns/GroupsDropdown.js +90 -90
- package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +32 -32
- package/lib/components/Dropdowns/ManagedNavDropdown.js +118 -118
- package/lib/components/Dropdowns/UserDropdown.d.ts +6 -6
- package/lib/components/Dropdowns/UserDropdown.js +76 -76
- package/lib/components/Dropdowns/index.d.ts +3 -3
- package/lib/components/Dropdowns/index.js +12 -12
- package/lib/components/EntityOwnerList.d.ts +11 -11
- package/lib/components/EntityOwnerList.js +63 -63
- package/lib/components/ErrorBoundary.d.ts +11 -11
- package/lib/components/ErrorBoundary.js +74 -74
- package/lib/components/Forms/DateField.d.ts +13 -13
- package/lib/components/Forms/DateField.js +99 -99
- package/lib/components/Forms/TimeField.d.ts +11 -11
- package/lib/components/Forms/TimeField.js +112 -112
- package/lib/components/Forms/index.d.ts +2 -2
- package/lib/components/Forms/index.js +14 -14
- package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +10 -10
- package/lib/components/Groups/CreateEditCopySaveButtons.js +18 -18
- package/lib/components/Groups/GroupCreateOrEditCommonProps.d.ts +6 -6
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
- package/lib/components/Groups/RosterSyncInfo.d.ts +5 -5
- package/lib/components/Groups/RosterSyncInfo.js +54 -54
- package/lib/components/HOC/AccessibleAppComponent.d.ts +15 -15
- package/lib/components/HOC/AccessibleAppComponent.js +135 -135
- package/lib/components/HOC/ActivityRequiredComponent.d.ts +105 -105
- package/lib/components/HOC/ActivityRequiredComponent.js +101 -101
- package/lib/components/HOC/AsyncComponent.d.ts +37 -37
- package/lib/components/HOC/AsyncComponent.js +136 -136
- package/lib/components/HOC/AuthenticatedComponent.d.ts +10 -10
- package/lib/components/HOC/AuthenticatedComponent.js +104 -104
- package/lib/components/HOC/CollectionComponent.d.ts +61 -61
- package/lib/components/HOC/CollectionComponent.js +175 -175
- package/lib/components/HOC/CollectionFirstItemComponent.d.ts +67 -67
- package/lib/components/HOC/CollectionFirstItemComponent.js +94 -94
- package/lib/components/HOC/CollectionItemComponent.d.ts +61 -61
- package/lib/components/HOC/CollectionItemComponent.js +172 -172
- package/lib/components/HOC/ConnectedModalComponent.d.ts +26 -26
- package/lib/components/HOC/ConnectedModalComponent.js +110 -110
- package/lib/components/HOC/DataDependentComponent.d.ts +61 -61
- package/lib/components/HOC/DataDependentComponent.js +90 -90
- package/lib/components/HOC/EntityComponent.d.ts +83 -83
- package/lib/components/HOC/EntityComponent.js +120 -120
- package/lib/components/HOC/FullscreenModalComponent.d.ts +74 -74
- package/lib/components/HOC/FullscreenModalComponent.js +173 -173
- package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +29 -29
- package/lib/components/HOC/GroupActivityRequiredComponent.js +49 -49
- package/lib/components/HOC/GuidComponent.d.ts +14 -14
- package/lib/components/HOC/GuidComponent.js +72 -72
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +172 -172
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +72 -72
- package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +69 -69
- package/lib/components/HOC/ModelErrorRedirectComponent.js +101 -101
- package/lib/components/HOC/SearchPersistorComponent.d.ts +85 -85
- package/lib/components/HOC/SearchPersistorComponent.js +198 -198
- package/lib/components/HOC/UnauthenticatedComponent.d.ts +62 -62
- package/lib/components/HOC/UnauthenticatedComponent.js +90 -90
- package/lib/components/HOC/UserComponent.d.ts +3 -3
- package/lib/components/HOC/UserComponent.js +12 -12
- package/lib/components/Icons/IconExternalUser.d.ts +3 -3
- package/lib/components/Icons/IconExternalUser.js +24 -24
- package/lib/components/Icons/IconImpersonation.d.ts +3 -3
- package/lib/components/Icons/IconImpersonation.js +24 -24
- package/lib/components/Icons/IconStopImpersonating.d.ts +3 -3
- package/lib/components/Icons/IconStopImpersonating.js +24 -24
- package/lib/components/Impersonation/Button.d.ts +7 -7
- package/lib/components/Impersonation/Button.js +61 -61
- package/lib/components/Impersonation/Link.d.ts +7 -7
- package/lib/components/Impersonation/Link.js +58 -58
- package/lib/components/Impersonation/UserDetail.css +22 -22
- package/lib/components/Impersonation/UserDetail.d.ts +22 -22
- package/lib/components/Impersonation/UserDetail.js +23 -23
- package/lib/components/Loading.d.ts +4 -4
- package/lib/components/Loading.js +24 -24
- package/lib/components/Lti/Confirm.d.ts +8 -8
- package/lib/components/Lti/Confirm.js +37 -37
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +15 -15
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +83 -83
- package/lib/components/Lti/Launch.d.ts +21 -21
- package/lib/components/Lti/Launch.js +52 -52
- package/lib/components/Lti/LaunchGroup.d.ts +9 -9
- package/lib/components/Lti/LaunchGroup.js +45 -45
- package/lib/components/NewVersionAlert.d.ts +18 -18
- package/lib/components/NewVersionAlert.js +97 -97
- package/lib/components/NotFound.d.ts +3 -3
- package/lib/components/NotFound.js +28 -28
- package/lib/components/Notifications.d.ts +39 -39
- package/lib/components/Notifications.js +175 -175
- package/lib/components/RefreshIndicator/Bordered.d.ts +7 -7
- package/lib/components/RefreshIndicator/Bordered.js +35 -35
- package/lib/components/RefreshIndicator/Inline.d.ts +4 -4
- package/lib/components/RefreshIndicator/Inline.js +36 -36
- package/lib/components/RefreshIndicator/index.d.ts +21 -21
- package/lib/components/RefreshIndicator/index.js +116 -116
- package/lib/components/SearchControls.d.ts +14 -14
- package/lib/components/SearchControls.js +34 -34
- package/lib/components/SentryRoute.d.ts +3 -3
- package/lib/components/SentryRoute.js +25 -25
- package/lib/components/Tables/RoleFilter.d.ts +14 -14
- package/lib/components/Tables/RoleFilter.js +53 -53
- package/lib/components/Tables/TextFilter.d.ts +7 -7
- package/lib/components/Tables/TextFilter.js +26 -26
- package/lib/components/UserRoles/Add.d.ts +31 -31
- package/lib/components/UserRoles/Add.js +165 -165
- package/lib/components/UserRoles/RoleCell.d.ts +21 -21
- package/lib/components/UserRoles/RoleCell.js +53 -53
- package/lib/components/UserRoles/Select.d.ts +27 -27
- package/lib/components/UserRoles/Select.js +44 -44
- package/lib/components/UserRoles/Table.d.ts +16 -16
- package/lib/components/UserRoles/Table.js +99 -99
- package/lib/components/UserRoles/index.d.ts +76 -76
- package/lib/components/UserRoles/index.js +361 -361
- package/lib/constants/baseActivity.d.ts +25 -25
- package/lib/constants/baseActivity.js +29 -29
- package/lib/constants/baseRole.d.ts +9 -9
- package/lib/constants/baseRole.js +13 -13
- package/lib/constants/configuration.d.ts +8 -8
- package/lib/constants/configuration.js +39 -39
- package/lib/constants/externalProviderType.d.ts +5 -5
- package/lib/constants/externalProviderType.js +9 -9
- package/lib/constants/index.d.ts +8 -8
- package/lib/constants/index.js +20 -20
- package/lib/constants/mockData.d.ts +82 -84
- package/lib/constants/mockData.js +379 -379
- package/lib/constants/modelStatus.d.ts +10 -10
- package/lib/constants/modelStatus.js +14 -14
- package/lib/constants/notificationType.d.ts +7 -7
- package/lib/constants/notificationType.js +11 -11
- package/lib/constants/shard.d.ts +6 -6
- package/lib/constants/shard.js +10 -10
- package/lib/constants/tier.d.ts +6 -6
- package/lib/constants/tier.js +10 -10
- package/lib/constants/userRole.d.ts +2 -2
- package/lib/constants/userRole.js +21 -21
- package/lib/css/base/_base.css +98 -98
- package/lib/css/base/_typography.css +130 -130
- package/lib/css/components/_alert.css +85 -85
- package/lib/css/components/_bootstrap-grid.css +28 -28
- package/lib/css/components/_buttons.css +325 -325
- package/lib/css/components/_forms.css +91 -91
- package/lib/css/components/_menu.css +56 -56
- package/lib/css/components/_modals.css +41 -41
- package/lib/css/components/_tables.css +426 -426
- package/lib/css/components/_tags.css +12 -12
- package/lib/css/index-with-variables.css +14 -14
- package/lib/css/index.css +13 -13
- package/lib/css/utils/_border.css +463 -463
- package/lib/css/utils/_color.css +271 -271
- package/lib/css/utils/_display.css +312 -312
- package/lib/css/utils/_general.css +48 -48
- package/lib/css/utils/_icon.css +16 -16
- package/lib/css/utils/_text.css +24 -24
- package/lib/css/utils/_width.css +60 -60
- package/lib/css/variables.css +70 -70
- package/lib/endpointMappings.d.ts +4 -4
- package/lib/endpointMappings.js +173 -173
- package/lib/hooks/useCollection.d.ts +6 -6
- package/lib/hooks/useCollection.js +61 -61
- package/lib/hooks/useCollectionConfiguration.d.ts +27 -27
- package/lib/hooks/useCollectionConfiguration.js +67 -67
- package/lib/hooks/useCollectionItem.d.ts +6 -6
- package/lib/hooks/useCollectionItem.js +54 -54
- package/lib/hooks/useGuid.d.ts +4 -4
- package/lib/hooks/useGuid.js +14 -14
- package/lib/hooks/usePrevious.d.ts +5 -5
- package/lib/hooks/usePrevious.js +18 -18
- package/lib/index.d.ts +8 -8
- package/lib/index.js +30 -30
- package/lib/redux/actionCreator.d.ts +5 -5
- package/lib/redux/actionCreator.js +16 -16
- package/lib/redux/actions.d.ts +12 -12
- package/lib/redux/actions.js +30 -30
- package/lib/redux/configureReducers.d.ts +22 -22
- package/lib/redux/configureReducers.js +94 -94
- package/lib/redux/configureStore.d.ts +14 -14
- package/lib/redux/configureStore.js +118 -118
- package/lib/redux/helpers.d.ts +2 -2
- package/lib/redux/helpers.js +7 -7
- package/lib/redux/reducers/index.d.ts +4 -4
- package/lib/redux/reducers/index.js +12 -12
- package/lib/redux/reducers/modalsReducer.d.ts +8 -8
- package/lib/redux/reducers/modalsReducer.js +54 -54
- package/lib/redux/reducers/notificationsReducer.d.ts +9 -9
- package/lib/redux/reducers/notificationsReducer.js +27 -27
- package/lib/redux/reducers/searchReducer.d.ts +17 -17
- package/lib/redux/reducers/searchReducer.js +26 -26
- package/lib/redux/sagas/caliperSaga.d.ts +2 -2
- package/lib/redux/sagas/caliperSaga.js +296 -296
- package/lib/redux/sagas/clockOffsetSaga.d.ts +10 -10
- package/lib/redux/sagas/clockOffsetSaga.js +81 -81
- package/lib/redux/sagas/configurationSaga.d.ts +1 -1
- package/lib/redux/sagas/configurationSaga.js +48 -48
- package/lib/redux/sagas/errorSaga.d.ts +2 -2
- package/lib/redux/sagas/errorSaga.js +66 -66
- package/lib/redux/sagas/identityProviderSaga.d.ts +2 -2
- package/lib/redux/sagas/identityProviderSaga.js +91 -91
- package/lib/redux/sagas/initialDataLoadSaga.d.ts +1 -1
- package/lib/redux/sagas/initialDataLoadSaga.js +33 -33
- package/lib/redux/sagas/postLoginDataSaga.d.ts +9 -9
- package/lib/redux/sagas/postLoginDataSaga.js +87 -87
- package/lib/redux/sagas/postLoginRedirectSaga.d.ts +6 -6
- package/lib/redux/sagas/postLoginRedirectSaga.js +96 -96
- package/lib/redux/sagas/rootSaga.d.ts +5 -5
- package/lib/redux/sagas/rootSaga.js +144 -144
- package/lib/redux/sagas/sentrySaga.d.ts +1 -1
- package/lib/redux/sagas/sentrySaga.js +103 -103
- package/lib/services/codeProviderService.d.ts +3 -3
- package/lib/services/codeProviderService.js +36 -36
- package/lib/services/documentService.d.ts +10 -10
- package/lib/services/documentService.js +17 -17
- package/lib/services/persistenceService.d.ts +13 -13
- package/lib/services/persistenceService.js +45 -45
- package/lib/services/ticketProviderService.d.ts +3 -3
- package/lib/services/ticketProviderService.js +40 -40
- package/lib/services/windowService.d.ts +9 -9
- package/lib/services/windowService.js +15 -15
- package/lib/setupTests.d.ts +1 -1
- package/lib/setupTests.js +25 -25
- package/lib/startup.d.ts +29 -29
- package/lib/startup.js +128 -128
- package/lib/types/AppConfiguration.d.ts +32 -32
- package/lib/types/AppConfiguration.js +2 -2
- package/lib/types/Artifact.d.ts +14 -14
- package/lib/types/Artifact.js +9 -9
- package/lib/types/BaseReduxState.d.ts +57 -57
- package/lib/types/BaseReduxState.js +2 -2
- package/lib/types/Client.d.ts +6 -6
- package/lib/types/Client.js +2 -2
- package/lib/types/Collection.d.ts +175 -175
- package/lib/types/Collection.js +2 -2
- package/lib/types/Configuration.d.ts +12 -12
- package/lib/types/Configuration.js +2 -2
- package/lib/types/DeepLinkingResponseRequest.d.ts +4 -4
- package/lib/types/DeepLinkingResponseRequest.js +2 -2
- package/lib/types/DeletableModel.d.ts +4 -4
- package/lib/types/DeletableModel.js +2 -2
- package/lib/types/External.d.ts +31 -31
- package/lib/types/External.js +2 -2
- package/lib/types/Group.d.ts +19 -19
- package/lib/types/Group.js +2 -2
- package/lib/types/IdentityProvider.d.ts +11 -11
- package/lib/types/IdentityProvider.js +2 -2
- package/lib/types/LtiLaunch.d.ts +20 -20
- package/lib/types/LtiLaunch.js +2 -2
- package/lib/types/NameOnlyEntity.d.ts +3 -3
- package/lib/types/NameOnlyEntity.js +2 -2
- package/lib/types/Notification.d.ts +15 -15
- package/lib/types/Notification.js +2 -2
- package/lib/types/OptionalRecord.d.ts +4 -4
- package/lib/types/OptionalRecord.js +2 -2
- package/lib/types/OwnerSchedule.d.ts +9 -9
- package/lib/types/OwnerSchedule.js +2 -2
- package/lib/types/PropertyOfType.d.ts +12 -12
- package/lib/types/PropertyOfType.js +2 -2
- package/lib/types/RoleDescription.d.ts +4 -4
- package/lib/types/RoleDescription.js +2 -2
- package/lib/types/Search.d.ts +11 -11
- package/lib/types/Search.js +2 -2
- package/lib/types/SimpleLocation.d.ts +46 -46
- package/lib/types/SimpleLocation.js +2 -2
- package/lib/types/UniTime.d.ts +17 -17
- package/lib/types/UniTime.js +2 -2
- package/lib/types/User.d.ts +68 -68
- package/lib/types/User.js +2 -2
- package/lib/types/UserRole.d.ts +19 -19
- package/lib/types/UserRole.js +2 -2
- package/lib/types/index.d.ts +21 -21
- package/lib/types/index.js +33 -33
- package/lib/utils/baseActivity.d.ts +63 -63
- package/lib/utils/baseActivity.js +155 -155
- package/lib/utils/baseRole.d.ts +2 -2
- package/lib/utils/baseRole.js +38 -38
- package/lib/utils/collection.d.ts +43 -43
- package/lib/utils/collection.js +337 -337
- package/lib/utils/date.d.ts +162 -162
- package/lib/utils/date.js +401 -401
- package/lib/utils/domainIdentifier.d.ts +2 -2
- package/lib/utils/domainIdentifier.js +12 -12
- package/lib/utils/entityUserRole.d.ts +3 -3
- package/lib/utils/entityUserRole.js +7 -7
- package/lib/utils/externalGroup.d.ts +4 -4
- package/lib/utils/externalGroup.js +32 -32
- package/lib/utils/externalProviders.d.ts +2 -2
- package/lib/utils/externalProviders.js +11 -11
- package/lib/utils/externalTerms.d.ts +2 -2
- package/lib/utils/externalTerms.js +10 -10
- package/lib/utils/group.d.ts +15 -15
- package/lib/utils/group.js +15 -15
- package/lib/utils/groupDates.d.ts +9 -9
- package/lib/utils/groupDates.js +52 -52
- package/lib/utils/groupRoles.d.ts +8 -8
- package/lib/utils/groupRoles.js +42 -42
- package/lib/utils/logger.d.ts +10 -10
- package/lib/utils/logger.js +34 -34
- package/lib/utils/lti.d.ts +3 -3
- package/lib/utils/lti.js +9 -9
- package/lib/utils/model.d.ts +15 -15
- package/lib/utils/model.js +58 -58
- package/lib/utils/number.d.ts +13 -13
- package/lib/utils/number.js +32 -32
- package/lib/utils/promise.d.ts +5 -5
- package/lib/utils/promise.js +17 -17
- package/lib/utils/route.d.ts +5 -5
- package/lib/utils/route.js +69 -69
- package/lib/utils/shard.d.ts +3 -3
- package/lib/utils/shard.js +45 -45
- package/lib/utils/sort.d.ts +11 -11
- package/lib/utils/sort.js +69 -69
- package/lib/utils/string.d.ts +2 -2
- package/lib/utils/string.js +16 -16
- package/lib/utils/timezone.d.ts +2 -2
- package/lib/utils/timezone.js +32 -32
- package/lib/utils/url.d.ts +23 -23
- package/lib/utils/url.js +163 -163
- package/lib/utils/user.d.ts +8 -8
- package/lib/utils/user.js +73 -73
- package/lib/utils/userRole.d.ts +21 -21
- package/lib/utils/userRole.js +48 -48
- 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;
|
package/lib/utils/string.d.ts
CHANGED
|
@@ -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;
|
package/lib/utils/string.js
CHANGED
|
@@ -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;
|
package/lib/utils/timezone.d.ts
CHANGED
|
@@ -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;
|
package/lib/utils/timezone.js
CHANGED
|
@@ -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;
|
package/lib/utils/url.d.ts
CHANGED
|
@@ -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;
|