@bravobit/bb-foundation 0.16.4 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -47
- package/auth/bravobit-bb-foundation-auth.d.ts +5 -5
- package/auth/lib/auth.interceptor.d.ts +21 -21
- package/auth/lib/auth.module.d.ts +15 -15
- package/auth/lib/auth.service.d.ts +59 -59
- package/auth/lib/auth.session.d.ts +34 -34
- package/auth/lib/directives/authenticated.directive.d.ts +14 -14
- package/auth/lib/directives/permission.directive.d.ts +24 -24
- package/auth/lib/directives/role.directive.d.ts +16 -16
- package/auth/lib/guards/anonymous.guard.d.ts +11 -11
- package/auth/lib/guards/authenticated.guard.d.ts +11 -11
- package/auth/lib/helpers/jwt.helper.d.ts +8 -8
- package/auth/lib/helpers/mapper.helper.d.ts +23 -23
- package/auth/lib/interfaces/config.interface.d.ts +12 -12
- package/auth/lib/interfaces/mapper.interface.d.ts +19 -19
- package/auth/lib/interfaces/provider.interface.d.ts +16 -16
- package/auth/lib/interfaces/token.interface.d.ts +11 -11
- package/auth/lib/permissions.service.d.ts +14 -14
- package/auth/lib/providers/email.provider.d.ts +15 -15
- package/auth/lib/providers/verify.provider.d.ts +13 -13
- package/auth/lib/tokens/use-authorization.token.d.ts +2 -2
- package/auth/public_api.d.ts +18 -18
- package/bravobit-bb-foundation.d.ts +5 -5
- package/collections/bravobit-bb-foundation-collections.d.ts +5 -5
- package/collections/lib/collection.d.ts +43 -43
- package/collections/lib/collections.module.d.ts +10 -10
- package/collections/lib/components/collections-pager/collections-pager.component.d.ts +34 -34
- package/collections/lib/components/collections-viewer/collections-viewer.component.d.ts +12 -12
- package/collections/lib/components/collections.directive.d.ts +17 -17
- package/collections/lib/interfaces/collection.interface.d.ts +26 -26
- package/collections/lib/providers/api-collection.provider.d.ts +19 -15
- package/collections/lib/providers/collection.provider.d.ts +6 -6
- package/collections/lib/providers/local-collection.provider.d.ts +8 -8
- package/collections/public_api.d.ts +9 -9
- package/controls/bravobit-bb-foundation-controls.d.ts +5 -5
- package/controls/lib/checkbox/checkbox/checkbox.component.d.ts +47 -47
- package/controls/lib/checkbox/checkbox-group/checkbox-group.component.d.ts +18 -18
- package/controls/lib/checkbox/checkbox.module.d.ts +9 -9
- package/controls/lib/controls.module.d.ts +7 -7
- package/controls/public_api.d.ts +4 -4
- package/dashboard/bravobit-bb-foundation-dashboard.d.ts +5 -5
- package/dashboard/lib/dashboard/dashboard.component.d.ts +19 -19
- package/dashboard/lib/dashboard-header/dashboard-header.component.d.ts +11 -11
- package/dashboard/lib/dashboard-menu/dashboard-menu.component.d.ts +9 -9
- package/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.d.ts +11 -11
- package/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.d.ts +21 -21
- package/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.d.ts +27 -27
- package/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.d.ts +16 -16
- package/dashboard/lib/dashboard.module.d.ts +16 -16
- package/dashboard/public_api.d.ts +8 -8
- package/dialog/bravobit-bb-foundation-dialog.d.ts +5 -5
- package/dialog/lib/dialog-actions/dialog-actions.component.d.ts +5 -5
- package/dialog/lib/dialog-confirm/dialog-confirm.component.d.ts +16 -16
- package/dialog/lib/dialog-container/dialog-container.component.d.ts +24 -24
- package/dialog/lib/dialog-header/dialog-header.component.d.ts +9 -9
- package/dialog/lib/dialog-link/dialog-link.component.d.ts +5 -5
- package/dialog/lib/dialog-modal/dialog-modal.component.d.ts +12 -12
- package/dialog/lib/dialog-overlay/dialog-overlay.component.d.ts +22 -22
- package/dialog/lib/dialog.injector.d.ts +8 -8
- package/dialog/lib/dialog.insertion.d.ts +8 -8
- package/dialog/lib/dialog.interfaces.d.ts +3 -3
- package/dialog/lib/dialog.module.d.ts +19 -19
- package/dialog/lib/dialog.ref.d.ts +8 -8
- package/dialog/lib/dialog.service.d.ts +19 -19
- package/dialog/public_api.d.ts +9 -9
- package/elements/bravobit-bb-foundation-elements.d.ts +5 -5
- package/elements/lib/avatar/avatar.component.d.ts +25 -25
- package/elements/lib/button/button.component.d.ts +23 -23
- package/elements/lib/checkbox/checkbox.component.d.ts +27 -27
- package/elements/lib/date-picker/date-picker.component.d.ts +69 -69
- package/elements/lib/directives/addon.directive.d.ts +9 -9
- package/elements/lib/directives/autosize.directive.d.ts +18 -18
- package/elements/lib/directives/focus-trap.directive.d.ts +17 -17
- package/elements/lib/directives/focus.directive.d.ts +14 -14
- package/elements/lib/directives/form-submit.directive.d.ts +17 -17
- package/elements/lib/directives/input.directive.d.ts +38 -38
- package/elements/lib/directives/template.directive.d.ts +10 -10
- package/elements/lib/dropdown/dropdown.component.d.ts +21 -21
- package/elements/lib/elements.interfaces.d.ts +25 -25
- package/elements/lib/elements.module.d.ts +116 -116
- package/elements/lib/file-picker/file-picker.component.d.ts +49 -49
- package/elements/lib/form-control/form-control.component.d.ts +21 -21
- package/elements/lib/form-error/form-error.component.d.ts +29 -29
- package/elements/lib/form-group/form-group.component.d.ts +10 -10
- package/elements/lib/icon/icon.component.d.ts +22 -22
- package/elements/lib/image-picker/image-picker.component.d.ts +38 -38
- package/elements/lib/pipes/file-image.pipe.d.ts +13 -13
- package/elements/lib/pipes/file-size.pipe.d.ts +8 -8
- package/elements/lib/pipes/relative-time.pipe.d.ts +19 -19
- package/elements/lib/spinner/spinner.component.d.ts +12 -12
- package/elements/lib/tag/tag.component.d.ts +7 -7
- package/elements/public_api.d.ts +25 -25
- package/esm2020/auth/bravobit-bb-foundation-auth.mjs +4 -4
- package/esm2020/auth/lib/auth.interceptor.mjs +93 -94
- package/esm2020/auth/lib/auth.module.mjs +54 -54
- package/esm2020/auth/lib/auth.service.mjs +281 -276
- package/esm2020/auth/lib/auth.session.mjs +131 -131
- package/esm2020/auth/lib/directives/authenticated.directive.mjs +31 -31
- package/esm2020/auth/lib/directives/permission.directive.mjs +80 -80
- package/esm2020/auth/lib/directives/role.directive.mjs +37 -37
- package/esm2020/auth/lib/guards/anonymous.guard.mjs +34 -34
- package/esm2020/auth/lib/guards/authenticated.guard.mjs +35 -35
- package/esm2020/auth/lib/helpers/jwt.helper.mjs +69 -69
- package/esm2020/auth/lib/helpers/mapper.helper.mjs +35 -35
- package/esm2020/auth/lib/interfaces/config.interface.mjs +3 -3
- package/esm2020/auth/lib/interfaces/mapper.interface.mjs +2 -2
- package/esm2020/auth/lib/interfaces/provider.interface.mjs +2 -2
- package/esm2020/auth/lib/interfaces/token.interface.mjs +2 -2
- package/esm2020/auth/lib/permissions.service.mjs +56 -56
- package/esm2020/auth/lib/providers/email.provider.mjs +25 -25
- package/esm2020/auth/lib/providers/verify.provider.mjs +19 -19
- package/esm2020/auth/lib/tokens/use-authorization.token.mjs +3 -3
- package/esm2020/auth/public_api.mjs +19 -19
- package/esm2020/bravobit-bb-foundation.mjs +4 -4
- package/esm2020/collections/bravobit-bb-foundation-collections.mjs +4 -4
- package/esm2020/collections/lib/collection.mjs +102 -102
- package/esm2020/collections/lib/collections.module.mjs +54 -54
- package/esm2020/collections/lib/components/collections-pager/collections-pager.component.mjs +123 -123
- package/esm2020/collections/lib/components/collections-viewer/collections-viewer.component.mjs +31 -31
- package/esm2020/collections/lib/components/collections.directive.mjs +43 -43
- package/esm2020/collections/lib/interfaces/collection.interface.mjs +2 -2
- package/esm2020/collections/lib/providers/api-collection.provider.mjs +71 -71
- package/esm2020/collections/lib/providers/collection.provider.mjs +13 -13
- package/esm2020/collections/lib/providers/local-collection.provider.mjs +16 -16
- package/esm2020/collections/public_api.mjs +10 -10
- package/esm2020/controls/bravobit-bb-foundation-controls.mjs +4 -4
- package/esm2020/controls/lib/checkbox/checkbox/checkbox.component.mjs +153 -153
- package/esm2020/controls/lib/checkbox/checkbox-group/checkbox-group.component.mjs +48 -48
- package/esm2020/controls/lib/checkbox/checkbox.module.mjs +19 -19
- package/esm2020/controls/lib/controls.module.mjs +16 -16
- package/esm2020/controls/public_api.mjs +5 -5
- package/esm2020/dashboard/bravobit-bb-foundation-dashboard.mjs +4 -4
- package/esm2020/dashboard/lib/dashboard/dashboard.component.mjs +56 -56
- package/esm2020/dashboard/lib/dashboard-header/dashboard-header.component.mjs +30 -30
- package/esm2020/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +31 -31
- package/esm2020/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +29 -29
- package/esm2020/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +75 -75
- package/esm2020/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +99 -99
- package/esm2020/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +62 -62
- package/esm2020/dashboard/lib/dashboard.module.mjs +47 -47
- package/esm2020/dashboard/public_api.mjs +9 -9
- package/esm2020/dialog/bravobit-bb-foundation-dialog.mjs +4 -4
- package/esm2020/dialog/lib/dialog-actions/dialog-actions.component.mjs +12 -12
- package/esm2020/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +37 -37
- package/esm2020/dialog/lib/dialog-container/dialog-container.component.mjs +153 -153
- package/esm2020/dialog/lib/dialog-header/dialog-header.component.mjs +25 -25
- package/esm2020/dialog/lib/dialog-link/dialog-link.component.mjs +11 -11
- package/esm2020/dialog/lib/dialog-modal/dialog-modal.component.mjs +46 -46
- package/esm2020/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +134 -134
- package/esm2020/dialog/lib/dialog.injector.mjs +18 -18
- package/esm2020/dialog/lib/dialog.insertion.mjs +16 -16
- package/esm2020/dialog/lib/dialog.interfaces.mjs +3 -3
- package/esm2020/dialog/lib/dialog.module.mjs +70 -70
- package/esm2020/dialog/lib/dialog.ref.mjs +22 -22
- package/esm2020/dialog/lib/dialog.service.mjs +77 -77
- package/esm2020/dialog/public_api.mjs +10 -10
- package/esm2020/elements/bravobit-bb-foundation-elements.mjs +4 -4
- package/esm2020/elements/lib/avatar/avatar.component.mjs +145 -142
- package/esm2020/elements/lib/button/button.component.mjs +61 -61
- package/esm2020/elements/lib/checkbox/checkbox.component.mjs +73 -73
- package/esm2020/elements/lib/date-picker/date-picker.component.mjs +304 -304
- package/esm2020/elements/lib/directives/addon.directive.mjs +29 -29
- package/esm2020/elements/lib/directives/autosize.directive.mjs +72 -72
- package/esm2020/elements/lib/directives/focus-trap.directive.mjs +77 -77
- package/esm2020/elements/lib/directives/focus.directive.mjs +39 -39
- package/esm2020/elements/lib/directives/form-submit.directive.mjs +50 -50
- package/esm2020/elements/lib/directives/input.directive.mjs +136 -136
- package/esm2020/elements/lib/directives/template.directive.mjs +28 -28
- package/esm2020/elements/lib/dropdown/dropdown.component.mjs +100 -100
- package/esm2020/elements/lib/elements.interfaces.mjs +4 -4
- package/esm2020/elements/lib/elements.module.mjs +177 -177
- package/esm2020/elements/lib/file-picker/file-picker.component.mjs +236 -236
- package/esm2020/elements/lib/form-control/form-control.component.mjs +49 -49
- package/esm2020/elements/lib/form-error/form-error.component.mjs +108 -108
- package/esm2020/elements/lib/form-group/form-group.component.mjs +18 -18
- package/esm2020/elements/lib/icon/icon.component.mjs +102 -102
- package/esm2020/elements/lib/image-picker/image-picker.component.mjs +106 -106
- package/esm2020/elements/lib/pipes/file-image.pipe.mjs +42 -42
- package/esm2020/elements/lib/pipes/file-size.pipe.mjs +28 -28
- package/esm2020/elements/lib/pipes/relative-time.pipe.mjs +94 -94
- package/esm2020/elements/lib/spinner/spinner.component.mjs +25 -25
- package/esm2020/elements/lib/tag/tag.component.mjs +18 -18
- package/esm2020/elements/public_api.mjs +26 -26
- package/esm2020/http/bravobit-bb-foundation-http.mjs +4 -4
- package/esm2020/http/lib/classes/http.config.mjs +29 -29
- package/esm2020/http/lib/classes/http.error.mjs +20 -20
- package/esm2020/http/lib/http.interfaces.mjs +2 -2
- package/esm2020/http/lib/http.module.mjs +43 -43
- package/esm2020/http/lib/interceptors/base-url.interceptor.mjs +50 -50
- package/esm2020/http/lib/interceptors/error.interceptor.mjs +32 -32
- package/esm2020/http/public_api.mjs +7 -7
- package/esm2020/lib/core/miscellaneous/regex.mjs +5 -5
- package/esm2020/lib/core/miscellaneous/validator.mjs +85 -85
- package/esm2020/lib/core/mixins/can-disable.mjs +16 -16
- package/esm2020/lib/core/mixins/can-hide-errors.mjs +16 -16
- package/esm2020/lib/core/mixins/can-load.mjs +16 -16
- package/esm2020/lib/core/mixins/constructor.mjs +2 -2
- package/esm2020/lib/core/mixins/has-error.mjs +16 -16
- package/esm2020/lib/core/mixins/is-focused.mjs +16 -16
- package/esm2020/lib/core/mixins/is-grouped.mjs +16 -16
- package/esm2020/lib/core/mixins/is-readonly.mjs +16 -16
- package/esm2020/lib/core/mixins/is-required.mjs +16 -16
- package/esm2020/lib/core/services/clipboard.service.mjs +70 -70
- package/esm2020/lib/core/services/exif.service.mjs +163 -163
- package/esm2020/lib/core/services/file-loader.service.mjs +87 -87
- package/esm2020/lib/core/services/image-converter.service.mjs +123 -123
- package/esm2020/lib/core/services/languages.service.mjs +74 -74
- package/esm2020/lib/core/services/network.service.mjs +55 -55
- package/esm2020/lib/core/services/patch.service.mjs +63 -63
- package/esm2020/lib/core/services/platform.service.mjs +42 -42
- package/esm2020/lib/core/tokens/accept-language.token.mjs +3 -3
- package/esm2020/lib/core/tokens/base-url.token.mjs +3 -3
- package/esm2020/lib/core/tokens/cookie.token.mjs +3 -3
- package/esm2020/lib/core/tokens/location.token.mjs +6 -6
- package/esm2020/lib/core/tokens/navigator.token.mjs +6 -6
- package/esm2020/lib/core/tokens/window.token.mjs +12 -12
- package/esm2020/localize/bravobit-bb-foundation-localize.mjs +4 -4
- package/esm2020/localize/lib/functions/date.function.mjs +18 -18
- package/esm2020/localize/lib/functions/lowercase.function.mjs +13 -13
- package/esm2020/localize/lib/functions/uppercase.function.mjs +13 -13
- package/esm2020/localize/lib/handlers/missing.handler.mjs +15 -17
- package/esm2020/localize/lib/interfaces/config.interfaces.mjs +7 -10
- package/esm2020/localize/lib/interfaces/functions.interfaces.mjs +8 -8
- package/esm2020/localize/lib/interfaces/handlers.interfaces.mjs +2 -2
- package/esm2020/localize/lib/interfaces/options.interfaces.mjs +6 -6
- package/esm2020/localize/lib/localizations/dutch.localization.mjs +45 -53
- package/esm2020/localize/lib/localizations/english.localization.mjs +45 -53
- package/esm2020/localize/lib/localize.dictionary.mjs +26 -135
- package/esm2020/localize/lib/localize.module.mjs +71 -72
- package/esm2020/localize/lib/localize.pipe.mjs +49 -49
- package/esm2020/localize/lib/localize.service.mjs +205 -280
- package/esm2020/localize/lib/views/localize-string/localize-string.component.mjs +88 -88
- package/esm2020/localize/lib/views/localize-template-or-string.directive.mjs +28 -28
- package/esm2020/localize/lib/views/localize-template.directive.mjs +21 -21
- package/esm2020/localize/public_api.mjs +17 -18
- package/esm2020/notifications/bravobit-bb-foundation-notifications.mjs +4 -4
- package/esm2020/notifications/lib/notifications-item/notifications-item.component.mjs +100 -100
- package/esm2020/notifications/lib/notifications-list/notifications-list.component.mjs +47 -47
- package/esm2020/notifications/lib/notifications.animations.mjs +28 -28
- package/esm2020/notifications/lib/notifications.injector.mjs +18 -18
- package/esm2020/notifications/lib/notifications.interfaces.mjs +20 -20
- package/esm2020/notifications/lib/notifications.module.mjs +30 -30
- package/esm2020/notifications/lib/notifications.service.mjs +145 -145
- package/esm2020/notifications/public_api.mjs +4 -4
- package/esm2020/public_api.mjs +29 -29
- package/esm2020/recaptcha/bravobit-bb-foundation-recaptcha.mjs +4 -4
- package/esm2020/recaptcha/lib/recaptcha/recaptcha.component.mjs +185 -185
- package/esm2020/recaptcha/lib/recaptcha-loader.service.mjs +90 -90
- package/esm2020/recaptcha/lib/recaptcha.interface.mjs +3 -3
- package/esm2020/recaptcha/lib/recaptcha.module.mjs +27 -27
- package/esm2020/recaptcha/public_api.mjs +5 -5
- package/esm2020/rxjs/bravobit-bb-foundation-rxjs.mjs +4 -4
- package/esm2020/rxjs/lib/operators/combine-latest-map.operator.mjs +10 -10
- package/esm2020/rxjs/lib/operators/filter-nil.operator.mjs +5 -5
- package/esm2020/rxjs/public_api.mjs +3 -3
- package/esm2020/storage/bravobit-bb-foundation-storage.mjs +4 -4
- package/esm2020/storage/lib/interfaces/attributes.interface.mjs +2 -2
- package/esm2020/storage/lib/interfaces/memory.interface.mjs +2 -2
- package/esm2020/storage/lib/interfaces/strategy.interface.mjs +2 -2
- package/esm2020/storage/lib/storage.service.mjs +109 -109
- package/esm2020/storage/lib/strategies/cookie-storage.strategy.mjs +142 -142
- package/esm2020/storage/lib/strategies/memory-storage.strategy.mjs +56 -56
- package/esm2020/storage/lib/strategies/polyfill-storage.strategy.mjs +102 -102
- package/esm2020/storage/public_api.mjs +8 -8
- package/esm2020/table/bravobit-bb-foundation-table.mjs +4 -4
- package/esm2020/table/lib/components/table/table.component.mjs +191 -191
- package/esm2020/table/lib/components/table-cell/table-cell.component.mjs +11 -11
- package/esm2020/table/lib/components/table-header-cell/table-header-cell.component.mjs +131 -131
- package/esm2020/table/lib/components/table-pager/table-pager.component.mjs +136 -136
- package/esm2020/table/lib/data/datasource.data.mjs +32 -32
- package/esm2020/table/lib/data/generic.data.mjs +72 -72
- package/esm2020/table/lib/interfaces/datasource.interface.mjs +2 -2
- package/esm2020/table/lib/interfaces/table.interfaces.mjs +2 -2
- package/esm2020/table/lib/table.module.mjs +42 -42
- package/esm2020/table/public_api.mjs +10 -10
- package/fesm2015/bravobit-bb-foundation-auth.mjs +930 -926
- package/fesm2015/bravobit-bb-foundation-auth.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-collections.mjs +423 -423
- package/fesm2015/bravobit-bb-foundation-collections.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-controls.mjs +216 -216
- package/fesm2015/bravobit-bb-foundation-controls.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-dashboard.mjs +382 -382
- package/fesm2015/bravobit-bb-foundation-dashboard.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-dialog.mjs +542 -542
- package/fesm2015/bravobit-bb-foundation-dialog.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-elements.mjs +1971 -1968
- package/fesm2015/bravobit-bb-foundation-elements.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-http.mjs +156 -156
- package/fesm2015/bravobit-bb-foundation-http.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-localize.mjs +611 -812
- package/fesm2015/bravobit-bb-foundation-localize.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-notifications.mjs +348 -348
- package/fesm2015/bravobit-bb-foundation-notifications.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-recaptcha.mjs +290 -290
- package/fesm2015/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-rxjs.mjs +7 -7
- package/fesm2015/bravobit-bb-foundation-rxjs.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-storage.mjs +401 -401
- package/fesm2015/bravobit-bb-foundation-storage.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation-table.mjs +571 -571
- package/fesm2015/bravobit-bb-foundation-table.mjs.map +1 -1
- package/fesm2015/bravobit-bb-foundation.mjs +860 -860
- package/fesm2015/bravobit-bb-foundation.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-auth.mjs +882 -878
- package/fesm2020/bravobit-bb-foundation-auth.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-collections.mjs +413 -413
- package/fesm2020/bravobit-bb-foundation-collections.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-controls.mjs +214 -214
- package/fesm2020/bravobit-bb-foundation-controls.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-dashboard.mjs +370 -370
- package/fesm2020/bravobit-bb-foundation-dashboard.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-dialog.mjs +541 -541
- package/fesm2020/bravobit-bb-foundation-dialog.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-elements.mjs +1928 -1925
- package/fesm2020/bravobit-bb-foundation-elements.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-http.mjs +148 -148
- package/fesm2020/bravobit-bb-foundation-http.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-localize.mjs +590 -798
- package/fesm2020/bravobit-bb-foundation-localize.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-notifications.mjs +346 -346
- package/fesm2020/bravobit-bb-foundation-notifications.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-recaptcha.mjs +280 -280
- package/fesm2020/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-rxjs.mjs +10 -10
- package/fesm2020/bravobit-bb-foundation-rxjs.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-storage.mjs +396 -396
- package/fesm2020/bravobit-bb-foundation-storage.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation-table.mjs +560 -560
- package/fesm2020/bravobit-bb-foundation-table.mjs.map +1 -1
- package/fesm2020/bravobit-bb-foundation.mjs +832 -832
- package/fesm2020/bravobit-bb-foundation.mjs.map +1 -1
- package/http/bravobit-bb-foundation-http.d.ts +5 -5
- package/http/lib/classes/http.config.d.ts +9 -9
- package/http/lib/classes/http.error.d.ts +7 -7
- package/http/lib/http.interfaces.d.ts +12 -12
- package/http/lib/http.module.d.ts +15 -15
- package/http/lib/interceptors/base-url.interceptor.d.ts +15 -15
- package/http/lib/interceptors/error.interceptor.d.ts +11 -11
- package/http/public_api.d.ts +6 -6
- package/lib/core/miscellaneous/regex.d.ts +4 -4
- package/lib/core/miscellaneous/validator.d.ts +13 -13
- package/lib/core/mixins/can-disable.d.ts +6 -6
- package/lib/core/mixins/can-hide-errors.d.ts +6 -6
- package/lib/core/mixins/can-load.d.ts +6 -6
- package/lib/core/mixins/constructor.d.ts +1 -1
- package/lib/core/mixins/has-error.d.ts +6 -6
- package/lib/core/mixins/is-focused.d.ts +6 -6
- package/lib/core/mixins/is-grouped.d.ts +6 -6
- package/lib/core/mixins/is-readonly.d.ts +6 -6
- package/lib/core/mixins/is-required.d.ts +6 -6
- package/lib/core/services/clipboard.service.d.ts +18 -18
- package/lib/core/services/exif.service.d.ts +15 -15
- package/lib/core/services/file-loader.service.d.ts +13 -13
- package/lib/core/services/image-converter.service.d.ts +21 -21
- package/lib/core/services/languages.service.d.ts +16 -16
- package/lib/core/services/network.service.d.ts +14 -14
- package/lib/core/services/patch.service.d.ts +16 -16
- package/lib/core/services/platform.service.d.ts +18 -18
- package/lib/core/tokens/accept-language.token.d.ts +2 -2
- package/lib/core/tokens/base-url.token.d.ts +2 -2
- package/lib/core/tokens/cookie.token.d.ts +2 -2
- package/lib/core/tokens/location.token.d.ts +2 -2
- package/lib/core/tokens/navigator.token.d.ts +2 -2
- package/lib/core/tokens/window.token.d.ts +2 -2
- package/localize/bravobit-bb-foundation-localize.d.ts +5 -5
- package/localize/lib/functions/date.function.d.ts +5 -5
- package/localize/lib/functions/lowercase.function.d.ts +5 -5
- package/localize/lib/functions/uppercase.function.d.ts +5 -5
- package/localize/lib/handlers/missing.handler.d.ts +6 -6
- package/localize/lib/interfaces/config.interfaces.d.ts +18 -9
- package/localize/lib/interfaces/functions.interfaces.d.ts +9 -9
- package/localize/lib/interfaces/handlers.interfaces.d.ts +6 -6
- package/localize/lib/interfaces/options.interfaces.d.ts +10 -10
- package/localize/lib/localizations/dutch.localization.d.ts +44 -51
- package/localize/lib/localizations/english.localization.d.ts +44 -51
- package/localize/lib/localize.dictionary.d.ts +7 -24
- package/localize/lib/localize.module.d.ts +17 -18
- package/localize/lib/localize.pipe.d.ts +12 -12
- package/localize/lib/localize.service.d.ts +40 -52
- package/localize/lib/views/localize-string/localize-string.component.d.ts +23 -23
- package/localize/lib/views/localize-template-or-string.directive.d.ts +10 -10
- package/localize/lib/views/localize-template.directive.d.ts +9 -9
- package/localize/public_api.d.ts +16 -17
- package/notifications/bravobit-bb-foundation-notifications.d.ts +5 -5
- package/notifications/lib/notifications-item/notifications-item.component.d.ts +34 -34
- package/notifications/lib/notifications-list/notifications-list.component.d.ts +16 -16
- package/notifications/lib/notifications.animations.d.ts +1 -1
- package/notifications/lib/notifications.injector.d.ts +8 -8
- package/notifications/lib/notifications.interfaces.d.ts +49 -49
- package/notifications/lib/notifications.module.d.ts +13 -13
- package/notifications/lib/notifications.service.d.ts +34 -34
- package/notifications/public_api.d.ts +3 -3
- package/package.json +6 -6
- package/public_api.d.ts +25 -25
- package/recaptcha/bravobit-bb-foundation-recaptcha.d.ts +5 -5
- package/recaptcha/lib/recaptcha/recaptcha.component.d.ts +47 -47
- package/recaptcha/lib/recaptcha-loader.service.d.ts +22 -22
- package/recaptcha/lib/recaptcha.interface.d.ts +14 -14
- package/recaptcha/lib/recaptcha.module.d.ts +10 -10
- package/recaptcha/public_api.d.ts +4 -4
- package/rxjs/bravobit-bb-foundation-rxjs.d.ts +5 -5
- package/rxjs/lib/operators/combine-latest-map.operator.d.ts +8 -8
- package/rxjs/lib/operators/filter-nil.operator.d.ts +1 -1
- package/rxjs/public_api.d.ts +2 -2
- package/storage/bravobit-bb-foundation-storage.d.ts +5 -5
- package/storage/lib/interfaces/attributes.interface.d.ts +13 -13
- package/storage/lib/interfaces/memory.interface.d.ts +7 -7
- package/storage/lib/interfaces/strategy.interface.d.ts +17 -17
- package/storage/lib/storage.service.d.ts +26 -26
- package/storage/lib/strategies/cookie-storage.strategy.d.ts +20 -20
- package/storage/lib/strategies/memory-storage.strategy.d.ts +11 -11
- package/storage/lib/strategies/polyfill-storage.strategy.d.ts +15 -15
- package/storage/public_api.d.ts +7 -7
- package/table/bravobit-bb-foundation-table.d.ts +5 -5
- package/table/lib/components/table/table.component.d.ts +56 -56
- package/table/lib/components/table-cell/table-cell.component.d.ts +5 -5
- package/table/lib/components/table-header-cell/table-header-cell.component.d.ts +29 -29
- package/table/lib/components/table-pager/table-pager.component.d.ts +41 -41
- package/table/lib/data/datasource.data.d.ts +14 -14
- package/table/lib/data/generic.data.d.ts +23 -23
- package/table/lib/interfaces/datasource.interface.d.ts +17 -17
- package/table/lib/interfaces/table.interfaces.d.ts +1 -1
- package/table/lib/table.module.d.ts +14 -14
- package/table/public_api.d.ts +9 -9
- package/esm2020/localize/lib/interfaces/dictionary.interfaces.mjs +0 -8
- package/localize/lib/interfaces/dictionary.interfaces.d.ts +0 -12
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class FileLoader {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.isFile = (input) => {
|
|
6
|
-
return 'File' in window && input instanceof File;
|
|
7
|
-
};
|
|
8
|
-
this.isBlob = (input) => {
|
|
9
|
-
return 'Blob' in window && input instanceof Blob;
|
|
10
|
-
};
|
|
11
|
-
this.blobToFile = (blob, fileName) => {
|
|
12
|
-
const anyBlob = blob;
|
|
13
|
-
anyBlob.lastModifiedDate = new Date();
|
|
14
|
-
anyBlob.name = fileName;
|
|
15
|
-
return anyBlob;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
fromDataUrl(value, name = 'file') {
|
|
19
|
-
if (!value) {
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
// Convert base64 to raw binary data held in a string.
|
|
24
|
-
const byteString = window.atob(value.split(',')[1]);
|
|
25
|
-
// Separate out the mime component.
|
|
26
|
-
const mimeString = value
|
|
27
|
-
.split(',')[0]
|
|
28
|
-
.split(':')[1]
|
|
29
|
-
.split(';')[0];
|
|
30
|
-
// Write the bytes of the string to an ArrayBuffer.
|
|
31
|
-
const arrayBuffer = new ArrayBuffer(byteString.length);
|
|
32
|
-
const uint8Array = new Uint8Array(arrayBuffer);
|
|
33
|
-
for (let index = 0; index < byteString.length; index++) {
|
|
34
|
-
uint8Array[index] = byteString.charCodeAt(index);
|
|
35
|
-
}
|
|
36
|
-
const dataView = new DataView(arrayBuffer);
|
|
37
|
-
const blob = new Blob([dataView.buffer], { type: mimeString });
|
|
38
|
-
return this.createFile(blob, name);
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
asDataUrl(file) {
|
|
45
|
-
return this.read(file, 'dataurl');
|
|
46
|
-
}
|
|
47
|
-
asArrayBuffer(file) {
|
|
48
|
-
return this.read(file, 'arraybuffer');
|
|
49
|
-
}
|
|
50
|
-
async read(file, type) {
|
|
51
|
-
return new Promise((resolve, reject) => {
|
|
52
|
-
const isFileLike = this.isFile(file) || this.isBlob(file);
|
|
53
|
-
if (!file || !isFileLike) {
|
|
54
|
-
return reject('Invalid file');
|
|
55
|
-
}
|
|
56
|
-
const reader = new FileReader();
|
|
57
|
-
reader.onerror = () => reject('Error file read');
|
|
58
|
-
reader.onabort = () => reject('Abort file read');
|
|
59
|
-
reader.onload = () => {
|
|
60
|
-
const result = reader.result;
|
|
61
|
-
return resolve(result);
|
|
62
|
-
};
|
|
63
|
-
if (type === 'dataurl') {
|
|
64
|
-
reader.readAsDataURL(file);
|
|
65
|
-
}
|
|
66
|
-
else if (type === 'arraybuffer') {
|
|
67
|
-
reader.readAsArrayBuffer(file);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
createFile(blob, name) {
|
|
72
|
-
if (!navigator['msSaveBlob']) {
|
|
73
|
-
return new File([blob], name, { lastModified: Date.now(), type: blob?.type });
|
|
74
|
-
}
|
|
75
|
-
const blobFile = new Blob([blob], { type: blob?.type });
|
|
76
|
-
return this.blobToFile(blobFile, name);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
FileLoader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
80
|
-
FileLoader.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.
|
|
81
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.
|
|
82
|
-
type: Injectable,
|
|
83
|
-
args: [{
|
|
84
|
-
providedIn: 'root'
|
|
85
|
-
}]
|
|
86
|
-
}] });
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class FileLoader {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.isFile = (input) => {
|
|
6
|
+
return 'File' in window && input instanceof File;
|
|
7
|
+
};
|
|
8
|
+
this.isBlob = (input) => {
|
|
9
|
+
return 'Blob' in window && input instanceof Blob;
|
|
10
|
+
};
|
|
11
|
+
this.blobToFile = (blob, fileName) => {
|
|
12
|
+
const anyBlob = blob;
|
|
13
|
+
anyBlob.lastModifiedDate = new Date();
|
|
14
|
+
anyBlob.name = fileName;
|
|
15
|
+
return anyBlob;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
fromDataUrl(value, name = 'file') {
|
|
19
|
+
if (!value) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
// Convert base64 to raw binary data held in a string.
|
|
24
|
+
const byteString = window.atob(value.split(',')[1]);
|
|
25
|
+
// Separate out the mime component.
|
|
26
|
+
const mimeString = value
|
|
27
|
+
.split(',')[0]
|
|
28
|
+
.split(':')[1]
|
|
29
|
+
.split(';')[0];
|
|
30
|
+
// Write the bytes of the string to an ArrayBuffer.
|
|
31
|
+
const arrayBuffer = new ArrayBuffer(byteString.length);
|
|
32
|
+
const uint8Array = new Uint8Array(arrayBuffer);
|
|
33
|
+
for (let index = 0; index < byteString.length; index++) {
|
|
34
|
+
uint8Array[index] = byteString.charCodeAt(index);
|
|
35
|
+
}
|
|
36
|
+
const dataView = new DataView(arrayBuffer);
|
|
37
|
+
const blob = new Blob([dataView.buffer], { type: mimeString });
|
|
38
|
+
return this.createFile(blob, name);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
asDataUrl(file) {
|
|
45
|
+
return this.read(file, 'dataurl');
|
|
46
|
+
}
|
|
47
|
+
asArrayBuffer(file) {
|
|
48
|
+
return this.read(file, 'arraybuffer');
|
|
49
|
+
}
|
|
50
|
+
async read(file, type) {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const isFileLike = this.isFile(file) || this.isBlob(file);
|
|
53
|
+
if (!file || !isFileLike) {
|
|
54
|
+
return reject('Invalid file');
|
|
55
|
+
}
|
|
56
|
+
const reader = new FileReader();
|
|
57
|
+
reader.onerror = () => reject('Error file read');
|
|
58
|
+
reader.onabort = () => reject('Abort file read');
|
|
59
|
+
reader.onload = () => {
|
|
60
|
+
const result = reader.result;
|
|
61
|
+
return resolve(result);
|
|
62
|
+
};
|
|
63
|
+
if (type === 'dataurl') {
|
|
64
|
+
reader.readAsDataURL(file);
|
|
65
|
+
}
|
|
66
|
+
else if (type === 'arraybuffer') {
|
|
67
|
+
reader.readAsArrayBuffer(file);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
createFile(blob, name) {
|
|
72
|
+
if (!navigator['msSaveBlob']) {
|
|
73
|
+
return new File([blob], name, { lastModified: Date.now(), type: blob?.type });
|
|
74
|
+
}
|
|
75
|
+
const blobFile = new Blob([blob], { type: blob?.type });
|
|
76
|
+
return this.blobToFile(blobFile, name);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
FileLoader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: FileLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
80
|
+
FileLoader.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: FileLoader, providedIn: 'root' });
|
|
81
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: FileLoader, decorators: [{
|
|
82
|
+
type: Injectable,
|
|
83
|
+
args: [{
|
|
84
|
+
providedIn: 'root'
|
|
85
|
+
}]
|
|
86
|
+
}] });
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1sb2FkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vc3JjL2xpYi9jb3JlL3NlcnZpY2VzL2ZpbGUtbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFLekMsTUFBTSxPQUFPLFVBQVU7SUFIdkI7UUFtRVksV0FBTSxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDaEMsT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssWUFBWSxJQUFJLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBRU0sV0FBTSxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDaEMsT0FBTyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssWUFBWSxJQUFJLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBV00sZUFBVSxHQUFHLENBQUMsSUFBVSxFQUFFLFFBQWdCLEVBQUUsRUFBRTtZQUNsRCxNQUFNLE9BQU8sR0FBUSxJQUFJLENBQUM7WUFDMUIsT0FBTyxDQUFDLGdCQUFnQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEMsT0FBTyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7WUFDeEIsT0FBTyxPQUFlLENBQUM7UUFDM0IsQ0FBQyxDQUFDO0tBRUw7SUF0RkcsV0FBVyxDQUFDLEtBQWEsRUFBRSxPQUFlLE1BQU07UUFDNUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJO1lBQ0Esc0RBQXNEO1lBQ3RELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXBELG1DQUFtQztZQUNuQyxNQUFNLFVBQVUsR0FBRyxL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QUFFLElBQUksRUFBQyxDQUFDLENBQUM7U0FDL0U7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7dUdBL0VRLFVBQVU7MkdBQVYsVUFBVSxjQUZQLE1BQU07MkZBRVQsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWxlTG9hZGVyIHtcclxuXHJcbiAgICBmcm9tRGF0YVVybCh2YWx1ZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSAnZmlsZScpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gQ29udmVydCBiYXNlNjQgdG8gcmF3IGJpbmFyeSBkYXRhIGhlbGQgaW4gYSBzdHJpbmcuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVTdHJpbmcgPSB3aW5kb3cuYXRvYih2YWx1ZS5zcGxpdCgnLCcpWzFdKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlcGFyYXRlIG91dCB0aGUgbWltZSBjb21wb25lbnQuXHJcbiAgICAgICAgICAgIGNvbnN0IG1pbWVTdHJpbmcgPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylbMF1cclxuICAgICAgICAgICAgICAgIC5zcGxpdCgnOicpWzFdXHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoJzsnKVswXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIHRvIGFuIEFycmF5QnVmZmVyLlxyXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBieXRlU3RyaW5nLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgdWludDhBcnJheVtpbmRleF0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YVZpZXcuYnVmZmVyXSwge3R5cGU6IG1pbWVTdHJpbmd9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZpbGUoYmxvYiwgbmFtZSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc0RhdGFVcmwoZmlsZTogRmlsZSB8IEJsb2IpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkPHN0cmluZz4oZmlsZSwgJ2RhdGF1cmwnKTtcclxuICAgIH1cclxuXHJcbiAgICBhc0FycmF5QnVmZmVyKGZpbGU6IEZpbGUgfCBCbG9iKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZDxBcnJheUJ1ZmZlcj4oZmlsZSwgJ2FycmF5YnVmZmVyJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkPFQgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlcj4oZmlsZTogRmlsZSB8IEJsb2IsIHR5cGU6ICdkYXRhdXJsJyB8ICdhcnJheWJ1ZmZlcicpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0ZpbGVMaWtlID0gdGhpcy5pc0ZpbGUoZmlsZSkgfHwgdGhpcy5pc0Jsb2IoZmlsZSk7XHJcbiAgICAgICAgICAgIGlmICghZmlsZSB8fCAhaXNGaWxlTGlrZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdCgnSW52YWxpZCBmaWxlJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KCdFcnJvciBmaWxlIHJlYWQnKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9uYWJvcnQgPSAoKSA9PiByZWplY3QoJ0Fib3J0IGZpbGUgcmVhZCcpO1xyXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVhZGVyLnJlc3VsdCBhcyB1bmtub3duO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0IGFzIFQpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdkYXRhdXJsJykge1xyXG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xyXG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0ZpbGUgPSAoaW5wdXQ6IHVua25vd24pID0+IHtcclxuICAgICAgICByZXR1cm4gJ0ZpbGUnIGluIHdpbmRvdyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZpbGU7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgaXNCbG9iID0gKGlucHV0OiB1bmtub3duKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICdCbG9iJyBpbiB3aW5kb3cgJiYgaW5wdXQgaW5zdGFuY2VvZiBCbG9iO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUZpbGUoYmxvYjogQmxvYiwgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFuYXZpZ2F0b3JbJ21zU2F2ZUJsb2InXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBuYW1lLCB7bGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCB0eXBlOiBibG9iPy50eXBlfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBibG9iRmlsZSA9IG5ldyBCbG9iKFtibG9iXSwge3R5cGU6IGJsb2I/LnR5cGV9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5ibG9iVG9GaWxlKGJsb2JGaWxlLCBuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJsb2JUb0ZpbGUgPSAoYmxvYjogQmxvYiwgZmlsZU5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFueUJsb2I6IGFueSA9IGJsb2I7XHJcbiAgICAgICAgYW55QmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBhbnlCbG9iLm5hbWUgPSBmaWxlTmFtZTtcclxuICAgICAgICByZXR1cm4gYW55QmxvYiBhcyBGaWxlO1xyXG4gICAgfTtcclxuXHJcbn1cclxuIl19
|
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "./exif.service";
|
|
4
|
-
import * as i2 from "./platform.service";
|
|
5
|
-
import * as i3 from "./file-loader.service";
|
|
6
|
-
export class ImageConverter {
|
|
7
|
-
constructor(_exif, _platform, _fileLoader) {
|
|
8
|
-
this._exif = _exif;
|
|
9
|
-
this._platform = _platform;
|
|
10
|
-
this._fileLoader = _fileLoader;
|
|
11
|
-
// Data.
|
|
12
|
-
this._types = ['image/png', 'image/jpeg'];
|
|
13
|
-
this.calculateOffsetAndDimensions = (image, canvasWidth, canvasHeight) => {
|
|
14
|
-
const originalWidth = image.width;
|
|
15
|
-
const originalHeight = image.height;
|
|
16
|
-
const widthRatio = canvasWidth / originalWidth;
|
|
17
|
-
const heightRatio = canvasHeight / originalHeight;
|
|
18
|
-
let width;
|
|
19
|
-
let height;
|
|
20
|
-
if (originalWidth > originalHeight) {
|
|
21
|
-
height = originalHeight * heightRatio;
|
|
22
|
-
width = (originalWidth / originalHeight) * height;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
width = originalWidth * widthRatio;
|
|
26
|
-
height = (originalHeight / originalWidth) * width;
|
|
27
|
-
}
|
|
28
|
-
let xOffset = 0;
|
|
29
|
-
let yOffset = 0;
|
|
30
|
-
if (canvasHeight === height) {
|
|
31
|
-
xOffset = -((width - canvasWidth) / 2);
|
|
32
|
-
}
|
|
33
|
-
else if (canvasWidth === width) {
|
|
34
|
-
yOffset = -((height - canvasHeight) / 2);
|
|
35
|
-
}
|
|
36
|
-
return { xOffset, yOffset, width, height };
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
async toDataUri(contents, options = null) {
|
|
40
|
-
// Check if the current platform is a browser.
|
|
41
|
-
if (!this._platform.isBrowser) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
// Get the image.
|
|
45
|
-
const image = await this.getImage(contents);
|
|
46
|
-
// Get the canvas width and height.
|
|
47
|
-
const canvasWidth = options?.width || image?.width;
|
|
48
|
-
const canvasHeight = options?.height || image?.height;
|
|
49
|
-
// Get the canvas and context.
|
|
50
|
-
const canvas = document.createElement('canvas');
|
|
51
|
-
const context = canvas.getContext('2d');
|
|
52
|
-
// Validate the context exists.
|
|
53
|
-
if (!context) {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
// Set the width and height.
|
|
57
|
-
canvas.width = canvasWidth;
|
|
58
|
-
canvas.height = canvasHeight;
|
|
59
|
-
// When the canvas sizes are 0 we have failed.
|
|
60
|
-
if (canvas?.width === 0 && canvas?.height === 0) {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
// Check if dimensions where supplied, else create the image.
|
|
64
|
-
if (!options) {
|
|
65
|
-
// Draw the image.
|
|
66
|
-
context.drawImage(image, 0, 0);
|
|
67
|
-
// Convert the canvas to a data url.
|
|
68
|
-
return canvas.toDataURL(this._types[0]);
|
|
69
|
-
}
|
|
70
|
-
// Get the dimensions and offsets.
|
|
71
|
-
const { width, height, xOffset, yOffset } = this.calculateOffsetAndDimensions(image, canvasWidth, canvasHeight);
|
|
72
|
-
// Draw the image.
|
|
73
|
-
context.drawImage(image, 0, 0, image.width, image.height, xOffset, yOffset, width, height);
|
|
74
|
-
// Convert the canvas to a data url.
|
|
75
|
-
return canvas.toDataURL(this._types[0]);
|
|
76
|
-
}
|
|
77
|
-
async fileToImage(file, types = this._types) {
|
|
78
|
-
// Check if the file matches an image.
|
|
79
|
-
if (!types.includes(file.type)) {
|
|
80
|
-
throw new Error('The selected file does not meet the required format.');
|
|
81
|
-
}
|
|
82
|
-
let stripped = null;
|
|
83
|
-
try {
|
|
84
|
-
stripped = await this._exif.strip(file, 90);
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
// Do nothing.
|
|
88
|
-
}
|
|
89
|
-
// Ge the data uri.
|
|
90
|
-
const dataUri = await this._fileLoader.asDataUrl(stripped ?? file);
|
|
91
|
-
// Convert the data URI to a image element.
|
|
92
|
-
return await this.stringToImage(dataUri);
|
|
93
|
-
}
|
|
94
|
-
stringToImage(src) {
|
|
95
|
-
return new Promise((resolve, reject) => {
|
|
96
|
-
const image = new Image();
|
|
97
|
-
image.src = src;
|
|
98
|
-
image.onload = () => resolve(image);
|
|
99
|
-
image.onerror = error => reject(error);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
async getImage(contents) {
|
|
103
|
-
// If the contents is already an HTML image element just return it.
|
|
104
|
-
if (contents instanceof HTMLImageElement) {
|
|
105
|
-
return contents;
|
|
106
|
-
}
|
|
107
|
-
// If the contents is a file convert it to an HTML image element.
|
|
108
|
-
if (contents instanceof File) {
|
|
109
|
-
return this.fileToImage(contents);
|
|
110
|
-
}
|
|
111
|
-
// If the contents is a string convert it to an HTML image element.
|
|
112
|
-
return this.stringToImage(contents);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
ImageConverter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.
|
|
116
|
-
ImageConverter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.
|
|
117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.
|
|
118
|
-
type: Injectable,
|
|
119
|
-
args: [{
|
|
120
|
-
providedIn: 'root'
|
|
121
|
-
}]
|
|
122
|
-
}], ctorParameters: function () { return [{ type: i1.Exif }, { type: i2.Platform }, { type: i3.FileLoader }]; } });
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY29udmVydGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL3NyYy9saWIvY29yZS9zZXJ2aWNlcy9pbWFnZS1jb252ZXJ0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7OztBQU16QyxNQUFNLE9BQU8sY0FBYztJQUt2QixZQUFvQixLQUFXLEVBQ1gsU0FBbUIsRUFDbkIsV0FBdUI7UUFGdkIsVUFBSyxHQUFMLEtBQUssQ0FBTTtRQUNYLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDbkIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFMM0MsUUFBUTtRQUNTLFdBQU0sR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQXFHOUMsaUNBQTRCLEdBQUcsQ0FBQyxLQUF1QixFQUFFLFdBQW1CLEVBQUUsWUFBb0IsRUFBRSxFQUFFO1lBQzFHLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUVwQyxNQUFNLFVBQVUsR0FBRyxXQUFXLEdBQUcsYUFBYSxDQUFDO1lBQy9DLE1BQU0sV0FBVyxHQUFHLFlBQVksR0FBRyxjQUFjLENBQUM7WUFFbEQsSUFBSSxLQUFhLENBQUM7WUFDbEIsSUFBSSxNQUFjLENBQUM7WUFFbkIsSUFBSSxhQUFhLEdBQUcsY0FBYyxFQUFFO2dCQUNoQyxNQUFNLEdBQUcsY0FBYyxHQUFHLFdBQVcsQ0FBQztnQkFDdEMsS0FBSyxHQUFHLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQzthQUNyRDtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsYUFBYSxHQUFHLFVBQVUsQ0FBQztnQkFDbkMsTUFBTSxHQUFHLENBQUMsY0FBYyxH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UUFBUSxDQUFDLENBQUM7U0FDckM7UUFFRCxtRUFBbUU7UUFDbkUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7OzJHQXRHUSxjQUFjOytHQUFkLGNBQWMsY0FGWCxNQUFNOzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGaWxlTG9hZGVyfSBmcm9tICcuL2ZpbGUtbG9hZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnLi9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0V4aWZ9IGZyb20gJy4vZXhpZi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBJbWFnZUNvbnZlcnRlciB7XG5cbiAgICAvLyBEYXRhLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3R5cGVzID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZyddO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZXhpZjogRXhpZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9wbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfZmlsZUxvYWRlcjogRmlsZUxvYWRlcikge1xuICAgIH1cblxuICAgIGFzeW5jIHRvRGF0YVVyaShjb250ZW50czogc3RyaW5nIHwgRmlsZSB8IEhUTUxJbWFnZUVsZW1lbnQsIG9wdGlvbnM6IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGEgYnJvd3Nlci5cbiAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBpbWFnZS5cbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmdldEltYWdlKGNvbnRlbnRzKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAgICBjb25zdCBjYW52YXNXaWR0aCA9IG9wdGlvbnM/LndpZHRoIHx8IGltYWdlPy53aWR0aDtcbiAgICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gb3B0aW9ucz8uaGVpZ2h0IHx8IGltYWdlPy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBjYW52YXMgYW5kIGNvbnRleHQuXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGNvbnRleHQgZXhpc3RzLlxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcblxuICAgICAgICAvLyBXaGVuIHRoZSBjYW52YXMgc2l6ZXMgYXJlIDAgd2UgaGF2ZSBmYWlsZWQuXG4gICAgICAgIGlmIChjYW52YXM/LndpZHRoID09PSAwICYmIGNhbnZhcz8uaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGRpbWVuc2lvbnMgd2hlcmUgc3VwcGxpZWQsIGVsc2UgY3JlYXRlIHRoZSBpbWFnZS5cbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBEcmF3IHRoZSBpbWFnZS5cbiAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcblxuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgY2FudmFzIHRvIGEgZGF0YSB1cmwuXG4gICAgICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCh0aGlzLl90eXBlc1swXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbnMgYW5kIG9mZnNldHMuXG4gICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCB4T2Zmc2V0LCB5T2Zmc2V0fSA9IHRoaXMuY2FsY3VsYXRlT2Zmc2V0QW5kRGltZW5zaW9ucyhpbWFnZSwgY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCk7XG5cbiAgICAgICAgLy8gRHJhdyB0aGUgaW1hZ2UuXG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCB4T2Zmc2V0LCB5T2Zmc2V0LCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBjYW52YXMgdG8gYSBkYXRhIHVybC5cbiAgICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwodGhpcy5fdHlwZXNbMF0pO1xuICAgIH1cblxuICAgIGFzeW5jIGZpbGVUb0ltYWdlKGZpbGU6IEZpbGUsIHR5cGVzOiBzdHJpbmdbXSA9IHRoaXMuX3R5cGVzKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIG1hdGNoZXMgYW4gaW1hZ2UuXG4gICAgICAgIGlmICghdHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2VsZWN0ZWQgZmlsZSBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlZCBmb3JtYXQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RyaXBwZWQ6IEZpbGUgfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0cmlwcGVkID0gYXdhaXQgdGhpcy5fZXhpZi5zdHJpcChmaWxlLCA5MCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlIHRoZSBkYXRhIHVyaS5cbiAgICAgICAgY29uc3QgZGF0YVVyaSA9IGF3YWl0IHRoaXMuX2ZpbGVMb2FkZXIuYXNEYXRhVXJsKHN0cmlwcGVkID8/IGZpbGUpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdGhlIGRhdGEgVVJJIHRvIGEgaW1hZ2UgZWxlbWVudC5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RyaW5nVG9JbWFnZShkYXRhVXJpKTtcbiAgICB9XG5cbiAgICBzdHJpbmdUb0ltYWdlKHNyYzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gc3JjO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWFnZSk7XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbWFnZShjb250ZW50czogc3RyaW5nIHwgRmlsZSB8IEhUTUxJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGNvbnRlbnRzIGlzIGFscmVhZHkgYW4gSFRNTCBpbWFnZSBlbGVtZW50IGp1c3QgcmV0dXJuIGl0LlxuICAgICAgICBpZiAoY29udGVudHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgY29udGVudHMgaXMgYSBmaWxlIGNvbnZlcnQgaXQgdG8gYW4gSFRNTCBpbWFnZSBlbGVtZW50LlxuICAgICAgICBpZiAoY29udGVudHMgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlVG9JbWFnZShjb250ZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgY29udGVudHMgaXMgYSBzdHJpbmcgY29udmVydCBpdCB0byBhbiBIVE1MIGltYWdlIGVsZW1lbnQuXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ1RvSW1hZ2UoY29udGVudHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlT2Zmc2V0QW5kRGltZW5zaW9ucyA9IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCwgY2FudmFzV2lkdGg6IG51bWJlciwgY2FudmFzSGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9IGltYWdlLndpZHRoO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuICAgICAgICBjb25zdCB3aWR0aFJhdGlvID0gY2FudmFzV2lkdGggLyBvcmlnaW5hbFdpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNhbnZhc0hlaWdodCAvIG9yaWdpbmFsSGVpZ2h0O1xuXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyO1xuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXI7XG5cbiAgICAgICAgaWYgKG9yaWdpbmFsV2lkdGggPiBvcmlnaW5hbEhlaWdodCkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gb3JpZ2luYWxIZWlnaHQgKiBoZWlnaHRSYXRpbztcbiAgICAgICAgICAgIHdpZHRoID0gKG9yaWdpbmFsV2lkdGggLyBvcmlnaW5hbEhlaWdodCkgKiBoZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IG9yaWdpbmFsV2lkdGggKiB3aWR0aFJhdGlvO1xuICAgICAgICAgICAgaGVpZ2h0ID0gKG9yaWdpbmFsSGVpZ2h0IC8gb3JpZ2luYWxXaWR0aCkgKiB3aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB4T2Zmc2V0ID0gMDtcbiAgICAgICAgbGV0IHlPZmZzZXQgPSAwO1xuXG4gICAgICAgIGlmIChjYW52YXNIZWlnaHQgPT09IGhlaWdodCkge1xuICAgICAgICAgICAgeE9mZnNldCA9IC0oKHdpZHRoIC0gY2FudmFzV2lkdGgpIC8gMik7XG4gICAgICAgIH0gZWxzZSBpZiAoY2FudmFzV2lkdGggPT09IHdpZHRoKSB7XG4gICAgICAgICAgICB5T2Zmc2V0ID0gLSgoaGVpZ2h0IC0gY2FudmFzSGVpZ2h0KSAvIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHt4T2Zmc2V0LCB5T2Zmc2V0LCB3aWR0aCwgaGVpZ2h0fTtcbiAgICB9O1xuXG59XG4iXX0=
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "./exif.service";
|
|
4
|
+
import * as i2 from "./platform.service";
|
|
5
|
+
import * as i3 from "./file-loader.service";
|
|
6
|
+
export class ImageConverter {
|
|
7
|
+
constructor(_exif, _platform, _fileLoader) {
|
|
8
|
+
this._exif = _exif;
|
|
9
|
+
this._platform = _platform;
|
|
10
|
+
this._fileLoader = _fileLoader;
|
|
11
|
+
// Data.
|
|
12
|
+
this._types = ['image/png', 'image/jpeg'];
|
|
13
|
+
this.calculateOffsetAndDimensions = (image, canvasWidth, canvasHeight) => {
|
|
14
|
+
const originalWidth = image.width;
|
|
15
|
+
const originalHeight = image.height;
|
|
16
|
+
const widthRatio = canvasWidth / originalWidth;
|
|
17
|
+
const heightRatio = canvasHeight / originalHeight;
|
|
18
|
+
let width;
|
|
19
|
+
let height;
|
|
20
|
+
if (originalWidth > originalHeight) {
|
|
21
|
+
height = originalHeight * heightRatio;
|
|
22
|
+
width = (originalWidth / originalHeight) * height;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
width = originalWidth * widthRatio;
|
|
26
|
+
height = (originalHeight / originalWidth) * width;
|
|
27
|
+
}
|
|
28
|
+
let xOffset = 0;
|
|
29
|
+
let yOffset = 0;
|
|
30
|
+
if (canvasHeight === height) {
|
|
31
|
+
xOffset = -((width - canvasWidth) / 2);
|
|
32
|
+
}
|
|
33
|
+
else if (canvasWidth === width) {
|
|
34
|
+
yOffset = -((height - canvasHeight) / 2);
|
|
35
|
+
}
|
|
36
|
+
return { xOffset, yOffset, width, height };
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async toDataUri(contents, options = null) {
|
|
40
|
+
// Check if the current platform is a browser.
|
|
41
|
+
if (!this._platform.isBrowser) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
// Get the image.
|
|
45
|
+
const image = await this.getImage(contents);
|
|
46
|
+
// Get the canvas width and height.
|
|
47
|
+
const canvasWidth = options?.width || image?.width;
|
|
48
|
+
const canvasHeight = options?.height || image?.height;
|
|
49
|
+
// Get the canvas and context.
|
|
50
|
+
const canvas = document.createElement('canvas');
|
|
51
|
+
const context = canvas.getContext('2d');
|
|
52
|
+
// Validate the context exists.
|
|
53
|
+
if (!context) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// Set the width and height.
|
|
57
|
+
canvas.width = canvasWidth;
|
|
58
|
+
canvas.height = canvasHeight;
|
|
59
|
+
// When the canvas sizes are 0 we have failed.
|
|
60
|
+
if (canvas?.width === 0 && canvas?.height === 0) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
// Check if dimensions where supplied, else create the image.
|
|
64
|
+
if (!options) {
|
|
65
|
+
// Draw the image.
|
|
66
|
+
context.drawImage(image, 0, 0);
|
|
67
|
+
// Convert the canvas to a data url.
|
|
68
|
+
return canvas.toDataURL(this._types[0]);
|
|
69
|
+
}
|
|
70
|
+
// Get the dimensions and offsets.
|
|
71
|
+
const { width, height, xOffset, yOffset } = this.calculateOffsetAndDimensions(image, canvasWidth, canvasHeight);
|
|
72
|
+
// Draw the image.
|
|
73
|
+
context.drawImage(image, 0, 0, image.width, image.height, xOffset, yOffset, width, height);
|
|
74
|
+
// Convert the canvas to a data url.
|
|
75
|
+
return canvas.toDataURL(this._types[0]);
|
|
76
|
+
}
|
|
77
|
+
async fileToImage(file, types = this._types) {
|
|
78
|
+
// Check if the file matches an image.
|
|
79
|
+
if (!types.includes(file.type)) {
|
|
80
|
+
throw new Error('The selected file does not meet the required format.');
|
|
81
|
+
}
|
|
82
|
+
let stripped = null;
|
|
83
|
+
try {
|
|
84
|
+
stripped = await this._exif.strip(file, 90);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Do nothing.
|
|
88
|
+
}
|
|
89
|
+
// Ge the data uri.
|
|
90
|
+
const dataUri = await this._fileLoader.asDataUrl(stripped ?? file);
|
|
91
|
+
// Convert the data URI to a image element.
|
|
92
|
+
return await this.stringToImage(dataUri);
|
|
93
|
+
}
|
|
94
|
+
stringToImage(src) {
|
|
95
|
+
return new Promise((resolve, reject) => {
|
|
96
|
+
const image = new Image();
|
|
97
|
+
image.src = src;
|
|
98
|
+
image.onload = () => resolve(image);
|
|
99
|
+
image.onerror = error => reject(error);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async getImage(contents) {
|
|
103
|
+
// If the contents is already an HTML image element just return it.
|
|
104
|
+
if (contents instanceof HTMLImageElement) {
|
|
105
|
+
return contents;
|
|
106
|
+
}
|
|
107
|
+
// If the contents is a file convert it to an HTML image element.
|
|
108
|
+
if (contents instanceof File) {
|
|
109
|
+
return this.fileToImage(contents);
|
|
110
|
+
}
|
|
111
|
+
// If the contents is a string convert it to an HTML image element.
|
|
112
|
+
return this.stringToImage(contents);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
ImageConverter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: ImageConverter, deps: [{ token: i1.Exif }, { token: i2.Platform }, { token: i3.FileLoader }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
116
|
+
ImageConverter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: ImageConverter, providedIn: 'root' });
|
|
117
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: ImageConverter, decorators: [{
|
|
118
|
+
type: Injectable,
|
|
119
|
+
args: [{
|
|
120
|
+
providedIn: 'root'
|
|
121
|
+
}]
|
|
122
|
+
}], ctorParameters: function () { return [{ type: i1.Exif }, { type: i2.Platform }, { type: i3.FileLoader }]; } });
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY29udmVydGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL3NyYy9saWIvY29yZS9zZXJ2aWNlcy9pbWFnZS1jb252ZXJ0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7OztBQU16QyxNQUFNLE9BQU8sY0FBYztJQUt2QixZQUFvQixLQUFXLEVBQ1gsU0FBbUIsRUFDbkIsV0FBdUI7UUFGdkIsVUFBSyxHQUFMLEtBQUssQ0FBTTtRQUNYLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDbkIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFMM0MsUUFBUTtRQUNTLFdBQU0sR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQXFHOUMsaUNBQTRCLEdBQUcsQ0FBQyxLQUF1QixFQUFFLFdBQW1CLEVBQUUsWUFBb0IsRUFBRSxFQUFFO1lBQzFHLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbEMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUVwQyxNQUFNLFVBQVUsR0FBRyxXQUFXLEdBQUcsYUFBYSxDQUFDO1lBQy9DLE1BQU0sV0FBVyxHQUFHLFlBQVksR0FBRyxjQUFjLENBQUM7WUFFbEQsSUFBSSxLQUFhLENBQUM7WUFDbEIsSUFBSSxNQUFjLENBQUM7WUFFbkIsSUFBSSxhQUFhLEdBQUcsY0FBYyxFQUFFO2dCQUNoQyxNQUFNLEdBQUcsY0FBYyxHQUFHLFdBQVcsQ0FBQztnQkFDdEMsS0FBSyxHQUFHLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQzthQUNyRDtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsYUFBYSxHQUFHLFVBQVUsQ0FBQztnQkFDbkMsTUFBTSxHQUFHLENBQUMsY0FBYyxH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UUFBUSxDQUFDLENBQUM7U0FDckM7UUFFRCxtRUFBbUU7UUFDbkUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7OzJHQXRHUSxjQUFjOytHQUFkLGNBQWMsY0FGWCxNQUFNOzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGaWxlTG9hZGVyfSBmcm9tICcuL2ZpbGUtbG9hZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICcuL3BsYXRmb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0V4aWZ9IGZyb20gJy4vZXhpZi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgSW1hZ2VDb252ZXJ0ZXIge1xyXG5cclxuICAgIC8vIERhdGEuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90eXBlcyA9IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnXTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9leGlmOiBFeGlmLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfZmlsZUxvYWRlcjogRmlsZUxvYWRlcikge1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHRvRGF0YVVyaShjb250ZW50czogc3RyaW5nIHwgRmlsZSB8IEhUTUxJbWFnZUVsZW1lbnQsIG9wdGlvbnM6IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYSBicm93c2VyLlxyXG4gICAgICAgIGlmICghdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBpbWFnZS5cclxuICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2UoY29udGVudHMpO1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0LlxyXG4gICAgICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gb3B0aW9ucz8ud2lkdGggfHwgaW1hZ2U/LndpZHRoO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IG9wdGlvbnM/LmhlaWdodCB8fCBpbWFnZT8uaGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIGNhbnZhcyBhbmQgY29udGV4dC5cclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZXh0IGV4aXN0cy5cclxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQuXHJcbiAgICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcclxuXHJcbiAgICAgICAgLy8gV2hlbiB0aGUgY2FudmFzIHNpemVzIGFyZSAwIHdlIGhhdmUgZmFpbGVkLlxyXG4gICAgICAgIGlmIChjYW52YXM/LndpZHRoID09PSAwICYmIGNhbnZhcz8uaGVpZ2h0ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgZGltZW5zaW9ucyB3aGVyZSBzdXBwbGllZCwgZWxzZSBjcmVhdGUgdGhlIGltYWdlLlxyXG4gICAgICAgIGlmICghb3B0aW9ucykge1xyXG4gICAgICAgICAgICAvLyBEcmF3IHRoZSBpbWFnZS5cclxuICAgICAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgY2FudmFzIHRvIGEgZGF0YSB1cmwuXHJcbiAgICAgICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKHRoaXMuX3R5cGVzWzBdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0cy5cclxuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgeE9mZnNldCwgeU9mZnNldH0gPSB0aGlzLmNhbGN1bGF0ZU9mZnNldEFuZERpbWVuc2lvbnMoaW1hZ2UsIGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQpO1xyXG5cclxuICAgICAgICAvLyBEcmF3IHRoZSBpbWFnZS5cclxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgeE9mZnNldCwgeU9mZnNldCwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIC8vIENvbnZlcnQgdGhlIGNhbnZhcyB0byBhIGRhdGEgdXJsLlxyXG4gICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKHRoaXMuX3R5cGVzWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmaWxlVG9JbWFnZShmaWxlOiBGaWxlLCB0eXBlczogc3RyaW5nW10gPSB0aGlzLl90eXBlcykge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIG1hdGNoZXMgYW4gaW1hZ2UuXHJcbiAgICAgICAgaWYgKCF0eXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlbGVjdGVkIGZpbGUgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZWQgZm9ybWF0LicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0cmlwcGVkOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc3RyaXBwZWQgPSBhd2FpdCB0aGlzLl9leGlmLnN0cmlwKGZpbGUsIDkwKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdlIHRoZSBkYXRhIHVyaS5cclxuICAgICAgICBjb25zdCBkYXRhVXJpID0gYXdhaXQgdGhpcy5fZmlsZUxvYWRlci5hc0RhdGFVcmwoc3RyaXBwZWQgPz8gZmlsZSk7XHJcblxyXG4gICAgICAgIC8vIENvbnZlcnQgdGhlIGRhdGEgVVJJIHRvIGEgaW1hZ2UgZWxlbWVudC5cclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdHJpbmdUb0ltYWdlKGRhdGFVcmkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0cmluZ1RvSW1hZ2Uoc3JjOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBzcmM7XHJcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1hZ2UpO1xyXG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEltYWdlKGNvbnRlbnRzOiBzdHJpbmcgfCBGaWxlIHwgSFRNTEltYWdlRWxlbWVudCkge1xyXG4gICAgICAgIC8vIElmIHRoZSBjb250ZW50cyBpcyBhbHJlYWR5IGFuIEhUTUwgaW1hZ2UgZWxlbWVudCBqdXN0IHJldHVybiBpdC5cclxuICAgICAgICBpZiAoY29udGVudHMgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBjb250ZW50cyBpcyBhIGZpbGUgY29udmVydCBpdCB0byBhbiBIVE1MIGltYWdlIGVsZW1lbnQuXHJcbiAgICAgICAgaWYgKGNvbnRlbnRzIGluc3RhbmNlb2YgRmlsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlVG9JbWFnZShjb250ZW50cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY29udGVudHMgaXMgYSBzdHJpbmcgY29udmVydCBpdCB0byBhbiBIVE1MIGltYWdlIGVsZW1lbnQuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVG9JbWFnZShjb250ZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVPZmZzZXRBbmREaW1lbnNpb25zID0gKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBjYW52YXNXaWR0aDogbnVtYmVyLCBjYW52YXNIZWlnaHQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGggPSBpbWFnZS53aWR0aDtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGhSYXRpbyA9IGNhbnZhc1dpZHRoIC8gb3JpZ2luYWxXaWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNhbnZhc0hlaWdodCAvIG9yaWdpbmFsSGVpZ2h0O1xyXG5cclxuICAgICAgICBsZXQgd2lkdGg6IG51bWJlcjtcclxuICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbFdpZHRoID4gb3JpZ2luYWxIZWlnaHQpIHtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gb3JpZ2luYWxIZWlnaHQgKiBoZWlnaHRSYXRpbztcclxuICAgICAgICAgICAgd2lkdGggPSAob3JpZ2luYWxXaWR0aCAvIG9yaWdpbmFsSGVpZ2h0KSAqIGhlaWdodDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB3aWR0aCA9IG9yaWdpbmFsV2lkdGggKiB3aWR0aFJhdGlvO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSAob3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoKSAqIHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHhPZmZzZXQgPSAwO1xyXG4gICAgICAgIGxldCB5T2Zmc2V0ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGNhbnZhc0hlaWdodCA9PT0gaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHhPZmZzZXQgPSAtKCh3aWR0aCAtIGNhbnZhc1dpZHRoKSAvIDIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2FudmFzV2lkdGggPT09IHdpZHRoKSB7XHJcbiAgICAgICAgICAgIHlPZmZzZXQgPSAtKChoZWlnaHQgLSBjYW52YXNIZWlnaHQpIC8gMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge3hPZmZzZXQsIHlPZmZzZXQsIHdpZHRoLCBoZWlnaHR9O1xyXG4gICAgfTtcclxuXHJcbn1cclxuIl19
|