@lenne.tech/ng-base 15.0.0-beta-3 → 16.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/base-components/base-components.module.d.ts +1 -2
  2. package/base-components/components/checkbox/checkbox.component.d.ts +1 -1
  3. package/base-components/components/delete-account/delete-account.component.d.ts +1 -1
  4. package/base-components/components/fab-button/fab-button.component.d.ts +1 -1
  5. package/base-components/components/input/input.component.d.ts +1 -1
  6. package/base-components/components/loading-bar/loading-bar.component.d.ts +1 -1
  7. package/base-components/components/model-form/model-form-base.component.d.ts +1 -1
  8. package/base-components/components/model-form/model-form.component.d.ts +1 -1
  9. package/base-components/components/model-form-sub/model-form-sub.component.d.ts +1 -1
  10. package/base-components/components/model-table/model-table.component.d.ts +1 -1
  11. package/base-components/components/refence-input/refence-input.component.d.ts +1 -1
  12. package/base-components/components/select/select.component.d.ts +1 -1
  13. package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +1 -1
  14. package/base-components/components/tags/tags.component.d.ts +1 -1
  15. package/base-components/components/textarea/textarea.component.d.ts +1 -1
  16. package/base-components/components/toast/toast.component.d.ts +1 -1
  17. package/base-components/components/upload-image/upload-image.component.d.ts +1 -1
  18. package/base-components/directives/context-menu.directive.d.ts +1 -1
  19. package/base-components/directives/sort.directive.d.ts +1 -1
  20. package/base-prototype/pages/login/login.component.d.ts +1 -1
  21. package/base-prototype/pages/profile/profile.component.d.ts +1 -1
  22. package/base-prototype/pages/set-password/set-password.component.d.ts +1 -1
  23. package/esm2022/base-cms/base-cms-routing.module.mjs +33 -0
  24. package/esm2022/base-cms/base-cms.module.mjs +61 -0
  25. package/esm2022/base-cms/pages/base-cms/base-cms.component.mjs +233 -0
  26. package/esm2022/base-components/base-components.module.mjs +123 -0
  27. package/esm2022/base-components/components/breadcrumb/breadcrumb.component.mjs +21 -0
  28. package/esm2022/base-components/components/change-password/change-password.component.mjs +96 -0
  29. package/esm2022/base-components/components/checkbox/checkbox.component.mjs +35 -0
  30. package/esm2022/base-components/components/delete-account/delete-account.component.mjs +61 -0
  31. package/esm2022/base-components/components/fab-button/fab-button.component.mjs +21 -0
  32. package/esm2022/base-components/components/input/input.component.mjs +72 -0
  33. package/esm2022/base-components/components/loading-bar/loading-bar.component.mjs +39 -0
  34. package/esm2022/base-components/components/model-form/model-form-base.component.mjs +145 -0
  35. package/esm2022/base-components/components/model-form/model-form.component.mjs +585 -0
  36. package/esm2022/base-components/components/model-form-sub/model-form-sub.component.mjs +111 -0
  37. package/esm2022/base-components/components/model-table/model-table.component.mjs +470 -0
  38. package/esm2022/base-components/components/refence-input/refence-input.component.mjs +273 -0
  39. package/esm2022/base-components/components/select/select.component.mjs +59 -0
  40. package/esm2022/base-components/components/skeleton-loader/skeleton-loader.component.mjs +32 -0
  41. package/esm2022/base-components/components/tags/tags.component.mjs +224 -0
  42. package/esm2022/base-components/components/textarea/textarea.component.mjs +76 -0
  43. package/esm2022/base-components/components/toast/toast.component.mjs +70 -0
  44. package/esm2022/base-components/components/upload-image/upload-image.component.mjs +343 -0
  45. package/esm2022/base-components/directives/back-button.directive.mjs +25 -0
  46. package/esm2022/base-components/directives/context-menu.directive.mjs +112 -0
  47. package/esm2022/base-components/directives/sort.directive.mjs +61 -0
  48. package/esm2022/base-components/directives/stop-propagation.directive.mjs +24 -0
  49. package/esm2022/base-components/pipes/ellipses.pipe.mjs +23 -0
  50. package/esm2022/base-prototype/base-prototype.module.mjs +54 -0
  51. package/esm2022/base-prototype/pages/email-verification/email-verification.component.mjs +62 -0
  52. package/esm2022/base-prototype/pages/forgot-password/forgot-password.component.mjs +75 -0
  53. package/esm2022/base-prototype/pages/login/login.component.mjs +111 -0
  54. package/esm2022/base-prototype/pages/profile/profile.component.mjs +86 -0
  55. package/esm2022/base-prototype/pages/register/register.component.mjs +94 -0
  56. package/esm2022/base-prototype/pages/set-password/set-password.component.mjs +90 -0
  57. package/esm2022/shared/classes/auth.class.mjs +14 -0
  58. package/esm2022/shared/classes/basic-user.class.mjs +49 -0
  59. package/esm2022/shared/classes/graphql-enum.class.mjs +10 -0
  60. package/esm2022/shared/classes/graphql-meta.class.mjs +345 -0
  61. package/esm2022/shared/classes/graphql-type.class.mjs +14 -0
  62. package/esm2022/shared/classes/sort.class.mjs +38 -0
  63. package/esm2022/shared/services/auth.service.mjs +153 -0
  64. package/esm2022/shared/services/breadcrumb.service.mjs +70 -0
  65. package/{esm2020 → esm2022}/shared/services/cms.service.mjs +7 -5
  66. package/esm2022/shared/services/file.service.mjs +87 -0
  67. package/esm2022/shared/services/forms.service.mjs +62 -0
  68. package/esm2022/shared/services/graphql-meta.service.mjs +133 -0
  69. package/esm2022/shared/services/graphql-plus.service.mjs +94 -0
  70. package/esm2022/shared/services/graphql.service.mjs +511 -0
  71. package/esm2022/shared/services/image.service.mjs +103 -0
  72. package/esm2022/shared/services/loader.service.mjs +79 -0
  73. package/esm2022/shared/services/navigation.service.mjs +39 -0
  74. package/esm2022/shared/services/scroll.service.mjs +208 -0
  75. package/esm2022/shared/services/storage.service.mjs +142 -0
  76. package/esm2022/shared/services/toast.service.mjs +40 -0
  77. package/esm2022/shared/services/user.service.mjs +161 -0
  78. package/esm2022/shared/services/ws.service.mjs +18 -0
  79. package/esm2022/src/base.module.mjs +98 -0
  80. package/esm2022/src/directives/lazy-load.directive.mjs +48 -0
  81. package/esm2022/src/directives/match-height.directive.mjs +92 -0
  82. package/esm2022/src/directives/resizable.directive.mjs +92 -0
  83. package/esm2022/src/functions/extract-files.function.mjs +87 -0
  84. package/esm2022/src/guards/auth.guard.mjs +92 -0
  85. package/esm2022/src/guards/can-deactivate.guard.mjs +17 -0
  86. package/esm2022/src/guards/logout.guard.mjs +35 -0
  87. package/esm2022/src/pipes/date-ago.pipe.mjs +64 -0
  88. package/esm2022/src/pipes/safe-html.pipe.mjs +23 -0
  89. package/esm2022/src/services/fullscreen.service.mjs +52 -0
  90. package/esm2022/src/services/seo.service.mjs +100 -0
  91. package/esm2022/src/services/theme.service.mjs +45 -0
  92. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs +41 -30
  93. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs.map +1 -1
  94. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-components.mjs +421 -300
  95. package/fesm2022/lenne.tech-ng-base-base-components.mjs.map +1 -0
  96. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs +127 -88
  97. package/fesm2022/lenne.tech-ng-base-base-prototype.mjs.map +1 -0
  98. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs +164 -113
  99. package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs.map +1 -1
  100. package/{fesm2020 → fesm2022}/lenne.tech-ng-base.mjs +153 -126
  101. package/fesm2022/lenne.tech-ng-base.mjs.map +1 -0
  102. package/package.json +23 -38
  103. package/src/directives/lazy-load.directive.d.ts +1 -1
  104. package/src/directives/match-height.directive.d.ts +1 -1
  105. package/src/directives/resizable.directive.d.ts +1 -1
  106. package/src/guards/auth.guard.d.ts +4 -3
  107. package/src/guards/can-deactivate.guard.d.ts +1 -2
  108. package/src/guards/logout.guard.d.ts +2 -2
  109. package/esm2020/base-cms/base-cms-routing.module.mjs +0 -32
  110. package/esm2020/base-cms/base-cms.module.mjs +0 -59
  111. package/esm2020/base-cms/pages/base-cms/base-cms.component.mjs +0 -222
  112. package/esm2020/base-components/base-components.module.mjs +0 -123
  113. package/esm2020/base-components/components/breadcrumb/breadcrumb.component.mjs +0 -18
  114. package/esm2020/base-components/components/change-password/change-password.component.mjs +0 -90
  115. package/esm2020/base-components/components/checkbox/checkbox.component.mjs +0 -31
  116. package/esm2020/base-components/components/delete-account/delete-account.component.mjs +0 -56
  117. package/esm2020/base-components/components/fab-button/fab-button.component.mjs +0 -21
  118. package/esm2020/base-components/components/input/input.component.mjs +0 -67
  119. package/esm2020/base-components/components/loading-bar/loading-bar.component.mjs +0 -35
  120. package/esm2020/base-components/components/model-form/model-form-base.component.mjs +0 -136
  121. package/esm2020/base-components/components/model-form/model-form.component.mjs +0 -564
  122. package/esm2020/base-components/components/model-form-sub/model-form-sub.component.mjs +0 -102
  123. package/esm2020/base-components/components/model-table/model-table.component.mjs +0 -456
  124. package/esm2020/base-components/components/refence-input/refence-input.component.mjs +0 -261
  125. package/esm2020/base-components/components/select/select.component.mjs +0 -54
  126. package/esm2020/base-components/components/skeleton-loader/skeleton-loader.component.mjs +0 -32
  127. package/esm2020/base-components/components/tags/tags.component.mjs +0 -218
  128. package/esm2020/base-components/components/textarea/textarea.component.mjs +0 -72
  129. package/esm2020/base-components/components/toast/toast.component.mjs +0 -68
  130. package/esm2020/base-components/components/upload-image/upload-image.component.mjs +0 -324
  131. package/esm2020/base-components/directives/back-button.directive.mjs +0 -23
  132. package/esm2020/base-components/directives/context-menu.directive.mjs +0 -108
  133. package/esm2020/base-components/directives/sort.directive.mjs +0 -57
  134. package/esm2020/base-components/directives/stop-propagation.directive.mjs +0 -23
  135. package/esm2020/base-components/pipes/ellipses.pipe.mjs +0 -22
  136. package/esm2020/base-prototype/base-prototype.module.mjs +0 -53
  137. package/esm2020/base-prototype/pages/email-verification/email-verification.component.mjs +0 -55
  138. package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +0 -67
  139. package/esm2020/base-prototype/pages/login/login.component.mjs +0 -102
  140. package/esm2020/base-prototype/pages/profile/profile.component.mjs +0 -81
  141. package/esm2020/base-prototype/pages/register/register.component.mjs +0 -86
  142. package/esm2020/base-prototype/pages/set-password/set-password.component.mjs +0 -82
  143. package/esm2020/shared/classes/auth.class.mjs +0 -17
  144. package/esm2020/shared/classes/basic-user.class.mjs +0 -52
  145. package/esm2020/shared/classes/graphql-enum.class.mjs +0 -9
  146. package/esm2020/shared/classes/graphql-meta.class.mjs +0 -344
  147. package/esm2020/shared/classes/graphql-type.class.mjs +0 -17
  148. package/esm2020/shared/classes/sort.class.mjs +0 -40
  149. package/esm2020/shared/services/auth.service.mjs +0 -148
  150. package/esm2020/shared/services/breadcrumb.service.mjs +0 -68
  151. package/esm2020/shared/services/file.service.mjs +0 -84
  152. package/esm2020/shared/services/forms.service.mjs +0 -59
  153. package/esm2020/shared/services/graphql-meta.service.mjs +0 -123
  154. package/esm2020/shared/services/graphql-plus.service.mjs +0 -89
  155. package/esm2020/shared/services/graphql.service.mjs +0 -507
  156. package/esm2020/shared/services/image.service.mjs +0 -102
  157. package/esm2020/shared/services/loader.service.mjs +0 -79
  158. package/esm2020/shared/services/navigation.service.mjs +0 -36
  159. package/esm2020/shared/services/scroll.service.mjs +0 -179
  160. package/esm2020/shared/services/storage.service.mjs +0 -140
  161. package/esm2020/shared/services/toast.service.mjs +0 -41
  162. package/esm2020/shared/services/user.service.mjs +0 -155
  163. package/esm2020/shared/services/ws.service.mjs +0 -16
  164. package/esm2020/src/base.module.mjs +0 -97
  165. package/esm2020/src/directives/lazy-load.directive.mjs +0 -45
  166. package/esm2020/src/directives/match-height.directive.mjs +0 -84
  167. package/esm2020/src/directives/resizable.directive.mjs +0 -90
  168. package/esm2020/src/functions/extract-files.function.mjs +0 -84
  169. package/esm2020/src/guards/auth.guard.mjs +0 -80
  170. package/esm2020/src/guards/can-deactivate.guard.mjs +0 -16
  171. package/esm2020/src/guards/logout.guard.mjs +0 -32
  172. package/esm2020/src/pipes/date-ago.pipe.mjs +0 -65
  173. package/esm2020/src/pipes/safe-html.pipe.mjs +0 -21
  174. package/esm2020/src/services/fullscreen.service.mjs +0 -51
  175. package/esm2020/src/services/seo.service.mjs +0 -97
  176. package/esm2020/src/services/theme.service.mjs +0 -43
  177. package/fesm2015/lenne.tech-ng-base-base-cms.mjs +0 -323
  178. package/fesm2015/lenne.tech-ng-base-base-cms.mjs.map +0 -1
  179. package/fesm2015/lenne.tech-ng-base-base-components.mjs +0 -2866
  180. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +0 -1
  181. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +0 -496
  182. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
  183. package/fesm2015/lenne.tech-ng-base-shared.mjs +0 -2750
  184. package/fesm2015/lenne.tech-ng-base-shared.mjs.map +0 -1
  185. package/fesm2015/lenne.tech-ng-base.mjs +0 -905
  186. package/fesm2015/lenne.tech-ng-base.mjs.map +0 -1
  187. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +0 -1
  188. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
  189. package/fesm2020/lenne.tech-ng-base.mjs.map +0 -1
  190. /package/{esm2020 → esm2022}/base-cms/interfaces/base-cms-module-config.interface.mjs +0 -0
  191. /package/{esm2020 → esm2022}/base-cms/lenne.tech-ng-base-base-cms.mjs +0 -0
  192. /package/{esm2020 → esm2022}/base-cms/public-api.mjs +0 -0
  193. /package/{esm2020 → esm2022}/base-components/lenne.tech-ng-base-base-components.mjs +0 -0
  194. /package/{esm2020 → esm2022}/base-components/public-api.mjs +0 -0
  195. /package/{esm2020 → esm2022}/base-prototype/lenne.tech-ng-base-base-prototype.mjs +0 -0
  196. /package/{esm2020 → esm2022}/base-prototype/public-api.mjs +0 -0
  197. /package/{esm2020 → esm2022}/lenne.tech-ng-base.mjs +0 -0
  198. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  199. /package/{esm2020 → esm2022}/shared/classes/helper.class.mjs +0 -0
  200. /package/{esm2020 → esm2022}/shared/classes/standard.class.mjs +0 -0
  201. /package/{esm2020 → esm2022}/shared/decorators/debounce.decorator.mjs +0 -0
  202. /package/{esm2020 → esm2022}/shared/enums/comparison-operator.enum.mjs +0 -0
  203. /package/{esm2020 → esm2022}/shared/enums/graphql-request-type.enum.mjs +0 -0
  204. /package/{esm2020 → esm2022}/shared/enums/logical-operator.enum.mjs +0 -0
  205. /package/{esm2020 → esm2022}/shared/enums/skeleton-type.enum.mjs +0 -0
  206. /package/{esm2020 → esm2022}/shared/enums/sort-order.enum.mjs +0 -0
  207. /package/{esm2020 → esm2022}/shared/enums/toast-type.enum.mjs +0 -0
  208. /package/{esm2020 → esm2022}/shared/functions/ws-client.function.mjs +0 -0
  209. /package/{esm2020 → esm2022}/shared/interfaces/base-module-config.interface.mjs +0 -0
  210. /package/{esm2020 → esm2022}/shared/interfaces/breadcrumb.interface.mjs +0 -0
  211. /package/{esm2020 → esm2022}/shared/interfaces/can-component-deactivate.interface.mjs +0 -0
  212. /package/{esm2020 → esm2022}/shared/interfaces/cms-enum-values.interface.mjs +0 -0
  213. /package/{esm2020 → esm2022}/shared/interfaces/cms-field-config.interface.mjs +0 -0
  214. /package/{esm2020 → esm2022}/shared/interfaces/cms-model-config.interface.mjs +0 -0
  215. /package/{esm2020 → esm2022}/shared/interfaces/cms-table-field.interface.mjs +0 -0
  216. /package/{esm2020 → esm2022}/shared/interfaces/combined-filter-input.interface.mjs +0 -0
  217. /package/{esm2020 → esm2022}/shared/interfaces/compress-options.interface.mjs +0 -0
  218. /package/{esm2020 → esm2022}/shared/interfaces/cropping-options.interface.mjs +0 -0
  219. /package/{esm2020 → esm2022}/shared/interfaces/field-object.interface.mjs +0 -0
  220. /package/{esm2020 → esm2022}/shared/interfaces/field.interface.mjs +0 -0
  221. /package/{esm2020 → esm2022}/shared/interfaces/filter-input.interface.mjs +0 -0
  222. /package/{esm2020 → esm2022}/shared/interfaces/find-args.interface.mjs +0 -0
  223. /package/{esm2020 → esm2022}/shared/interfaces/graphql-crud-type.interface.mjs +0 -0
  224. /package/{esm2020 → esm2022}/shared/interfaces/graphql-fields-object.interface.mjs +0 -0
  225. /package/{esm2020 → esm2022}/shared/interfaces/graphql-options.interface.mjs +0 -0
  226. /package/{esm2020 → esm2022}/shared/interfaces/graphql-plus-options.interfacen.mjs +0 -0
  227. /package/{esm2020 → esm2022}/shared/interfaces/graphql-type-collection.interface.mjs +0 -0
  228. /package/{esm2020 → esm2022}/shared/interfaces/login-config.interface.mjs +0 -0
  229. /package/{esm2020 → esm2022}/shared/interfaces/single-filter-input.interface.mjs +0 -0
  230. /package/{esm2020 → esm2022}/shared/interfaces/sort-input.interface.mjs +0 -0
  231. /package/{esm2020 → esm2022}/shared/interfaces/time-components.interface.mjs +0 -0
  232. /package/{esm2020 → esm2022}/shared/interfaces/toast.interface.mjs +0 -0
  233. /package/{esm2020 → esm2022}/shared/lenne.tech-ng-base-shared.mjs +0 -0
  234. /package/{esm2020 → esm2022}/shared/public-api.mjs +0 -0
  235. /package/{esm2020 → esm2022}/shared/types/graphql-fields.type.mjs +0 -0
  236. /package/{esm2020 → esm2022}/shared/types/storage.type.mjs +0 -0
  237. /package/{esm2020 → esm2022}/shared/validators/email.validator.mjs +0 -0
  238. /package/{esm2020 → esm2022}/shared/validators/match.validator.mjs +0 -0
  239. /package/{esm2020 → esm2022}/shared/validators/secure-password.validator.mjs +0 -0
  240. /package/{esm2020 → esm2022}/src/decorators/auto-unsubscribe.decorator.mjs +0 -0
  241. /package/{esm2020 → esm2022}/src/factories/apollo-options.factory.mjs +0 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Inspired by Inpspired by https://github.com/jaydenseric/extract-files/releases/tag/v11.0.0
