@banta/sdk 5.3.0 → 5.4.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 (138) hide show
  1. package/{esm2022 → esm2020}/banta-sdk.mjs +4 -4
  2. package/{esm2022 → esm2020}/lib/attachment-scraper.mjs +1 -1
  3. package/esm2020/lib/banta/banta.component.mjs +204 -0
  4. package/{esm2022 → esm2020}/lib/banta-logo.component.mjs +11 -11
  5. package/{esm2022 → esm2020}/lib/banta-sdk.module.mjs +135 -135
  6. package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +209 -0
  7. package/esm2020/lib/chat/chat-message/chat-message.component.mjs +62 -0
  8. package/esm2020/lib/chat/chat-view/chat-view.component.mjs +170 -0
  9. package/{esm2022 → esm2020}/lib/chat/chat.module.mjs +51 -51
  10. package/{esm2022 → esm2020}/lib/chat/index.mjs +5 -5
  11. package/esm2020/lib/chat/live-chat-message.component.mjs +80 -0
  12. package/{esm2022 → esm2020}/lib/chat-backend-base.mjs +30 -30
  13. package/esm2020/lib/chat-backend.mjs +194 -0
  14. package/{esm2022 → esm2020}/lib/chat-source-base.mjs +1 -1
  15. package/esm2020/lib/chat-source.mjs +233 -0
  16. package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +76 -0
  17. package/esm2020/lib/comments/attachment-scraper.directive.mjs +107 -0
  18. package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +749 -0
  19. package/esm2020/lib/comments/comment/comment.component.mjs +175 -0
  20. package/esm2020/lib/comments/comment-field/comment-field.component.mjs +401 -0
  21. package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
  22. package/esm2020/lib/comments/comment-view/comment-view.component.mjs +470 -0
  23. package/{esm2022 → esm2020}/lib/comments/comments.module.mjs +111 -111
  24. package/{esm2022 → esm2020}/lib/comments/index.mjs +10 -10
  25. package/esm2020/lib/comments/live-comment.component.mjs +80 -0
  26. package/{esm2022 → esm2020}/lib/comments/reply-send-options.directive.mjs +13 -13
  27. package/esm2020/lib/common/attachment/attachment.component.mjs +128 -0
  28. package/{esm2022 → esm2020}/lib/common/attachments/attachments.component.mjs +75 -75
  29. package/{esm2022 → esm2020}/lib/common/common.module.mjs +68 -68
  30. package/{esm2022 → esm2020}/lib/common/index.mjs +10 -10
  31. package/{esm2022 → esm2020}/lib/common/lazy-connection.mjs +14 -14
  32. package/esm2020/lib/common/lightbox/lightbox.component.mjs +31 -0
  33. package/esm2020/lib/common/markdown-to-html.pipe.mjs +88 -0
  34. package/esm2020/lib/common/mention-linker.pipe.mjs +35 -0
  35. package/esm2020/lib/common/timer-pool.service.mjs +83 -0
  36. package/esm2020/lib/common/timestamp.component.mjs +123 -0
  37. package/{esm2022 → esm2020}/lib/common/trust-resource-url.pipe.mjs +22 -22
  38. package/esm2020/lib/emoji/emoji-selector-button.component.mjs +116 -0
  39. package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +98 -0
  40. package/{esm2022 → esm2020}/lib/emoji/emoji.module.mjs +55 -55
  41. package/{esm2022 → esm2020}/lib/emoji/emojis.mjs +6507 -6507
  42. package/{esm2022 → esm2020}/lib/emoji/index.mjs +4 -4
  43. package/esm2020/lib/giphy-attachments.mjs +16 -0
  44. package/{esm2022 → esm2020}/lib/index.mjs +19 -19
  45. package/{esm2022 → esm2020}/lib/live-message.component.mjs +61 -61
  46. package/{esm2022 → esm2020}/lib/message-menu-item.mjs +1 -1
  47. package/{esm2022 → esm2020}/lib/sdk-options.mjs +1 -1
  48. package/esm2020/lib/static-chat-source.mjs +71 -0
  49. package/esm2020/lib/tweet-attachments.mjs +13 -0
  50. package/esm2020/lib/url-attachments.mjs +42 -0
  51. package/esm2020/lib/youtube-attachments.mjs +29 -0
  52. package/{esm2022 → esm2020}/public-api.mjs +4 -4
  53. package/fesm2015/banta-sdk.mjs +11258 -0
  54. package/fesm2015/banta-sdk.mjs.map +1 -0
  55. package/{fesm2022 → fesm2020}/banta-sdk.mjs +10823 -10822
  56. package/fesm2020/banta-sdk.mjs.map +1 -0
  57. package/index.d.ts +5 -5
  58. package/lib/attachment-scraper.d.ts +15 -15
  59. package/lib/banta/banta.component.d.ts +58 -58
  60. package/lib/banta-logo.component.d.ts +5 -5
  61. package/lib/banta-sdk.module.d.ts +31 -31
  62. package/lib/chat/banta-chat/banta-chat.component.d.ts +79 -79
  63. package/lib/chat/chat-message/chat-message.component.d.ts +21 -21
  64. package/lib/chat/chat-view/chat-view.component.d.ts +52 -52
  65. package/lib/chat/chat.module.d.ts +15 -15
  66. package/lib/chat/index.d.ts +5 -5
  67. package/lib/chat/live-chat-message.component.d.ts +23 -23
  68. package/lib/chat-backend-base.d.ts +72 -72
  69. package/lib/chat-backend.d.ts +67 -67
  70. package/lib/chat-source-base.d.ts +44 -44
  71. package/lib/chat-source.d.ts +65 -65
  72. package/lib/comments/attachment-button/attachment-button.component.d.ts +17 -17
  73. package/lib/comments/attachment-scraper.directive.d.ts +21 -21
  74. package/lib/comments/banta-comments/banta-comments.component.d.ts +203 -203
  75. package/lib/comments/comment/comment.component.d.ts +72 -72
  76. package/lib/comments/comment-field/comment-field.component.d.ts +89 -89
  77. package/lib/comments/comment-sort/comment-sort.component.d.ts +16 -16
  78. package/lib/comments/comment-view/comment-view.component.d.ts +121 -121
  79. package/lib/comments/comments.module.d.ts +30 -30
  80. package/lib/comments/index.d.ts +10 -10
  81. package/lib/comments/live-comment.component.d.ts +23 -23
  82. package/lib/comments/reply-send-options.directive.d.ts +5 -5
  83. package/lib/common/attachment/attachment.component.d.ts +34 -34
  84. package/lib/common/attachments/attachments.component.d.ts +26 -26
  85. package/lib/common/common.module.d.ts +19 -19
  86. package/lib/common/index.d.ts +10 -10
  87. package/lib/common/lazy-connection.d.ts +6 -6
  88. package/lib/common/lightbox/lightbox.component.d.ts +14 -14
  89. package/lib/common/markdown-to-html.pipe.d.ts +15 -15
  90. package/lib/common/mention-linker.pipe.d.ts +13 -13
  91. package/lib/common/timer-pool.service.d.ts +15 -15
  92. package/lib/common/timestamp.component.d.ts +19 -19
  93. package/lib/common/trust-resource-url.pipe.d.ts +10 -10
  94. package/lib/emoji/emoji-selector-button.component.d.ts +30 -30
  95. package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +26 -26
  96. package/lib/emoji/emoji.module.d.ts +16 -16
  97. package/lib/emoji/emojis.d.ts +6507 -6507
  98. package/lib/emoji/index.d.ts +4 -4
  99. package/lib/giphy-attachments.d.ts +5 -5
  100. package/lib/index.d.ts +19 -19
  101. package/lib/live-message.component.d.ts +22 -22
  102. package/lib/message-menu-item.d.ts +6 -6
  103. package/lib/sdk-options.d.ts +5 -5
  104. package/lib/static-chat-source.d.ts +42 -42
  105. package/lib/tweet-attachments.d.ts +5 -5
  106. package/lib/url-attachments.d.ts +14 -14
  107. package/lib/youtube-attachments.d.ts +5 -5
  108. package/package.json +11 -5
  109. package/public-api.d.ts +1 -1
  110. package/esm2022/lib/banta/banta.component.mjs +0 -204
  111. package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +0 -209
  112. package/esm2022/lib/chat/chat-message/chat-message.component.mjs +0 -62
  113. package/esm2022/lib/chat/chat-view/chat-view.component.mjs +0 -170
  114. package/esm2022/lib/chat/live-chat-message.component.mjs +0 -80
  115. package/esm2022/lib/chat-backend.mjs +0 -194
  116. package/esm2022/lib/chat-source.mjs +0 -233
  117. package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +0 -76
  118. package/esm2022/lib/comments/attachment-scraper.directive.mjs +0 -107
  119. package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +0 -748
  120. package/esm2022/lib/comments/comment/comment.component.mjs +0 -175
  121. package/esm2022/lib/comments/comment-field/comment-field.component.mjs +0 -401
  122. package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
  123. package/esm2022/lib/comments/comment-view/comment-view.component.mjs +0 -470
  124. package/esm2022/lib/comments/live-comment.component.mjs +0 -80
  125. package/esm2022/lib/common/attachment/attachment.component.mjs +0 -128
  126. package/esm2022/lib/common/lightbox/lightbox.component.mjs +0 -31
  127. package/esm2022/lib/common/markdown-to-html.pipe.mjs +0 -88
  128. package/esm2022/lib/common/mention-linker.pipe.mjs +0 -35
  129. package/esm2022/lib/common/timer-pool.service.mjs +0 -83
  130. package/esm2022/lib/common/timestamp.component.mjs +0 -123
  131. package/esm2022/lib/emoji/emoji-selector-button.component.mjs +0 -115
  132. package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -98
  133. package/esm2022/lib/giphy-attachments.mjs +0 -16
  134. package/esm2022/lib/static-chat-source.mjs +0 -71
  135. package/esm2022/lib/tweet-attachments.mjs +0 -13
  136. package/esm2022/lib/url-attachments.mjs +0 -42
  137. package/esm2022/lib/youtube-attachments.mjs +0 -29
  138. package/fesm2022/banta-sdk.mjs.map +0 -1
