@smartbit4all/ng-client 1.1.43 → 1.1.44
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/README.md +386 -386
- package/esm2020/lib/session/api/api/api.mjs +4 -4
- package/esm2020/lib/session/api/api/session.service.mjs +306 -306
- package/esm2020/lib/session/api/configuration.mjs +91 -91
- package/esm2020/lib/session/api/encoder.mjs +19 -19
- package/esm2020/lib/session/api/index.mjs +3 -3
- package/esm2020/lib/session/api/model/accountInfo.mjs +13 -13
- package/esm2020/lib/session/api/model/apiError.mjs +13 -13
- package/esm2020/lib/session/api/model/authenticationProviderData.mjs +13 -13
- package/esm2020/lib/session/api/model/getAuthenticationProvidersResponse.mjs +2 -2
- package/esm2020/lib/session/api/model/models.mjs +9 -9
- package/esm2020/lib/session/api/model/refreshSessionRequest.mjs +13 -13
- package/esm2020/lib/session/api/model/session.mjs +2 -2
- package/esm2020/lib/session/api/model/sessionInfoData.mjs +2 -2
- package/esm2020/lib/session/api/model/userActivityLog.mjs +13 -13
- package/esm2020/lib/session/api/param.mjs +2 -2
- package/esm2020/lib/session/api/variables.mjs +9 -9
- package/esm2020/lib/session/cookie-service/smart-cookie.service.mjs +225 -225
- package/esm2020/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.component.mjs +90 -90
- package/esm2020/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.service.mjs +43 -43
- package/esm2020/lib/session/dev-tool/smart-dev-tool-floating-button/smart-dev-tool-floating-button.component.mjs +40 -40
- package/esm2020/lib/session/dev-tool/smart-dev-tool.interceptor.mjs +52 -52
- package/esm2020/lib/session/dev-tool/smart-dev-tool.service.mjs +165 -165
- package/esm2020/lib/session/projects.mjs +12 -12
- package/esm2020/lib/session/smart-error-catching.interceptor.mjs +71 -71
- package/esm2020/lib/session/smart-header-maintainer.interceptor.mjs +46 -46
- package/esm2020/lib/session/smart-session-handler.service.mjs +6 -6
- package/esm2020/lib/session/smart-session.module.mjs +74 -74
- package/esm2020/lib/session/smart-session.service.mjs +225 -225
- package/esm2020/lib/session/smart-timer/smart-session-timer.component.mjs +35 -35
- package/esm2020/lib/session/smart-timer/smart-session-timer.service.mjs +52 -52
- package/esm2020/lib/smart-client/api/api/api.mjs +4 -4
- package/esm2020/lib/smart-client/api/api/default.service.mjs +133 -133
- package/esm2020/lib/smart-client/api/api.module.mjs +40 -40
- package/esm2020/lib/smart-client/api/configuration.mjs +91 -91
- package/esm2020/lib/smart-client/api/encoder.mjs +19 -19
- package/esm2020/lib/smart-client/api/index.mjs +7 -7
- package/esm2020/lib/smart-client/api/model/componentType.mjs +17 -17
- package/esm2020/lib/smart-client/api/model/componentWidgetType.mjs +17 -17
- package/esm2020/lib/smart-client/api/model/layoutDirection.mjs +16 -16
- package/esm2020/lib/smart-client/api/model/models.mjs +6 -6
- package/esm2020/lib/smart-client/api/model/smartComponentLayoutDefinition.mjs +2 -2
- package/esm2020/lib/smart-client/api/model/smartComponentWidgetDefinition.mjs +2 -2
- package/esm2020/lib/smart-client/api/param.mjs +2 -2
- package/esm2020/lib/smart-client/api/variables.mjs +9 -9
- package/esm2020/lib/smart-client/projects.mjs +5 -5
- package/esm2020/lib/smart-client/smart-authentication.service.mjs +21 -21
- package/esm2020/lib/smart-client/smart-component-api-client.mjs +403 -403
- package/esm2020/lib/smart-client/smart-component-layout/smart-component-layout.component.mjs +126 -126
- package/esm2020/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +50 -50
- package/esm2020/lib/smart-client/smart.component.mjs +30 -30
- package/esm2020/lib/smart-client/smart.service.mjs +30 -30
- package/esm2020/lib/smart-ng-client.module.mjs +62 -62
- package/esm2020/lib/smart-ng-client.service.mjs +19 -19
- package/esm2020/lib/view-context/api/api/api.mjs +4 -4
- package/esm2020/lib/view-context/api/api/view.service.mjs +859 -859
- package/esm2020/lib/view-context/api/api.module.mjs +40 -40
- package/esm2020/lib/view-context/api/configuration.mjs +91 -91
- package/esm2020/lib/view-context/api/encoder.mjs +19 -19
- package/esm2020/lib/view-context/api/index.mjs +7 -7
- package/esm2020/lib/view-context/api/model/closeResult.mjs +17 -17
- package/esm2020/lib/view-context/api/model/componentConstraint.mjs +2 -2
- package/esm2020/lib/view-context/api/model/componentModel.mjs +2 -2
- package/esm2020/lib/view-context/api/model/componentModelChange.mjs +13 -13
- package/esm2020/lib/view-context/api/model/dataChange.mjs +2 -2
- package/esm2020/lib/view-context/api/model/dataChangeEvent.mjs +2 -2
- package/esm2020/lib/view-context/api/model/dataChangeKind.mjs +17 -17
- package/esm2020/lib/view-context/api/model/messageData.mjs +2 -2
- package/esm2020/lib/view-context/api/model/messageOption.mjs +2 -2
- package/esm2020/lib/view-context/api/model/messageOptionType.mjs +17 -17
- package/esm2020/lib/view-context/api/model/messageResult.mjs +2 -2
- package/esm2020/lib/view-context/api/model/messageType.mjs +18 -18
- package/esm2020/lib/view-context/api/model/models.mjs +40 -40
- package/esm2020/lib/view-context/api/model/openPendingData.mjs +2 -2
- package/esm2020/lib/view-context/api/model/smartLinkData.mjs +2 -2
- package/esm2020/lib/view-context/api/model/uiAction.mjs +2 -2
- package/esm2020/lib/view-context/api/model/uiActionButtonDescriptor.mjs +13 -13
- package/esm2020/lib/view-context/api/model/uiActionButtonIconPos.mjs +16 -16
- package/esm2020/lib/view-context/api/model/uiActionButtonType.mjs +21 -21
- package/esm2020/lib/view-context/api/model/uiActionConstraint.mjs +13 -13
- package/esm2020/lib/view-context/api/model/uiActionDescriptor.mjs +2 -2
- package/esm2020/lib/view-context/api/model/uiActionDialogDescriptor.mjs +2 -2
- package/esm2020/lib/view-context/api/model/uiActionFeedbackType.mjs +16 -16
- package/esm2020/lib/view-context/api/model/uiActionInputType.mjs +20 -20
- package/esm2020/lib/view-context/api/model/uiActionRequest.mjs +13 -13
- package/esm2020/lib/view-context/api/model/uiActionUploadDescriptor.mjs +13 -13
- package/esm2020/lib/view-context/api/model/uploadedFile.mjs +13 -13
- package/esm2020/lib/view-context/api/model/valueSet.mjs +2 -2
- package/esm2020/lib/view-context/api/model/view.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewApiError.mjs +13 -13
- package/esm2020/lib/view-context/api/model/viewConstraint.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewContext.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewContextChange.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewContextData.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewContextUpdate.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewData.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewEventHandler.mjs +20 -20
- package/esm2020/lib/view-context/api/model/viewState.mjs +21 -21
- package/esm2020/lib/view-context/api/model/viewStateUpdate.mjs +2 -2
- package/esm2020/lib/view-context/api/model/viewType.mjs +17 -17
- package/esm2020/lib/view-context/api/param.mjs +2 -2
- package/esm2020/lib/view-context/api/variables.mjs +9 -9
- package/esm2020/lib/view-context/message-dialog/message-dialog.component.mjs +63 -63
- package/esm2020/lib/view-context/projects.mjs +17 -17
- package/esm2020/lib/view-context/property-definition-data.mjs +2 -2
- package/esm2020/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +30 -30
- package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +53 -53
- package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +48 -48
- package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +68 -68
- package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +53 -53
- package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +119 -119
- package/esm2020/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +52 -52
- package/esm2020/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +109 -109
- package/esm2020/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +119 -119
- package/esm2020/lib/view-context/smart-ui-action/ui-action.model.mjs +7 -7
- package/esm2020/lib/view-context/smart-ui-action/ui-action.service.mjs +182 -182
- package/esm2020/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +29 -29
- package/esm2020/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +69 -69
- package/esm2020/lib/view-context/smart-view-context.interceptor.mjs +39 -39
- package/esm2020/lib/view-context/smart-view-context.model.mjs +2 -2
- package/esm2020/lib/view-context/smart-view-context.module.mjs +87 -87
- package/esm2020/lib/view-context/smart-view-context.service.mjs +536 -536
- package/esm2020/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +33 -33
- package/esm2020/lib/view-context/value-api/api/api.mjs +4 -4
- package/esm2020/lib/view-context/value-api/api/value.service.mjs +138 -138
- package/esm2020/lib/view-context/value-api/api.module.mjs +40 -40
- package/esm2020/lib/view-context/value-api/configuration.mjs +91 -91
- package/esm2020/lib/view-context/value-api/encoder.mjs +19 -19
- package/esm2020/lib/view-context/value-api/index.mjs +7 -7
- package/esm2020/lib/view-context/value-api/model/models.mjs +9 -9
- package/esm2020/lib/view-context/value-api/model/value.mjs +13 -13
- package/esm2020/lib/view-context/value-api/model/valueSetData.mjs +13 -13
- package/esm2020/lib/view-context/value-api/model/valueSetDefinition.mjs +2 -2
- package/esm2020/lib/view-context/value-api/model/valueSetDefinitionData.mjs +2 -2
- package/esm2020/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +23 -23
- package/esm2020/lib/view-context/value-api/model/valueSetExpression.mjs +2 -2
- package/esm2020/lib/view-context/value-api/model/valueSetOperand.mjs +2 -2
- package/esm2020/lib/view-context/value-api/model/valueSetOperation.mjs +18 -18
- package/esm2020/lib/view-context/value-api/param.mjs +2 -2
- package/esm2020/lib/view-context/value-api/variables.mjs +9 -9
- package/esm2020/projects.mjs +12 -12
- package/esm2020/smartbit4all-ng-client.mjs +4 -4
- package/fesm2015/smartbit4all-ng-client.mjs +5264 -5264
- package/fesm2015/smartbit4all-ng-client.mjs.map +1 -1
- package/fesm2020/smartbit4all-ng-client.mjs +5228 -5228
- package/fesm2020/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/session/api/api/api.d.ts +3 -3
- package/lib/session/api/api/session.service.d.ts +107 -107
- package/lib/session/api/configuration.d.ts +104 -104
- package/lib/session/api/encoder.d.ts +11 -11
- package/lib/session/api/index.d.ts +2 -2
- package/lib/session/api/model/accountInfo.d.ts +22 -22
- package/lib/session/api/model/apiError.d.ts +15 -15
- package/lib/session/api/model/authenticationProviderData.d.ts +17 -17
- package/lib/session/api/model/getAuthenticationProvidersResponse.d.ts +15 -15
- package/lib/session/api/model/models.d.ts +8 -8
- package/lib/session/api/model/refreshSessionRequest.d.ts +14 -14
- package/lib/session/api/model/session.d.ts +32 -32
- package/lib/session/api/model/sessionInfoData.d.ts +22 -22
- package/lib/session/api/model/userActivityLog.d.ts +33 -33
- package/lib/session/api/param.d.ts +37 -37
- package/lib/session/api/variables.d.ts +8 -8
- package/lib/session/cookie-service/smart-cookie.service.d.ts +129 -129
- package/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.component.d.ts +28 -28
- package/lib/session/dev-tool/smart-dev-tool-dialog/smart-dev-tool-dialog.service.d.ts +18 -18
- package/lib/session/dev-tool/smart-dev-tool-floating-button/smart-dev-tool-floating-button.component.d.ts +15 -15
- package/lib/session/dev-tool/smart-dev-tool.interceptor.d.ts +18 -18
- package/lib/session/dev-tool/smart-dev-tool.service.d.ts +57 -57
- package/lib/session/projects.d.ts +8 -8
- package/lib/session/smart-error-catching.interceptor.d.ts +13 -13
- package/lib/session/smart-header-maintainer.interceptor.d.ts +11 -11
- package/lib/session/smart-session-handler.service.d.ts +11 -11
- package/lib/session/smart-session.module.d.ts +15 -15
- package/lib/session/smart-session.service.d.ts +54 -54
- package/lib/session/smart-timer/smart-session-timer.component.d.ts +14 -14
- package/lib/session/smart-timer/smart-session-timer.service.d.ts +21 -21
- package/lib/smart-client/api/api/api.d.ts +3 -3
- package/lib/smart-client/api/api/default.service.d.ts +33 -33
- package/lib/smart-client/api/api.module.d.ts +11 -11
- package/lib/smart-client/api/configuration.d.ts +104 -104
- package/lib/smart-client/api/encoder.d.ts +11 -11
- package/lib/smart-client/api/index.d.ts +6 -6
- package/lib/smart-client/api/model/componentType.d.ts +17 -17
- package/lib/smart-client/api/model/componentWidgetType.d.ts +17 -17
- package/lib/smart-client/api/model/layoutDirection.d.ts +16 -16
- package/lib/smart-client/api/model/models.d.ts +5 -5
- package/lib/smart-client/api/model/smartComponentLayoutDefinition.d.ts +29 -29
- package/lib/smart-client/api/model/smartComponentWidgetDefinition.d.ts +20 -20
- package/lib/smart-client/api/param.d.ts +37 -37
- package/lib/smart-client/api/variables.d.ts +8 -8
- package/lib/smart-client/projects.d.ts +4 -4
- package/lib/smart-client/smart-authentication.service.d.ts +15 -15
- package/lib/smart-client/smart-component-api-client.d.ts +93 -93
- package/lib/smart-client/smart-component-layout/smart-component-layout.component.d.ts +32 -32
- package/lib/smart-client/smart-file-uploader/smart-file-uploader.component.d.ts +18 -18
- package/lib/smart-client/smart.component.d.ts +11 -11
- package/lib/smart-client/smart.service.d.ts +11 -11
- package/lib/smart-ng-client.module.d.ts +16 -16
- package/lib/smart-ng-client.service.d.ts +10 -10
- package/lib/view-context/api/api/api.d.ts +3 -3
- package/lib/view-context/api/api/view.service.d.ts +313 -313
- package/lib/view-context/api/api.module.d.ts +11 -11
- package/lib/view-context/api/configuration.d.ts +104 -104
- package/lib/view-context/api/encoder.d.ts +11 -11
- package/lib/view-context/api/index.d.ts +6 -6
- package/lib/view-context/api/model/closeResult.d.ts +17 -17
- package/lib/view-context/api/model/componentConstraint.d.ts +25 -25
- package/lib/view-context/api/model/componentModel.d.ts +35 -35
- package/lib/view-context/api/model/componentModelChange.d.ts +29 -29
- package/lib/view-context/api/model/dataChange.d.ts +27 -27
- package/lib/view-context/api/model/dataChangeEvent.d.ts +33 -33
- package/lib/view-context/api/model/dataChangeKind.d.ts +20 -20
- package/lib/view-context/api/model/messageData.d.ts +29 -29
- package/lib/view-context/api/model/messageOption.d.ts +20 -20
- package/lib/view-context/api/model/messageOptionType.d.ts +17 -17
- package/lib/view-context/api/model/messageResult.d.ts +16 -16
- package/lib/view-context/api/model/messageType.d.ts +18 -18
- package/lib/view-context/api/model/models.d.ts +39 -39
- package/lib/view-context/api/model/openPendingData.d.ts +22 -22
- package/lib/view-context/api/model/smartLinkData.d.ts +21 -21
- package/lib/view-context/api/model/uiAction.d.ts +29 -29
- package/lib/view-context/api/model/uiActionButtonDescriptor.d.ts +18 -18
- package/lib/view-context/api/model/uiActionButtonIconPos.d.ts +19 -19
- package/lib/view-context/api/model/uiActionButtonType.d.ts +24 -24
- package/lib/view-context/api/model/uiActionConstraint.d.ts +22 -22
- package/lib/view-context/api/model/uiActionDescriptor.d.ts +36 -36
- package/lib/view-context/api/model/uiActionDialogDescriptor.d.ts +23 -23
- package/lib/view-context/api/model/uiActionFeedbackType.d.ts +19 -19
- package/lib/view-context/api/model/uiActionInputType.d.ts +20 -20
- package/lib/view-context/api/model/uiActionRequest.d.ts +28 -28
- package/lib/view-context/api/model/uiActionUploadDescriptor.d.ts +23 -23
- package/lib/view-context/api/model/uploadedFile.d.ts +19 -19
- package/lib/view-context/api/model/valueSet.d.ts +20 -20
- package/lib/view-context/api/model/view.d.ts +68 -68
- package/lib/view-context/api/model/viewApiError.d.ts +18 -18
- package/lib/view-context/api/model/viewConstraint.d.ts +18 -18
- package/lib/view-context/api/model/viewContext.d.ts +22 -22
- package/lib/view-context/api/model/viewContextChange.d.ts +20 -20
- package/lib/view-context/api/model/viewContextData.d.ts +19 -19
- package/lib/view-context/api/model/viewContextUpdate.d.ts +22 -22
- package/lib/view-context/api/model/viewData.d.ts +27 -27
- package/lib/view-context/api/model/viewEventHandler.d.ts +30 -30
- package/lib/view-context/api/model/viewState.d.ts +21 -21
- package/lib/view-context/api/model/viewStateUpdate.d.ts +24 -24
- package/lib/view-context/api/model/viewType.d.ts +17 -17
- package/lib/view-context/api/param.d.ts +37 -37
- package/lib/view-context/api/variables.d.ts +8 -8
- package/lib/view-context/message-dialog/message-dialog.component.d.ts +17 -17
- package/lib/view-context/projects.d.ts +13 -13
- package/lib/view-context/property-definition-data.d.ts +5 -5
- package/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.d.ts +13 -13
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.d.ts +25 -25
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +18 -18
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +30 -30
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.d.ts +22 -22
- package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.d.ts +29 -29
- package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +25 -25
- package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +30 -30
- package/lib/view-context/smart-ui-action/ui-action.descriptor.service.d.ts +21 -21
- package/lib/view-context/smart-ui-action/ui-action.model.d.ts +32 -32
- package/lib/view-context/smart-ui-action/ui-action.service.d.ts +37 -37
- package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.d.ts +13 -13
- package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +19 -19
- package/lib/view-context/smart-view-context.interceptor.d.ts +13 -13
- package/lib/view-context/smart-view-context.model.d.ts +30 -30
- package/lib/view-context/smart-view-context.module.d.ts +21 -21
- package/lib/view-context/smart-view-context.service.d.ts +106 -106
- package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +14 -14
- package/lib/view-context/value-api/api/api.d.ts +3 -3
- package/lib/view-context/value-api/api/value.service.d.ts +35 -35
- package/lib/view-context/value-api/api.module.d.ts +11 -11
- package/lib/view-context/value-api/configuration.d.ts +104 -104
- package/lib/view-context/value-api/encoder.d.ts +11 -11
- package/lib/view-context/value-api/index.d.ts +6 -6
- package/lib/view-context/value-api/model/models.d.ts +8 -8
- package/lib/view-context/value-api/model/value.d.ts +29 -29
- package/lib/view-context/value-api/model/valueSetData.d.ts +41 -41
- package/lib/view-context/value-api/model/valueSetDefinition.d.ts +16 -16
- package/lib/view-context/value-api/model/valueSetDefinitionData.d.ts +55 -55
- package/lib/view-context/value-api/model/valueSetDefinitionKind.d.ts +23 -23
- package/lib/view-context/value-api/model/valueSetExpression.d.ts +20 -20
- package/lib/view-context/value-api/model/valueSetOperand.d.ts +25 -25
- package/lib/view-context/value-api/model/valueSetOperation.d.ts +18 -18
- package/lib/view-context/value-api/param.d.ts +37 -37
- package/lib/view-context/value-api/variables.d.ts +8 -8
- package/package.json +2 -1
- package/projects.d.ts +8 -8
- package/schematics/collection.json +11 -11
- package/schematics/smart-component/index.ts +26 -26
- package/schematics/smart-component/schema.json +20 -20
- package/schematics/smart-component/smart-component.schema.ts +4 -4
- package/schematics/smart-component/templates/__name@dasherize__.component.html.template +2 -2
- package/schematics/smart-component/templates/__name@dasherize__.component.ts.template +26 -26
- package/smartbit4all-ng-client-1.1.44.tgz +0 -0
- package/smartbit4all-ng-client.d.ts +5 -5
- package/src/lib/session/api/README.md +226 -226
- package/src/lib/smart-client/api/README.md +226 -226
- package/src/lib/view-context/api/README.md +226 -226
- package/src/lib/view-context/value-api/README.md +226 -226
- package/smartbit4all-ng-client-1.1.43.tgz +0 -0
|
@@ -1,225 +1,225 @@
|
|
|
1
|
-
// This service is based on the `ng2-cookies` package which sadly is not a service and does
|
|
2
|
-
// not use `DOCUMENT` injection and therefore doesn't work well with AoT production builds.
|
|
3
|
-
// Package: https://github.com/BCJTI/ng2-cookies
|
|
4
|
-
import { Inject, Injectable, PLATFORM_ID } from "@angular/core";
|
|
5
|
-
import { DOCUMENT, isPlatformBrowser } from "@angular/common";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class SmartCookieService {
|
|
8
|
-
constructor(document,
|
|
9
|
-
// Get the `PLATFORM_ID` so we can check if we're in a browser.
|
|
10
|
-
platformId) {
|
|
11
|
-
this.document = document;
|
|
12
|
-
this.platformId = platformId;
|
|
13
|
-
this.documentIsAccessible = isPlatformBrowser(this.platformId);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Get cookie Regular Expression
|
|
17
|
-
*
|
|
18
|
-
* @param name Cookie name
|
|
19
|
-
* @returns property RegExp
|
|
20
|
-
*
|
|
21
|
-
* @author: Stepan Suvorov
|
|
22
|
-
* @since: 1.0.0
|
|
23
|
-
*/
|
|
24
|
-
static getCookieRegExp(name) {
|
|
25
|
-
const escapedName = name.replace(/([\[\]\{\}\(\)\|\=\;\+\?\,\.\*\^\$])/gi, "\\$1");
|
|
26
|
-
return new RegExp("(?:^" + escapedName + "|;\\s*" + escapedName + ")=(.*?)(?:;|$)", "g");
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
30
|
-
*
|
|
31
|
-
* @param encodedURIComponent A value representing an encoded URI component.
|
|
32
|
-
*
|
|
33
|
-
* @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
34
|
-
*
|
|
35
|
-
* @author: Stepan Suvorov
|
|
36
|
-
* @since: 1.0.0
|
|
37
|
-
*/
|
|
38
|
-
static safeDecodeURIComponent(encodedURIComponent) {
|
|
39
|
-
try {
|
|
40
|
-
return decodeURIComponent(encodedURIComponent);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// probably it is not uri encoded. return as is
|
|
44
|
-
return encodedURIComponent;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Return `true` if {@link Document} is accessible, otherwise return `false`
|
|
49
|
-
*
|
|
50
|
-
* @param name Cookie name
|
|
51
|
-
* @returns boolean - whether cookie with specified name exists
|
|
52
|
-
*
|
|
53
|
-
* @author: Stepan Suvorov
|
|
54
|
-
* @since: 1.0.0
|
|
55
|
-
*/
|
|
56
|
-
check(name) {
|
|
57
|
-
if (!this.documentIsAccessible) {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
name = encodeURIComponent(name);
|
|
61
|
-
const regExp = SmartCookieService.getCookieRegExp(name);
|
|
62
|
-
return regExp.test(this.document.cookie);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Get cookies by name
|
|
66
|
-
*
|
|
67
|
-
* @param name Cookie name
|
|
68
|
-
* @returns property value
|
|
69
|
-
*
|
|
70
|
-
* @author: Stepan Suvorov
|
|
71
|
-
* @since: 1.0.0
|
|
72
|
-
*/
|
|
73
|
-
get(name) {
|
|
74
|
-
if (this.documentIsAccessible && this.check(name)) {
|
|
75
|
-
name = encodeURIComponent(name);
|
|
76
|
-
const regExp = SmartCookieService.getCookieRegExp(name);
|
|
77
|
-
const result = regExp.exec(this.document.cookie);
|
|
78
|
-
let results = result.input.split(";");
|
|
79
|
-
let value;
|
|
80
|
-
results.forEach((r) => {
|
|
81
|
-
let values = r.split(`${name}=`);
|
|
82
|
-
if (values[1] !== "null") {
|
|
83
|
-
value = values[1];
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
return value ?? "";
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
return "";
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Get all cookies in JSON format
|
|
94
|
-
*
|
|
95
|
-
* @returns all the cookies in json
|
|
96
|
-
*
|
|
97
|
-
* @author: Stepan Suvorov
|
|
98
|
-
* @since: 1.0.0
|
|
99
|
-
*/
|
|
100
|
-
getAll() {
|
|
101
|
-
if (!this.documentIsAccessible) {
|
|
102
|
-
return {};
|
|
103
|
-
}
|
|
104
|
-
const cookies = {};
|
|
105
|
-
const document = this.document;
|
|
106
|
-
if (document.cookie && document.cookie !== "") {
|
|
107
|
-
document.cookie.split(";").forEach((currentCookie) => {
|
|
108
|
-
const [cookieName, cookieValue] = currentCookie.split("=");
|
|
109
|
-
cookies[SmartCookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ""))] =
|
|
110
|
-
SmartCookieService.safeDecodeURIComponent(cookieValue);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
return cookies;
|
|
114
|
-
}
|
|
115
|
-
set(name, value, expiresOrOptions, path, domain, secure, sameSite) {
|
|
116
|
-
if (!this.documentIsAccessible) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (typeof expiresOrOptions === "number" ||
|
|
120
|
-
expiresOrOptions instanceof Date ||
|
|
121
|
-
path ||
|
|
122
|
-
domain ||
|
|
123
|
-
secure ||
|
|
124
|
-
sameSite) {
|
|
125
|
-
const optionsBody = {
|
|
126
|
-
expires: expiresOrOptions,
|
|
127
|
-
path,
|
|
128
|
-
domain,
|
|
129
|
-
secure,
|
|
130
|
-
sameSite: sameSite ? sameSite : "Lax",
|
|
131
|
-
};
|
|
132
|
-
this.set(name, value, optionsBody);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
let cookieString = encodeURIComponent(name) + "=" + encodeURIComponent(value) + ";";
|
|
136
|
-
const options = expiresOrOptions ? expiresOrOptions : {};
|
|
137
|
-
if (options.expires) {
|
|
138
|
-
if (typeof options.expires === "number") {
|
|
139
|
-
const dateExpires = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);
|
|
140
|
-
cookieString += "expires=" + dateExpires.toUTCString() + ";";
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
cookieString += "expires=" + options.expires.toUTCString() + ";";
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (options.path) {
|
|
147
|
-
cookieString += "path=" + options.path + ";";
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
cookieString += "path=/;";
|
|
151
|
-
}
|
|
152
|
-
if (options.domain) {
|
|
153
|
-
cookieString += "domain=" + options.domain + ";";
|
|
154
|
-
}
|
|
155
|
-
if (options.secure === false && options.sameSite === "None") {
|
|
156
|
-
options.secure = true;
|
|
157
|
-
console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` +
|
|
158
|
-
`More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`);
|
|
159
|
-
}
|
|
160
|
-
if (options.secure) {
|
|
161
|
-
cookieString += "secure;";
|
|
162
|
-
}
|
|
163
|
-
if (!options.sameSite) {
|
|
164
|
-
options.sameSite = "Lax";
|
|
165
|
-
}
|
|
166
|
-
cookieString += "sameSite=" + options.sameSite + ";";
|
|
167
|
-
this.document.cookie = cookieString;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Delete cookie by name
|
|
171
|
-
*
|
|
172
|
-
* @param name Cookie name
|
|
173
|
-
* @param path Cookie path
|
|
174
|
-
* @param domain Cookie domain
|
|
175
|
-
* @param secure Cookie secure flag
|
|
176
|
-
* @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
|
177
|
-
*
|
|
178
|
-
* @author: Stepan Suvorov
|
|
179
|
-
* @since: 1.0.0
|
|
180
|
-
*/
|
|
181
|
-
delete(name, path, domain, secure, sameSite = "Lax") {
|
|
182
|
-
if (!this.documentIsAccessible) {
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
const expiresDate = new Date("Thu, 01 Jan 1970 00:00:01 GMT");
|
|
186
|
-
this.set(name, "", { expires: expiresDate, path, domain, secure, sameSite });
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Delete all cookies
|
|
190
|
-
*
|
|
191
|
-
* @param path Cookie path
|
|
192
|
-
* @param domain Cookie domain
|
|
193
|
-
* @param secure Is the Cookie secure
|
|
194
|
-
* @param sameSite Is the cookie same site
|
|
195
|
-
*
|
|
196
|
-
* @author: Stepan Suvorov
|
|
197
|
-
* @since: 1.0.0
|
|
198
|
-
*/
|
|
199
|
-
deleteAll(path, domain, secure, sameSite = "Lax") {
|
|
200
|
-
if (!this.documentIsAccessible) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
const cookies = this.getAll();
|
|
204
|
-
for (const cookieName in cookies) {
|
|
205
|
-
if (cookies.hasOwnProperty(cookieName)) {
|
|
206
|
-
this.delete(cookieName, path, domain, secure, sameSite);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
SmartCookieService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartCookieService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
212
|
-
SmartCookieService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartCookieService, providedIn: "root" });
|
|
213
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartCookieService, decorators: [{
|
|
214
|
-
type: Injectable,
|
|
215
|
-
args: [{
|
|
216
|
-
providedIn: "root",
|
|
217
|
-
}]
|
|
218
|
-
}], ctorParameters: function () { return [{ type: Document, decorators: [{
|
|
219
|
-
type: Inject,
|
|
220
|
-
args: [DOCUMENT]
|
|
221
|
-
}] }, { type: undefined, decorators: [{
|
|
222
|
-
type: Inject,
|
|
223
|
-
args: [PLATFORM_ID]
|
|
224
|
-
}] }]; } });
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29va2llLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zZXNzaW9uL2Nvb2tpZS1zZXJ2aWNlL3NtYXJ0LWNvb2tpZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJGQUEyRjtBQUMzRiwyRkFBMkY7QUFDM0YsZ0RBQWdEO0FBRWhELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBZTlELE1BQU0sT0FBTyxrQkFBa0I7SUFHM0IsWUFDOEIsUUFBa0I7SUFDNUMsK0RBQStEO0lBQ2xDLFVBQWU7UUFGbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUVmLGVBQVUsR0FBVixVQUFVLENBQUs7UUFFNUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQVk7UUFDdkMsTUFBTSxXQUFXLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRixPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLEdBQUcsUUFBUSxHQUFHLFdBQVcsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssTUFBTSxDQUFDLHNCQUFzQixDQUFDLG1CQUEyQjtRQUM3RCxJQUFJO1lBQ0EsT0FBTyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ2xEO1FBQUMsTUFBTTtZQUNKLCtDQUErQztZQUMvQyxP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QUFnQyxFQUNoQyxNQUFnQyxFQUNoQyxXQUFxQixLQUFLO1FBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDNUIsT0FBTztTQUNWO1FBRUQsTUFBTSxPQUFPLEdBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRW5DLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxFQUFFO1lBQzlCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDM0Q7U0FDSjtJQUNMLENBQUM7O2dIQTFTUSxrQkFBa0Isa0JBSWYsUUFBUSxhQUVSLFdBQVc7b0hBTmQsa0JBQWtCLGNBRmYsTUFBTTs0RkFFVCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzBEQUsyQyxRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVE7OzBCQUVmLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgc2VydmljZSBpcyBiYXNlZCBvbiB0aGUgYG5nMi1jb29raWVzYCBwYWNrYWdlIHdoaWNoIHNhZGx5IGlzIG5vdCBhIHNlcnZpY2UgYW5kIGRvZXNcbi8vIG5vdCB1c2UgYERPQ1VNRU5UYCBpbmplY3Rpb24gYW5kIHRoZXJlZm9yZSBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIEFvVCBwcm9kdWN0aW9uIGJ1aWxkcy5cbi8vIFBhY2thZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9CQ0pUSS9uZzItY29va2llc1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFBMQVRGT1JNX0lEIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgU2FtZVNpdGUgPSBcIkxheFwiIHwgXCJOb25lXCIgfCBcIlN0cmljdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvb2tpZU9wdGlvbnMge1xuICAgIGV4cGlyZXM/OiBudW1iZXIgfCBEYXRlO1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgZG9tYWluPzogc3RyaW5nO1xuICAgIHNlY3VyZT86IGJvb2xlYW47XG4gICAgc2FtZVNpdGU/OiBTYW1lU2l0ZTtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46IFwicm9vdFwiLFxufSlcbmV4cG9ydCBjbGFzcyBTbWFydENvb2tpZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRJc0FjY2Vzc2libGU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgICAgIC8vIEdldCB0aGUgYFBMQVRGT1JNX0lEYCBzbyB3ZSBjYW4gY2hlY2sgaWYgd2UncmUgaW4gYSBicm93c2VyLlxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IGFueVxuICAgICkge1xuICAgICAgICB0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlID0gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29va2llIFJlZ3VsYXIgRXhwcmVzc2lvblxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgQ29va2llIG5hbWVcbiAgICAgKiBAcmV0dXJucyBwcm9wZXJ0eSBSZWdFeHBcbiAgICAgKlxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAgICogQHNpbmNlOiAxLjAuMFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldENvb2tpZVJlZ0V4cChuYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAgICAgICBjb25zdCBlc2NhcGVkTmFtZTogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC8oW1xcW1xcXVxce1xcfVxcKFxcKVxcfFxcPVxcO1xcK1xcP1xcLFxcLlxcKlxcXlxcJF0pL2dpLCBcIlxcXFwkMVwiKTtcblxuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIig/Ol5cIiArIGVzY2FwZWROYW1lICsgXCJ8O1xcXFxzKlwiICsgZXNjYXBlZE5hbWUgKyBcIik9KC4qPykoPzo7fCQpXCIsIFwiZ1wiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1bmVuY29kZWQgdmVyc2lvbiBvZiBhbiBlbmNvZGVkIGNvbXBvbmVudCBvZiBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmNvZGVkVVJJQ29tcG9uZW50IEEgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGVuY29kZWQgVVJJIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB1bmVuY29kZWQgdmVyc2lvbiBvZiBhbiBlbmNvZGVkIGNvbXBvbmVudCBvZiBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKS5cbiAgICAgKlxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAgICogQHNpbmNlOiAxLjAuMFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIHNhZmVEZWNvZGVVUklDb21wb25lbnQoZW5jb2RlZFVSSUNvbXBvbmVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlZFVSSUNvbXBvbmVudCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJvYmFibHkgaXQgaXMgbm90IHVyaSBlbmNvZGVkLiByZXR1cm4gYXMgaXNcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVkVVJJQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZiB7QGxpbmsgRG9jdW1lbnR9IGlzIGFjY2Vzc2libGUsIG90aGVyd2lzZSByZXR1cm4gYGZhbHNlYFxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgQ29va2llIG5hbWVcbiAgICAgKiBAcmV0dXJucyBib29sZWFuIC0gd2hldGhlciBjb29raWUgd2l0aCBzcGVjaWZpZWQgbmFtZSBleGlzdHNcbiAgICAgKlxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAgICogQHNpbmNlOiAxLjAuMFxuICAgICAqL1xuICAgIGNoZWNrKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpO1xuICAgICAgICBjb25zdCByZWdFeHA6IFJlZ0V4cCA9IFNtYXJ0Q29va2llU2VydmljZS5nZXRDb29raWVSZWdFeHAobmFtZSk7XG4gICAgICAgIHJldHVybiByZWdFeHAudGVzdCh0aGlzLmRvY3VtZW50LmNvb2tpZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNvb2tpZXMgYnkgbmFtZVxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgQ29va2llIG5hbWVcbiAgICAgKiBAcmV0dXJucyBwcm9wZXJ0eSB2YWx1ZVxuICAgICAqXG4gICAgICogQGF1dGhvcjogU3RlcGFuIFN1dm9yb3ZcbiAgICAgKiBAc2luY2U6IDEuMC4wXG4gICAgICovXG4gICAgZ2V0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlICYmIHRoaXMuY2hlY2sobmFtZSkpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZ0V4cDogUmVnRXhwID0gU21hcnRDb29raWVTZXJ2aWNlLmdldENvb2tpZVJlZ0V4cChuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVnRXhwRXhlY0FycmF5ID0gcmVnRXhwLmV4ZWModGhpcy5kb2N1bWVudC5jb29raWUpITtcbiAgICAgICAgICAgIGxldCByZXN1bHRzID0gcmVzdWx0LmlucHV0LnNwbGl0KFwiO1wiKTtcblxuICAgICAgICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgocjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHIuc3BsaXQoYCR7bmFtZX09YCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1sxXSAhPT0gXCJudWxsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/PyBcIlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGNvb2tpZXMgaW4gSlNPTiBmb3JtYXRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGFsbCB0aGUgY29va2llcyBpbiBqc29uXG4gICAgICpcbiAgICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxuICAgICAqIEBzaW5jZTogMS4wLjBcbiAgICAgKi9cbiAgICBnZXRBbGwoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29va2llczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICBjb25zdCBkb2N1bWVudDogYW55ID0gdGhpcy5kb2N1bWVudDtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuY29va2llICYmIGRvY3VtZW50LmNvb2tpZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKS5mb3JFYWNoKChjdXJyZW50Q29va2llOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbY29va2llTmFtZSwgY29va2llVmFsdWVdID0gY3VycmVudENvb2tpZS5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgY29va2llc1tTbWFydENvb2tpZVNlcnZpY2Uuc2FmZURlY29kZVVSSUNvbXBvbmVudChjb29raWVOYW1lLnJlcGxhY2UoL14gLywgXCJcIikpXSA9XG4gICAgICAgICAgICAgICAgICAgIFNtYXJ0Q29va2llU2VydmljZS5zYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZVZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvb2tpZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGNvb2tpZSBiYXNlZCBvbiBwcm92aWRlZCBpbmZvcm1hdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgICAgIENvb2tpZSBuYW1lXG4gICAgICogQHBhcmFtIHZhbHVlICAgIENvb2tpZSB2YWx1ZVxuICAgICAqIEBwYXJhbSBleHBpcmVzICBOdW1iZXIgb2YgZGF5cyB1bnRpbCB0aGUgY29va2llcyBleHBpcmVzIG9yIGFuIGFjdHVhbCBgRGF0ZWBcbiAgICAgKiBAcGFyYW0gcGF0aCAgICAgQ29va2llIHBhdGhcbiAgICAgKiBAcGFyYW0gZG9tYWluICAgQ29va2llIGRvbWFpblxuICAgICAqIEBwYXJhbSBzZWN1cmUgICBTZWN1cmUgZmxhZ1xuICAgICAqIEBwYXJhbSBzYW1lU2l0ZSBPV0FTUCBzYW1lc2l0ZSB0b2tlbiBgTGF4YCwgYE5vbmVgLCBvciBgU3RyaWN0YC4gRGVmYXVsdHMgdG8gYExheGBcbiAgICAgKlxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAgICogQHNpbmNlOiAxLjAuMFxuICAgICAqL1xuICAgIHNldChcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBleHBpcmVzPzogQ29va2llT3B0aW9uc1tcImV4cGlyZXNcIl0sXG4gICAgICAgIHBhdGg/OiBDb29raWVPcHRpb25zW1wicGF0aFwiXSxcbiAgICAgICAgZG9tYWluPzogQ29va2llT3B0aW9uc1tcImRvbWFpblwiXSxcbiAgICAgICAgc2VjdXJlPzogQ29va2llT3B0aW9uc1tcInNlY3VyZVwiXSxcbiAgICAgICAgc2FtZVNpdGU/OiBTYW1lU2l0ZVxuICAgICk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29va2llIGJhc2VkIG9uIHByb3ZpZGVkIGluZm9ybWF0aW9uXG4gICAgICpcbiAgICAgKiBDb29raWUncyBwYXJhbWV0ZXJzOlxuICAgICAqIDxwcmU+XG4gICAgICogZXhwaXJlcyAgTnVtYmVyIG9mIGRheXMgdW50aWwgdGhlIGNvb2tpZXMgZXhwaXJlcyBvciBhbiBhY3R1YWwgYERhdGVgXG4gICAgICogcGF0aCAgICAgQ29va2llIHBhdGhcbiAgICAgKiBkb21haW4gICBDb29raWUgZG9tYWluXG4gICAgICogc2VjdXJlICAgU2VjdXJlIGZsYWdcbiAgICAgKiBzYW1lU2l0ZSBPV0FTUCBzYW1lc2l0ZSB0b2tlbiBgTGF4YCwgYE5vbmVgLCBvciBgU3RyaWN0YC4gRGVmYXVsdHMgdG8gYExheGBcbiAgICAgKiA8L3ByZT5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lICAgICBDb29raWUgbmFtZVxuICAgICAqIEBwYXJhbSB2YWx1ZSAgICBDb29raWUgdmFsdWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAgQm9keSB3aXRoIGNvb2tpZSdzIHBhcmFtc1xuICAgICAqXG4gICAgICogQGF1dGhvcjogU3RlcGFuIFN1dm9yb3ZcbiAgICAgKiBAc2luY2U6IDEuMC4wXG4gICAgICovXG4gICAgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IENvb2tpZU9wdGlvbnMpOiB2b2lkO1xuXG4gICAgc2V0KFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGV4cGlyZXNPck9wdGlvbnM/OiBDb29raWVPcHRpb25zW1wiZXhwaXJlc1wiXSB8IENvb2tpZU9wdGlvbnMsXG4gICAgICAgIHBhdGg/OiBDb29raWVPcHRpb25zW1wicGF0aFwiXSxcbiAgICAgICAgZG9tYWluPzogQ29va2llT3B0aW9uc1tcImRvbWFpblwiXSxcbiAgICAgICAgc2VjdXJlPzogQ29va2llT3B0aW9uc1tcInNlY3VyZVwiXSxcbiAgICAgICAgc2FtZVNpdGU/OiBTYW1lU2l0ZVxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBleHBpcmVzT3JPcHRpb25zID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICBleHBpcmVzT3JPcHRpb25zIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgcGF0aCB8fFxuICAgICAgICAgICAgZG9tYWluIHx8XG4gICAgICAgICAgICBzZWN1cmUgfHxcbiAgICAgICAgICAgIHNhbWVTaXRlXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc0JvZHkgPSB7XG4gICAgICAgICAgICAgICAgZXhwaXJlczogZXhwaXJlc09yT3B0aW9ucyBhcyBDb29raWVPcHRpb25zW1wiZXhwaXJlc1wiXSxcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICAgICAgICBzZWN1cmUsXG4gICAgICAgICAgICAgICAgc2FtZVNpdGU6IHNhbWVTaXRlID8gc2FtZVNpdGUgOiBcIkxheFwiLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUsIG9wdGlvbnNCb2R5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb29raWVTdHJpbmc6IHN0cmluZyA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSArIFwiO1wiO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBleHBpcmVzT3JPcHRpb25zID8gZXhwaXJlc09yT3B0aW9ucyA6IHt9O1xuXG4gICAgICAgIGlmIChvcHRpb25zLmV4cGlyZXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBpcmVzID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUV4cGlyZXM6IERhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBvcHRpb25zLmV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvb2tpZVN0cmluZyArPSBcImV4cGlyZXM9XCIgKyBkYXRlRXhwaXJlcy50b1VUQ1N0cmluZygpICsgXCI7XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvb2tpZVN0cmluZyArPSBcImV4cGlyZXM9XCIgKyBvcHRpb25zLmV4cGlyZXMudG9VVENTdHJpbmcoKSArIFwiO1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xuICAgICAgICAgICAgY29va2llU3RyaW5nICs9IFwicGF0aD1cIiArIG9wdGlvbnMucGF0aCArIFwiO1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29va2llU3RyaW5nICs9IFwicGF0aD0vO1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZG9tYWluKSB7XG4gICAgICAgICAgICBjb29raWVTdHJpbmcgKz0gXCJkb21haW49XCIgKyBvcHRpb25zLmRvbWFpbiArIFwiO1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2VjdXJlID09PSBmYWxzZSAmJiBvcHRpb25zLnNhbWVTaXRlID09PSBcIk5vbmVcIikge1xuICAgICAgICAgICAgb3B0aW9ucy5zZWN1cmUgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGBbbmd4LWNvb2tpZS1zZXJ2aWNlXSBDb29raWUgJHtuYW1lfSB3YXMgZm9yY2VkIHdpdGggc2VjdXJlIGZsYWcgYmVjYXVzZSBzYW1lU2l0ZT1Ob25lLmAgK1xuICAgICAgICAgICAgICAgICAgICBgTW9yZSBkZXRhaWxzIDogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXZlcm1laXN0ZXIvbmd4LWNvb2tpZS1zZXJ2aWNlL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtNTk3NzIwMTMwYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zZWN1cmUpIHtcbiAgICAgICAgICAgIGNvb2tpZVN0cmluZyArPSBcInNlY3VyZTtcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5zYW1lU2l0ZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zYW1lU2l0ZSA9IFwiTGF4XCI7XG4gICAgICAgIH1cbiAgICAgICAgY29va2llU3RyaW5nICs9IFwic2FtZVNpdGU9XCIgKyBvcHRpb25zLnNhbWVTaXRlICsgXCI7XCI7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQuY29va2llID0gY29va2llU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBjb29raWUgYnkgbmFtZVxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgICBDb29raWUgbmFtZVxuICAgICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcbiAgICAgKiBAcGFyYW0gZG9tYWluIENvb2tpZSBkb21haW5cbiAgICAgKiBAcGFyYW0gc2VjdXJlIENvb2tpZSBzZWN1cmUgZmxhZ1xuICAgICAqIEBwYXJhbSBzYW1lU2l0ZSBDb29raWUgc2FtZVNpdGUgZmxhZyAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9TZXQtQ29va2llL1NhbWVTaXRlXG4gICAgICpcbiAgICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxuICAgICAqIEBzaW5jZTogMS4wLjBcbiAgICAgKi9cbiAgICBkZWxldGUoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcGF0aD86IENvb2tpZU9wdGlvbnNbXCJwYXRoXCJdLFxuICAgICAgICBkb21haW4/OiBDb29raWVPcHRpb25zW1wiZG9tYWluXCJdLFxuICAgICAgICBzZWN1cmU/OiBDb29raWVPcHRpb25zW1wic2VjdXJlXCJdLFxuICAgICAgICBzYW1lU2l0ZTogU2FtZVNpdGUgPSBcIkxheFwiXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4cGlyZXNEYXRlID0gbmV3IERhdGUoXCJUaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAxIEdNVFwiKTtcbiAgICAgICAgdGhpcy5zZXQobmFtZSwgXCJcIiwgeyBleHBpcmVzOiBleHBpcmVzRGF0ZSwgcGF0aCwgZG9tYWluLCBzZWN1cmUsIHNhbWVTaXRlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhbGwgY29va2llc1xuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGggICBDb29raWUgcGF0aFxuICAgICAqIEBwYXJhbSBkb21haW4gQ29va2llIGRvbWFpblxuICAgICAqIEBwYXJhbSBzZWN1cmUgSXMgdGhlIENvb2tpZSBzZWN1cmVcbiAgICAgKiBAcGFyYW0gc2FtZVNpdGUgSXMgdGhlIGNvb2tpZSBzYW1lIHNpdGVcbiAgICAgKlxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAgICogQHNpbmNlOiAxLjAuMFxuICAgICAqL1xuICAgIGRlbGV0ZUFsbChcbiAgICAgICAgcGF0aD86IENvb2tpZU9wdGlvbnNbXCJwYXRoXCJdLFxuICAgICAgICBkb21haW4/OiBDb29raWVPcHRpb25zW1wiZG9tYWluXCJdLFxuICAgICAgICBzZWN1cmU/OiBDb29raWVPcHRpb25zW1wic2VjdXJlXCJdLFxuICAgICAgICBzYW1lU2l0ZTogU2FtZVNpdGUgPSBcIkxheFwiXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29va2llczogYW55ID0gdGhpcy5nZXRBbGwoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvb2tpZU5hbWUgaW4gY29va2llcykge1xuICAgICAgICAgICAgaWYgKGNvb2tpZXMuaGFzT3duUHJvcGVydHkoY29va2llTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZShjb29raWVOYW1lLCBwYXRoLCBkb21haW4sIHNlY3VyZSwgc2FtZVNpdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
1
|
+
// This service is based on the `ng2-cookies` package which sadly is not a service and does
|
|
2
|
+
// not use `DOCUMENT` injection and therefore doesn't work well with AoT production builds.
|
|
3
|
+
// Package: https://github.com/BCJTI/ng2-cookies
|
|
4
|
+
import { Inject, Injectable, PLATFORM_ID } from "@angular/core";
|
|
5
|
+
import { DOCUMENT, isPlatformBrowser } from "@angular/common";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class SmartCookieService {
|
|
8
|
+
constructor(document,
|
|
9
|
+
// Get the `PLATFORM_ID` so we can check if we're in a browser.
|
|
10
|
+
platformId) {
|
|
11
|
+
this.document = document;
|
|
12
|
+
this.platformId = platformId;
|
|
13
|
+
this.documentIsAccessible = isPlatformBrowser(this.platformId);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get cookie Regular Expression
|
|
17
|
+
*
|
|
18
|
+
* @param name Cookie name
|
|
19
|
+
* @returns property RegExp
|
|
20
|
+
*
|
|
21
|
+
* @author: Stepan Suvorov
|
|
22
|
+
* @since: 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
static getCookieRegExp(name) {
|
|
25
|
+
const escapedName = name.replace(/([\[\]\{\}\(\)\|\=\;\+\?\,\.\*\^\$])/gi, "\\$1");
|
|
26
|
+
return new RegExp("(?:^" + escapedName + "|;\\s*" + escapedName + ")=(.*?)(?:;|$)", "g");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
30
|
+
*
|
|
31
|
+
* @param encodedURIComponent A value representing an encoded URI component.
|
|
32
|
+
*
|
|
33
|
+
* @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
34
|
+
*
|
|
35
|
+
* @author: Stepan Suvorov
|
|
36
|
+
* @since: 1.0.0
|
|
37
|
+
*/
|
|
38
|
+
static safeDecodeURIComponent(encodedURIComponent) {
|
|
39
|
+
try {
|
|
40
|
+
return decodeURIComponent(encodedURIComponent);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// probably it is not uri encoded. return as is
|
|
44
|
+
return encodedURIComponent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return `true` if {@link Document} is accessible, otherwise return `false`
|
|
49
|
+
*
|
|
50
|
+
* @param name Cookie name
|
|
51
|
+
* @returns boolean - whether cookie with specified name exists
|
|
52
|
+
*
|
|
53
|
+
* @author: Stepan Suvorov
|
|
54
|
+
* @since: 1.0.0
|
|
55
|
+
*/
|
|
56
|
+
check(name) {
|
|
57
|
+
if (!this.documentIsAccessible) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
name = encodeURIComponent(name);
|
|
61
|
+
const regExp = SmartCookieService.getCookieRegExp(name);
|
|
62
|
+
return regExp.test(this.document.cookie);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get cookies by name
|
|
66
|
+
*
|
|
67
|
+
* @param name Cookie name
|
|
68
|
+
* @returns property value
|
|
69
|
+
*
|
|
70
|
+
* @author: Stepan Suvorov
|
|
71
|
+
* @since: 1.0.0
|
|
72
|
+
*/
|
|
73
|
+
get(name) {
|
|
74
|
+
if (this.documentIsAccessible && this.check(name)) {
|
|
75
|
+
name = encodeURIComponent(name);
|
|
76
|
+
const regExp = SmartCookieService.getCookieRegExp(name);
|
|
77
|
+
const result = regExp.exec(this.document.cookie);
|
|
78
|
+
let results = result.input.split(";");
|
|
79
|
+
let value;
|
|
80
|
+
results.forEach((r) => {
|
|
81
|
+
let values = r.split(`${name}=`);
|
|
82
|
+
if (values[1] !== "null") {
|
|
83
|
+
value = values[1];
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return value ?? "";
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return "";
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all cookies in JSON format
|
|
94
|
+
*
|
|
95
|
+
* @returns all the cookies in json
|
|
96
|
+
*
|
|
97
|
+
* @author: Stepan Suvorov
|
|
98
|
+
* @since: 1.0.0
|
|
99
|
+
*/
|
|
100
|
+
getAll() {
|
|
101
|
+
if (!this.documentIsAccessible) {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
const cookies = {};
|
|
105
|
+
const document = this.document;
|
|
106
|
+
if (document.cookie && document.cookie !== "") {
|
|
107
|
+
document.cookie.split(";").forEach((currentCookie) => {
|
|
108
|
+
const [cookieName, cookieValue] = currentCookie.split("=");
|
|
109
|
+
cookies[SmartCookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ""))] =
|
|
110
|
+
SmartCookieService.safeDecodeURIComponent(cookieValue);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return cookies;
|
|
114
|
+
}
|
|
115
|
+
set(name, value, expiresOrOptions, path, domain, secure, sameSite) {
|
|
116
|
+
if (!this.documentIsAccessible) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (typeof expiresOrOptions === "number" ||
|
|
120
|
+
expiresOrOptions instanceof Date ||
|
|
121
|
+
path ||
|
|
122
|
+
domain ||
|
|
123
|
+
secure ||
|
|
124
|
+
sameSite) {
|
|
125
|
+
const optionsBody = {
|
|
126
|
+
expires: expiresOrOptions,
|
|
127
|
+
path,
|
|
128
|
+
domain,
|
|
129
|
+
secure,
|
|
130
|
+
sameSite: sameSite ? sameSite : "Lax",
|
|
131
|
+
};
|
|
132
|
+
this.set(name, value, optionsBody);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
let cookieString = encodeURIComponent(name) + "=" + encodeURIComponent(value) + ";";
|
|
136
|
+
const options = expiresOrOptions ? expiresOrOptions : {};
|
|
137
|
+
if (options.expires) {
|
|
138
|
+
if (typeof options.expires === "number") {
|
|
139
|
+
const dateExpires = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);
|
|
140
|
+
cookieString += "expires=" + dateExpires.toUTCString() + ";";
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
cookieString += "expires=" + options.expires.toUTCString() + ";";
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (options.path) {
|
|
147
|
+
cookieString += "path=" + options.path + ";";
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
cookieString += "path=/;";
|
|
151
|
+
}
|
|
152
|
+
if (options.domain) {
|
|
153
|
+
cookieString += "domain=" + options.domain + ";";
|
|
154
|
+
}
|
|
155
|
+
if (options.secure === false && options.sameSite === "None") {
|
|
156
|
+
options.secure = true;
|
|
157
|
+
console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` +
|
|
158
|
+
`More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`);
|
|
159
|
+
}
|
|
160
|
+
if (options.secure) {
|
|
161
|
+
cookieString += "secure;";
|
|
162
|
+
}
|
|
163
|
+
if (!options.sameSite) {
|
|
164
|
+
options.sameSite = "Lax";
|
|
165
|
+
}
|
|
166
|
+
cookieString += "sameSite=" + options.sameSite + ";";
|
|
167
|
+
this.document.cookie = cookieString;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Delete cookie by name
|
|
171
|
+
*
|
|
172
|
+
* @param name Cookie name
|
|
173
|
+
* @param path Cookie path
|
|
174
|
+
* @param domain Cookie domain
|
|
175
|
+
* @param secure Cookie secure flag
|
|
176
|
+
* @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
|
177
|
+
*
|
|
178
|
+
* @author: Stepan Suvorov
|
|
179
|
+
* @since: 1.0.0
|
|
180
|
+
*/
|
|
181
|
+
delete(name, path, domain, secure, sameSite = "Lax") {
|
|
182
|
+
if (!this.documentIsAccessible) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const expiresDate = new Date("Thu, 01 Jan 1970 00:00:01 GMT");
|
|
186
|
+
this.set(name, "", { expires: expiresDate, path, domain, secure, sameSite });
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Delete all cookies
|
|
190
|
+
*
|
|
191
|
+
* @param path Cookie path
|
|
192
|
+
* @param domain Cookie domain
|
|
193
|
+
* @param secure Is the Cookie secure
|
|
194
|
+
* @param sameSite Is the cookie same site
|
|
195
|
+
*
|
|
196
|
+
* @author: Stepan Suvorov
|
|
197
|
+
* @since: 1.0.0
|
|
198
|
+
*/
|
|
199
|
+
deleteAll(path, domain, secure, sameSite = "Lax") {
|
|
200
|
+
if (!this.documentIsAccessible) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const cookies = this.getAll();
|
|
204
|
+
for (const cookieName in cookies) {
|
|
205
|
+
if (cookies.hasOwnProperty(cookieName)) {
|
|
206
|
+
this.delete(cookieName, path, domain, secure, sameSite);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
SmartCookieService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartCookieService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
212
|
+
SmartCookieService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartCookieService, providedIn: "root" });
|
|
213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: SmartCookieService, decorators: [{
|
|
214
|
+
type: Injectable,
|
|
215
|
+
args: [{
|
|
216
|
+
providedIn: "root",
|
|
217
|
+
}]
|
|
218
|
+
}], ctorParameters: function () { return [{ type: Document, decorators: [{
|
|
219
|
+
type: Inject,
|
|
220
|
+
args: [DOCUMENT]
|
|
221
|
+
}] }, { type: undefined, decorators: [{
|
|
222
|
+
type: Inject,
|
|
223
|
+
args: [PLATFORM_ID]
|
|
224
|
+
}] }]; } });
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29va2llLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zZXNzaW9uL2Nvb2tpZS1zZXJ2aWNlL3NtYXJ0LWNvb2tpZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJGQUEyRjtBQUMzRiwyRkFBMkY7QUFDM0YsZ0RBQWdEO0FBRWhELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBZTlELE1BQU0sT0FBTyxrQkFBa0I7SUFHM0IsWUFDOEIsUUFBa0I7SUFDNUMsK0RBQStEO0lBQ2xDLFVBQWU7UUFGbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUVmLGVBQVUsR0FBVixVQUFVLENBQUs7UUFFNUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQVk7UUFDdkMsTUFBTSxXQUFXLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRixPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLEdBQUcsUUFBUSxHQUFHLFdBQVcsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssTUFBTSxDQUFDLHNCQUFzQixDQUFDLG1CQUEyQjtRQUM3RCxJQUFJO1lBQ0EsT0FBTyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ2xEO1FBQUMsTUFBTTtZQUNKLCtDQUErQztZQUMvQyxP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QUFnQyxFQUNoQyxNQUFnQyxFQUNoQyxXQUFxQixLQUFLO1FBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDNUIsT0FBTztTQUNWO1FBRUQsTUFBTSxPQUFPLEdBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRW5DLEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxFQUFFO1lBQzlCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDM0Q7U0FDSjtJQUNMLENBQUM7O2dIQTFTUSxrQkFBa0Isa0JBSWYsUUFBUSxhQUVSLFdBQVc7b0hBTmQsa0JBQWtCLGNBRmYsTUFBTTs0RkFFVCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzBEQUsyQyxRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVE7OzBCQUVmLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgc2VydmljZSBpcyBiYXNlZCBvbiB0aGUgYG5nMi1jb29raWVzYCBwYWNrYWdlIHdoaWNoIHNhZGx5IGlzIG5vdCBhIHNlcnZpY2UgYW5kIGRvZXNcclxuLy8gbm90IHVzZSBgRE9DVU1FTlRgIGluamVjdGlvbiBhbmQgdGhlcmVmb3JlIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggQW9UIHByb2R1Y3Rpb24gYnVpbGRzLlxyXG4vLyBQYWNrYWdlOiBodHRwczovL2dpdGh1Yi5jb20vQkNKVEkvbmcyLWNvb2tpZXNcclxuXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcblxyXG5leHBvcnQgdHlwZSBTYW1lU2l0ZSA9IFwiTGF4XCIgfCBcIk5vbmVcIiB8IFwiU3RyaWN0XCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvb2tpZU9wdGlvbnMge1xyXG4gICAgZXhwaXJlcz86IG51bWJlciB8IERhdGU7XHJcbiAgICBwYXRoPzogc3RyaW5nO1xyXG4gICAgZG9tYWluPzogc3RyaW5nO1xyXG4gICAgc2VjdXJlPzogYm9vbGVhbjtcclxuICAgIHNhbWVTaXRlPzogU2FtZVNpdGU7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRDb29raWVTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRJc0FjY2Vzc2libGU6IGJvb2xlYW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXHJcbiAgICAgICAgLy8gR2V0IHRoZSBgUExBVEZPUk1fSURgIHNvIHdlIGNhbiBjaGVjayBpZiB3ZSdyZSBpbiBhIGJyb3dzZXIuXHJcbiAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBhbnlcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUgPSBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGNvb2tpZSBSZWd1bGFyIEV4cHJlc3Npb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBDb29raWUgbmFtZVxyXG4gICAgICogQHJldHVybnMgcHJvcGVydHkgUmVnRXhwXHJcbiAgICAgKlxyXG4gICAgICogQGF1dGhvcjogU3RlcGFuIFN1dm9yb3ZcclxuICAgICAqIEBzaW5jZTogMS4wLjBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q29va2llUmVnRXhwKG5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XHJcbiAgICAgICAgY29uc3QgZXNjYXBlZE5hbWU6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvKFtcXFtcXF1cXHtcXH1cXChcXClcXHxcXD1cXDtcXCtcXD9cXCxcXC5cXCpcXF5cXCRdKS9naSwgXCJcXFxcJDFcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKD86XlwiICsgZXNjYXBlZE5hbWUgKyBcInw7XFxcXHMqXCIgKyBlc2NhcGVkTmFtZSArIFwiKT0oLio/KSg/Ojt8JClcIiwgXCJnXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdW5lbmNvZGVkIHZlcnNpb24gb2YgYW4gZW5jb2RlZCBjb21wb25lbnQgb2YgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVuY29kZWRVUklDb21wb25lbnQgQSB2YWx1ZSByZXByZXNlbnRpbmcgYW4gZW5jb2RlZCBVUkkgY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSB1bmVuY29kZWQgdmVyc2lvbiBvZiBhbiBlbmNvZGVkIGNvbXBvbmVudCBvZiBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKS5cclxuICAgICAqXHJcbiAgICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxyXG4gICAgICogQHNpbmNlOiAxLjAuMFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZWRVUklDb21wb25lbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVkVVJJQ29tcG9uZW50KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gcHJvYmFibHkgaXQgaXMgbm90IHVyaSBlbmNvZGVkLiByZXR1cm4gYXMgaXNcclxuICAgICAgICAgICAgcmV0dXJuIGVuY29kZWRVUklDb21wb25lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZiB7QGxpbmsgRG9jdW1lbnR9IGlzIGFjY2Vzc2libGUsIG90aGVyd2lzZSByZXR1cm4gYGZhbHNlYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIENvb2tpZSBuYW1lXHJcbiAgICAgKiBAcmV0dXJucyBib29sZWFuIC0gd2hldGhlciBjb29raWUgd2l0aCBzcGVjaWZpZWQgbmFtZSBleGlzdHNcclxuICAgICAqXHJcbiAgICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxyXG4gICAgICogQHNpbmNlOiAxLjAuMFxyXG4gICAgICovXHJcbiAgICBjaGVjayhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlZ0V4cDogUmVnRXhwID0gU21hcnRDb29raWVTZXJ2aWNlLmdldENvb2tpZVJlZ0V4cChuYW1lKTtcclxuICAgICAgICByZXR1cm4gcmVnRXhwLnRlc3QodGhpcy5kb2N1bWVudC5jb29raWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGNvb2tpZXMgYnkgbmFtZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIENvb2tpZSBuYW1lXHJcbiAgICAgKiBAcmV0dXJucyBwcm9wZXJ0eSB2YWx1ZVxyXG4gICAgICpcclxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XHJcbiAgICAgKiBAc2luY2U6IDEuMC4wXHJcbiAgICAgKi9cclxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlICYmIHRoaXMuY2hlY2sobmFtZSkpIHtcclxuICAgICAgICAgICAgbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ0V4cDogUmVnRXhwID0gU21hcnRDb29raWVTZXJ2aWNlLmdldENvb2tpZVJlZ0V4cChuYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWdFeHBFeGVjQXJyYXkgPSByZWdFeHAuZXhlYyh0aGlzLmRvY3VtZW50LmNvb2tpZSkhO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IHJlc3VsdC5pbnB1dC5zcGxpdChcIjtcIik7XHJcblxyXG4gICAgICAgICAgICBsZXQgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgocjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gci5zcGxpdChgJHtuYW1lfT1gKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbMV0gIT09IFwibnVsbFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID8/IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGFsbCBjb29raWVzIGluIEpTT04gZm9ybWF0XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgYWxsIHRoZSBjb29raWVzIGluIGpzb25cclxuICAgICAqXHJcbiAgICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxyXG4gICAgICogQHNpbmNlOiAxLjAuMFxyXG4gICAgICovXHJcbiAgICBnZXRBbGwoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvb2tpZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICAgICAgICBjb25zdCBkb2N1bWVudDogYW55ID0gdGhpcy5kb2N1bWVudDtcclxuXHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmNvb2tpZSAmJiBkb2N1bWVudC5jb29raWUgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKS5mb3JFYWNoKChjdXJyZW50Q29va2llOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtjb29raWVOYW1lLCBjb29raWVWYWx1ZV0gPSBjdXJyZW50Q29va2llLnNwbGl0KFwiPVwiKTtcclxuICAgICAgICAgICAgICAgIGNvb2tpZXNbU21hcnRDb29raWVTZXJ2aWNlLnNhZmVEZWNvZGVVUklDb21wb25lbnQoY29va2llTmFtZS5yZXBsYWNlKC9eIC8sIFwiXCIpKV0gPVxyXG4gICAgICAgICAgICAgICAgICAgIFNtYXJ0Q29va2llU2VydmljZS5zYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZVZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29va2llcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBjb29raWUgYmFzZWQgb24gcHJvdmlkZWQgaW5mb3JtYXRpb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAgICAgQ29va2llIG5hbWVcclxuICAgICAqIEBwYXJhbSB2YWx1ZSAgICBDb29raWUgdmFsdWVcclxuICAgICAqIEBwYXJhbSBleHBpcmVzICBOdW1iZXIgb2YgZGF5cyB1bnRpbCB0aGUgY29va2llcyBleHBpcmVzIG9yIGFuIGFjdHVhbCBgRGF0ZWBcclxuICAgICAqIEBwYXJhbSBwYXRoICAgICBDb29raWUgcGF0aFxyXG4gICAgICogQHBhcmFtIGRvbWFpbiAgIENvb2tpZSBkb21haW5cclxuICAgICAqIEBwYXJhbSBzZWN1cmUgICBTZWN1cmUgZmxhZ1xyXG4gICAgICogQHBhcmFtIHNhbWVTaXRlIE9XQVNQIHNhbWVzaXRlIHRva2VuIGBMYXhgLCBgTm9uZWAsIG9yIGBTdHJpY3RgLiBEZWZhdWx0cyB0byBgTGF4YFxyXG4gICAgICpcclxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XHJcbiAgICAgKiBAc2luY2U6IDEuMC4wXHJcbiAgICAgKi9cclxuICAgIHNldChcclxuICAgICAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgdmFsdWU6IHN0cmluZyxcclxuICAgICAgICBleHBpcmVzPzogQ29va2llT3B0aW9uc1tcImV4cGlyZXNcIl0sXHJcbiAgICAgICAgcGF0aD86IENvb2tpZU9wdGlvbnNbXCJwYXRoXCJdLFxyXG4gICAgICAgIGRvbWFpbj86IENvb2tpZU9wdGlvbnNbXCJkb21haW5cIl0sXHJcbiAgICAgICAgc2VjdXJlPzogQ29va2llT3B0aW9uc1tcInNlY3VyZVwiXSxcclxuICAgICAgICBzYW1lU2l0ZT86IFNhbWVTaXRlXHJcbiAgICApOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGNvb2tpZSBiYXNlZCBvbiBwcm92aWRlZCBpbmZvcm1hdGlvblxyXG4gICAgICpcclxuICAgICAqIENvb2tpZSdzIHBhcmFtZXRlcnM6XHJcbiAgICAgKiA8cHJlPlxyXG4gICAgICogZXhwaXJlcyAgTnVtYmVyIG9mIGRheXMgdW50aWwgdGhlIGNvb2tpZXMgZXhwaXJlcyBvciBhbiBhY3R1YWwgYERhdGVgXHJcbiAgICAgKiBwYXRoICAgICBDb29raWUgcGF0aFxyXG4gICAgICogZG9tYWluICAgQ29va2llIGRvbWFpblxyXG4gICAgICogc2VjdXJlICAgU2VjdXJlIGZsYWdcclxuICAgICAqIHNhbWVTaXRlIE9XQVNQIHNhbWVzaXRlIHRva2VuIGBMYXhgLCBgTm9uZWAsIG9yIGBTdHJpY3RgLiBEZWZhdWx0cyB0byBgTGF4YFxyXG4gICAgICogPC9wcmU+XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgICAgIENvb2tpZSBuYW1lXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgICAgQ29va2llIHZhbHVlXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAgQm9keSB3aXRoIGNvb2tpZSdzIHBhcmFtc1xyXG4gICAgICpcclxuICAgICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XHJcbiAgICAgKiBAc2luY2U6IDEuMC4wXHJcbiAgICAgKi9cclxuICAgIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBDb29raWVPcHRpb25zKTogdm9pZDtcclxuXHJcbiAgICBzZXQoXHJcbiAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXHJcbiAgICAgICAgZXhwaXJlc09yT3B0aW9ucz86IENvb2tpZU9wdGlvbnNbXCJleHBpcmVzXCJdIHwgQ29va2llT3B0aW9ucyxcclxuICAgICAgICBwYXRoPzogQ29va2llT3B0aW9uc1tcInBhdGhcIl0sXHJcbiAgICAgICAgZG9tYWluPzogQ29va2llT3B0aW9uc1tcImRvbWFpblwiXSxcclxuICAgICAgICBzZWN1cmU/OiBDb29raWVPcHRpb25zW1wic2VjdXJlXCJdLFxyXG4gICAgICAgIHNhbWVTaXRlPzogU2FtZVNpdGVcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBleHBpcmVzT3JPcHRpb25zID09PSBcIm51bWJlclwiIHx8XHJcbiAgICAgICAgICAgIGV4cGlyZXNPck9wdGlvbnMgaW5zdGFuY2VvZiBEYXRlIHx8XHJcbiAgICAgICAgICAgIHBhdGggfHxcclxuICAgICAgICAgICAgZG9tYWluIHx8XHJcbiAgICAgICAgICAgIHNlY3VyZSB8fFxyXG4gICAgICAgICAgICBzYW1lU2l0ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zQm9keSA9IHtcclxuICAgICAgICAgICAgICAgIGV4cGlyZXM6IGV4cGlyZXNPck9wdGlvbnMgYXMgQ29va2llT3B0aW9uc1tcImV4cGlyZXNcIl0sXHJcbiAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgZG9tYWluLFxyXG4gICAgICAgICAgICAgICAgc2VjdXJlLFxyXG4gICAgICAgICAgICAgICAgc2FtZVNpdGU6IHNhbWVTaXRlID8gc2FtZVNpdGUgOiBcIkxheFwiLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUsIG9wdGlvbnNCb2R5KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGNvb2tpZVN0cmluZzogc3RyaW5nID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpICsgXCI7XCI7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBleHBpcmVzT3JPcHRpb25zID8gZXhwaXJlc09yT3B0aW9ucyA6IHt9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5leHBpcmVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBpcmVzID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlRXhwaXJlczogRGF0ZSA9IG5ldyBEYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgb3B0aW9ucy5leHBpcmVzICogMTAwMCAqIDYwICogNjAgKiAyNFxyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb29raWVTdHJpbmcgKz0gXCJleHBpcmVzPVwiICsgZGF0ZUV4cGlyZXMudG9VVENTdHJpbmcoKSArIFwiO1wiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29va2llU3RyaW5nICs9IFwiZXhwaXJlcz1cIiArIG9wdGlvbnMuZXhwaXJlcy50b1VUQ1N0cmluZygpICsgXCI7XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLnBhdGgpIHtcclxuICAgICAgICAgICAgY29va2llU3RyaW5nICs9IFwicGF0aD1cIiArIG9wdGlvbnMucGF0aCArIFwiO1wiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvb2tpZVN0cmluZyArPSBcInBhdGg9LztcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLmRvbWFpbikge1xyXG4gICAgICAgICAgICBjb29raWVTdHJpbmcgKz0gXCJkb21haW49XCIgKyBvcHRpb25zLmRvbWFpbiArIFwiO1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VjdXJlID09PSBmYWxzZSAmJiBvcHRpb25zLnNhbWVTaXRlID09PSBcIk5vbmVcIikge1xyXG4gICAgICAgICAgICBvcHRpb25zLnNlY3VyZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgICAgIGBbbmd4LWNvb2tpZS1zZXJ2aWNlXSBDb29raWUgJHtuYW1lfSB3YXMgZm9yY2VkIHdpdGggc2VjdXJlIGZsYWcgYmVjYXVzZSBzYW1lU2l0ZT1Ob25lLmAgK1xyXG4gICAgICAgICAgICAgICAgICAgIGBNb3JlIGRldGFpbHMgOiBodHRwczovL2dpdGh1Yi5jb20vc3RldmVybWVpc3Rlci9uZ3gtY29va2llLXNlcnZpY2UvaXNzdWVzLzg2I2lzc3VlY29tbWVudC01OTc3MjAxMzBgXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcHRpb25zLnNlY3VyZSkge1xyXG4gICAgICAgICAgICBjb29raWVTdHJpbmcgKz0gXCJzZWN1cmU7XCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9wdGlvbnMuc2FtZVNpdGUpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5zYW1lU2l0ZSA9IFwiTGF4XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvb2tpZVN0cmluZyArPSBcInNhbWVTaXRlPVwiICsgb3B0aW9ucy5zYW1lU2l0ZSArIFwiO1wiO1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnQuY29va2llID0gY29va2llU3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlIGNvb2tpZSBieSBuYW1lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgICBDb29raWUgbmFtZVxyXG4gICAgICogQHBhcmFtIHBhdGggICBDb29raWUgcGF0aFxyXG4gICAgICogQHBhcmFtIGRvbWFpbiBDb29raWUgZG9tYWluXHJcbiAgICAgKiBAcGFyYW0gc2VjdXJlIENvb2tpZSBzZWN1cmUgZmxhZ1xyXG4gICAgICogQHBhcmFtIHNhbWVTaXRlIENvb2tpZSBzYW1lU2l0ZSBmbGFnIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1NldC1Db29raWUvU2FtZVNpdGVcclxuICAgICAqXHJcbiAgICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxyXG4gICAgICogQHNpbmNlOiAxLjAuMFxyXG4gICAgICovXHJcbiAgICBkZWxldGUoXHJcbiAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgIHBhdGg/OiBDb29raWVPcHRpb25zW1wicGF0aFwiXSxcclxuICAgICAgICBkb21haW4/OiBDb29raWVPcHRpb25zW1wiZG9tYWluXCJdLFxyXG4gICAgICAgIHNlY3VyZT86IENvb2tpZU9wdGlvbnNbXCJzZWN1cmVcIl0sXHJcbiAgICAgICAgc2FtZVNpdGU6IFNhbWVTaXRlID0gXCJMYXhcIlxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXhwaXJlc0RhdGUgPSBuZXcgRGF0ZShcIlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UXCIpO1xyXG4gICAgICAgIHRoaXMuc2V0KG5hbWUsIFwiXCIsIHsgZXhwaXJlczogZXhwaXJlc0RhdGUsIHBhdGgsIGRvbWFpbiwgc2VjdXJlLCBzYW1lU2l0ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZSBhbGwgY29va2llc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcclxuICAgICAqIEBwYXJhbSBkb21haW4gQ29va2llIGRvbWFpblxyXG4gICAgICogQHBhcmFtIHNlY3VyZSBJcyB0aGUgQ29va2llIHNlY3VyZVxyXG4gICAgICogQHBhcmFtIHNhbWVTaXRlIElzIHRoZSBjb29raWUgc2FtZSBzaXRlXHJcbiAgICAgKlxyXG4gICAgICogQGF1dGhvcjogU3RlcGFuIFN1dm9yb3ZcclxuICAgICAqIEBzaW5jZTogMS4wLjBcclxuICAgICAqL1xyXG4gICAgZGVsZXRlQWxsKFxyXG4gICAgICAgIHBhdGg/OiBDb29raWVPcHRpb25zW1wicGF0aFwiXSxcclxuICAgICAgICBkb21haW4/OiBDb29raWVPcHRpb25zW1wiZG9tYWluXCJdLFxyXG4gICAgICAgIHNlY3VyZT86IENvb2tpZU9wdGlvbnNbXCJzZWN1cmVcIl0sXHJcbiAgICAgICAgc2FtZVNpdGU6IFNhbWVTaXRlID0gXCJMYXhcIlxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvb2tpZXM6IGFueSA9IHRoaXMuZ2V0QWxsKCk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29va2llTmFtZSBpbiBjb29raWVzKSB7XHJcbiAgICAgICAgICAgIGlmIChjb29raWVzLmhhc093blByb3BlcnR5KGNvb2tpZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZShjb29raWVOYW1lLCBwYXRoLCBkb21haW4sIHNlY3VyZSwgc2FtZVNpdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|