3
+ */
4
+ /**
5
+ * Reactive native file
6
+ */
7
+ class ReactNativeFile {
8
+ uri;
9
+ name;
10
+ type;
11
+ constructor(uri, name, type) {
12
+ this.uri = uri;
13
+ this.name = name;
14
+ this.type = type;
15
+ }
16
+ }
17
+ /**
18
+ * Check whether value is an extractable file
19
+ */
20
+ function isExtractableFile(value) {
21
+ return ((typeof File !== 'undefined' && value instanceof File) ||
22
+ (typeof Blob !== 'undefined' && value instanceof Blob) ||
23
+ value instanceof ReactNativeFile);
24
+ }
25
+ /**
26
+ * Clones a value, recursively extracting
27
+ */
28
+ export default function extractFiles(value, path = '', isExtractableFileFunc = isExtractableFile) {
29
+ // Map of extracted files and their object paths within the input value.
30
+ const files = new Map();
31
+ // Map of arrays and objects recursed within the input value and their clones,
32
+ // for reusing clones of values that are referenced multiple times within the
33
+ // input value.
34
+ const clones = new Map();
35
+ /**
36
+ * Recursively clones the value, extracting files.
37
+ */
38
+ function recurse(recurseValue, recursePath, recursed) {
39
+ let clone = recurseValue;
40
+ if (isExtractableFileFunc(recurseValue)) {
41
+ clone = null;
42
+ const filePaths = files.get(recurseValue);
43
+ filePaths ? filePaths.push(recursePath) : files.set(recurseValue, [recursePath]);
44
+ }
45
+ else {
46
+ const isList = Array.isArray(recurseValue) || (typeof FileList !== 'undefined' && recurseValue instanceof FileList);
47
+ const isObject = recurseValue && recurseValue.constructor === Object;
48
+ if (isList || isObject) {
49
+ const hasClone = clones.has(recurseValue);
50
+ if (hasClone) {
51
+ clone = clones.get(recurseValue);
52
+ }
53
+ else {
54
+ clone = isList ? [] : {};
55
+ clones.set(recurseValue, clone);
56
+ }
57
+ if (!recursed.has(recurseValue)) {
58
+ const pathPrefix = recursePath ? `${recursePath}.` : '';
59
+ const recursedDeeper = new Set(recursed).add(recurseValue);
60
+ if (isList) {
61
+ let index = 0;
62
+ for (const item of recurseValue) {
63
+ const itemClone = recurse(item, pathPrefix + index++, recursedDeeper);
64
+ if (!hasClone) {
65
+ clone.push(itemClone);
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ for (const key of Object.keys(recurseValue)) {
71
+ const propertyClone = recurse(recurseValue[key], pathPrefix + key, recursedDeeper);
72
+ if (!hasClone) {
73
+ clone[key] = propertyClone;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ return clone;
81
+ }
82
+ return {
83
+ clone: recurse(value, path, new Set()),
84
+ files,
85
+ };
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdC1maWxlcy5mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2Z1bmN0aW9ucy9leHRyYWN0LWZpbGVzLmZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLGVBQWU7SUFDQTtJQUFvQjtJQUFxQjtJQUE1RCxZQUFtQixHQUFXLEVBQVMsSUFBWSxFQUFTLElBQVk7UUFBckQsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUFTLFNBQUksR0FBSixJQUFJLENBQVE7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUcsQ0FBQztDQUM3RTtBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLE9BQU8sQ0FDTCxDQUFDLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDO1FBQ3RELENBQUMsT0FBTyxJQUFJLEtBQUssV0FBVyxJQUFJLEtBQUssWUFBWSxJQUFJLENBQUM7UUFDdEQsS0FBSyxZQUFZLGVBQWUsQ0FDakMsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLHFCQUFxQixHQUFHLGlCQUFpQjtJQUM5Rix3RUFBd0U7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUV4Qiw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLGVBQWU7SUFDZixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXpCOztPQUVHO0lBQ0gsU0FBUyxPQUFPLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRO1FBQ2xELElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQztRQUV6QixJQUFJLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3ZDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFFYixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FDVixLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLFlBQVksWUFBWSxRQUFRLENBQUMsQ0FBQztZQUN2RyxNQUFNLFFBQVEsR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUM7WUFFckUsSUFBSSxNQUFNLElBQUksUUFBUSxFQUFFO2dCQUN0QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUUxQyxJQUFJLFFBQVEsRUFBRTtvQkFDWixLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDbEM7cUJBQU07b0JBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBRXpCLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNqQztnQkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDL0IsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFFM0QsSUFBSSxNQUFNLEVBQUU7d0JBQ1YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUVkLEtBQUssTUFBTSxJQUFJLElBQUksWUFBbUIsRUFBRTs0QkFDdEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsS0FBSyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7NEJBRXRFLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0NBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs2QkFDdkI7eUJBQ0Y7cUJBQ0Y7eUJBQU07d0JBQ0wsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFOzRCQUMzQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7NEJBRW5GLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0NBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs2QkFDNUI7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTztRQUNMLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLEtBQUs7S0FDTixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW5zcGlyZWQgYnkgSW5wc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXlkZW5zZXJpYy9leHRyYWN0LWZpbGVzL3JlbGVhc2VzL3RhZy92MTEuMC4wXG4gKi9cblxuLyoqXG4gKiBSZWFjdGl2ZSBuYXRpdmUgZmlsZVxuICovXG5jbGFzcyBSZWFjdE5hdGl2ZUZpbGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdXJpOiBzdHJpbmcsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB0eXBlOiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB2YWx1ZSBpcyBhbiBleHRyYWN0YWJsZSBmaWxlXG4gKi9cbmZ1bmN0aW9uIGlzRXh0cmFjdGFibGVGaWxlKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgKHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHx8XG4gICAgKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgdmFsdWUgaW5zdGFuY2VvZiBSZWFjdE5hdGl2ZUZpbGVcbiAgKTtcbn1cblxuLyoqXG4gKiBDbG9uZXMgYSB2YWx1ZSwgcmVjdXJzaXZlbHkgZXh0cmFjdGluZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRyYWN0RmlsZXModmFsdWUsIHBhdGggPSAnJywgaXNFeHRyYWN0YWJsZUZpbGVGdW5jID0gaXNFeHRyYWN0YWJsZUZpbGUpIHtcbiAgLy8gTWFwIG9mIGV4dHJhY3RlZCBmaWxlcyBhbmQgdGhlaXIgb2JqZWN0IHBhdGhzIHdpdGhpbiB0aGUgaW5wdXQgdmFsdWUuXG4gIGNvbnN0IGZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIC8vIE1hcCBvZiBhcnJheXMgYW5kIG9iamVjdHMgcmVjdXJzZWQgd2l0aGluIHRoZSBpbnB1dCB2YWx1ZSBhbmQgdGhlaXIgY2xvbmVzLFxuICAvLyBmb3IgcmV1c2luZyBjbG9uZXMgb2YgdmFsdWVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZVxuICAvLyBpbnB1dCB2YWx1ZS5cbiAgY29uc3QgY2xvbmVzID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjbG9uZXMgdGhlIHZhbHVlLCBleHRyYWN0aW5nIGZpbGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVjdXJzZShyZWN1cnNlVmFsdWUsIHJlY3Vyc2VQYXRoLCByZWN1cnNlZCkge1xuICAgIGxldCBjbG9uZSA9IHJlY3Vyc2VWYWx1ZTtcblxuICAgIGlmIChpc0V4dHJhY3RhYmxlRmlsZUZ1bmMocmVjdXJzZVZhbHVlKSkge1xuICAgICAgY2xvbmUgPSBudWxsO1xuXG4gICAgICBjb25zdCBmaWxlUGF0aHMgPSBmaWxlcy5nZXQocmVjdXJzZVZhbHVlKTtcblxuICAgICAgZmlsZVBhdGhzID8gZmlsZVBhdGhzLnB1c2gocmVjdXJzZVBhdGgpIDogZmlsZXMuc2V0KHJlY3Vyc2VWYWx1ZSwgW3JlY3Vyc2VQYXRoXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzTGlzdCA9XG4gICAgICAgIEFycmF5LmlzQXJyYXkocmVjdXJzZVZhbHVlKSB8fCAodHlwZW9mIEZpbGVMaXN0ICE9PSAndW5kZWZpbmVkJyAmJiByZWN1cnNlVmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdCk7XG4gICAgICBjb25zdCBpc09iamVjdCA9IHJlY3Vyc2VWYWx1ZSAmJiByZWN1cnNlVmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdDtcblxuICAgICAgaWYgKGlzTGlzdCB8fCBpc09iamVjdCkge1xuICAgICAgICBjb25zdCBoYXNDbG9uZSA9IGNsb25lcy5oYXMocmVjdXJzZVZhbHVlKTtcblxuICAgICAgICBpZiAoaGFzQ2xvbmUpIHtcbiAgICAgICAgICBjbG9uZSA9IGNsb25lcy5nZXQocmVjdXJzZVZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbG9uZSA9IGlzTGlzdCA/IFtdIDoge307XG5cbiAgICAgICAgICBjbG9uZXMuc2V0KHJlY3Vyc2VWYWx1ZSwgY2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZWN1cnNlZC5oYXMocmVjdXJzZVZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IHBhdGhQcmVmaXggPSByZWN1cnNlUGF0aCA/IGAke3JlY3Vyc2VQYXRofS5gIDogJyc7XG4gICAgICAgICAgY29uc3QgcmVjdXJzZWREZWVwZXIgPSBuZXcgU2V0KHJlY3Vyc2VkKS5hZGQocmVjdXJzZVZhbHVlKTtcblxuICAgICAgICAgIGlmIChpc0xpc3QpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZWN1cnNlVmFsdWUgYXMgYW55KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1DbG9uZSA9IHJlY3Vyc2UoaXRlbSwgcGF0aFByZWZpeCArIGluZGV4KyssIHJlY3Vyc2VkRGVlcGVyKTtcblxuICAgICAgICAgICAgICBpZiAoIWhhc0Nsb25lKSB7XG4gICAgICAgICAgICAgICAgY2xvbmUucHVzaChpdGVtQ2xvbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY3Vyc2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlDbG9uZSA9IHJlY3Vyc2UocmVjdXJzZVZhbHVlW2tleV0sIHBhdGhQcmVmaXggKyBrZXksIHJlY3Vyc2VkRGVlcGVyKTtcblxuICAgICAgICAgICAgICBpZiAoIWhhc0Nsb25lKSB7XG4gICAgICAgICAgICAgICAgY2xvbmVba2V5XSA9IHByb3BlcnR5Q2xvbmU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNsb25lOiByZWN1cnNlKHZhbHVlLCBwYXRoLCBuZXcgU2V0KCkpLFxuICAgIGZpbGVzLFxuICB9O1xufVxuIl19
@@ -0,0 +1,92 @@
1
+ import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { BASE_MODULE_CONFIG } from '@lenne.tech/ng-base/shared';
4
+ import { isPlatformBrowser } from '@angular/common';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/router";
7
+ import * as i2 from "@lenne.tech/ng-base/shared";
8
+ /**
9
+ * Authentication guard
10
+ */
11
+ class AuthGuard {
12
+ router;
13
+ authService;
14
+ moduleConfig;
15
+ platformId;
16
+ /**
17
+ * Imports
18
+ */
19
+ constructor(router, authService, moduleConfig, platformId) {
20
+ this.router = router;
21
+ this.authService = authService;
22
+ this.moduleConfig = moduleConfig;
23
+ this.platformId = platformId;
24
+ }
25
+ /**
26
+ * Can activate main route
27
+ */
28
+ canActivate(route, state) {
29
+ if (isPlatformBrowser(this.platformId)) {
30
+ return new Observable((subscriber) => {
31
+ let allowed = false;
32
+ let redirected = false;
33
+ /* If the user is logged in and the route is not marked as opposite, then the user is allowed to access the route. */
34
+ const opposite = route?.data?.opposite ? route?.data?.opposite : false;
35
+ const redirectAuthUrl = route?.data?.redirectAuthUrl
36
+ ? route.data.redirectAuthUrl
37
+ : this.moduleConfig.authGuardRedirectUrl;
38
+ const redirectRoleUrl = route?.data?.redirectRoleUrl
39
+ ? route.data.redirectRoleUrl
40
+ : this.moduleConfig.authGuardRedirectUrl;
41
+ const disableQueryParams = route?.data?.disableQueryParams ?? false;
42
+ const queryParams = disableQueryParams
43
+ ? {}
44
+ : {
45
+ queryParams: {
46
+ redirectUrl: route['_routerState'].url,
47
+ },
48
+ };
49
+ if (this.authService.token && !opposite) {
50
+ if (route.data?.roles) {
51
+ const user = this.authService.currentUser;
52
+ allowed = !!route.data.roles.find((role) => user.roles?.includes(role));
53
+ if (!allowed && redirectRoleUrl) {
54
+ this.router.navigate([redirectRoleUrl], queryParams);
55
+ redirected = true;
56
+ }
57
+ }
58
+ else {
59
+ allowed = true;
60
+ }
61
+ }
62
+ else if (!this.authService.token && opposite) {
63
+ allowed = true;
64
+ }
65
+ if (!allowed && redirectAuthUrl && !redirected) {
66
+ this.router.navigate([redirectAuthUrl], queryParams);
67
+ }
68
+ subscriber.next(allowed);
69
+ subscriber.complete();
70
+ });
71
+ }
72
+ }
73
+ /**
74
+ * Can activate child route
75
+ */
76
+ canActivateChild(route, state) {
77
+ return this.canActivate(route, state);
78
+ }
79
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AuthGuard, deps: [{ token: i1.Router }, { token: i2.AuthService }, { token: BASE_MODULE_CONFIG }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
80
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AuthGuard });
81
+ }
82
+ export { AuthGuard };
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AuthGuard, decorators: [{
84
+ type: Injectable
85
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }, { type: undefined, decorators: [{
86
+ type: Inject,
87
+ args: [BASE_MODULE_CONFIG]
88
+ }] }, { type: undefined, decorators: [{
89
+ type: Inject,
90
+ args: [PLATFORM_ID]
91
+ }] }]; } });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2d1YXJkcy9hdXRoLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBZSxrQkFBa0IsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQUVwRDs7R0FFRztBQUNILE1BQ2EsU0FBUztJQUtWO0lBQ0E7SUFDNEI7SUFDUDtJQVAvQjs7T0FFRztJQUNILFlBQ1UsTUFBYyxFQUNkLFdBQXdCLEVBQ0ksWUFBOEIsRUFDckMsVUFBa0I7UUFIdkMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ0ksaUJBQVksR0FBWixZQUFZLENBQWtCO1FBQ3JDLGVBQVUsR0FBVixVQUFVLENBQVE7SUFDOUMsQ0FBQztJQUVKOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEtBQTZCLEVBQUUsS0FBMEI7UUFDbkUsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdkIscUhBQXFIO2dCQUNySCxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDdkUsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxlQUFlO29CQUNsRCxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlO29CQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQztnQkFDM0MsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxlQUFlO29CQUNsRCxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlO29CQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQztnQkFDM0MsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixJQUFJLEtBQUssQ0FBQztnQkFDcEUsTUFBTSxXQUFXLEdBQUcsa0JBQWtCO29CQUNwQyxDQUFDLENBQUMsRUFBRTtvQkFDSixDQUFDLENBQUM7d0JBQ0UsV0FBVyxFQUFFOzRCQUNYLFdBQVcsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRzt5QkFDdkM7cUJBQ0YsQ0FBQztnQkFFTixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUN2QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO3dCQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQzt3QkFDMUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBRXhFLElBQUksQ0FBQyxPQUFPLElBQUksZUFBZSxFQUFFOzRCQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDOzRCQUNyRCxVQUFVLEdBQUcsSUFBSSxDQUFDO3lCQUNuQjtxQkFDRjt5QkFBTTt3QkFDTCxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUNoQjtpQkFDRjtxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksUUFBUSxFQUFFO29CQUM5QyxPQUFPLEdBQUcsSUFBSSxDQUFDO2lCQUNoQjtnQkFFRCxJQUFJLENBQUMsT0FBTyxJQUFJLGVBQWUsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztpQkFDdEQ7Z0JBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQzt1R0FuRVUsU0FBUyxtRUFPVixrQkFBa0IsYUFDbEIsV0FBVzsyR0FSVixTQUFTOztTQUFULFNBQVM7MkZBQVQsU0FBUztrQkFEckIsVUFBVTs7MEJBUU4sTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXIsIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UsIEJBU0VfTU9EVUxFX0NPTkZJRywgQmFzZU1vZHVsZUNvbmZpZyB9IGZyb20gJ0BsZW5uZS50ZWNoL25nLWJhc2Uvc2hhcmVkJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBBdXRoZW50aWNhdGlvbiBndWFyZFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aEd1YXJkIHtcbiAgLyoqXG4gICAqIEltcG9ydHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgQEluamVjdChCQVNFX01PRFVMRV9DT05GSUcpIHByaXZhdGUgbW9kdWxlQ29uZmlnOiBCYXNlTW9kdWxlQ29uZmlnLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogb2JqZWN0XG4gICkge31cblxuICAvKipcbiAgICogQ2FuIGFjdGl2YXRlIG1haW4gcm91dGVcbiAgICovXG4gIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlZGlyZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyogSWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluIGFuZCB0aGUgcm91dGUgaXMgbm90IG1hcmtlZCBhcyBvcHBvc2l0ZSwgdGhlbiB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgcm91dGUuICovXG4gICAgICAgIGNvbnN0IG9wcG9zaXRlID0gcm91dGU/LmRhdGE/Lm9wcG9zaXRlID8gcm91dGU/LmRhdGE/Lm9wcG9zaXRlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0QXV0aFVybCA9IHJvdXRlPy5kYXRhPy5yZWRpcmVjdEF1dGhVcmxcbiAgICAgICAgICA/IHJvdXRlLmRhdGEucmVkaXJlY3RBdXRoVXJsXG4gICAgICAgICAgOiB0aGlzLm1vZHVsZUNvbmZpZy5hdXRoR3VhcmRSZWRpcmVjdFVybDtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RSb2xlVXJsID0gcm91dGU/LmRhdGE/LnJlZGlyZWN0Um9sZVVybFxuICAgICAgICAgID8gcm91dGUuZGF0YS5yZWRpcmVjdFJvbGVVcmxcbiAgICAgICAgICA6IHRoaXMubW9kdWxlQ29uZmlnLmF1dGhHdWFyZFJlZGlyZWN0VXJsO1xuICAgICAgICBjb25zdCBkaXNhYmxlUXVlcnlQYXJhbXMgPSByb3V0ZT8uZGF0YT8uZGlzYWJsZVF1ZXJ5UGFyYW1zID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGRpc2FibGVRdWVyeVBhcmFtc1xuICAgICAgICAgID8ge31cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVybDogcm91dGVbJ19yb3V0ZXJTdGF0ZSddLnVybCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UudG9rZW4gJiYgIW9wcG9zaXRlKSB7XG4gICAgICAgICAgaWYgKHJvdXRlLmRhdGE/LnJvbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoU2VydmljZS5jdXJyZW50VXNlcjtcbiAgICAgICAgICAgIGFsbG93ZWQgPSAhIXJvdXRlLmRhdGEucm9sZXMuZmluZCgocm9sZSkgPT4gdXNlci5yb2xlcz8uaW5jbHVkZXMocm9sZSkpO1xuXG4gICAgICAgICAgICBpZiAoIWFsbG93ZWQgJiYgcmVkaXJlY3RSb2xlVXJsKSB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtyZWRpcmVjdFJvbGVVcmxdLCBxdWVyeVBhcmFtcyk7XG4gICAgICAgICAgICAgIHJlZGlyZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuYXV0aFNlcnZpY2UudG9rZW4gJiYgb3Bwb3NpdGUpIHtcbiAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWxsb3dlZCAmJiByZWRpcmVjdEF1dGhVcmwgJiYgIXJlZGlyZWN0ZWQpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcmVkaXJlY3RBdXRoVXJsXSwgcXVlcnlQYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGFsbG93ZWQpO1xuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuIGFjdGl2YXRlIGNoaWxkIHJvdXRlXG4gICAqL1xuICBjYW5BY3RpdmF0ZUNoaWxkKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNhbkFjdGl2YXRlKHJvdXRlLCBzdGF0ZSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Guard to check if a component can be deactivated
5
+ */
6
+ class CanDeactivateGuard {
7
+ canDeactivate(component) {
8
+ return component.canDeactivate ? component.canDeactivate() : true;
9
+ }
10
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: CanDeactivateGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: CanDeactivateGuard });
12
+ }
13
+ export { CanDeactivateGuard };
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: CanDeactivateGuard, decorators: [{
15
+ type: Injectable
16
+ }] });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuLWRlYWN0aXZhdGUuZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9ndWFyZHMvY2FuLWRlYWN0aXZhdGUuZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJM0M7O0dBRUc7QUFDSCxNQUNhLGtCQUFrQjtJQUM3QixhQUFhLENBQUMsU0FBa0M7UUFDOUMsT0FBTyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRSxDQUFDO3VHQUhVLGtCQUFrQjsyR0FBbEIsa0JBQWtCOztTQUFsQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSUNhbkNvbXBvbmVudERlYWN0aXZhdGUgfSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5cbi8qKlxuICogR3VhcmQgdG8gY2hlY2sgaWYgYSBjb21wb25lbnQgY2FuIGJlIGRlYWN0aXZhdGVkXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYW5EZWFjdGl2YXRlR3VhcmQge1xuICBjYW5EZWFjdGl2YXRlKGNvbXBvbmVudDogSUNhbkNvbXBvbmVudERlYWN0aXZhdGUpIHtcbiAgICByZXR1cm4gY29tcG9uZW50LmNhbkRlYWN0aXZhdGUgPyBjb21wb25lbnQuY2FuRGVhY3RpdmF0ZSgpIDogdHJ1ZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,35 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ import * as i2 from "@lenne.tech/ng-base/shared";
6
+ /**
7
+ * Logout guard
8
+ */
9
+ class LogoutGuard {
10
+ router;
11
+ authService;
12
+ constructor(router, authService) {
13
+ this.router = router;
14
+ this.authService = authService;
15
+ }
16
+ canActivate(route, state) {
17
+ return new Observable((subscriber) => {
18
+ if (this.authService.token) {
19
+ this.authService.logout();
20
+ }
21
+ subscriber.next(true);
22
+ subscriber.complete();
23
+ });
24
+ }
25
+ canActivateChild(route, state) {
26
+ return this.canActivate(route, state);
27
+ }
28
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LogoutGuard, deps: [{ token: i1.Router }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
29
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LogoutGuard });
30
+ }
31
+ export { LogoutGuard };
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: LogoutGuard, decorators: [{
33
+ type: Injectable
34
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }]; } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nb3V0Lmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zcmMvZ3VhcmRzL2xvZ291dC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFHbEM7O0dBRUc7QUFDSCxNQUNhLFdBQVc7SUFDRjtJQUF3QjtJQUE1QyxZQUFvQixNQUFjLEVBQVUsV0FBd0I7UUFBaEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQztJQUV4RSxXQUFXLENBQUMsS0FBNkIsRUFBRSxLQUEwQjtRQUNuRSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUMzQjtZQUVELFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQTZCLEVBQUUsS0FBMEI7UUFDeEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO3VHQWhCVSxXQUFXOzJHQUFYLFdBQVc7O1NBQVgsV0FBVzsyRkFBWCxXQUFXO2tCQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUm91dGVyLCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnQGxlbm5lLnRlY2gvbmctYmFzZS9zaGFyZWQnO1xuXG4vKipcbiAqIExvZ291dCBndWFyZFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9nb3V0R3VhcmQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSkge31cblxuICBjYW5BY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLnRva2VuKSB7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0KCk7XG4gICAgICB9XG5cbiAgICAgIHN1YnNjcmliZXIubmV4dCh0cnVlKTtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNhbkFjdGl2YXRlQ2hpbGQocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuQWN0aXZhdGUocm91dGUsIHN0YXRlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,64 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ class DateAgoPipe {
4
+ intervals = {
5
+ year: 31536000,
6
+ month: 2592000,
7
+ week: 604800,
8
+ day: 86400,
9
+ hour: 3600,
10
+ minute: 60,
11
+ second: 1,
12
+ };
13
+ singular = {
14
+ year: 'Jahr',
15
+ month: 'Monat',
16
+ week: 'Woche',
17
+ day: 'Tag',
18
+ hour: 'Stunde',
19
+ minute: 'Minute',
20
+ second: 'Sekunde',
21
+ };
22
+ plural = {
23
+ year: 'Jahren',
24
+ month: 'Monaten',
25
+ week: 'Wochen',
26
+ day: 'Tagen',
27
+ hour: 'Stunden',
28
+ minute: 'Minuten',
29
+ second: 'Sekunden',
30
+ };
31
+ transform(value, currentDate) {
32
+ const now = currentDate ?? new Date();
33
+ if (value) {
34
+ const seconds = Math.floor((+now - +new Date(value)) / 1000);
35
+ if (seconds < 29) {
36
+ return 'gerade eben'; // less than 30 seconds ago will show as 'Just now'
37
+ }
38
+ let counter;
39
+ for (const i of Object.keys(this.intervals)) {
40
+ counter = Math.floor(seconds / this.intervals[i]);
41
+ if (counter > 0) {
42
+ if (counter === 1) {
43
+ return 'vor ' + counter + ' ' + this.singular[i]; // singular (1 day ago)
44
+ }
45
+ else {
46
+ return 'vor ' + counter + ' ' + this.plural[i]; // plural (2 days ago)
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return value;
52
+ }
53
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: DateAgoPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
54
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: DateAgoPipe, name: "dateAgo" });
55
+ }
56
+ export { DateAgoPipe };
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: DateAgoPipe, decorators: [{
58
+ type: Pipe,
59
+ args: [{
60
+ name: 'dateAgo',
61
+ pure: true,
62
+ }]
63
+ }] });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1hZ28ucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL3BpcGVzL2RhdGUtYWdvLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBRXBELE1BSWEsV0FBVztJQUN0QixTQUFTLEdBQUc7UUFDVixJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxPQUFPO1FBQ2QsSUFBSSxFQUFFLE1BQU07UUFDWixHQUFHLEVBQUUsS0FBSztRQUNWLElBQUksRUFBRSxJQUFJO1FBQ1YsTUFBTSxFQUFFLEVBQUU7UUFDVixNQUFNLEVBQUUsQ0FBQztLQUNWLENBQUM7SUFFRixRQUFRLEdBQUc7UUFDVCxJQUFJLEVBQUUsTUFBTTtRQUNaLEtBQUssRUFBRSxPQUFPO1FBQ2QsSUFBSSxFQUFFLE9BQU87UUFDYixHQUFHLEVBQUUsS0FBSztRQUNWLElBQUksRUFBRSxRQUFRO1FBQ2QsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLFNBQVM7S0FDbEIsQ0FBQztJQUVGLE1BQU0sR0FBRztRQUNQLElBQUksRUFBRSxRQUFRO1FBQ2QsS0FBSyxFQUFFLFNBQVM7UUFDaEIsSUFBSSxFQUFFLFFBQVE7UUFDZCxHQUFHLEVBQUUsT0FBTztRQUNaLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFLFVBQVU7S0FDbkIsQ0FBQztJQUVGLFNBQVMsQ0FBQyxLQUFVLEVBQUUsV0FBa0I7UUFDdEMsTUFBTSxHQUFHLEdBQUcsV0FBVyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxLQUFLLEVBQUU7WUFDVCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzdELElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRTtnQkFDaEIsT0FBTyxhQUFhLENBQUMsQ0FBQyxtREFBbUQ7YUFDMUU7WUFFRCxJQUFJLE9BQU8sQ0FBQztZQUNaLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzNDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtvQkFDZixJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7d0JBQ2pCLE9BQU8sTUFBTSxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtxQkFDMUU7eUJBQU07d0JBQ0wsT0FBTyxNQUFNLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO3FCQUN2RTtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7dUdBcERVLFdBQVc7cUdBQVgsV0FBVzs7U0FBWCxXQUFXOzJGQUFYLFdBQVc7a0JBSnZCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLElBQUk7aUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ2RhdGVBZ28nLFxuICBwdXJlOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlQWdvUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICBpbnRlcnZhbHMgPSB7XG4gICAgeWVhcjogMzE1MzYwMDAsXG4gICAgbW9udGg6IDI1OTIwMDAsXG4gICAgd2VlazogNjA0ODAwLFxuICAgIGRheTogODY0MDAsXG4gICAgaG91cjogMzYwMCxcbiAgICBtaW51dGU6IDYwLFxuICAgIHNlY29uZDogMSxcbiAgfTtcblxuICBzaW5ndWxhciA9IHtcbiAgICB5ZWFyOiAnSmFocicsXG4gICAgbW9udGg6ICdNb25hdCcsXG4gICAgd2VlazogJ1dvY2hlJyxcbiAgICBkYXk6ICdUYWcnLFxuICAgIGhvdXI6ICdTdHVuZGUnLFxuICAgIG1pbnV0ZTogJ01pbnV0ZScsXG4gICAgc2Vjb25kOiAnU2VrdW5kZScsXG4gIH07XG5cbiAgcGx1cmFsID0ge1xuICAgIHllYXI6ICdKYWhyZW4nLFxuICAgIG1vbnRoOiAnTW9uYXRlbicsXG4gICAgd2VlazogJ1dvY2hlbicsXG4gICAgZGF5OiAnVGFnZW4nLFxuICAgIGhvdXI6ICdTdHVuZGVuJyxcbiAgICBtaW51dGU6ICdNaW51dGVuJyxcbiAgICBzZWNvbmQ6ICdTZWt1bmRlbicsXG4gIH07XG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGN1cnJlbnREYXRlPzogRGF0ZSk6IGFueSB7XG4gICAgY29uc3Qgbm93ID0gY3VycmVudERhdGUgPz8gbmV3IERhdGUoKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLmZsb29yKCgrbm93IC0gK25ldyBEYXRlKHZhbHVlKSkgLyAxMDAwKTtcbiAgICAgIGlmIChzZWNvbmRzIDwgMjkpIHtcbiAgICAgICAgcmV0dXJuICdnZXJhZGUgZWJlbic7IC8vIGxlc3MgdGhhbiAzMCBzZWNvbmRzIGFnbyB3aWxsIHNob3cgYXMgJ0p1c3Qgbm93J1xuICAgICAgfVxuXG4gICAgICBsZXQgY291bnRlcjtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyh0aGlzLmludGVydmFscykpIHtcbiAgICAgICAgY291bnRlciA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIHRoaXMuaW50ZXJ2YWxzW2ldKTtcbiAgICAgICAgaWYgKGNvdW50ZXIgPiAwKSB7XG4gICAgICAgICAgaWYgKGNvdW50ZXIgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAndm9yICcgKyBjb3VudGVyICsgJyAnICsgdGhpcy5zaW5ndWxhcltpXTsgLy8gc2luZ3VsYXIgKDEgZGF5IGFnbylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICd2b3IgJyArIGNvdW50ZXIgKyAnICcgKyB0aGlzLnBsdXJhbFtpXTsgLy8gcGx1cmFsICgyIGRheXMgYWdvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,23 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/platform-browser";
4
+ /**
5
+ * Declarate html as safe
6
+ */
7
+ class SafeHtmlPipe {
8
+ sanitized;
9
+ constructor(sanitized) {
10
+ this.sanitized = sanitized;
11
+ }
12
+ transform(value) {
13
+ return this.sanitized.bypassSecurityTrustHtml(value);
14
+ }
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: SafeHtmlPipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
16
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: SafeHtmlPipe, name: "ltSafeHtml" });
17
+ }
18
+ export { SafeHtmlPipe };
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: SafeHtmlPipe, decorators: [{
20
+ type: Pipe,
21
+ args: [{ name: 'ltSafeHtml' }]
22
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS1odG1sLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9waXBlcy9zYWZlLWh0bWwucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7O0FBRXBEOztHQUVHO0FBQ0gsTUFDYSxZQUFZO0lBQ0g7SUFBcEIsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztJQUFHLENBQUM7SUFFL0MsU0FBUyxDQUFDLEtBQUs7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQzt1R0FMVSxZQUFZO3FHQUFaLFlBQVk7O1NBQVosWUFBWTsyRkFBWixZQUFZO2tCQUR4QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIERlY2xhcmF0ZSBodG1sIGFzIHNhZmVcbiAqL1xuQFBpcGUoeyBuYW1lOiAnbHRTYWZlSHRtbCcgfSlcbmV4cG9ydCBjbGFzcyBTYWZlSHRtbFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZWQ6IERvbVNhbml0aXplcikge31cblxuICB0cmFuc2Zvcm0odmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZWQuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodmFsdWUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,52 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Fullscreen service
6
+ */
7
+ class FullscreenService {
8
+ _isFullscreenActive = new BehaviorSubject(false);
9
+ constructor() {
10
+ this.listenToFullscreenEvent();
11
+ }
12
+ get fullscreenState() {
13
+ return this._isFullscreenActive.value;
14
+ }
15
+ get fullscreenStateAsObservable() {
16
+ return this._isFullscreenActive.asObservable();
17
+ }
18
+ toggleFullscreen() {
19
+ const elem = document.documentElement;
20
+ if (!this._isFullscreenActive.value) {
21
+ elem.requestFullscreen();
22
+ this._isFullscreenActive.next(true);
23
+ }
24
+ else {
25
+ document.exitFullscreen();
26
+ this._isFullscreenActive.next(false);
27
+ }
28
+ }
29
+ /**
30
+ * Event Listener for fullscreen toggle
31
+ */
32
+ listenToFullscreenEvent() {
33
+ document.addEventListener('fullscreenchange', () => {
34
+ if (document.fullscreenElement) {
35
+ this._isFullscreenActive.next(true);
36
+ }
37
+ else {
38
+ this._isFullscreenActive.next(false);
39
+ }
40
+ });
41
+ }
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FullscreenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
43
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FullscreenService, providedIn: 'root' });
44
+ }
45
+ export { FullscreenService };
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FullscreenService, decorators: [{
47
+ type: Injectable,
48
+ args: [{
49
+ providedIn: 'root',
50
+ }]
51
+ }], ctorParameters: function () { return []; } });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHNjcmVlbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zcmMvc2VydmljZXMvZnVsbHNjcmVlbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFFbkQ7O0dBRUc7QUFDSCxNQUdhLGlCQUFpQjtJQUNwQixtQkFBbUIsR0FBNkIsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFNUY7UUFDRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7YUFBTTtZQUNMLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCO1FBQzdCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7WUFDakQsSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDckM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt1R0FyQ1UsaUJBQWlCOzJHQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs7U0FFUCxpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBGdWxsc2NyZWVuIHNlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfaXNGdWxsc2NyZWVuQWN0aXZlOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxpc3RlblRvRnVsbHNjcmVlbkV2ZW50KCk7XG4gIH1cblxuICBnZXQgZnVsbHNjcmVlblN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Z1bGxzY3JlZW5BY3RpdmUudmFsdWU7XG4gIH1cblxuICBnZXQgZnVsbHNjcmVlblN0YXRlQXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Z1bGxzY3JlZW5BY3RpdmUuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICBjb25zdCBlbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGlmICghdGhpcy5faXNGdWxsc2NyZWVuQWN0aXZlLnZhbHVlKSB7XG4gICAgICBlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICB0aGlzLl9pc0Z1bGxzY3JlZW5BY3RpdmUubmV4dCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgIHRoaXMuX2lzRnVsbHNjcmVlbkFjdGl2ZS5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgTGlzdGVuZXIgZm9yIGZ1bGxzY3JlZW4gdG9nZ2xlXG4gICAqL1xuICBwcml2YXRlIGxpc3RlblRvRnVsbHNjcmVlbkV2ZW50KCkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5faXNGdWxsc2NyZWVuQWN0aXZlLm5leHQodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc0Z1bGxzY3JlZW5BY3RpdmUubmV4dChmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,100 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/platform-browser";
4
+ /**
5
+ * SEO service for setting HTML meta data
6
+ */
7
+ class SEOService {
8
+ titleService;
9
+ metaTagService;
10
+ constructor(titleService, metaTagService) {
11
+ this.titleService = titleService;
12
+ this.metaTagService = metaTagService;
13
+ }
14
+ initPageForSEO(input) {
15
+ this.setGeneralData(input);
16
+ this.setTwitterData(input);
17
+ this.setTwitterData(input);
18
+ this.setFacebookData(input);
19
+ if (input.keywords) {
20
+ this.setPageKeywords(input.keywords);
21
+ }
22
+ }
23
+ /**
24
+ * Set general metadata
25
+ *
26
+ * @param data
27
+ * @private
28
+ */
29
+ setGeneralData(data) {
30
+ this.titleService.setTitle(data.title);
31
+ this.metaTagService.updateTag({ name: 'description', content: data.description });
32
+ }
33
+ /**
34
+ * Set metadata for twitter
35
+ *
36
+ * @param data
37
+ * @private
38
+ */
39
+ setTwitterData(data) {
40
+ this.metaTagService.updateTag({ name: 'twitter:title', content: data.title });
41
+ this.metaTagService.updateTag({ name: 'twitter:description', content: data.description });
42
+ this.metaTagService.updateTag({
43
+ property: 'twitter:url',
44
+ content: data.url ? data.url : window?.location.href,
45
+ });
46
+ if (data.image) {
47
+ this.metaTagService.updateTag({
48
+ property: 'twitter:image',
49
+ content: data.image,
50
+ });
51
+ this.metaTagService.updateTag({
52
+ property: 'twitter:card',
53
+ content: 'summary_large_image',
54
+ });
55
+ }
56
+ }
57
+ /**
58
+ * Set metadata for facebook
59
+ *
60
+ * @param data
61
+ * @private
62
+ */
63
+ setFacebookData(data) {
64
+ this.metaTagService.updateTag({ property: 'og:title', content: data.title });
65
+ this.metaTagService.updateTag({ property: 'og:description', content: data.description });
66
+ this.metaTagService.updateTag({
67
+ property: 'og:type',
68
+ content: 'website',
69
+ });
70
+ this.metaTagService.updateTag({
71
+ property: 'og:url',
72
+ content: data.url ? data.url : window?.location.href,
73
+ });
74
+ if (data.image) {
75
+ this.metaTagService.updateTag({
76
+ property: 'og:image',
77
+ content: data.image,
78
+ });
79
+ }
80
+ }
81
+ /**
82
+ * Set page keywords
83
+ *
84
+ * @param keywords
85
+ * @private
86
+ */
87
+ setPageKeywords(keywords) {
88
+ this.metaTagService.updateTag({ name: 'keywords', content: keywords });
89
+ }
90
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: SEOService, deps: [{ token: i1.Title }, { token: i1.Meta }], target: i0.ɵɵFactoryTarget.Injectable });
91
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: SEOService, providedIn: 'root' });
92
+ }
93
+ export { SEOService };
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: SEOService, decorators: [{
95
+ type: Injectable,
96
+ args: [{
97
+ providedIn: 'root',
98
+ }]
99
+ }], ctorParameters: function () { return [{ type: i1.Title }, { type: i1.Meta }]; } });
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9zZXJ2aWNlcy9zZW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFXM0M7O0dBRUc7QUFDSCxNQUdhLFVBQVU7SUFDRDtJQUE2QjtJQUFqRCxZQUFvQixZQUFtQixFQUFVLGNBQW9CO1FBQWpELGlCQUFZLEdBQVosWUFBWSxDQUFPO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQU07SUFBRyxDQUFDO0lBRWxFLGNBQWMsQ0FBQyxLQUFjO1FBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssY0FBYyxDQUFDLElBQWE7UUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssY0FBYyxDQUFDLElBQWE7UUFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDNUIsUUFBUSxFQUFFLGFBQWE7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSTtTQUNyRCxDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztnQkFDNUIsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSzthQUNwQixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztnQkFDNUIsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLE9BQU8sRUFBRSxxQkFBcUI7YUFDL0IsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUMsSUFBYTtRQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUM1QixRQUFRLEVBQUUsU0FBUztZQUNuQixPQUFPLEVBQUUsU0FBUztTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUM1QixRQUFRLEVBQUUsUUFBUTtZQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1NBQ3JELENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO2dCQUM1QixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ3BCLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLFFBQWdCO1FBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO3VHQXRGVSxVQUFVOzJHQUFWLFVBQVUsY0FGVCxNQUFNOztTQUVQLFVBQVU7MkZBQVYsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZXRhLCBUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5pbnRlcmZhY2UgU0VPRGF0YSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGltYWdlPzogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG4gIGtleXdvcmRzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNFTyBzZXJ2aWNlIGZvciBzZXR0aW5nIEhUTUwgbWV0YSBkYXRhXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTRU9TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aXRsZVNlcnZpY2U6IFRpdGxlLCBwcml2YXRlIG1ldGFUYWdTZXJ2aWNlOiBNZXRhKSB7fVxuXG4gIHB1YmxpYyBpbml0UGFnZUZvclNFTyhpbnB1dDogU0VPRGF0YSkge1xuICAgIHRoaXMuc2V0R2VuZXJhbERhdGEoaW5wdXQpO1xuICAgIHRoaXMuc2V0VHdpdHRlckRhdGEoaW5wdXQpO1xuICAgIHRoaXMuc2V0VHdpdHRlckRhdGEoaW5wdXQpO1xuICAgIHRoaXMuc2V0RmFjZWJvb2tEYXRhKGlucHV0KTtcblxuICAgIGlmIChpbnB1dC5rZXl3b3Jkcykge1xuICAgICAgdGhpcy5zZXRQYWdlS2V5d29yZHMoaW5wdXQua2V5d29yZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZ2VuZXJhbCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRHZW5lcmFsRGF0YShkYXRhOiBTRU9EYXRhKSB7XG4gICAgdGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUoZGF0YS50aXRsZSk7XG4gICAgdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAnZGVzY3JpcHRpb24nLCBjb250ZW50OiBkYXRhLmRlc2NyaXB0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdHdpdHRlclxuICAgKlxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRUd2l0dGVyRGF0YShkYXRhOiBTRU9EYXRhKSB7XG4gICAgdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAndHdpdHRlcjp0aXRsZScsIGNvbnRlbnQ6IGRhdGEudGl0bGUgfSk7XG4gICAgdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAndHdpdHRlcjpkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IGRhdGEuZGVzY3JpcHRpb24gfSk7XG4gICAgdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoe1xuICAgICAgcHJvcGVydHk6ICd0d2l0dGVyOnVybCcsXG4gICAgICBjb250ZW50OiBkYXRhLnVybCA/IGRhdGEudXJsIDogd2luZG93Py5sb2NhdGlvbi5ocmVmLFxuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEuaW1hZ2UpIHtcbiAgICAgIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHtcbiAgICAgICAgcHJvcGVydHk6ICd0d2l0dGVyOmltYWdlJyxcbiAgICAgICAgY29udGVudDogZGF0YS5pbWFnZSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7XG4gICAgICAgIHByb3BlcnR5OiAndHdpdHRlcjpjYXJkJyxcbiAgICAgICAgY29udGVudDogJ3N1bW1hcnlfbGFyZ2VfaW1hZ2UnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgZmFjZWJvb2tcbiAgICpcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2V0RmFjZWJvb2tEYXRhKGRhdGE6IFNFT0RhdGEpIHtcbiAgICB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiAnb2c6dGl0bGUnLCBjb250ZW50OiBkYXRhLnRpdGxlIH0pO1xuICAgIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6ICdvZzpkZXNjcmlwdGlvbicsIGNvbnRlbnQ6IGRhdGEuZGVzY3JpcHRpb24gfSk7XG4gICAgdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoe1xuICAgICAgcHJvcGVydHk6ICdvZzp0eXBlJyxcbiAgICAgIGNvbnRlbnQ6ICd3ZWJzaXRlJyxcbiAgICB9KTtcbiAgICB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7XG4gICAgICBwcm9wZXJ0eTogJ29nOnVybCcsXG4gICAgICBjb250ZW50OiBkYXRhLnVybCA/IGRhdGEudXJsIDogd2luZG93Py5sb2NhdGlvbi5ocmVmLFxuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEuaW1hZ2UpIHtcbiAgICAgIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHtcbiAgICAgICAgcHJvcGVydHk6ICdvZzppbWFnZScsXG4gICAgICAgIGNvbnRlbnQ6IGRhdGEuaW1hZ2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhZ2Uga2V5d29yZHNcbiAgICpcbiAgICogQHBhcmFtIGtleXdvcmRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHNldFBhZ2VLZXl3b3JkcyhrZXl3b3Jkczogc3RyaW5nKSB7XG4gICAgdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBuYW1lOiAna2V5d29yZHMnLCBjb250ZW50OiBrZXl3b3JkcyB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,45 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@lenne.tech/ng-base/shared";
5
+ class ThemeService {
6
+ storageService;
7
+ _theme = new BehaviorSubject('light');
8
+ get theme() {
9
+ return this._theme.value;
10
+ }
11
+ set theme(theme) {
12
+ this._theme.next(theme);
13
+ this.storageService.save('theme', theme);
14
+ }
15
+ get themeObservable() {
16
+ return this._theme.asObservable();
17
+ }
18
+ constructor(storageService) {
19
+ this.storageService = storageService;
20
+ // Load from storage
21
+ this.theme = this.storageService.load('theme');
22
+ // Use system theme if no theme is set
23
+ if (!this.theme) {
24
+ this.checkSystemTheme();
25
+ }
26
+ }
27
+ /**
28
+ * Check theme from system
29
+ */
30
+ checkSystemTheme() {
31
+ if (window?.matchMedia) {
32
+ this.theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
33
+ }
34
+ }
35
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ThemeService, deps: [{ token: i1.StorageService }], target: i0.ɵɵFactoryTarget.Injectable });
36
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ThemeService, providedIn: 'root' });
37
+ }
38
+ export { ThemeService };
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ThemeService, decorators: [{
40
+ type: Injectable,
41
+ args: [{
42
+ providedIn: 'root',
43
+ }]
44
+ }], ctorParameters: function () { return [{ type: i1.StorageService }]; } });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL3NlcnZpY2VzL3RoZW1lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7QUFHbkQsTUFHYSxZQUFZO0lBZ0JIO0lBZnBCLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxPQUFPLENBQUMsQ0FBQztJQUU5QyxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBb0IsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2hELG9CQUFvQjtRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBVyxDQUFDO1FBRXpELHNDQUFzQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsSUFBSSxNQUFNLEVBQUUsVUFBVSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7U0FDM0Y7SUFDSCxDQUFDO3VHQWpDVSxZQUFZOzJHQUFaLFlBQVksY0FGWCxNQUFNOztTQUVQLFlBQVk7MkZBQVosWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnQGxlbm5lLnRlY2gvbmctYmFzZS9zaGFyZWQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGhlbWVTZXJ2aWNlIHtcbiAgX3RoZW1lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCdsaWdodCcpO1xuXG4gIGdldCB0aGVtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aGVtZS52YWx1ZTtcbiAgfVxuXG4gIHNldCB0aGVtZSh0aGVtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhlbWUubmV4dCh0aGVtZSk7XG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKCd0aGVtZScsIHRoZW1lKTtcbiAgfVxuXG4gIGdldCB0aGVtZU9ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fdGhlbWUuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSkge1xuICAgIC8vIExvYWQgZnJvbSBzdG9yYWdlXG4gICAgdGhpcy50aGVtZSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgndGhlbWUnKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBVc2Ugc3lzdGVtIHRoZW1lIGlmIG5vIHRoZW1lIGlzIHNldFxuICAgIGlmICghdGhpcy50aGVtZSkge1xuICAgICAgdGhpcy5jaGVja1N5c3RlbVRoZW1lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZW1lIGZyb20gc3lzdGVtXG4gICAqL1xuICBjaGVja1N5c3RlbVRoZW1lKCkge1xuICAgIGlmICh3aW5kb3c/Lm1hdGNoTWVkaWEpIHtcbiAgICAgIHRoaXMudGhlbWUgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnO1xuICAgIH1cbiAgfVxufVxuIl19