@@ -1,80 +0,0 @@
1
- import { Component, Input, Output } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../chat-backend-base";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "./comment/comment.component";
7
- export class LiveCommentComponent {
8
- constructor(backend) {
9
- this.backend = backend;
10
- this._upvoted = new Subject();
11
- this._reported = new Subject();
12
- this._selected = new Subject();
13
- }
14
- get upvoted() {
15
- return this._upvoted;
16
- }
17
- get reported() {
18
- return this._reported;
19
- }
20
- get selected() {
21
- return this._selected;
22
- }
23
- get message() {
24
- return this._message;
25
- }
26
- set message(value) {
27
- let originalId = null;
28
- if (this._message)
29
- originalId = this._message.id;
30
- this._message = value;
31
- if (value && originalId === value.id) {
32
- return;
33
- }
34
- if (this.unsubscribe)
35
- this.unsubscribe();
36
- if (value) {
37
- this.unsubscribe = this.backend.watchMessage(value, message => this.message = message);
38
- }
39
- }
40
- report() {
41
- this._reported.next();
42
- }
43
- upvote() {
44
- this._upvoted.next();
45
- }
46
- select() {
47
- this._selected.next();
48
- }
49
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: LiveCommentComponent, deps: [{ token: i1.ChatBackendBase }], target: i0.ɵɵFactoryTarget.Component }); }
50
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: LiveCommentComponent, selector: "banta-live-comment", inputs: { message: "message" }, outputs: { upvoted: "upvoted", reported: "reported", selected: "selected" }, ngImport: i0, template: `
51
- <banta-comment
52
- *ngIf="message"
53
- [message]="message"
54
- (upvoted)="upvote()"
55
- (reported)="report()"
56
- (selected)="select()"
57
- ></banta-comment>
58
- `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.CommentComponent, selector: "banta-comment", inputs: ["message", "customMenuItems", "showReplyAction", "maxLength", "permissions", "mine", "editing", "genericAvatarUrl", "readonly"], outputs: ["liked", "unliked", "selected", "edited", "deleted", "editStarted", "editEnded", "shared", "userSelected", "usernameSelected", "avatarSelected", "reported", "loaded"] }] }); }
59
- }
60
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: LiveCommentComponent, decorators: [{
61
- type: Component,
62
- args: [{ selector: 'banta-live-comment', template: `
63
- <banta-comment
64
- *ngIf="message"
65
- [message]="message"
66
- (upvoted)="upvote()"
67
- (reported)="report()"
68
- (selected)="select()"
69
- ></banta-comment>
70
- ` }]
71
- }], ctorParameters: () => [{ type: i1.ChatBackendBase }], propDecorators: { upvoted: [{
72
- type: Output
73
- }], reported: [{
74
- type: Output
75
- }], selected: [{
76
- type: Output
77
- }], message: [{
78
- type: Input
79
- }] } });
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1jb21tZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1lbnRzL2xpdmUtY29tbWVudC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7Ozs7O0FBZ0IzQyxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFlBQ1ksT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFNN0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDL0IsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFMeEMsQ0FBQztJQU9ELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBSUQsSUFBSSxPQUFPLENBQUMsS0FBSztRQUNiLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQ2IsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXRCLElBQUksS0FBSyxJQUFJLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkMsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV2QixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzNGLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDOzhHQS9EUSxvQkFBb0I7a0dBQXBCLG9CQUFvQix1S0FYbkI7Ozs7Ozs7O0tBUVQ7OzJGQUdRLG9CQUFvQjtrQkFiaEMsU0FBUzsrQkFDSSxvQkFBb0IsWUFDcEI7Ozs7Ozs7O0tBUVQ7b0ZBZ0JHLE9BQU87c0JBRFYsTUFBTTtnQkFNSCxRQUFRO3NCQURYLE1BQU07Z0JBTUgsUUFBUTtzQkFEWCxNQUFNO2dCQU1ILE9BQU87c0JBRFYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gJy4uL2NoYXQtYmFja2VuZC1iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYW50YS1saXZlLWNvbW1lbnQnLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8YmFudGEtY29tbWVudCBcclxuICAgICAgICAgICAgKm5nSWY9XCJtZXNzYWdlXCJcclxuICAgICAgICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZVwiXHJcbiAgICAgICAgICAgICh1cHZvdGVkKT1cInVwdm90ZSgpXCJcclxuICAgICAgICAgICAgKHJlcG9ydGVkKT1cInJlcG9ydCgpXCJcclxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdCgpXCJcclxuICAgICAgICAgICAgPjwvYmFudGEtY29tbWVudD5cclxuICAgIGAsXHJcbiAgICBzdHlsZXM6IFtgYF1cclxufSlcclxuZXhwb3J0IGNsYXNzIExpdmVDb21tZW50Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYmFja2VuZCA6IENoYXRCYWNrZW5kQmFzZVxyXG4gICAgKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX21lc3NhZ2UgOiBDaGF0TWVzc2FnZTtcclxuICAgIHByaXZhdGUgX3Vwdm90ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfcmVwb3J0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgZ2V0IHVwdm90ZWQoKSA6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cHZvdGVkO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBAT3V0cHV0KClcclxuICAgIGdldCByZXBvcnRlZCgpIDogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcG9ydGVkO1xyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgZ2V0IHNlbGVjdGVkKCkgOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbWVzc2FnZSgpIDogQ2hhdE1lc3NhZ2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdW5zdWJzY3JpYmUgOiBGdW5jdGlvbjtcclxuXHJcbiAgICBzZXQgbWVzc2FnZSh2YWx1ZSkge1xyXG4gICAgICAgIGxldCBvcmlnaW5hbElkID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fbWVzc2FnZSlcclxuICAgICAgICAgICAgb3JpZ2luYWxJZCA9IHRoaXMuX21lc3NhZ2UuaWQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgJiYgb3JpZ2luYWxJZCA9PT0gdmFsdWUuaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy51bnN1YnNjcmliZSlcclxuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlID0gdGhpcy5iYWNrZW5kLndhdGNoTWVzc2FnZSh2YWx1ZSwgbWVzc2FnZSA9PiB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVwb3J0KCkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVkLm5leHQoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdXB2b3RlKCkge1xyXG4gICAgICAgIHRoaXMuX3Vwdm90ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdCgpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcbn0iXX0=
@@ -1,128 +0,0 @@
1
- import { Component, HostBinding, Input, Output } from "@angular/core";
2
- import { Subject } from "rxjs";
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/material/icon";
6
- import * as i3 from "@angular/cdk/bidi";
7
- import * as i4 from "@angular/material/progress-spinner";
8
- import * as i5 from "@angular/material/button";
9
- import * as i6 from "../trust-resource-url.pipe";
10
- let TWITTER_LOADED = false;
11
- export class BantaAttachmentComponent {
12
- constructor(elementRef) {
13
- this.elementRef = elementRef;
14
- this.loading = false;
15
- this.editing = false;
16
- this.loadingMessage = 'Please wait...';
17
- this.error = false;
18
- this.errorMessage = 'An error has occurred';
19
- this.removed = new Subject();
20
- this.activated = new Subject();
21
- this.loaded = new Subject();
22
- this._viewLoaded = false;
23
- }
24
- get attachment() { return this._attachment; }
25
- set attachment(value) {
26
- this._attachment = value;
27
- this.checkLoad();
28
- this.loadPlatformSpecific();
29
- }
30
- ngAfterViewInit() {
31
- this._viewLoaded = true;
32
- this.checkLoad();
33
- }
34
- loadTwitterWidgets() {
35
- if (typeof window !== 'undefined')
36
- window['twttr']?.widgets.load();
37
- }
38
- loadPlatformSpecific() {
39
- if (typeof window === 'undefined')
40
- return;
41
- if (this._attachment?.type === 'tweet') {
42
- if (!TWITTER_LOADED && document.querySelector('script[src="https://platform.twitter.com/widgets.js"]'))
43
- TWITTER_LOADED = true;
44
- if (typeof window !== 'undefined' && !TWITTER_LOADED) {
45
- TWITTER_LOADED = true;
46
- let script = document.createElement('script');
47
- script.src = 'https://platform.twitter.com/widgets.js';
48
- script.async = true;
49
- script.addEventListener('load', () => setTimeout(() => this.loadTwitterWidgets()));
50
- document.body.appendChild(script);
51
- }
52
- else {
53
- setTimeout(() => this.loadTwitterWidgets());
54
- }
55
- }
56
- }
57
- checkLoad() {
58
- if (!this._attachment || !this._viewLoaded || !this.elementRef?.nativeElement)
59
- return;
60
- if (typeof window === 'undefined')
61
- this.loaded.next();
62
- else
63
- setTimeout(() => this.loaded.next(), 250);
64
- }
65
- activate() {
66
- this.activated.next();
67
- }
68
- remove() {
69
- this.removed.next();
70
- }
71
- get isError() {
72
- return this.error || this.attachment?.transientState?.error;
73
- }
74
- get theErrorMessage() {
75
- return this.errorMessage || this.attachment?.transientState?.errorMessage;
76
- }
77
- get isLoading() {
78
- return this.editing && (this.loading || !this.attachment || this.attachment.transientState?.loading
79
- || !this.attachment.url);
80
- }
81
- get isImageAttachment() {
82
- return this.attachment?.type?.startsWith('image/');
83
- }
84
- get hasFrame() {
85
- if (!this.attachment)
86
- return false;
87
- return this.attachment.type === 'iframe' || (this.attachment.type === 'card'
88
- && this.attachment.card?.player);
89
- }
90
- get frameUrl() {
91
- if (!this.attachment)
92
- return undefined;
93
- if (this.attachment.type === 'iframe') {
94
- return this.attachment.url;
95
- }
96
- else if (this.attachment.type === 'card') {
97
- return this.attachment.card.player;
98
- }
99
- }
100
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaAttachmentComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
101
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: BantaAttachmentComponent, selector: "banta-attachment", inputs: { attachment: "attachment", loading: "loading", editing: "editing", loadingMessage: "loadingMessage", error: "error", errorMessage: "errorMessage" }, outputs: { removed: "removed", activated: "activated", loaded: "loaded" }, host: { properties: { "class.loading": "this.isLoading" } }, ngImport: i0, template: "<button type=\"button\" (click)=\"remove()\" mat-mini-fab color=\"primary\" class=\"remove-button\" *ngIf=\"editing\">\r\n <mat-icon>close</mat-icon>\r\n</button>\r\n\r\n<ng-container *ngIf=\"isError\">\r\n <mat-icon class=\"error\">close</mat-icon>\r\n <em class=\"error\">{{theErrorMessage}}</em>\r\n</ng-container>\r\n<ng-container *ngIf=\"!isError\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <mat-spinner></mat-spinner>\r\n <em>{{loadingMessage}}</em>\r\n </ng-container>\r\n <ng-container *ngIf=\"!isLoading && attachment\">\r\n <iframe *ngIf=\"hasFrame\"\r\n sandbox=\"allow-scripts allow-popups allow-same-origin allow-presentation\" \r\n [src]=\"frameUrl | trustResourceUrl\"></iframe>\r\n <a *ngIf=\"attachment.type === 'card'\" class=\"card-attachment\" [href]=\"attachment.url\" target=\"_blank\" [class.has-image]=\"attachment.card.image\">\r\n <img \r\n *ngIf=\"attachment.card.image\"\r\n class=\"thumbnail\" \r\n [src]=\"attachment.card.image\"\r\n />\r\n <div class=\"description\">\r\n <h1>{{attachment.card.title}}</h1>\r\n <div class=\"summary\">\r\n {{attachment.card.description}}\r\n </div>\r\n <cite>{{attachment.card.url}}</cite>\r\n </div>\r\n </a>\r\n <a class=\"image-attachment\" *ngIf=\"isImageAttachment && attachment.url\" href=\"javascript:;\" (click)=\"activate()\">\r\n <img [src]=\"attachment.url\" alt=\"Image Attachment\">\r\n </a>\r\n <blockquote *ngIf=\"attachment.type === 'tweet'\" \r\n class=\"twitter-tweet\">\r\n <p lang=\"en\" dir=\"ltr\"></p>\r\n <a [href]=\"attachment.url\"></a>\r\n </blockquote>\r\n </ng-container>\r\n</ng-container>", styles: [":host{position:relative;display:block}:host.loading{outline:1px solid #333;padding:1em 0;width:300px;text-align:center}:host.loading mat-spinner{display:block;margin:0 auto .5em;width:fit-content}a.card-attachment{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919;margin:1em 0}a.card-attachment img{width:250px;aspect-ratio:16/9;object-fit:cover;border-radius:10px}a.card-attachment.has-image h1{font-size:22px}a.card-attachment h1{min-width:0;margin:0 0 .5em;font-size:26px}a.card-attachment cite{min-width:0;opacity:.75;margin-top:1em;display:block;font-size:80%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}a.card-attachment .description{min-width:0;width:100%}a.card-attachment .summary{overflow-x:hidden;text-overflow:ellipsis}.remove-button{position:absolute;right:10px;top:10px;margin:0;z-index:1}a.image-attachment{width:300px;position:relative;text-align:center}a.image-attachment.with-border{outline:1px solid #333;padding:1em 0}a.image-attachment mat-spinner{display:block;margin:0 auto .5em;width:fit-content}a.image-attachment mat-icon.error{display:block;font-size:48px;width:48px;height:48px;margin:0 auto .5em}a.image-attachment .error{color:#b76363}a.image-attachment img{width:300px;border-radius:10px;max-width:100%;max-height:20em;object-fit:cover}iframe{border:none;width:100%;aspect-ratio:16/9}@media (max-width: 700px){a.card-attachment{flex-direction:column}a.card-attachment img{width:100%}}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i5.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "pipe", type: i6.BantaTrustResourceUrlPipe, name: "trustResourceUrl" }] }); }
102
- }
103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaAttachmentComponent, decorators: [{
104
- type: Component,
105
- args: [{ selector: 'banta-attachment', template: "<button type=\"button\" (click)=\"remove()\" mat-mini-fab color=\"primary\" class=\"remove-button\" *ngIf=\"editing\">\r\n <mat-icon>close</mat-icon>\r\n</button>\r\n\r\n<ng-container *ngIf=\"isError\">\r\n <mat-icon class=\"error\">close</mat-icon>\r\n <em class=\"error\">{{theErrorMessage}}</em>\r\n</ng-container>\r\n<ng-container *ngIf=\"!isError\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <mat-spinner></mat-spinner>\r\n <em>{{loadingMessage}}</em>\r\n </ng-container>\r\n <ng-container *ngIf=\"!isLoading && attachment\">\r\n <iframe *ngIf=\"hasFrame\"\r\n sandbox=\"allow-scripts allow-popups allow-same-origin allow-presentation\" \r\n [src]=\"frameUrl | trustResourceUrl\"></iframe>\r\n <a *ngIf=\"attachment.type === 'card'\" class=\"card-attachment\" [href]=\"attachment.url\" target=\"_blank\" [class.has-image]=\"attachment.card.image\">\r\n <img \r\n *ngIf=\"attachment.card.image\"\r\n class=\"thumbnail\" \r\n [src]=\"attachment.card.image\"\r\n />\r\n <div class=\"description\">\r\n <h1>{{attachment.card.title}}</h1>\r\n <div class=\"summary\">\r\n {{attachment.card.description}}\r\n </div>\r\n <cite>{{attachment.card.url}}</cite>\r\n </div>\r\n </a>\r\n <a class=\"image-attachment\" *ngIf=\"isImageAttachment && attachment.url\" href=\"javascript:;\" (click)=\"activate()\">\r\n <img [src]=\"attachment.url\" alt=\"Image Attachment\">\r\n </a>\r\n <blockquote *ngIf=\"attachment.type === 'tweet'\" \r\n class=\"twitter-tweet\">\r\n <p lang=\"en\" dir=\"ltr\"></p>\r\n <a [href]=\"attachment.url\"></a>\r\n </blockquote>\r\n </ng-container>\r\n</ng-container>", styles: [":host{position:relative;display:block}:host.loading{outline:1px solid #333;padding:1em 0;width:300px;text-align:center}:host.loading mat-spinner{display:block;margin:0 auto .5em;width:fit-content}a.card-attachment{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919;margin:1em 0}a.card-attachment img{width:250px;aspect-ratio:16/9;object-fit:cover;border-radius:10px}a.card-attachment.has-image h1{font-size:22px}a.card-attachment h1{min-width:0;margin:0 0 .5em;font-size:26px}a.card-attachment cite{min-width:0;opacity:.75;margin-top:1em;display:block;font-size:80%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}a.card-attachment .description{min-width:0;width:100%}a.card-attachment .summary{overflow-x:hidden;text-overflow:ellipsis}.remove-button{position:absolute;right:10px;top:10px;margin:0;z-index:1}a.image-attachment{width:300px;position:relative;text-align:center}a.image-attachment.with-border{outline:1px solid #333;padding:1em 0}a.image-attachment mat-spinner{display:block;margin:0 auto .5em;width:fit-content}a.image-attachment mat-icon.error{display:block;font-size:48px;width:48px;height:48px;margin:0 auto .5em}a.image-attachment .error{color:#b76363}a.image-attachment img{width:300px;border-radius:10px;max-width:100%;max-height:20em;object-fit:cover}iframe{border:none;width:100%;aspect-ratio:16/9}@media (max-width: 700px){a.card-attachment{flex-direction:column}a.card-attachment img{width:100%}}\n"] }]
106
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { attachment: [{
107
- type: Input
108
- }], loading: [{
109
- type: Input
110
- }], editing: [{
111
- type: Input
112
- }], loadingMessage: [{
113
- type: Input
114
- }], error: [{
115
- type: Input
116
- }], errorMessage: [{
117
- type: Input
118
- }], removed: [{
119
- type: Output
120
- }], activated: [{
121
- type: Output
122
- }], loaded: [{
123
- type: Output
124
- }], isLoading: [{
125
- type: HostBinding,
126
- args: ['class.loading']
127
- }] } });
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jb21tb24vYXR0YWNobWVudC9hdHRhY2htZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9hdHRhY2htZW50L2F0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVsRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQUUvQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFPM0IsTUFBTSxPQUFPLHdCQUF3QjtJQUNqQyxZQUNZLFVBQW1DO1FBQW5DLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBYXRDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixtQkFBYyxHQUFXLGdCQUFnQixDQUFDO1FBQzFDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxpQkFBWSxHQUFXLHVCQUF1QixDQUFDO1FBQzlDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzlCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2hDLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRS9CLGdCQUFXLEdBQUcsS0FBSyxDQUFDO0lBbkI1QixDQUFDO0lBR0QsSUFBYSxVQUFVLEtBQUssT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN0RCxJQUFJLFVBQVUsQ0FBQyxLQUFLO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFT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ZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VBdHRhY2htZW50IH0gZnJvbSBcIkBiYW50YS9jb21tb25cIjtcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5sZXQgVFdJVFRFUl9MT0FERUQgPSBmYWxzZTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYW50YS1hdHRhY2htZW50JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2F0dGFjaG1lbnQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFudGFBdHRhY2htZW50Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cclxuICAgICkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9hdHRhY2htZW50OiBDaGF0TWVzc2FnZUF0dGFjaG1lbnQ7XHJcbiAgICBASW5wdXQoKSBnZXQgYXR0YWNobWVudCgpIHsgcmV0dXJuIHRoaXMuX2F0dGFjaG1lbnQ7IH1cclxuICAgIHNldCBhdHRhY2htZW50KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fYXR0YWNobWVudCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuY2hlY2tMb2FkKCk7XHJcbiAgICAgICAgdGhpcy5sb2FkUGxhdGZvcm1TcGVjaWZpYygpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBlZGl0aW5nID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBsb2FkaW5nTWVzc2FnZTogc3RyaW5nID0gJ1BsZWFzZSB3YWl0Li4uJztcclxuICAgIEBJbnB1dCgpIGVycm9yID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICdBbiBlcnJvciBoYXMgb2NjdXJyZWQnO1xyXG4gICAgQE91dHB1dCgpIHJlbW92ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgQE91dHB1dCgpIGFjdGl2YXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgbG9hZGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIF92aWV3TG9hZGVkID0gZmFsc2U7XHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fdmlld0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jaGVja0xvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRUd2l0dGVyV2lkZ2V0cygpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHdpbmRvd1sndHd0dHInXT8ud2lkZ2V0cy5sb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkUGxhdGZvcm1TcGVjaWZpYygpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5fYXR0YWNobWVudD8udHlwZSA9PT0gJ3R3ZWV0Jykge1xyXG4gICAgICAgICAgICBpZiAoIVRXSVRURVJfTE9BREVEICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmM9XCJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanNcIl0nKSlcclxuICAgICAgICAgICAgICAgIFRXSVRURVJfTE9BREVEID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhVFdJVFRFUl9MT0FERUQpIHtcclxuICAgICAgICAgICAgICAgIFRXSVRURVJfTE9BREVEID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGxldCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSAnaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzJztcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkVHdpdHRlcldpZGdldHMoKSkpO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRUd2l0dGVyV2lkZ2V0cygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrTG9hZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2F0dGFjaG1lbnQgfHwgIXRoaXMuX3ZpZXdMb2FkZWQgfHwgIXRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVkLm5leHQoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb2FkZWQubmV4dCgpLCAyNTApO1xyXG4gICAgfVxyXG5cclxuICAgIGFjdGl2YXRlKCkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZhdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUoKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNFcnJvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvciB8fCB0aGlzLmF0dGFjaG1lbnQ/LnRyYW5zaWVudFN0YXRlPy5lcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdGhlRXJyb3JNZXNzYWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yTWVzc2FnZSB8fCB0aGlzLmF0dGFjaG1lbnQ/LnRyYW5zaWVudFN0YXRlPy5lcnJvck1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5sb2FkaW5nJylcclxuICAgIGdldCBpc0xvYWRpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGluZyAmJiAoXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyB8fCAhdGhpcy5hdHRhY2htZW50IHx8IHRoaXMuYXR0YWNobWVudC50cmFuc2llbnRTdGF0ZT8ubG9hZGluZyBcclxuICAgICAgICAgICAgfHwgIXRoaXMuYXR0YWNobWVudC51cmxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0ltYWdlQXR0YWNobWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50Py50eXBlPy5zdGFydHNXaXRoKCdpbWFnZS8nKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaGFzRnJhbWUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF0dGFjaG1lbnQpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNobWVudC50eXBlID09PSAnaWZyYW1lJyB8fCAoXHJcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudC50eXBlID09PSAnY2FyZCcgXHJcbiAgICAgICAgICAgICYmIHRoaXMuYXR0YWNobWVudC5jYXJkPy5wbGF5ZXJcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmcmFtZVVybCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNobWVudClcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5hdHRhY2htZW50LnR5cGUgPT09ICdpZnJhbWUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmF0dGFjaG1lbnQudXJsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hdHRhY2htZW50LnR5cGUgPT09ICdjYXJkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50LmNhcmQucGxheWVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIjxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZW1vdmUoKVwiIG1hdC1taW5pLWZhYiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cInJlbW92ZS1idXR0b25cIiAqbmdJZj1cImVkaXRpbmdcIj5cclxuICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbjwvYnV0dG9uPlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRXJyb3JcIj5cclxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImVycm9yXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPGVtIGNsYXNzPVwiZXJyb3JcIj57e3RoZUVycm9yTWVzc2FnZX19PC9lbT5cclxuPC9uZy1jb250YWluZXI+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFcnJvclwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgIDxlbT57e2xvYWRpbmdNZXNzYWdlfX08L2VtPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZyAmJiBhdHRhY2htZW50XCI+XHJcbiAgICAgICAgPGlmcmFtZSAqbmdJZj1cImhhc0ZyYW1lXCJcclxuICAgICAgICAgICAgc2FuZGJveD1cImFsbG93LXNjcmlwdHMgYWxsb3ctcG9wdXBzIGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXByZXNlbnRhdGlvblwiIFxyXG4gICAgICAgICAgICBbc3JjXT1cImZyYW1lVXJsIHwgdHJ1c3RSZXNvdXJjZVVybFwiPjwvaWZyYW1lPlxyXG4gICAgICAgIDxhICpuZ0lmPVwiYXR0YWNobWVudC50eXBlID09PSAnY2FyZCdcIiBjbGFzcz1cImNhcmQtYXR0YWNobWVudFwiIFtocmVmXT1cImF0dGFjaG1lbnQudXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgW2NsYXNzLmhhcy1pbWFnZV09XCJhdHRhY2htZW50LmNhcmQuaW1hZ2VcIj5cclxuICAgICAgICAgICAgPGltZyBcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYXR0YWNobWVudC5jYXJkLmltYWdlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGh1bWJuYWlsXCIgXHJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImF0dGFjaG1lbnQuY2FyZC5pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxoMT57e2F0dGFjaG1lbnQuY2FyZC50aXRsZX19PC9oMT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3thdHRhY2htZW50LmNhcmQuZGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8Y2l0ZT57e2F0dGFjaG1lbnQuY2FyZC51cmx9fTwvY2l0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICAgIDxhIGNsYXNzPVwiaW1hZ2UtYXR0YWNobWVudFwiICpuZ0lmPVwiaXNJbWFnZUF0dGFjaG1lbnQgJiYgYXR0YWNobWVudC51cmxcIiBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cImFjdGl2YXRlKClcIj5cclxuICAgICAgICAgICAgPGltZyBbc3JjXT1cImF0dGFjaG1lbnQudXJsXCIgYWx0PVwiSW1hZ2UgQXR0YWNobWVudFwiPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8YmxvY2txdW90ZSAqbmdJZj1cImF0dGFjaG1lbnQudHlwZSA9PT0gJ3R3ZWV0J1wiIFxyXG4gICAgICAgICAgICBjbGFzcz1cInR3aXR0ZXItdHdlZXRcIj5cclxuICAgICAgICAgICAgICAgIDxwIGxhbmc9XCJlblwiIGRpcj1cImx0clwiPjwvcD5cclxuICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cImF0dGFjaG1lbnQudXJsXCI+PC9hPlxyXG4gICAgICAgIDwvYmxvY2txdW90ZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLWNvbnRhaW5lcj4iXX0=
@@ -1,31 +0,0 @@
1
- import { Component, ViewChild } from "@angular/core";
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/material/icon";
4
- export class LightboxComponent {
5
- ngAfterViewInit() {
6
- if (typeof window !== 'undefined') {
7
- document.body.appendChild(this.containerElement.nativeElement);
8
- }
9
- }
10
- ngOnDestroy() {
11
- this.containerElement.nativeElement.remove();
12
- }
13
- close() {
14
- this.isOpen = false;
15
- }
16
- open(currentImage, images) {
17
- this.currentImage = currentImage;
18
- this.images = images;
19
- this.isOpen = true;
20
- }
21
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: LightboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: LightboxComponent, selector: "banta-lightbox", viewQueries: [{ propertyName: "containerElement", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div \r\n class=\"banta-lightbox-container\" \r\n #container\r\n [class.open]=\"isOpen\"\r\n >\r\n\r\n <a class=\"underlay\" (click)=\"close()\" href=\"javascript:;\"></a>\r\n\r\n <a class=\"close-button\" href=\"javascript:;\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]=\"currentImage\" />\r\n</div>\r\n", styles: ["::ng-deep .banta-lightbox-container{position:fixed;inset:0;opacity:0;pointer-events:none;background-color:#000000bf;color:#fff;z-index:10000;transition:.25s opacity ease-in-out;display:flex;align-items:center;justify-content:center}::ng-deep .banta-lightbox-container a.underlay{z-index:0;position:absolute;inset:0;opacity:0}::ng-deep .banta-lightbox-container img{z-index:10;max-width:95%}::ng-deep .banta-lightbox-container.open{opacity:1;pointer-events:initial}::ng-deep .banta-lightbox-container a.close-button{position:absolute;top:0;right:0;padding:.75em;z-index:20}\n"], dependencies: [{ kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
23
- }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: LightboxComponent, decorators: [{
25
- type: Component,
26
- args: [{ selector: 'banta-lightbox', template: "<div \r\n class=\"banta-lightbox-container\" \r\n #container\r\n [class.open]=\"isOpen\"\r\n >\r\n\r\n <a class=\"underlay\" (click)=\"close()\" href=\"javascript:;\"></a>\r\n\r\n <a class=\"close-button\" href=\"javascript:;\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <img [src]=\"currentImage\" />\r\n</div>\r\n", styles: ["::ng-deep .banta-lightbox-container{position:fixed;inset:0;opacity:0;pointer-events:none;background-color:#000000bf;color:#fff;z-index:10000;transition:.25s opacity ease-in-out;display:flex;align-items:center;justify-content:center}::ng-deep .banta-lightbox-container a.underlay{z-index:0;position:absolute;inset:0;opacity:0}::ng-deep .banta-lightbox-container img{z-index:10;max-width:95%}::ng-deep .banta-lightbox-container.open{opacity:1;pointer-events:initial}::ng-deep .banta-lightbox-container a.close-button{position:absolute;top:0;right:0;padding:.75em;z-index:20}\n"] }]
27
- }], propDecorators: { containerElement: [{
28
- type: ViewChild,
29
- args: ['container']
30
- }] } });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL2xpZ2h0Ym94L2xpZ2h0Ym94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9saWdodGJveC9saWdodGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBT2pFLE1BQU0sT0FBTyxpQkFBaUI7SUFJMUIsZUFBZTtRQUNYLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQU9ELEtBQUs7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxDQUFDLFlBQW9CLEVBQUUsTUFBZ0I7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQzs4R0EzQlEsaUJBQWlCO2tHQUFqQixpQkFBaUIscUtDUDlCLHNYQWNBOzsyRkRQYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0ksZ0JBQWdCOzhCQU0xQixnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JhbnRhLWxpZ2h0Ym94JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9saWdodGJveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9saWdodGJveC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMaWdodGJveENvbXBvbmVudCB7XHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKSBcclxuICAgIGNvbnRhaW5lckVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGltYWdlczogc3RyaW5nW107XHJcbiAgICBjdXJyZW50SW1hZ2U6IHN0cmluZztcclxuXHJcbiAgICBpc09wZW46IGJvb2xlYW47XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuKGN1cnJlbnRJbWFnZTogc3RyaW5nLCBpbWFnZXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2UgPSBjdXJyZW50SW1hZ2U7XHJcbiAgICAgICAgdGhpcy5pbWFnZXMgPSBpbWFnZXM7XHJcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG4gICAgfVxyXG59IiwiPGRpdiBcclxuICAgIGNsYXNzPVwiYmFudGEtbGlnaHRib3gtY29udGFpbmVyXCIgXHJcbiAgICAjY29udGFpbmVyXHJcbiAgICBbY2xhc3Mub3Blbl09XCJpc09wZW5cIlxyXG4gICAgPlxyXG5cclxuICAgIDxhIGNsYXNzPVwidW5kZXJsYXlcIiAoY2xpY2spPVwiY2xvc2UoKVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIj48L2E+XHJcblxyXG4gICAgPGEgY2xhc3M9XCJjbG9zZS1idXR0b25cIiBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cImNsb3NlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9hPlxyXG5cclxuICAgIDxpbWcgW3NyY109XCJjdXJyZW50SW1hZ2VcIiAvPlxyXG48L2Rpdj5cclxuIl19
@@ -1,88 +0,0 @@
1
- import { Pipe, Inject, Optional } from '@angular/core';
2
- import * as marked from 'marked';
3
- import createDOMPurify from 'dompurify';
4
- import twemoji from 'twemoji';
5
- import { BANTA_SDK_OPTIONS } from '../sdk-options';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/platform-browser";
8
- const underline = {
9
- name: 'underline',
10
- level: 'inline', // Is this a block-level or inline-level tokenizer?
11
- start(src) { return src.match(/\+\+/)?.index; }, // Hint to Marked.js to stop and check for a match
12
- tokenizer(src, tokens) {
13
- const rule = /^\+\+(.*?)\+\+/; // Regex for the complete token
14
- const match = rule.exec(src);
15
- if (match) {
16
- return {
17
- type: 'underline', // Should match "name" above
18
- raw: match[0], // Text to consume from the source
19
- text: this.lexer.inlineTokens(match[1].trim()), // Additional custom properties
20
- };
21
- }
22
- },
23
- renderer(token) {
24
- return `<u>${this.parser.parseInline(token.text)}</u>`;
25
- }
26
- };
27
- marked.marked.use({
28
- extensions: [underline]
29
- });
30
- export class BantaMarkdownToHtmlPipe {
31
- constructor(sanitizer, sdkOptions) {
32
- this.sanitizer = sanitizer;
33
- this.sdkOptions = sdkOptions;
34
- this.renderer = new marked.Renderer();
35
- const linkRenderer = this.renderer.link;
36
- this.renderer.link = token => {
37
- const html = linkRenderer.call(this.renderer, token);
38
- return html.replace(/^<a /, '<a target="_blank" rel="noopener noreferrer nofollow" ');
39
- };
40
- }
41
- get emojiUrl() {
42
- return this.sdkOptions?.emojiUrl ?? 'https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/';
43
- }
44
- transform(value) {
45
- if (!value)
46
- return '';
47
- let purifier = createDOMPurify(window);
48
- // https://github.com/cure53/DOMPurify/blob/e1c19cf6407d782b666cb1d02a6af191f9cbc09e/demos/hooks-target-blank-demo.html
49
- // Add a hook to make all links open a new window
50
- purifier.addHook('afterSanitizeAttributes', function (node) {
51
- // set all elements owning target to target=_blank
52
- if ('target' in node) {
53
- node.setAttribute('target', '_blank');
54
- // prevent https://www.owasp.org/index.php/Reverse_Tabnabbing
55
- node.setAttribute('rel', 'noopener noreferrer nofollow');
56
- }
57
- // set non-HTML/MathML links to xlink:show=new
58
- if (!node.hasAttribute('target')
59
- && (node.hasAttribute('xlink:href')
60
- || node.hasAttribute('href'))) {
61
- node.setAttribute('xlink:show', 'new');
62
- }
63
- });
64
- value = marked.marked.parse(value, {
65
- renderer: this.renderer
66
- });
67
- value = twemoji.parse(value, { base: this.emojiUrl });
68
- return this.sanitizer.bypassSecurityTrustHtml(purifier.sanitize(value, {
69
- FORBID_TAGS: ['h1', 'h2', 'h3', 'h4', 'style', 'link', 'script'],
70
- FORBID_ATTR: ['style'],
71
- KEEP_CONTENT: true
72
- }));
73
- }
74
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaMarkdownToHtmlPipe, deps: [{ token: i1.DomSanitizer }, { token: BANTA_SDK_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe }); }
75
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.9", ngImport: i0, type: BantaMarkdownToHtmlPipe, name: "markdownToHtml" }); }
76
- }
77
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaMarkdownToHtmlPipe, decorators: [{
78
- type: Pipe,
79
- args: [{
80
- name: 'markdownToHtml'
81
- }]
82
- }], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: undefined, decorators: [{
83
- type: Inject,
84
- args: [BANTA_SDK_OPTIONS]
85
- }, {
86
- type: Optional
87
- }] }] });
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tdG8taHRtbC5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL21hcmtkb3duLXRvLWh0bWwucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sZUFBZSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFjLE1BQU0sZ0JBQWdCLENBQUM7OztBQUUvRCxNQUFNLFNBQVMsR0FBRztJQUNkLElBQUksRUFBRSxXQUFXO0lBQ2pCLEtBQUssRUFBRSxRQUFRLEVBQUUsbURBQW1EO0lBQ3BFLEtBQUssQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxrREFBa0Q7SUFDbkcsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLENBQUMsK0JBQStCO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLFdBQVcsRUFBRSw0QkFBNEI7Z0JBQy9DLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0NBQWtDO2dCQUNqRCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsK0JBQStCO2FBQ2xG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OzsyRkFBdkIsdUJBQXVCO2tCQUhuQyxJQUFJO21CQUFDO29CQUNGLElBQUksRUFBRSxnQkFBZ0I7aUJBQ3pCOzswQkFLUSxNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0sIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbWFya2VkIGZyb20gJ21hcmtlZCc7XHJcbmltcG9ydCBjcmVhdGVET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB0d2Vtb2ppIGZyb20gJ3R3ZW1vamknO1xyXG5pbXBvcnQgeyBCQU5UQV9TREtfT1BUSU9OUywgU2RrT3B0aW9ucyB9IGZyb20gJy4uL3Nkay1vcHRpb25zJztcclxuXHJcbmNvbnN0IHVuZGVybGluZSA9IHtcclxuICAgIG5hbWU6ICd1bmRlcmxpbmUnLFxyXG4gICAgbGV2ZWw6ICdpbmxpbmUnLCAvLyBJcyB0aGlzIGEgYmxvY2stbGV2ZWwgb3IgaW5saW5lLWxldmVsIHRva2VuaXplcj9cclxuICAgIHN0YXJ0KHNyYykgeyByZXR1cm4gc3JjLm1hdGNoKC9cXCtcXCsvKT8uaW5kZXg7IH0sIC8vIEhpbnQgdG8gTWFya2VkLmpzIHRvIHN0b3AgYW5kIGNoZWNrIGZvciBhIG1hdGNoXHJcbiAgICB0b2tlbml6ZXIoc3JjLCB0b2tlbnMpIHtcclxuICAgICAgICBjb25zdCBydWxlID0gL15cXCtcXCsoLio/KVxcK1xcKy87IC8vIFJlZ2V4IGZvciB0aGUgY29tcGxldGUgdG9rZW5cclxuICAgICAgICBjb25zdCBtYXRjaCA9IHJ1bGUuZXhlYyhzcmMpO1xyXG4gICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICByZXR1cm4geyAvLyBUb2tlbiB0byBnZW5lcmF0ZVxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3VuZGVybGluZScsIC8vIFNob3VsZCBtYXRjaCBcIm5hbWVcIiBhYm92ZVxyXG4gICAgICAgICAgICAgICAgcmF3OiBtYXRjaFswXSwgLy8gVGV4dCB0byBjb25zdW1lIGZyb20gdGhlIHNvdXJjZVxyXG4gICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnMobWF0Y2hbMV0udHJpbSgpKSwgLy8gQWRkaXRpb25hbCBjdXN0b20gcHJvcGVydGllc1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICByZW5kZXJlcih0b2tlbikge1xyXG4gICAgICAgIHJldHVybiBgPHU+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbi50ZXh0KX08L3U+YDtcclxuICAgIH1cclxufTtcclxuXHJcbm1hcmtlZC5tYXJrZWQudXNlKHtcclxuICAgIGV4dGVuc2lvbnM6IFt1bmRlcmxpbmVdXHJcbn0pO1xyXG5cclxuQFBpcGUoe1xyXG4gICAgbmFtZTogJ21hcmtkb3duVG9IdG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFudGFNYXJrZG93blRvSHRtbFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcblxyXG4gICAgICAgIEBJbmplY3QoQkFOVEFfU0RLX09QVElPTlMpIEBPcHRpb25hbCgpXHJcbiAgICAgICAgcHJpdmF0ZSBzZGtPcHRpb25zOiBTZGtPcHRpb25zXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IG1hcmtlZC5SZW5kZXJlcigpO1xyXG4gICAgICAgIGNvbnN0IGxpbmtSZW5kZXJlciA9IHRoaXMucmVuZGVyZXIubGluaztcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpbmsgPSB0b2tlbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsaW5rUmVuZGVyZXIuY2FsbCh0aGlzLnJlbmRlcmVyLCB0b2tlbik7XHJcbiAgICAgICAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoL148YSAvLCAnPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvd1wiICcpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG5cdHByaXZhdGUgZ2V0IGVtb2ppVXJsKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2RrT3B0aW9ucz8uZW1vamlVcmwgPz8gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC90d2l0dGVyL3R3ZW1vamlAMTQuMC4yL2Fzc2V0cy8nO1xyXG5cdH1cclxuXHJcbiAgICByZW5kZXJlcjogbWFya2VkLlJlbmRlcmVyO1xyXG4gICAgdHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKVxyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcblxyXG4gICAgICAgIGxldCBwdXJpZmllciA9IGNyZWF0ZURPTVB1cmlmeSh3aW5kb3cpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jdXJlNTMvRE9NUHVyaWZ5L2Jsb2IvZTFjMTljZjY0MDdkNzgyYjY2NmNiMWQwMmE2YWYxOTFmOWNiYzA5ZS9kZW1vcy9ob29rcy10YXJnZXQtYmxhbmstZGVtby5odG1sXHJcbiAgICAgICAgLy8gQWRkIGEgaG9vayB0byBtYWtlIGFsbCBsaW5rcyBvcGVuIGEgbmV3IHdpbmRvd1xyXG4gICAgICAgIHB1cmlmaWVyLmFkZEhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgZnVuY3Rpb24obm9kZTogSFRNTEVsZW1lbnQgJiB7IHRhcmdldD86IHN0cmluZyB9KSB7XHJcbiAgICAgICAgICAgIC8vIHNldCBhbGwgZWxlbWVudHMgb3duaW5nIHRhcmdldCB0byB0YXJnZXQ9X2JsYW5rXHJcbiAgICAgICAgICAgIGlmICgndGFyZ2V0JyBpbiBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywnX2JsYW5rJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvUmV2ZXJzZV9UYWJuYWJiaW5nXHJcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgncmVsJywgJ25vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3cnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzZXQgbm9uLUhUTUwvTWF0aE1MIGxpbmtzIHRvIHhsaW5rOnNob3c9bmV3XHJcbiAgICAgICAgICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUoJ3RhcmdldCcpXHJcbiAgICAgICAgICAgICAgICAmJiAobm9kZS5oYXNBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGUuaGFzQXR0cmlidXRlKCdocmVmJykpKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgneGxpbms6c2hvdycsICduZXcnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YWx1ZSA9IG1hcmtlZC5tYXJrZWQucGFyc2UodmFsdWUsIHtcclxuICAgICAgICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXJcclxuICAgICAgICB9KSBhcyBzdHJpbmc7XHJcblxyXG4gICAgICAgIHZhbHVlID0gdHdlbW9qaS5wYXJzZSh2YWx1ZSwgeyBiYXNlOiB0aGlzLmVtb2ppVXJsIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoXHJcbiAgICAgICAgICAgIHB1cmlmaWVyLnNhbml0aXplKHZhbHVlLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIEZPUkJJRF9UQUdTOiBbJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ3N0eWxlJywgJ2xpbmsnLCAnc2NyaXB0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgRk9SQklEX0FUVFI6IFsnc3R5bGUnXSxcclxuICAgICAgICAgICAgICAgICAgICBLRUVQX0NPTlRFTlQ6IHRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iXX0=
@@ -1,35 +0,0 @@
1
- import { Pipe } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class BantaMentionLinkerPipe {
4
- transform(value, links) {
5
- if (!value)
6
- return '';
7
- if (!links)
8
- return value;
9
- let text = value;
10
- for (let i = 0, max = links.length; i < max; ++i) {
11
- let mention = links[i];
12
- text = text.replace(new RegExp(`${this.escapeRegExp(mention.text)}`, `gi`), `@{${i + 1}}`);
13
- }
14
- text = text.replace(/@\{(\d+)\}/g, (text, i) => links[i - 1] ? this.formatLink(links[i - 1]) : text);
15
- return text;
16
- }
17
- formatLink(link) {
18
- return `<a${link.external ? ` target="_blank" rel="noopener"` : ``} class="mention" href="${link.link}">${link.text}</a>`;
19
- }
20
- /**
21
- * https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
22
- */
23
- escapeRegExp(string) {
24
- return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
25
- }
26
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaMentionLinkerPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
27
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.9", ngImport: i0, type: BantaMentionLinkerPipe, name: "mentionLinker" }); }
28
- }
29
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaMentionLinkerPipe, decorators: [{
30
- type: Pipe,
31
- args: [{
32
- name: 'mentionLinker'
33
- }]
34
- }] });
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudGlvbi1saW5rZXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1vbi9tZW50aW9uLWxpbmtlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQU9wRCxNQUFNLE9BQU8sc0JBQXNCO0lBQy9CLFNBQVMsQ0FBQyxLQUFhLEVBQUUsS0FBNEI7UUFDakQsSUFBSSxDQUFDLEtBQUs7WUFDTixPQUFPLEVBQUUsQ0FBQztRQUVkLElBQUksQ0FBQyxLQUFLO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUVELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyRyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXdCO1FBQy9CLE9BQU8sS0FBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsRUFBRywwQkFBMEIsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDaEksQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLE1BQU07UUFDZixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxvQ0FBb0M7SUFDOUYsQ0FBQzs4R0E3QlEsc0JBQXNCOzRHQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBSGxDLElBQUk7bUJBQUM7b0JBQ0YsSUFBSSxFQUFFLGVBQWU7aUJBQ3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VNZW50aW9uIH0gZnJvbSAnQGJhbnRhL2NvbW1vbic7XHJcblxyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAnbWVudGlvbkxpbmtlcidcclxufSlcclxuZXhwb3J0IGNsYXNzIEJhbnRhTWVudGlvbkxpbmtlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBsaW5rcz86IENoYXRNZXNzYWdlTWVudGlvbltdKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSlcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG5cclxuICAgICAgICBpZiAoIWxpbmtzKVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcblxyXG4gICAgICAgIGxldCB0ZXh0ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBsaW5rcy5sZW5ndGg7IGkgPCBtYXg7ICsraSkge1xyXG4gICAgICAgICAgICBsZXQgbWVudGlvbiA9IGxpbmtzW2ldO1xyXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7dGhpcy5lc2NhcGVSZWdFeHAobWVudGlvbi50ZXh0KX1gLCBgZ2lgKSwgYEB7JHtpICsgMX19YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9AXFx7KFxcZCspXFx9L2csICh0ZXh0LCBpKSA9PiBsaW5rc1tpIC0gMV0gPyB0aGlzLmZvcm1hdExpbmsobGlua3NbaSAtIDFdKSA6IHRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtYXRMaW5rKGxpbms6IENoYXRNZXNzYWdlTWVudGlvbikge1xyXG4gICAgICAgIHJldHVybiBgPGEkeyBsaW5rLmV4dGVybmFsID8gYCB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiYCA6IGBgIH0gY2xhc3M9XCJtZW50aW9uXCIgaHJlZj1cIiR7bGluay5saW5rfVwiPiR7bGluay50ZXh0fTwvYT5gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleFxyXG4gICAgICovXHJcbiAgICBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpOyAvLyAkJiBtZWFucyB0aGUgd2hvbGUgbWF0Y2hlZCBzdHJpbmdcclxuICAgIH1cclxufSJdfQ==
@@ -1,83 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Injectable } from "@banta/common";
3
- /**
4
- * Provides a way to hook in to a shared set of timers, instead of creating a timer per instance.
5
- * This is very useful for cases where the update is not extremely time-sensitive, but happens at scale.
6
- * The principal use case is the TimestampComponent. When several hundred (or several thousand) comments are
7
- * being displayed, we do not want to trigger thousands of independent relative timestamp updates, because over
8
- * time the updates will saturate the CPU since they don't perfectly align.
9
- */
10
- let TimerPool = class TimerPool {
11
- constructor() {
12
- this.subscriptions = new Map();
13
- this.newSubscriptions = new Map();
14
- this.removedSubscriptions = new Map();
15
- }
16
- addTimer(interval, callback) {
17
- if (interval <= 0) {
18
- console.warn(`Refusing to set timer with interval of ${interval}!`);
19
- return () => { };
20
- }
21
- let state;
22
- let sizeWas = this.subscriptions.size;
23
- if (!this.subscriptions.has(interval)) {
24
- state = { subscribers: [] };
25
- state.handle = setInterval(() => {
26
- console.debug(`[Banta/TimerPool] Notifying ${state.subscribers.length} subs [${interval}ms]`);
27
- state.subscribers.forEach(sub => sub());
28
- }, interval);
29
- this.subscriptions.set(interval, state);
30
- }
31
- else {
32
- state = this.subscriptions.get(interval);
33
- }
34
- state.subscribers.push(callback);
35
- // Debug information //////////////////////////
36
- //
37
- if (!this.newSubscriptions.has(interval))
38
- this.newSubscriptions.set(interval, 0);
39
- this.newSubscriptions.set(interval, (this.newSubscriptions.get(interval) ?? 0) + 1);
40
- clearTimeout(this.newSubscriptionsNotice);
41
- this.newSubscriptionsNotice = setTimeout(() => {
42
- for (let [interval, count] of this.newSubscriptions) {
43
- console.debug(`[Banta/TimerPool] ${count} new subscriptions to ${interval}ms [${state.subscribers.length} total]`);
44
- }
45
- this.newSubscriptions.clear();
46
- });
47
- //
48
- ///////////////////////////////////////////////
49
- if (sizeWas === 0) {
50
- console.debug(`[Banta/TimerPool] No longer idle.`);
51
- }
52
- // Unsubscribe function
53
- return () => {
54
- let state = this.subscriptions.get(interval);
55
- let index = state.subscribers.indexOf(callback);
56
- if (index >= 0)
57
- state.subscribers.splice(index, 1);
58
- if (state.subscribers.length === 0) {
59
- clearInterval(state.handle);
60
- this.subscriptions.delete(interval);
61
- }
62
- if (!this.removedSubscriptions.has(interval))
63
- this.removedSubscriptions.set(interval, 0);
64
- this.removedSubscriptions.set(interval, (this.removedSubscriptions.get(interval) ?? 0) + 1);
65
- // Debug information ////////////////////////////////////////////////////////////////////
66
- clearTimeout(this.removedSubscriptionsNotice);
67
- this.removedSubscriptionsNotice = setTimeout(() => {
68
- for (let [interval, count] of this.removedSubscriptions) {
69
- let state = this.subscriptions.get(interval);
70
- console.debug(`[Banta/TimerPool] ${count} unsubscribed from ${interval}ms [${state?.subscribers?.length ?? 0} remain]`);
71
- }
72
- if (this.subscriptions.size === 0)
73
- console.debug(`[Banta/TimerPool] All subscriptions have been removed. Now idle.`);
74
- this.removedSubscriptions.clear();
75
- });
76
- };
77
- }
78
- };
79
- TimerPool = __decorate([
80
- Injectable()
81
- ], TimerPool);
82
- export { TimerPool };
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXItcG9vbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbW9uL3RpbWVyLXBvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU8zQzs7Ozs7O0dBTUc7QUFFSSxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7SUFBZjtRQUNLLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFHOUMscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFHN0MseUJBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFnRjdELENBQUM7SUE5RUcsUUFBUSxDQUFDLFFBQWdCLEVBQUUsUUFBb0I7UUFDM0MsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNwRSxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxLQUFpQixDQUFDO1FBQ3RCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBRXRDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BDLEtBQUssR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7Z0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxVQUFVLFFBQVEsS0FBSyxDQUFDLENBQUM7Z0JBQzlGLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFD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QUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDdEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdDLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEtBQUssc0JBQXNCLFFBQVEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM1SCxDQUFDO2dCQUVELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQztvQkFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO2dCQUV0RixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQTtBQXZGWSxTQUFTO0lBRHJCLFVBQVUsRUFBRTtHQUNBLFNBQVMsQ0F1RnJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYmFudGEvY29tbW9uXCI7XHJcblxyXG5pbnRlcmZhY2UgVGltZXJTdGF0ZSB7XHJcbiAgICBoYW5kbGU/O1xyXG4gICAgc3Vic2NyaWJlcnM6ICgoKSA9PiB2b2lkKVtdO1xyXG59XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgYSB3YXkgdG8gaG9vayBpbiB0byBhIHNoYXJlZCBzZXQgb2YgdGltZXJzLCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgdGltZXIgcGVyIGluc3RhbmNlLlxyXG4gKiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBjYXNlcyB3aGVyZSB0aGUgdXBkYXRlIGlzIG5vdCBleHRyZW1lbHkgdGltZS1zZW5zaXRpdmUsIGJ1dCBoYXBwZW5zIGF0IHNjYWxlLlxyXG4gKiBUaGUgcHJpbmNpcGFsIHVzZSBjYXNlIGlzIHRoZSBUaW1lc3RhbXBDb21wb25lbnQuIFdoZW4gc2V2ZXJhbCBodW5kcmVkIChvciBzZXZlcmFsIHRob3VzYW5kKSBjb21tZW50cyBhcmUgXHJcbiAqIGJlaW5nIGRpc3BsYXllZCwgd2UgZG8gbm90IHdhbnQgdG8gdHJpZ2dlciB0aG91c2FuZHMgb2YgaW5kZXBlbmRlbnQgcmVsYXRpdmUgdGltZXN0YW1wIHVwZGF0ZXMsIGJlY2F1c2Ugb3ZlciBcclxuICogdGltZSB0aGUgdXBkYXRlcyB3aWxsIHNhdHVyYXRlIHRoZSBDUFUgc2luY2UgdGhleSBkb24ndCBwZXJmZWN0bHkgYWxpZ24uIFxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVGltZXJQb29sIHtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBUaW1lclN0YXRlPigpO1xyXG5cclxuICAgIHByaXZhdGUgbmV3U3Vic2NyaXB0aW9uc05vdGljZTtcclxuICAgIHByaXZhdGUgbmV3U3Vic2NyaXB0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVkU3Vic2NyaXB0aW9uc05vdGljZTtcclxuICAgIHByaXZhdGUgcmVtb3ZlZFN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xyXG5cclxuICAgIGFkZFRpbWVyKGludGVydmFsOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgaWYgKGludGVydmFsIDw9IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZWZ1c2luZyB0byBzZXQgdGltZXIgd2l0aCBpbnRlcnZhbCBvZiAke2ludGVydmFsfSFgKTtcclxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0YXRlOiBUaW1lclN0YXRlO1xyXG4gICAgICAgIGxldCBzaXplV2FzID0gdGhpcy5zdWJzY3JpcHRpb25zLnNpemU7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhpbnRlcnZhbCkpIHtcclxuICAgICAgICAgICAgc3RhdGUgPSB7IHN1YnNjcmliZXJzOiBbXSB9O1xyXG4gICAgICAgICAgICBzdGF0ZS5oYW5kbGUgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbQmFudGEvVGltZXJQb29sXSBOb3RpZnlpbmcgJHtzdGF0ZS5zdWJzY3JpYmVycy5sZW5ndGh9IHN1YnMgWyR7aW50ZXJ2YWx9bXNdYCk7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZS5zdWJzY3JpYmVycy5mb3JFYWNoKHN1YiA9PiBzdWIoKSk7XHJcbiAgICAgICAgICAgIH0sIGludGVydmFsKTtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldChpbnRlcnZhbCwgc3RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChpbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGF0ZS5zdWJzY3JpYmVycy5wdXNoKGNhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgLy8gRGVidWcgaW5mb3JtYXRpb24gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMubmV3U3Vic2NyaXB0aW9ucy5oYXMoaW50ZXJ2YWwpKVxyXG4gICAgICAgICAgICB0aGlzLm5ld1N1YnNjcmlwdGlvbnMuc2V0KGludGVydmFsLCAwKTtcclxuICAgICAgICB0aGlzLm5ld1N1YnNjcmlwdGlvbnMuc2V0KGludGVydmFsLCAodGhpcy5uZXdTdWJzY3JpcHRpb25zLmdldChpbnRlcnZhbCkgPz8gMCkgKyAxKTtcclxuXHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubmV3U3Vic2NyaXB0aW9uc05vdGljZSk7XHJcbiAgICAgICAgdGhpcy5uZXdTdWJzY3JpcHRpb25zTm90aWNlID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IFtpbnRlcnZhbCwgY291bnRdIG9mIHRoaXMubmV3U3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW0JhbnRhL1RpbWVyUG9vbF0gJHtjb3VudH0gbmV3IHN1YnNjcmlwdGlvbnMgdG8gJHtpbnRlcnZhbH1tcyBbJHtzdGF0ZS5zdWJzY3JpYmVycy5sZW5ndGh9IHRvdGFsXWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5ld1N1YnNjcmlwdGlvbnMuY2xlYXIoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuICAgICAgICBpZiAoc2l6ZVdhcyA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbQmFudGEvVGltZXJQb29sXSBObyBsb25nZXIgaWRsZS5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFVuc3Vic2NyaWJlIGZ1bmN0aW9uIFxyXG5cclxuICAgICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGludGVydmFsKTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gc3RhdGUuc3Vic2NyaWJlcnMuaW5kZXhPZihjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKVxyXG4gICAgICAgICAgICAgICAgc3RhdGUuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc3RhdGUuaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoaW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMuaGFzKGludGVydmFsKSlcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMuc2V0KGludGVydmFsLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVkU3Vic2NyaXB0aW9ucy5zZXQoaW50ZXJ2YWwsICh0aGlzLnJlbW92ZWRTdWJzY3JpcHRpb25zLmdldChpbnRlcnZhbCkgPz8gMCkgKyAxKTtcclxuXHJcbiAgICAgICAgICAgIC8vIERlYnVnIGluZm9ybWF0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZW1vdmVkU3Vic2NyaXB0aW9uc05vdGljZSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnNOb3RpY2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtpbnRlcnZhbCwgY291bnRdIG9mIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGludGVydmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbQmFudGEvVGltZXJQb29sXSAke2NvdW50fSB1bnN1YnNjcmliZWQgZnJvbSAke2ludGVydmFsfW1zIFske3N0YXRlPy5zdWJzY3JpYmVycz8ubGVuZ3RoID8/IDB9IHJlbWFpbl1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLnNpemUgPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW0JhbnRhL1RpbWVyUG9vbF0gQWxsIHN1YnNjcmlwdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQuIE5vdyBpZGxlLmApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlZFN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufSJdfQ==