@o3r/components 12.0.0-next.6 → 12.0.0-next.8

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 (82) hide show
  1. package/builders/component-extractor/helpers/component/component.extractor.d.ts.map +1 -1
  2. package/builders/component-extractor/helpers/component/component.extractor.js +3 -0
  3. package/builders/component-extractor/helpers/component/component.extractor.js.map +1 -1
  4. package/builders/component-extractor/index.d.ts.map +1 -1
  5. package/builders/component-extractor/index.js +1 -0
  6. package/builders/component-extractor/index.js.map +1 -1
  7. package/builders/metadata-check/helpers/config-metadata-comparison.helper.d.ts.map +1 -1
  8. package/builders/metadata-check/helpers/config-metadata-comparison.helper.js +1 -3
  9. package/builders/metadata-check/helpers/config-metadata-comparison.helper.js.map +1 -1
  10. package/builders/package.json +3 -0
  11. package/fesm2022/o3r-components-rules-engine.mjs +10 -10
  12. package/fesm2022/o3r-components-rules-engine.mjs.map +1 -1
  13. package/fesm2022/o3r-components.mjs +61 -58
  14. package/fesm2022/o3r-components.mjs.map +1 -1
  15. package/package.json +25 -29
  16. package/rules-engine/package.json +3 -0
  17. package/rules-engine/placeholder.rules-engine.effect.d.ts +2 -2
  18. package/rules-engine/placeholder.rules-engine.effect.d.ts.map +1 -1
  19. package/schematics/package.json +3 -0
  20. package/tools/component-replacement/c11n.directive.d.ts.map +1 -1
  21. package/tools/component-replacement/c11n.mock.module.d.ts.map +1 -1
  22. package/tools/pipes/keep-white-space/keep-white-space.pipe.d.ts.map +1 -1
  23. package/tools/placeholder/placeholder.component.d.ts.map +1 -1
  24. package/esm2022/core/component.output.mjs +0 -2
  25. package/esm2022/core/index.mjs +0 -3
  26. package/esm2022/core/rendering/helpers.mjs +0 -31
  27. package/esm2022/core/rendering/index.mjs +0 -2
  28. package/esm2022/devkit/components-devkit.interface.mjs +0 -13
  29. package/esm2022/devkit/components-devtools.message.service.mjs +0 -115
  30. package/esm2022/devkit/components-devtools.module.mjs +0 -43
  31. package/esm2022/devkit/components-devtools.token.mjs +0 -6
  32. package/esm2022/devkit/index.mjs +0 -6
  33. package/esm2022/devkit/inspector/index.mjs +0 -4
  34. package/esm2022/devkit/inspector/ng/index.mjs +0 -2
  35. package/esm2022/devkit/inspector/ng/ng.mjs +0 -2
  36. package/esm2022/devkit/inspector/otter-inspector.helpers.mjs +0 -114
  37. package/esm2022/devkit/inspector/otter-inspector.service.mjs +0 -166
  38. package/esm2022/o3r-components.mjs +0 -5
  39. package/esm2022/public_api.mjs +0 -5
  40. package/esm2022/rules-engine/o3r-components-rules-engine.mjs +0 -5
  41. package/esm2022/rules-engine/placeholder.action-handler.mjs +0 -156
  42. package/esm2022/rules-engine/placeholder.interfaces.mjs +0 -3
  43. package/esm2022/rules-engine/placeholder.rules-engine.effect.mjs +0 -136
  44. package/esm2022/rules-engine/placeholder.rules-engine.module.mjs +0 -31
  45. package/esm2022/rules-engine/public_api.mjs +0 -4
  46. package/esm2022/stores/index.mjs +0 -3
  47. package/esm2022/stores/placeholder-request/index.mjs +0 -7
  48. package/esm2022/stores/placeholder-request/placeholder-request.actions.mjs +0 -18
  49. package/esm2022/stores/placeholder-request/placeholder-request.module.mjs +0 -39
  50. package/esm2022/stores/placeholder-request/placeholder-request.reducer.mjs +0 -71
  51. package/esm2022/stores/placeholder-request/placeholder-request.selectors.mjs +0 -15
  52. package/esm2022/stores/placeholder-request/placeholder-request.state.mjs +0 -5
  53. package/esm2022/stores/placeholder-request/placeholder-request.sync.mjs +0 -18
  54. package/esm2022/stores/placeholder-template/index.mjs +0 -7
  55. package/esm2022/stores/placeholder-template/placeholder-template.actions.mjs +0 -10
  56. package/esm2022/stores/placeholder-template/placeholder-template.module.mjs +0 -39
  57. package/esm2022/stores/placeholder-template/placeholder-template.reducer.mjs +0 -39
  58. package/esm2022/stores/placeholder-template/placeholder-template.selectors.mjs +0 -70
  59. package/esm2022/stores/placeholder-template/placeholder-template.state.mjs +0 -5
  60. package/esm2022/stores/placeholder-template/placeholder-template.sync.mjs +0 -15
  61. package/esm2022/tools/component-replacement/c11n.directive.mjs +0 -159
  62. package/esm2022/tools/component-replacement/c11n.helpers.mjs +0 -11
  63. package/esm2022/tools/component-replacement/c11n.mock.module.mjs +0 -46
  64. package/esm2022/tools/component-replacement/c11n.module.mjs +0 -47
  65. package/esm2022/tools/component-replacement/c11n.service.mjs +0 -37
  66. package/esm2022/tools/component-replacement/c11n.token.mjs +0 -6
  67. package/esm2022/tools/component-replacement/index.mjs +0 -7
  68. package/esm2022/tools/index.mjs +0 -4
  69. package/esm2022/tools/pipes/capitalize/capitalize.pipe.mjs +0 -16
  70. package/esm2022/tools/pipes/capitalize/index.mjs +0 -2
  71. package/esm2022/tools/pipes/duration/duration.model.mjs +0 -20
  72. package/esm2022/tools/pipes/duration/duration.pipe.mjs +0 -66
  73. package/esm2022/tools/pipes/duration/index.mjs +0 -2
  74. package/esm2022/tools/pipes/index.mjs +0 -5
  75. package/esm2022/tools/pipes/keep-white-space/index.mjs +0 -2
  76. package/esm2022/tools/pipes/keep-white-space/keep-white-space.pipe.mjs +0 -16
  77. package/esm2022/tools/pipes/replace-with-bold/index.mjs +0 -2
  78. package/esm2022/tools/pipes/replace-with-bold/replace-with-bold.pipe.mjs +0 -24
  79. package/esm2022/tools/placeholder/index.mjs +0 -3
  80. package/esm2022/tools/placeholder/placeholder.component.mjs +0 -83
  81. package/esm2022/tools/placeholder/placeholder.interface.mjs +0 -2
  82. package/esm2022/tools/placeholder/placeholder.module.mjs +0 -32
@@ -1,166 +0,0 @@
1
- import { BehaviorSubject, } from 'rxjs';
2
- import { getOtterLikeComponentInfo, INSPECTOR_CLASS, isContainer, } from './otter-inspector.helpers';
3
- /**
4
- * Service to handle the custom inspector for the Otter Devtools Chrome extension.
5
- */
6
- export class OtterInspectorService {
7
- constructor() {
8
- this.elementMouseOverCallback = this.elementMouseOver.bind(this);
9
- this.elementClickCallback = this.elementClick.bind(this);
10
- this.cancelEventCallback = this.cancelEvent.bind(this);
11
- this.inspectorDiv = null;
12
- this.otterLikeComponentInfoToBeSent = new BehaviorSubject(undefined);
13
- /**
14
- * Stream of component info to be sent to the extension app.
15
- */
16
- this.otterLikeComponentInfoToBeSent$ = this.otterLikeComponentInfoToBeSent.asObservable();
17
- this.angularDevTools = window.ng;
18
- }
19
- startInspecting() {
20
- window.addEventListener('mouseover', this.elementMouseOverCallback, true);
21
- window.addEventListener('click', this.elementClickCallback, true);
22
- window.addEventListener('mouseout', this.cancelEventCallback, true);
23
- }
24
- elementClick(e) {
25
- e.stopImmediatePropagation();
26
- e.stopPropagation();
27
- e.preventDefault();
28
- if (!this.selectedComponent || !this.angularDevTools) {
29
- return;
30
- }
31
- const parentElement = this.selectedComponent.host.parentElement;
32
- const parent = parentElement && (this.angularDevTools.getComponent(parentElement) || this.angularDevTools.getOwningComponent(parentElement));
33
- const parentHost = parent && this.angularDevTools.getHostElement(parent);
34
- const container = isContainer(parentHost)
35
- ? getOtterLikeComponentInfo(parent, parentHost)
36
- : undefined;
37
- const { component, host, ...infoToBeSent } = this.selectedComponent;
38
- this.otterLikeComponentInfoToBeSent.next({
39
- ...infoToBeSent,
40
- container
41
- });
42
- }
43
- isOtterLikeComponent(info) {
44
- const hasConfigId = !!info.configId;
45
- const hasTranslations = !!info.translations?.length;
46
- const hasAnalytics = Object.keys(info.analytics || {}).length > 0;
47
- return hasConfigId || hasTranslations || hasAnalytics;
48
- }
49
- findComponentInfo(node) {
50
- if (!this.angularDevTools) {
51
- return;
52
- }
53
- let componentClassInstance = this.angularDevTools.getComponent(node) || this.angularDevTools.getOwningComponent(node);
54
- let o3rLikeComponentInfo;
55
- let isO3rLike;
56
- if (!componentClassInstance) {
57
- return;
58
- }
59
- do {
60
- o3rLikeComponentInfo = getOtterLikeComponentInfo(componentClassInstance, this.angularDevTools.getHostElement(componentClassInstance));
61
- isO3rLike = this.isOtterLikeComponent(o3rLikeComponentInfo);
62
- if (!isO3rLike) {
63
- componentClassInstance = this.angularDevTools.getOwningComponent(componentClassInstance);
64
- }
65
- } while (!isO3rLike && componentClassInstance);
66
- if (isO3rLike) {
67
- return {
68
- component: componentClassInstance,
69
- host: this.angularDevTools.getHostElement(componentClassInstance),
70
- ...o3rLikeComponentInfo
71
- };
72
- }
73
- }
74
- elementMouseOver(e) {
75
- this.cancelEvent(e);
76
- const el = e.target;
77
- if (el) {
78
- const selectedComponent = this.findComponentInfo(el);
79
- if (selectedComponent?.host !== this.selectedComponent?.host) {
80
- this.unHighlight();
81
- this.highlight(selectedComponent);
82
- }
83
- }
84
- }
85
- highlight(selectedComponent) {
86
- this.selectedComponent = selectedComponent;
87
- if (this.selectedComponent?.host && this.inspectorDiv) {
88
- const rect = this.selectedComponent.host.getBoundingClientRect();
89
- this.inspectorDiv.style.width = `${rect.width}px`;
90
- this.inspectorDiv.style.height = `${rect.height}px`;
91
- this.inspectorDiv.style.top = `${rect.top}px`;
92
- this.inspectorDiv.style.left = `${rect.left}px`;
93
- this.inspectorDiv.firstChild.textContent = `<${this.selectedComponent.componentName}>`;
94
- }
95
- }
96
- unHighlight() {
97
- if (this.selectedComponent?.host && this.inspectorDiv) {
98
- this.inspectorDiv.style.width = '0';
99
- this.inspectorDiv.style.height = '0';
100
- this.inspectorDiv.style.top = '0';
101
- this.inspectorDiv.style.left = '0';
102
- }
103
- this.selectedComponent = undefined;
104
- }
105
- cancelEvent(e) {
106
- e.stopPropagation();
107
- e.stopImmediatePropagation();
108
- e.preventDefault();
109
- }
110
- /**
111
- * Prepare the inspector div and add it to the DOM.
112
- */
113
- prepareInspector() {
114
- if (this.inspectorDiv) {
115
- return;
116
- }
117
- const inspectorCss = document.createElement('style');
118
- inspectorCss.textContent = `
119
- .${INSPECTOR_CLASS} {
120
- z-index: 9999999;
121
- width: 0;
122
- height: 0;
123
- background: rgba(104, 182, 255, 0.35);
124
- position: fixed;
125
- left: 0;
126
- top: 0;
127
- pointer-events: none;
128
- }
129
-
130
- .${INSPECTOR_CLASS} > span {
131
- bottom: -25px;
132
- position: absolute;
133
- right: 10px;
134
- background: rgba(104, 182, 255, 0.9);;
135
- padding: 5px;
136
- border-radius: 5px;
137
- color: white;
138
- }`;
139
- const inspectorDiv = document.createElement('div');
140
- const inspectorSpan = document.createElement('span');
141
- inspectorDiv.append(inspectorSpan);
142
- inspectorDiv.classList.add(INSPECTOR_CLASS);
143
- document.head.append(inspectorCss);
144
- document.body.append(inspectorDiv);
145
- this.inspectorDiv = inspectorDiv;
146
- }
147
- /**
148
- * Toggle the inspector.
149
- * @param isRunning true if the inspector is running
150
- */
151
- toggleInspector(isRunning) {
152
- if (isRunning) {
153
- this.startInspecting();
154
- }
155
- else {
156
- this.stopInspecting();
157
- }
158
- }
159
- stopInspecting() {
160
- this.unHighlight();
161
- window.removeEventListener('mouseover', this.elementMouseOverCallback, true);
162
- window.removeEventListener('click', this.elementClickCallback, true);
163
- window.removeEventListener('mouseout', this.cancelEventCallback, true);
164
- }
165
- }
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3R0ZXItaW5zcGVjdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGV2a2l0L2luc3BlY3Rvci9vdHRlci1pbnNwZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxHQUVoQixNQUFNLE1BQU0sQ0FBQztBQUlkLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFdBQVcsR0FFWixNQUFNLDJCQUEyQixDQUFDO0FBT25DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQWNoQztRQVppQiw2QkFBd0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELHlCQUFvQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELHdCQUFtQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNELGlCQUFZLEdBQTBCLElBQUksQ0FBQztRQUNsQyxtQ0FBOEIsR0FBRyxJQUFJLGVBQWUsQ0FBcUMsU0FBUyxDQUFDLENBQUM7UUFFckg7O1dBRUc7UUFDSSxvQ0FBK0IsR0FBbUQsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRzFJLElBQUksQ0FBQyxlQUFlLEdBQUksTUFBYyxDQUFDLEVBQW9CLENBQUM7SUFDOUQsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJ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bkQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxZQUFZLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25DLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTVDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25DLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsU0FBa0I7UUFDdkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBOZyxcbn0gZnJvbSAnLi9uZyc7XG5pbXBvcnQge1xuICBnZXRPdHRlckxpa2VDb21wb25lbnRJbmZvLFxuICBJTlNQRUNUT1JfQ0xBU1MsXG4gIGlzQ29udGFpbmVyLFxuICBPdHRlckxpa2VDb21wb25lbnRJbmZvLFxufSBmcm9tICcuL290dGVyLWluc3BlY3Rvci5oZWxwZXJzJztcblxuaW50ZXJmYWNlIENvbXBvbmVudEluZm8gZXh0ZW5kcyBPdHRlckxpa2VDb21wb25lbnRJbmZvIHtcbiAgY29tcG9uZW50OiBhbnk7XG4gIGhvc3Q6IEVsZW1lbnQ7XG59XG5cbi8qKlxuICogU2VydmljZSB0byBoYW5kbGUgdGhlIGN1c3RvbSBpbnNwZWN0b3IgZm9yIHRoZSBPdHRlciBEZXZ0b29scyBDaHJvbWUgZXh0ZW5zaW9uLlxuICovXG5leHBvcnQgY2xhc3MgT3R0ZXJJbnNwZWN0b3JTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbmd1bGFyRGV2VG9vbHM6IE5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRNb3VzZU92ZXJDYWxsYmFjayA9IHRoaXMuZWxlbWVudE1vdXNlT3Zlci5iaW5kKHRoaXMpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRDbGlja0NhbGxiYWNrID0gdGhpcy5lbGVtZW50Q2xpY2suYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjYW5jZWxFdmVudENhbGxiYWNrID0gdGhpcy5jYW5jZWxFdmVudC5iaW5kKHRoaXMpO1xuICBwcml2YXRlIHNlbGVjdGVkQ29tcG9uZW50OiBDb21wb25lbnRJbmZvIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGluc3BlY3RvckRpdjogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvdHRlckxpa2VDb21wb25lbnRJbmZvVG9CZVNlbnQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE90dGVyTGlrZUNvbXBvbmVudEluZm8gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBvZiBjb21wb25lbnQgaW5mbyB0byBiZSBzZW50IHRvIHRoZSBleHRlbnNpb24gYXBwLlxuICAgKi9cbiAgcHVibGljIG90dGVyTGlrZUNvbXBvbmVudEluZm9Ub0JlU2VudCQ6IE9ic2VydmFibGU8T3R0ZXJMaWtlQ29tcG9uZW50SW5mbyB8IHVuZGVmaW5lZD4gPSB0aGlzLm90dGVyTGlrZUNvbXBvbmVudEluZm9Ub0JlU2VudC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFuZ3VsYXJEZXZUb29scyA9ICh3aW5kb3cgYXMgYW55KS5uZyBhcyBOZyB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRJbnNwZWN0aW5nKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLmVsZW1lbnRNb3VzZU92ZXJDYWxsYmFjaywgdHJ1ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5lbGVtZW50Q2xpY2tDYWxsYmFjaywgdHJ1ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5jYW5jZWxFdmVudENhbGxiYWNrLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZWxlbWVudENsaWNrKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbXBvbmVudCB8fCAhdGhpcy5hbmd1bGFyRGV2VG9vbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQuaG9zdC5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudEVsZW1lbnQgJiYgKHRoaXMuYW5ndWxhckRldlRvb2xzLmdldENvbXBvbmVudChwYXJlbnRFbGVtZW50KSB8fCB0aGlzLmFuZ3VsYXJEZXZUb29scy5nZXRPd25pbmdDb21wb25lbnQocGFyZW50RWxlbWVudCkpO1xuICAgIGNvbnN0IHBhcmVudEhvc3QgPSBwYXJlbnQgJiYgdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0SG9zdEVsZW1lbnQocGFyZW50KTtcbiAgICBjb25zdCBjb250YWluZXIgPSBpc0NvbnRhaW5lcihwYXJlbnRIb3N0KVxuICAgICAgPyBnZXRPdHRlckxpa2VDb21wb25lbnRJbmZvKHBhcmVudCwgcGFyZW50SG9zdClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgeyBjb21wb25lbnQsIGhvc3QsIC4uLmluZm9Ub0JlU2VudCB9ID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudDtcblxuICAgIHRoaXMub3R0ZXJMaWtlQ29tcG9uZW50SW5mb1RvQmVTZW50Lm5leHQoe1xuICAgICAgLi4uaW5mb1RvQmVTZW50LFxuICAgICAgY29udGFpbmVyXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzT3R0ZXJMaWtlQ29tcG9uZW50KGluZm86IE90dGVyTGlrZUNvbXBvbmVudEluZm8pIHtcbiAgICBjb25zdCBoYXNDb25maWdJZCA9ICEhaW5mby5jb25maWdJZDtcbiAgICBjb25zdCBoYXNUcmFuc2xhdGlvbnMgPSAhIWluZm8udHJhbnNsYXRpb25zPy5sZW5ndGg7XG4gICAgY29uc3QgaGFzQW5hbHl0aWNzID0gT2JqZWN0LmtleXMoaW5mby5hbmFseXRpY3MgfHwge30pLmxlbmd0aCA+IDA7XG4gICAgcmV0dXJuIGhhc0NvbmZpZ0lkIHx8IGhhc1RyYW5zbGF0aW9ucyB8fCBoYXNBbmFseXRpY3M7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDb21wb25lbnRJbmZvKG5vZGU6IEVsZW1lbnQpOiBDb21wb25lbnRJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuYW5ndWxhckRldlRvb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBjb21wb25lbnRDbGFzc0luc3RhbmNlID0gdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0Q29tcG9uZW50KG5vZGUpIHx8IHRoaXMuYW5ndWxhckRldlRvb2xzLmdldE93bmluZ0NvbXBvbmVudChub2RlKTtcbiAgICBsZXQgbzNyTGlrZUNvbXBvbmVudEluZm86IE90dGVyTGlrZUNvbXBvbmVudEluZm87XG4gICAgbGV0IGlzTzNyTGlrZTogYm9vbGVhbjtcbiAgICBpZiAoIWNvbXBvbmVudENsYXNzSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG8ge1xuICAgICAgbzNyTGlrZUNvbXBvbmVudEluZm8gPSBnZXRPdHRlckxpa2VDb21wb25lbnRJbmZvKGNvbXBvbmVudENsYXNzSW5zdGFuY2UsIHRoaXMuYW5ndWxhckRldlRvb2xzLmdldEhvc3RFbGVtZW50KGNvbXBvbmVudENsYXNzSW5zdGFuY2UpKTtcbiAgICAgIGlzTzNyTGlrZSA9IHRoaXMuaXNPdHRlckxpa2VDb21wb25lbnQobzNyTGlrZUNvbXBvbmVudEluZm8pO1xuICAgICAgaWYgKCFpc08zckxpa2UpIHtcbiAgICAgICAgY29tcG9uZW50Q2xhc3NJbnN0YW5jZSA9IHRoaXMuYW5ndWxhckRldlRvb2xzLmdldE93bmluZ0NvbXBvbmVudChjb21wb25lbnRDbGFzc0luc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9IHdoaWxlICghaXNPM3JMaWtlICYmIGNvbXBvbmVudENsYXNzSW5zdGFuY2UpO1xuICAgIGlmIChpc08zckxpa2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50Q2xhc3NJbnN0YW5jZSxcbiAgICAgICAgaG9zdDogdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50Q2xhc3NJbnN0YW5jZSksXG4gICAgICAgIC4uLm8zckxpa2VDb21wb25lbnRJbmZvXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZWxlbWVudE1vdXNlT3ZlcihlOiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5jYW5jZWxFdmVudChlKTtcblxuICAgIGNvbnN0IGVsID0gZS50YXJnZXQgYXMgRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChlbCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLmZpbmRDb21wb25lbnRJbmZvKGVsKTtcbiAgICAgIGlmIChzZWxlY3RlZENvbXBvbmVudD8uaG9zdCAhPT0gdGhpcy5zZWxlY3RlZENvbXBvbmVudD8uaG9zdCkge1xuICAgICAgICB0aGlzLnVuSGlnaGxpZ2h0KCk7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0KHNlbGVjdGVkQ29tcG9uZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhpZ2hsaWdodChzZWxlY3RlZENvbXBvbmVudDogQ29tcG9uZW50SW5mbyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBzZWxlY3RlZENvbXBvbmVudDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvbmVudD8uaG9zdCAmJiB0aGlzLmluc3BlY3RvckRpdikge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aH1weGA7XG4gICAgICB0aGlzLmluc3BlY3RvckRpdi5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB0aGlzLmluc3BlY3RvckRpdi5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XG4gICAgICB0aGlzLmluc3BlY3RvckRpdi5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LmZpcnN0Q2hpbGQhLnRleHRDb250ZW50ID0gYDwke3RoaXMuc2VsZWN0ZWRDb21wb25lbnQuY29tcG9uZW50TmFtZX0+YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuSGlnaGxpZ2h0KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9uZW50Py5ob3N0ICYmIHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICB0aGlzLmluc3BlY3RvckRpdi5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbEV2ZW50KGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgdGhlIGluc3BlY3RvciBkaXYgYW5kIGFkZCBpdCB0byB0aGUgRE9NLlxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbnNwZWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluc3BlY3RvckNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgaW5zcGVjdG9yQ3NzLnRleHRDb250ZW50ID0gYFxuICAgICAgLiR7SU5TUEVDVE9SX0NMQVNTfSB7XG4gICAgICAgIHotaW5kZXg6IDk5OTk5OTk7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTA0LCAxODIsIDI1NSwgMC4zNSk7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLiR7SU5TUEVDVE9SX0NMQVNTfSA+IHNwYW4ge1xuICAgICAgICBib3R0b206IC0yNXB4O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwNCwgMTgyLCAyNTUsIDAuOSk7O1xuICAgICAgICBwYWRkaW5nOiA1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfWA7XG5cbiAgICBjb25zdCBpbnNwZWN0b3JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBpbnNwZWN0b3JTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGluc3BlY3RvckRpdi5hcHBlbmQoaW5zcGVjdG9yU3Bhbik7XG4gICAgaW5zcGVjdG9yRGl2LmNsYXNzTGlzdC5hZGQoSU5TUEVDVE9SX0NMQVNTKTtcblxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGluc3BlY3RvckNzcyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoaW5zcGVjdG9yRGl2KTtcbiAgICB0aGlzLmluc3BlY3RvckRpdiA9IGluc3BlY3RvckRpdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIGluc3BlY3Rvci5cbiAgICogQHBhcmFtIGlzUnVubmluZyB0cnVlIGlmIHRoZSBpbnNwZWN0b3IgaXMgcnVubmluZ1xuICAgKi9cbiAgcHVibGljIHRvZ2dsZUluc3BlY3Rvcihpc1J1bm5pbmc6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNSdW5uaW5nKSB7XG4gICAgICB0aGlzLnN0YXJ0SW5zcGVjdGluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BJbnNwZWN0aW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0b3BJbnNwZWN0aW5nKCkge1xuICAgIHRoaXMudW5IaWdobGlnaHQoKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5lbGVtZW50TW91c2VPdmVyQ2FsbGJhY2ssIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZWxlbWVudENsaWNrQ2FsbGJhY2ssIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuY2FuY2VsRXZlbnRDYWxsYmFjaywgdHJ1ZSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public_api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibzNyLWNvbXBvbmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbzNyLWNvbXBvbmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
@@ -1,5 +0,0 @@
1
- export * from './core/index';
2
- export * from './devkit/index';
3
- export * from './stores/index';
4
- export * from './tools/index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgQ29udGV4dCwgQ29udGV4dElucHV0LCBCYXNlQ29udGV4dE91dHB1dCwgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSAnQG8zci9jb3JlJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2RldmtpdC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3Jlcy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL3Rvb2xzL2luZGV4JztcbiJdfQ==
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public_api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibzNyLWNvbXBvbmVudHMtcnVsZXMtZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzLWVuZ2luZS9vM3ItY29tcG9uZW50cy1ydWxlcy1lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
@@ -1,156 +0,0 @@
1
- import { Injectable, Injector, Optional, } from '@angular/core';
2
- import { takeUntilDestroyed, } from '@angular/core/rxjs-interop';
3
- import { select, Store, } from '@ngrx/store';
4
- import { DynamicContentService, } from '@o3r/dynamic-content';
5
- import { LocalizationService, } from '@o3r/localization';
6
- import { LoggerService, } from '@o3r/logger';
7
- import { combineLatest, distinctUntilChanged, firstValueFrom, map, of, startWith, Subject, withLatestFrom, } from 'rxjs';
8
- import { RULES_ENGINE_PLACEHOLDER_UPDATE_ACTION_TYPE, } from './placeholder.interfaces';
9
- import { deletePlaceholderTemplateEntity, selectPlaceholderRequestEntities, selectPlaceholderTemplateEntities, setPlaceholderRequestEntityFromUrl, setPlaceholderTemplateEntity, updatePlaceholderRequestEntity, } from '@o3r/components';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@ngrx/store";
12
- import * as i2 from "@o3r/logger";
13
- import * as i3 from "@o3r/localization";
14
- /**
15
- * Service to handle async PlaceholderTemplate actions
16
- */
17
- export class PlaceholderRulesEngineActionHandler {
18
- constructor(store, logger, injector, translateService) {
19
- this.logger = logger;
20
- this.injector = injector;
21
- this.placeholdersActions$ = new Subject();
22
- /** @inheritdoc */
23
- this.supportingActions = [RULES_ENGINE_PLACEHOLDER_UPDATE_ACTION_TYPE];
24
- const lang$ = translateService
25
- ? translateService.getTranslateService().onLangChange.pipe(map(({ lang }) => lang), startWith(translateService.getCurrentLanguage()), distinctUntilChanged())
26
- : of(null);
27
- const filteredActions$ = combineLatest([
28
- lang$,
29
- this.placeholdersActions$.pipe(distinctUntilChanged((prev, next) => JSON.stringify(prev) === JSON.stringify(next)))
30
- ]).pipe(withLatestFrom(combineLatest([store.pipe(select(selectPlaceholderTemplateEntities)), store.pipe(select(selectPlaceholderRequestEntities))])), map(([langAndTemplatesUrls, storedPlaceholdersAndRequests]) => {
31
- const [lang, placeholderActions] = langAndTemplatesUrls;
32
- const storedPlaceholders = storedPlaceholdersAndRequests[0] || {};
33
- const storedPlaceholderRequests = storedPlaceholdersAndRequests[1] || {};
34
- const placeholderNewRequests = [];
35
- // Stores all raw Urls used from the current engine execution
36
- const usedUrls = {};
37
- // Get all Urls that needs to be resolved from current rules engine output
38
- const placeholdersTemplates = placeholderActions.reduce((acc, placeholderAction) => {
39
- const placeholdersTemplateUrl = {
40
- rawUrl: placeholderAction.templateUrl,
41
- priority: placeholderAction.priority
42
- };
43
- if (acc[placeholderAction.placeholderId]) {
44
- acc[placeholderAction.placeholderId].push(placeholdersTemplateUrl);
45
- }
46
- else {
47
- acc[placeholderAction.placeholderId] = [placeholdersTemplateUrl];
48
- }
49
- const resolvedUrl = this.resolveUrlWithLang(placeholderAction.templateUrl, lang);
50
- // Filters duplicates and resolved urls that are already in the store
51
- if (!usedUrls[placeholderAction.templateUrl] && (!storedPlaceholderRequests[placeholderAction.templateUrl]
52
- || storedPlaceholderRequests[placeholderAction.templateUrl].resolvedUrl !== resolvedUrl)) {
53
- placeholderNewRequests.push({
54
- rawUrl: placeholderAction.templateUrl,
55
- resolvedUrl: this.resolveUrlWithLang(placeholderAction.templateUrl, lang)
56
- });
57
- }
58
- usedUrls[placeholderAction.templateUrl] = true;
59
- return acc;
60
- }, {});
61
- // Urls not used anymore and not already disabled
62
- const placeholderRequestsToDisable = [];
63
- // Urls used that were disabled
64
- const placeholderRequestsToEnable = [];
65
- Object.keys(storedPlaceholderRequests).forEach((storedPlaceholderRequestRawUrl) => {
66
- const usedFromEngineIteration = usedUrls[storedPlaceholderRequestRawUrl];
67
- const usedFromStore = (storedPlaceholderRequests && storedPlaceholderRequests[storedPlaceholderRequestRawUrl]) ? storedPlaceholderRequests[storedPlaceholderRequestRawUrl].used : false;
68
- if (!usedFromEngineIteration && usedFromStore) {
69
- placeholderRequestsToDisable.push(storedPlaceholderRequestRawUrl);
70
- }
71
- else if (usedFromEngineIteration && !usedFromStore) {
72
- placeholderRequestsToEnable.push(storedPlaceholderRequestRawUrl);
73
- }
74
- });
75
- // Placeholder that are no longer filled by the current engine execution output will be cleared
76
- const placeholdersTemplatesToBeCleanedUp = Object.keys(storedPlaceholders)
77
- .filter((placeholderId) => !placeholdersTemplates[placeholderId]);
78
- const placeholdersTemplatesToBeSet = Object.keys(placeholdersTemplates).reduce((changedPlaceholderTemplates, placeholderTemplateId) => {
79
- // Caching if the placeholder template already exists with the same urls
80
- if (!storedPlaceholders[placeholderTemplateId]
81
- || !(JSON.stringify(storedPlaceholders[placeholderTemplateId].urlsWithPriority) === JSON.stringify(placeholdersTemplates[placeholderTemplateId]))) {
82
- changedPlaceholderTemplates.push({
83
- id: placeholderTemplateId,
84
- urlsWithPriority: placeholdersTemplates[placeholderTemplateId]
85
- });
86
- }
87
- return changedPlaceholderTemplates;
88
- }, []);
89
- return {
90
- placeholdersTemplatesToBeCleanedUp,
91
- placeholderRequestsToDisable,
92
- placeholderRequestsToEnable,
93
- placeholdersTemplatesToBeSet,
94
- placeholderNewRequests
95
- };
96
- }));
97
- filteredActions$.pipe(takeUntilDestroyed()).subscribe((placeholdersUpdates) => {
98
- placeholdersUpdates.placeholdersTemplatesToBeCleanedUp.forEach((placeholderId) => store.dispatch(deletePlaceholderTemplateEntity({
99
- id: placeholderId
100
- })));
101
- placeholdersUpdates.placeholdersTemplatesToBeSet.forEach((placeholdersTemplateToBeSet) => {
102
- store.dispatch(setPlaceholderTemplateEntity({ entity: placeholdersTemplateToBeSet }));
103
- });
104
- placeholdersUpdates.placeholderRequestsToDisable.forEach((placeholderRequestToDisable) => {
105
- store.dispatch(updatePlaceholderRequestEntity({ entity: { id: placeholderRequestToDisable, used: false } }));
106
- });
107
- placeholdersUpdates.placeholderRequestsToEnable.forEach((placeholderRequestToEnable) => {
108
- store.dispatch(updatePlaceholderRequestEntity({ entity: { id: placeholderRequestToEnable, used: true } }));
109
- });
110
- placeholdersUpdates.placeholderNewRequests.forEach((placeholderNewRequest) => {
111
- store.dispatch(setPlaceholderRequestEntityFromUrl({
112
- resolvedUrl: placeholderNewRequest.resolvedUrl,
113
- id: placeholderNewRequest.rawUrl,
114
- call: this.retrieveTemplate(placeholderNewRequest.resolvedUrl)
115
- }));
116
- });
117
- });
118
- }
119
- /**
120
- * Localize the url, replacing the language marker
121
- * @param url
122
- * @param language
123
- */
124
- resolveUrlWithLang(url, language) {
125
- if (!language && url.includes('[LANGUAGE]')) {
126
- this.logger.warn(`Missing language when trying to resolve ${url}`);
127
- }
128
- return language ? url.replace(/\[LANGUAGE]/g, language) : url;
129
- }
130
- /**
131
- * Retrieve template as json from a given url
132
- * @param url
133
- */
134
- async retrieveTemplate(url) {
135
- const resolvedUrl$ = this.injector.get(DynamicContentService, null, { optional: true })?.getContentPathStream(url) || of(url);
136
- const fullUrl = await firstValueFrom(resolvedUrl$);
137
- return fetch(fullUrl).then((response) => response.json());
138
- }
139
- /** @inheritdoc */
140
- executeActions(actions) {
141
- const templates = actions.map((action) => ({
142
- placeholderId: action.placeholderId,
143
- templateUrl: action.value,
144
- priority: action.priority || 0
145
- }));
146
- this.placeholdersActions$.next(templates);
147
- }
148
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlaceholderRulesEngineActionHandler, deps: [{ token: i1.Store }, { token: i2.LoggerService }, { token: i0.Injector }, { token: i3.LocalizationService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
149
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlaceholderRulesEngineActionHandler }); }
150
- }
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlaceholderRulesEngineActionHandler, decorators: [{
152
- type: Injectable
153
- }], ctorParameters: () => [{ type: i1.Store }, { type: i2.LoggerService }, { type: i0.Injector }, { type: i3.LocalizationService, decorators: [{
154
- type: Optional
155
- }] }] });
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuYWN0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMtZW5naW5lL3BsYWNlaG9sZGVyLmFjdGlvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsa0JBQWtCLEdBQ25CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLE1BQU0sRUFDTixLQUFLLEdBQ04sTUFBTSxhQUFhLENBQUM7QUFJckIsT0FBTyxFQUNMLHFCQUFxQixHQUN0QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxtQkFBbUIsR0FDcEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsYUFBYSxHQUNkLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxHQUFHLEVBQ0gsRUFBRSxFQUNGLFNBQVMsRUFDVCxPQUFPLEVBQ1AsY0FBYyxHQUNmLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUVMLDJDQUEyQyxHQUM1QyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCwrQkFBK0IsRUFHL0IsZ0NBQWdDLEVBQ2hDLGlDQUFpQyxFQUNqQyxrQ0FBa0MsRUFDbEMsNEJBQTRCLEVBQzVCLDhCQUE4QixHQUMvQixNQUFNLGlCQUFpQixDQUFDOzs7OztBQUV6Qjs7R0FFRztBQUVILE1BQU0sT0FBTyxtQ0FBbUM7SUFNOUMsWUFDRSxLQUFzQyxFQUNyQixNQUFxQixFQUNyQixRQUFrQixFQUN2QixnQkFBc0M7UUFGakMsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBUjNCLHlCQUFvQixHQUFnRixJQUFJLE9BQU8sRUFBRSxD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Y2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3RvcixcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgdGFrZVVudGlsRGVzdHJveWVkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBzZWxlY3QsXG4gIFN0b3JlLFxufSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIFJ1bGVzRW5naW5lQWN0aW9uSGFuZGxlcixcbn0gZnJvbSAnQG8zci9jb3JlJztcbmltcG9ydCB7XG4gIER5bmFtaWNDb250ZW50U2VydmljZSxcbn0gZnJvbSAnQG8zci9keW5hbWljLWNvbnRlbnQnO1xuaW1wb3J0IHtcbiAgTG9jYWxpemF0aW9uU2VydmljZSxcbn0gZnJvbSAnQG8zci9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtcbiAgTG9nZ2VyU2VydmljZSxcbn0gZnJvbSAnQG8zci9sb2dnZXInO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBtYXAsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG4gIHdpdGhMYXRlc3RGcm9tLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEFjdGlvblVwZGF0ZVBsYWNlaG9sZGVyQmxvY2ssXG4gIFJVTEVTX0VOR0lORV9QTEFDRUhPTERFUl9VUERBVEVfQUNUSU9OX1RZUEUsXG59IGZyb20gJy4vcGxhY2Vob2xkZXIuaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBkZWxldGVQbGFjZWhvbGRlclRlbXBsYXRlRW50aXR5LFxuICBQbGFjZWhvbGRlclJlcXVlc3RSZXBseSxcbiAgUGxhY2Vob2xkZXJUZW1wbGF0ZVN0b3JlLFxuICBzZWxlY3RQbGFjZWhvbGRlclJlcXVlc3RFbnRpdGllcyxcbiAgc2VsZWN0UGxhY2Vob2xkZXJUZW1wbGF0ZUVudGl0aWVzLFxuICBzZXRQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHlGcm9tVXJsLFxuICBzZXRQbGFjZWhvbGRlclRlbXBsYXRlRW50aXR5LFxuICB1cGRhdGVQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHksXG59IGZyb20gJ0BvM3IvY29tcG9uZW50cyc7XG5cbi8qKlxuICogU2VydmljZSB0byBoYW5kbGUgYXN5bmMgUGxhY2Vob2xkZXJUZW1wbGF0ZSBhY3Rpb25zXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQbGFjZWhvbGRlclJ1bGVzRW5naW5lQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIFJ1bGVzRW5naW5lQWN0aW9uSGFuZGxlcjxBY3Rpb25VcGRhdGVQbGFjZWhvbGRlckJsb2NrPiB7XG4gIHByb3RlY3RlZCBwbGFjZWhvbGRlcnNBY3Rpb25zJDogU3ViamVjdDx7IHBsYWNlaG9sZGVySWQ6IHN0cmluZzsgdGVtcGxhdGVVcmw6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9W10+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1cHBvcnRpbmdBY3Rpb25zID0gW1JVTEVTX0VOR0lORV9QTEFDRUhPTERFUl9VUERBVEVfQUNUSU9OX1RZUEVdIGFzIGNvbnN0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0b3JlOiBTdG9yZTxQbGFjZWhvbGRlclRlbXBsYXRlU3RvcmU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBPcHRpb25hbCgpIHRyYW5zbGF0ZVNlcnZpY2U/OiBMb2NhbGl6YXRpb25TZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGxhbmckID0gdHJhbnNsYXRlU2VydmljZVxuICAgICAgPyB0cmFuc2xhdGVTZXJ2aWNlLmdldFRyYW5zbGF0ZVNlcnZpY2UoKS5vbkxhbmdDaGFuZ2UucGlwZShcbiAgICAgICAgbWFwKCh7IGxhbmcgfSkgPT4gbGFuZyksXG4gICAgICAgIHN0YXJ0V2l0aCh0cmFuc2xhdGVTZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKVxuICAgICAgOiBvZihudWxsKTtcblxuICAgIGNvbnN0IGZpbHRlcmVkQWN0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIGxhbmckLFxuICAgICAgdGhpcy5wbGFjZWhvbGRlcnNBY3Rpb25zJC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgbmV4dCkgPT4gSlNPTi5zdHJpbmdpZnkocHJldikgPT09IEpTT04uc3RyaW5naWZ5KG5leHQpKVxuICAgICAgKVxuICAgIF0pLnBpcGUoXG4gICAgICB3aXRoTGF0ZXN0RnJvbShcbiAgICAgICAgY29tYmluZUxhdGVzdChbc3RvcmUucGlwZShzZWxlY3Qoc2VsZWN0UGxhY2Vob2xkZXJUZW1wbGF0ZUVudGl0aWVzKSksIHN0b3JlLnBpcGUoc2VsZWN0KHNlbGVjdFBsYWNlaG9sZGVyUmVxdWVzdEVudGl0aWVzKSldKVxuICAgICAgKSxcbiAgICAgIG1hcCgoW2xhbmdBbmRUZW1wbGF0ZXNVcmxzLCBzdG9yZWRQbGFjZWhvbGRlcnNBbmRSZXF1ZXN0c10pID0+IHtcbiAgICAgICAgY29uc3QgW2xhbmcsIHBsYWNlaG9sZGVyQWN0aW9uc10gPSBsYW5nQW5kVGVtcGxhdGVzVXJscztcbiAgICAgICAgY29uc3Qgc3RvcmVkUGxhY2Vob2xkZXJzID0gc3RvcmVkUGxhY2Vob2xkZXJzQW5kUmVxdWVzdHNbMF0gfHwge307XG4gICAgICAgIGNvbnN0IHN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdHMgPSBzdG9yZWRQbGFjZWhvbGRlcnNBbmRSZXF1ZXN0c1sxXSB8fCB7fTtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJOZXdSZXF1ZXN0czogeyByYXdVcmw6IHN0cmluZzsgcmVzb2x2ZWRVcmw6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgICAgLy8gU3RvcmVzIGFsbCByYXcgVXJscyB1c2VkIGZyb20gdGhlIGN1cnJlbnQgZW5naW5lIGV4ZWN1dGlvblxuICAgICAgICBjb25zdCB1c2VkVXJsczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgICAgICAgLy8gR2V0IGFsbCBVcmxzIHRoYXQgbmVlZHMgdG8gYmUgcmVzb2x2ZWQgZnJvbSBjdXJyZW50IHJ1bGVzIGVuZ2luZSBvdXRwdXRcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzVGVtcGxhdGVzID0gcGxhY2Vob2xkZXJBY3Rpb25zLnJlZHVjZSgoYWNjLCBwbGFjZWhvbGRlckFjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyc1RlbXBsYXRlVXJsID0ge1xuICAgICAgICAgICAgcmF3VXJsOiBwbGFjZWhvbGRlckFjdGlvbi50ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgIHByaW9yaXR5OiBwbGFjZWhvbGRlckFjdGlvbi5wcmlvcml0eVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGFjY1twbGFjZWhvbGRlckFjdGlvbi5wbGFjZWhvbGRlcklkXSkge1xuICAgICAgICAgICAgYWNjW3BsYWNlaG9sZGVyQWN0aW9uLnBsYWNlaG9sZGVySWRdLnB1c2gocGxhY2Vob2xkZXJzVGVtcGxhdGVVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2NbcGxhY2Vob2xkZXJBY3Rpb24ucGxhY2Vob2xkZXJJZF0gPSBbcGxhY2Vob2xkZXJzVGVtcGxhdGVVcmxdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXNvbHZlZFVybCA9IHRoaXMucmVzb2x2ZVVybFdpdGhMYW5nKHBsYWNlaG9sZGVyQWN0aW9uLnRlbXBsYXRlVXJsLCBsYW5nKTtcbiAgICAgICAgICAvLyBGaWx0ZXJzIGR1cGxpY2F0ZXMgYW5kIHJlc29sdmVkIHVybHMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgc3RvcmVcbiAgICAgICAgICBpZiAoIXVzZWRVcmxzW3BsYWNlaG9sZGVyQWN0aW9uLnRlbXBsYXRlVXJsXSAmJiAoIXN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdHNbcGxhY2Vob2xkZXJBY3Rpb24udGVtcGxhdGVVcmxdXG4gICAgICAgICAgICB8fCBzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RzW3BsYWNlaG9sZGVyQWN0aW9uLnRlbXBsYXRlVXJsXSEucmVzb2x2ZWRVcmwgIT09IHJlc29sdmVkVXJsKSkge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJOZXdSZXF1ZXN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgcmF3VXJsOiBwbGFjZWhvbGRlckFjdGlvbi50ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRVcmw6IHRoaXMucmVzb2x2ZVVybFdpdGhMYW5nKHBsYWNlaG9sZGVyQWN0aW9uLnRlbXBsYXRlVXJsLCBsYW5nKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVzZWRVcmxzW3BsYWNlaG9sZGVyQWN0aW9uLnRlbXBsYXRlVXJsXSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30gYXMgeyBba2V5OiBzdHJpbmddOiB7IHJhd1VybDogc3RyaW5nOyBwcmlvcml0eTogbnVtYmVyIH1bXSB9KTtcbiAgICAgICAgLy8gVXJscyBub3QgdXNlZCBhbnltb3JlIGFuZCBub3QgYWxyZWFkeSBkaXNhYmxlZFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclJlcXVlc3RzVG9EaXNhYmxlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAvLyBVcmxzIHVzZWQgdGhhdCB3ZXJlIGRpc2FibGVkXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyUmVxdWVzdHNUb0VuYWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMoc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0cykuZm9yRWFjaCgoc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0UmF3VXJsKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlZEZyb21FbmdpbmVJdGVyYXRpb24gPSB1c2VkVXJsc1tzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RSYXdVcmxdO1xuICAgICAgICAgIGNvbnN0IHVzZWRGcm9tU3RvcmUgPSAoc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0cyAmJiBzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RzW3N0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdFJhd1VybF0pID8gc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0c1tzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RSYXdVcmxdLnVzZWQgOiBmYWxzZTtcbiAgICAgICAgICBpZiAoIXVzZWRGcm9tRW5naW5lSXRlcmF0aW9uICYmIHVzZWRGcm9tU3RvcmUpIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyUmVxdWVzdHNUb0Rpc2FibGUucHVzaChzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RSYXdVcmwpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodXNlZEZyb21FbmdpbmVJdGVyYXRpb24gJiYgIXVzZWRGcm9tU3RvcmUpIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyUmVxdWVzdHNUb0VuYWJsZS5wdXNoKHN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdFJhd1VybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gUGxhY2Vob2xkZXIgdGhhdCBhcmUgbm8gbG9uZ2VyIGZpbGxlZCBieSB0aGUgY3VycmVudCBlbmdpbmUgZXhlY3V0aW9uIG91dHB1dCB3aWxsIGJlIGNsZWFyZWRcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzVGVtcGxhdGVzVG9CZUNsZWFuZWRVcCA9IE9iamVjdC5rZXlzKHN0b3JlZFBsYWNlaG9sZGVycylcbiAgICAgICAgICAuZmlsdGVyKChwbGFjZWhvbGRlcklkKSA9PiAhcGxhY2Vob2xkZXJzVGVtcGxhdGVzW3BsYWNlaG9sZGVySWRdKTtcblxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNUZW1wbGF0ZXNUb0JlU2V0ID0gT2JqZWN0LmtleXMocGxhY2Vob2xkZXJzVGVtcGxhdGVzKS5yZWR1Y2UoKGNoYW5nZWRQbGFjZWhvbGRlclRlbXBsYXRlcywgcGxhY2Vob2xkZXJUZW1wbGF0ZUlkKSA9PiB7XG4gICAgICAgICAgLy8gQ2FjaGluZyBpZiB0aGUgcGxhY2Vob2xkZXIgdGVtcGxhdGUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSB1cmxzXG4gICAgICAgICAgaWYgKCFzdG9yZWRQbGFjZWhvbGRlcnNbcGxhY2Vob2xkZXJUZW1wbGF0ZUlkXVxuICAgICAgICAgICAgfHwgIShKU09OLnN0cmluZ2lmeShzdG9yZWRQbGFjZWhvbGRlcnNbcGxhY2Vob2xkZXJUZW1wbGF0ZUlkXS51cmxzV2l0aFByaW9yaXR5KSA9PT0gSlNPTi5zdHJpbmdpZnkocGxhY2Vob2xkZXJzVGVtcGxhdGVzW3BsYWNlaG9sZGVyVGVtcGxhdGVJZF0pKSkge1xuICAgICAgICAgICAgY2hhbmdlZFBsYWNlaG9sZGVyVGVtcGxhdGVzLnB1c2goe1xuICAgICAgICAgICAgICBpZDogcGxhY2Vob2xkZXJUZW1wbGF0ZUlkLFxuICAgICAgICAgICAgICB1cmxzV2l0aFByaW9yaXR5OiBwbGFjZWhvbGRlcnNUZW1wbGF0ZXNbcGxhY2Vob2xkZXJUZW1wbGF0ZUlkXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGFuZ2VkUGxhY2Vob2xkZXJUZW1wbGF0ZXM7XG4gICAgICAgIH0sIFtdIGFzIHsgaWQ6IHN0cmluZzsgdXJsc1dpdGhQcmlvcml0eTogeyByYXdVcmw6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9W10gfVtdKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwbGFjZWhvbGRlcnNUZW1wbGF0ZXNUb0JlQ2xlYW5lZFVwLFxuICAgICAgICAgIHBsYWNlaG9sZGVyUmVxdWVzdHNUb0Rpc2FibGUsXG4gICAgICAgICAgcGxhY2Vob2xkZXJSZXF1ZXN0c1RvRW5hYmxlLFxuICAgICAgICAgIHBsYWNlaG9sZGVyc1RlbXBsYXRlc1RvQmVTZXQsXG4gICAgICAgICAgcGxhY2Vob2xkZXJOZXdSZXF1ZXN0c1xuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZpbHRlcmVkQWN0aW9ucyQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKChwbGFjZWhvbGRlcnNVcGRhdGVzKSA9PiB7XG4gICAgICBwbGFjZWhvbGRlcnNVcGRhdGVzLnBsYWNlaG9sZGVyc1RlbXBsYXRlc1RvQmVDbGVhbmVkVXAuZm9yRWFjaCgocGxhY2Vob2xkZXJJZCkgPT5cbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goZGVsZXRlUGxhY2Vob2xkZXJUZW1wbGF0ZUVudGl0eSh7XG4gICAgICAgICAgaWQ6IHBsYWNlaG9sZGVySWRcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgICAgcGxhY2Vob2xkZXJzVXBkYXRlcy5wbGFjZWhvbGRlcnNUZW1wbGF0ZXNUb0JlU2V0LmZvckVhY2goKHBsYWNlaG9sZGVyc1RlbXBsYXRlVG9CZVNldCkgPT4ge1xuICAgICAgICBzdG9yZS5kaXNwYXRjaChzZXRQbGFjZWhvbGRlclRlbXBsYXRlRW50aXR5KHsgZW50aXR5OiBwbGFjZWhvbGRlcnNUZW1wbGF0ZVRvQmVTZXQgfSkpO1xuICAgICAgfSk7XG4gICAgICBwbGFjZWhvbGRlcnNVcGRhdGVzLnBsYWNlaG9sZGVyUmVxdWVzdHNUb0Rpc2FibGUuZm9yRWFjaCgocGxhY2Vob2xkZXJSZXF1ZXN0VG9EaXNhYmxlKSA9PiB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKHVwZGF0ZVBsYWNlaG9sZGVyUmVxdWVzdEVudGl0eSh7IGVudGl0eTogeyBpZDogcGxhY2Vob2xkZXJSZXF1ZXN0VG9EaXNhYmxlLCB1c2VkOiBmYWxzZSB9IH0pKTtcbiAgICAgIH0pO1xuICAgICAgcGxhY2Vob2xkZXJzVXBkYXRlcy5wbGFjZWhvbGRlclJlcXVlc3RzVG9FbmFibGUuZm9yRWFjaCgocGxhY2Vob2xkZXJSZXF1ZXN0VG9FbmFibGUpID0+IHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2godXBkYXRlUGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5KHsgZW50aXR5OiB7IGlkOiBwbGFjZWhvbGRlclJlcXVlc3RUb0VuYWJsZSwgdXNlZDogdHJ1ZSB9IH0pKTtcbiAgICAgIH0pO1xuICAgICAgcGxhY2Vob2xkZXJzVXBkYXRlcy5wbGFjZWhvbGRlck5ld1JlcXVlc3RzLmZvckVhY2goKHBsYWNlaG9sZGVyTmV3UmVxdWVzdCkgPT4ge1xuICAgICAgICBzdG9yZS5kaXNwYXRjaChzZXRQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHlGcm9tVXJsKHtcbiAgICAgICAgICByZXNvbHZlZFVybDogcGxhY2Vob2xkZXJOZXdSZXF1ZXN0LnJlc29sdmVkVXJsLFxuICAgICAgICAgIGlkOiBwbGFjZWhvbGRlck5ld1JlcXVlc3QucmF3VXJsLFxuICAgICAgICAgIGNhbGw6IHRoaXMucmV0cmlldmVUZW1wbGF0ZShwbGFjZWhvbGRlck5ld1JlcXVlc3QucmVzb2x2ZWRVcmwpXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2FsaXplIHRoZSB1cmwsIHJlcGxhY2luZyB0aGUgbGFuZ3VhZ2UgbWFya2VyXG4gICAqIEBwYXJhbSB1cmxcbiAgICogQHBhcmFtIGxhbmd1YWdlXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVVybFdpdGhMYW5nKHVybDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKCFsYW5ndWFnZSAmJiB1cmwuaW5jbHVkZXMoJ1tMQU5HVUFHRV0nKSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihgTWlzc2luZyBsYW5ndWFnZSB3aGVuIHRyeWluZyB0byByZXNvbHZlICR7dXJsfWApO1xuICAgIH1cbiAgICByZXR1cm4gbGFuZ3VhZ2UgPyB1cmwucmVwbGFjZSgvXFxbTEFOR1VBR0VdL2csIGxhbmd1YWdlKSA6IHVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0ZW1wbGF0ZSBhcyBqc29uIGZyb20gYSBnaXZlbiB1cmxcbiAgICogQHBhcmFtIHVybFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJldHJpZXZlVGVtcGxhdGUodXJsOiBzdHJpbmcpOiBQcm9taXNlPFBsYWNlaG9sZGVyUmVxdWVzdFJlcGx5PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRVcmwkID0gdGhpcy5pbmplY3Rvci5nZXQoRHluYW1pY0NvbnRlbnRTZXJ2aWNlLCBudWxsLCB7IG9wdGlvbmFsOiB0cnVlIH0pPy5nZXRDb250ZW50UGF0aFN0cmVhbSh1cmwpIHx8IG9mKHVybCk7XG4gICAgY29uc3QgZnVsbFVybCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJlc29sdmVkVXJsJCk7XG4gICAgcmV0dXJuIGZldGNoKGZ1bGxVcmwpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHB1YmxpYyBleGVjdXRlQWN0aW9ucyhhY3Rpb25zOiBBY3Rpb25VcGRhdGVQbGFjZWhvbGRlckJsb2NrW10pIHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiAoe1xuICAgICAgcGxhY2Vob2xkZXJJZDogYWN0aW9uLnBsYWNlaG9sZGVySWQsXG4gICAgICB0ZW1wbGF0ZVVybDogYWN0aW9uLnZhbHVlLFxuICAgICAgcHJpb3JpdHk6IGFjdGlvbi5wcmlvcml0eSB8fCAwXG4gICAgfSkpO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlcnNBY3Rpb25zJC5uZXh0KHRlbXBsYXRlcyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,3 +0,0 @@
1
- /** ActionUpdatePlaceholderBlock */
2
- export const RULES_ENGINE_PLACEHOLDER_UPDATE_ACTION_TYPE = 'UPDATE_PLACEHOLDER';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy1lbmdpbmUvcGxhY2Vob2xkZXIuaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE1BQU0sMkNBQTJDLEdBQUcsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIFJ1bGVzRW5naW5lQWN0aW9uLFxufSBmcm9tICdAbzNyL2NvcmUnO1xuXG4vKiogQWN0aW9uVXBkYXRlUGxhY2Vob2xkZXJCbG9jayAgKi9cbmV4cG9ydCBjb25zdCBSVUxFU19FTkdJTkVfUExBQ0VIT0xERVJfVVBEQVRFX0FDVElPTl9UWVBFID0gJ1VQREFURV9QTEFDRUhPTERFUic7XG5cbi8qKlxuICogQ29udGVudCBvZiBhY3Rpb24gdGhhdCB1cGRhdGVzIGEgcGxhY2Vob2xkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25VcGRhdGVQbGFjZWhvbGRlckJsb2NrIGV4dGVuZHMgUnVsZXNFbmdpbmVBY3Rpb24ge1xuICBhY3Rpb25UeXBlOiB0eXBlb2YgUlVMRVNfRU5HSU5FX1BMQUNFSE9MREVSX1VQREFURV9BQ1RJT05fVFlQRTtcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBwcmlvcml0eT86IG51bWJlcjtcbn1cbiJdfQ==
@@ -1,136 +0,0 @@
1
- import { Injectable, Optional, } from '@angular/core';
2
- import { Actions, createEffect, ofType, } from '@ngrx/effects';
3
- import { Store, } from '@ngrx/store';
4
- import { fromApiEffectSwitchMapById, } from '@o3r/core';
5
- import { JSONPath, } from 'jsonpath-plus';
6
- import { combineLatest, EMPTY, of, } from 'rxjs';
7
- import { distinctUntilChanged, map, switchMap, take, } from 'rxjs/operators';
8
- import { cancelPlaceholderRequest, failPlaceholderRequestEntity, selectPlaceholderRequestEntityUsage, setPlaceholderRequestEntityFromUrl, updatePlaceholderRequestEntity, } from '@o3r/components';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@ngrx/effects";
11
- import * as i2 from "@ngrx/store";
12
- import * as i3 from "@o3r/rules-engine";
13
- import * as i4 from "@o3r/dynamic-content";
14
- import * as i5 from "@o3r/localization";
15
- /**
16
- * Service to handle async PlaceholderTemplate actions
17
- */
18
- export class PlaceholderTemplateResponseEffect {
19
- constructor(actions$, store, rulesEngineService, dynamicContentService, translationService) {
20
- this.actions$ = actions$;
21
- this.store = store;
22
- this.rulesEngineService = rulesEngineService;
23
- this.dynamicContentService = dynamicContentService;
24
- this.translationService = translationService;
25
- /**
26
- * Set the PlaceholderRequest entity with the reply content, dispatch failPlaceholderRequestEntity if it catches a failure
27
- * Handles the rendering of the HTML content from the template and creates the combine latest from facts list if needed
28
- * Disables unused templates refresh if used is false in the store
29
- */
30
- this.setPlaceholderRequestEntityFromUrl$ = createEffect(() => this.actions$.pipe(ofType(setPlaceholderRequestEntityFromUrl), fromApiEffectSwitchMapById((templateResponse, action) => {
31
- const facts = templateResponse.vars ? Object.entries(templateResponse.vars).filter(([, variable]) => variable.type === 'fact') : [];
32
- const factsStreamsList = this.rulesEngineService
33
- ? facts.map(([varName, fact]) => this.rulesEngineService.engine.retrieveOrCreateFactStream(fact.value).pipe(map((factValue) => ({
34
- varName,
35
- factName: fact.value,
36
- // eslint-disable-next-line new-cap -- naming convention imposed by jsonpath-plus
37
- factValue: (fact.path && factValue) ? JSONPath({ wrap: false, json: factValue, path: fact.path }) : factValue
38
- })), distinctUntilChanged((previous, current) => previous.factValue === current.factValue)))
39
- : [];
40
- const factsStreamsList$ = factsStreamsList.length > 0 ? combineLatest(factsStreamsList) : of([]);
41
- return combineLatest([factsStreamsList$, this.store.select(selectPlaceholderRequestEntityUsage(action.id)).pipe(distinctUntilChanged())]).pipe(switchMap(([factsUsedInTemplate, placeholderRequestUsage]) => {
42
- if (!placeholderRequestUsage) {
43
- return EMPTY;
44
- }
45
- return this.getRenderedHTML$(templateResponse.template, templateResponse.vars, factsUsedInTemplate).pipe(map(({ renderedTemplate, unknownTypeFound }) =>
46
- // Update instead of set because used already set by the update from url action
47
- updatePlaceholderRequestEntity({
48
- entity: {
49
- ...templateResponse,
50
- resolvedUrl: action.resolvedUrl,
51
- id: action.id,
52
- renderedTemplate,
53
- unknownTypeFound
54
- },
55
- requestId: action.requestId
56
- })));
57
- }));
58
- }, (error, action) => of(failPlaceholderRequestEntity({ ids: [action.id], error, requestId: action.requestId })), (requestIdPayload, action) => cancelPlaceholderRequest({ ...requestIdPayload, id: action.id }))));
59
- }
60
- /**
61
- * Renders the html template, replacing facts and urls and localizationKeys
62
- * @param template
63
- * @param vars
64
- * @param facts
65
- */
66
- getRenderedHTML$(template, vars, facts) {
67
- let unknownTypeFound = false;
68
- const factMap = (facts || []).reduce((mapping, fact) => {
69
- mapping[fact.factName] = fact.factValue;
70
- return mapping;
71
- }, {});
72
- const factMapFromVars = (facts || []).reduce((mapping, fact) => {
73
- mapping[fact.varName] = fact.factValue;
74
- return mapping;
75
- }, {});
76
- const replacements$ = [];
77
- if (vars && template) {
78
- for (const varName in vars) {
79
- if (Object.prototype.hasOwnProperty.call(vars, varName)) {
80
- const ejsVar = new RegExp(`<%=\\s*${varName}\\s*%>`, 'g');
81
- switch (vars[varName].type) {
82
- case 'relativeUrl': {
83
- replacements$.push(this.dynamicContentService?.getMediaPathStream(vars[varName].value).pipe(take(1), map((value) => ({ ejsVar, value }))) || of({ ejsVar, value: vars[varName].value }));
84
- break;
85
- }
86
- case 'fullUrl': {
87
- template = template.replace(ejsVar, vars[varName].value);
88
- break;
89
- }
90
- case 'fact': {
91
- template = template.replace(ejsVar, factMap[vars[varName].value] ?? '');
92
- break;
93
- }
94
- case 'localisation': {
95
- const linkedVars = (vars[varName].vars || []).reduce((acc, parameter) => {
96
- const paramName = vars[parameter].value;
97
- acc[paramName] = factMap[paramName];
98
- return acc;
99
- }, {});
100
- const linkedParams = (Object.entries(vars[varName].parameters || {})).reduce((acc, [paramKey, paramValue]) => {
101
- acc[paramKey] = factMapFromVars[paramValue];
102
- return acc;
103
- }, linkedVars);
104
- replacements$.push(this.translationService
105
- ? this.translationService.translate(vars[varName].value, linkedParams).pipe(map((value) => (value ? { ejsVar, value } : null)))
106
- : of(null));
107
- break;
108
- }
109
- default: {
110
- unknownTypeFound = true;
111
- break;
112
- }
113
- }
114
- }
115
- }
116
- }
117
- return replacements$.length > 0 && !!template
118
- ? combineLatest(replacements$).pipe(map((replacements) => ({
119
- renderedTemplate: replacements.reduce((acc, replacement) => replacement ? acc.replace(replacement.ejsVar, replacement.value) : acc, template),
120
- unknownTypeFound
121
- })))
122
- : of({ renderedTemplate: template, unknownTypeFound });
123
- }
124
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlaceholderTemplateResponseEffect, deps: [{ token: i1.Actions }, { token: i2.Store }, { token: i3.RulesEngineRunnerService, optional: true }, { token: i4.DynamicContentService, optional: true }, { token: i5.LocalizationService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
125
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlaceholderTemplateResponseEffect }); }
126
- }
127
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlaceholderTemplateResponseEffect, decorators: [{
128
- type: Injectable
129
- }], ctorParameters: () => [{ type: i1.Actions }, { type: i2.Store }, { type: i3.RulesEngineRunnerService, decorators: [{
130
- type: Optional
131
- }] }, { type: i4.DynamicContentService, decorators: [{
132
- type: Optional
133
- }] }, { type: i5.LocalizationService, decorators: [{
134
- type: Optional
135
- }] }] });
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIucnVsZXMtZW5naW5lLmVmZmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy1lbmdpbmUvcGxhY2Vob2xkZXIucnVsZXMtZW5naW5lLmVmZmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFlBQVksRUFDWixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEtBQUssR0FDTixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsMEJBQTBCLEdBQzNCLE1BQU0sV0FBVyxDQUFDO0FBVW5CLE9BQU8sRUFDTCxRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGFBQWEsRUFDYixLQUFLLEVBRUwsRUFBRSxHQUNILE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsU0FBUyxFQUNULElBQUksR0FDTCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsNEJBQTRCLEVBRzVCLG1DQUFtQyxFQUNuQyxrQ0FBa0MsRUFDbEMsOEJBQThCLEdBQy9CLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFFekI7O0dBRUc7QUFFSCxNQUFNLE9BQU8saUNBQWlDO0lBc0Q1QyxZQUNtQixRQUFpQixFQUNqQixLQUFxQyxFQUN6QixrQkFBbUQsRUFDbkQscUJBQW1ELEVBQ25ELGtCQUE4QztRQUoxRCxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLFVBQUssR0FBTCxLQUFLLENBQWdDO1FBQ3pCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBaUM7UUFDbkQsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUE4QjtRQUNuRCx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTRC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QUFDLENBQ2IsQ0FBQzs0QkFDRixNQUFNO3dCQUNSLENBQUM7d0JBQ0QsT0FBUSxDQUFDLENBQUMsQ0FBQzs0QkFDVCxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7NEJBQ3hCLE1BQU07d0JBQ1IsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVE7WUFDM0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQ2pDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDckIsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FDbkMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FDbkIsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQ3hFLFFBQVEsQ0FDVDtnQkFDRCxnQkFBZ0I7YUFDakIsQ0FBQyxDQUFDLENBQ0o7WUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO2tJQTNJVSxpQ0FBaUM7c0lBQWpDLGlDQUFpQzs7NEZBQWpDLGlDQUFpQztrQkFEN0MsVUFBVTs7MEJBMEROLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3Rpb25zLFxuICBjcmVhdGVFZmZlY3QsXG4gIG9mVHlwZSxcbn0gZnJvbSAnQG5ncngvZWZmZWN0cyc7XG5pbXBvcnQge1xuICBTdG9yZSxcbn0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgZnJvbUFwaUVmZmVjdFN3aXRjaE1hcEJ5SWQsXG59IGZyb20gJ0BvM3IvY29yZSc7XG5pbXBvcnQge1xuICBEeW5hbWljQ29udGVudFNlcnZpY2UsXG59IGZyb20gJ0BvM3IvZHluYW1pYy1jb250ZW50JztcbmltcG9ydCB7XG4gIExvY2FsaXphdGlvblNlcnZpY2UsXG59IGZyb20gJ0BvM3IvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7XG4gIFJ1bGVzRW5naW5lUnVubmVyU2VydmljZSxcbn0gZnJvbSAnQG8zci9ydWxlcy1lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSlNPTlBhdGgsXG59IGZyb20gJ2pzb25wYXRoLXBsdXMnO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdCxcbiAgRU1QVFksXG4gIE9ic2VydmFibGUsXG4gIG9mLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgY2FuY2VsUGxhY2Vob2xkZXJSZXF1ZXN0LFxuICBmYWlsUGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5LFxuICB0eXBlIFBsYWNlaG9sZGVyUmVxdWVzdFN0b3JlLFxuICB0eXBlIFBsYWNlaG9sZGVyVmFyaWFibGUsXG4gIHNlbGVjdFBsYWNlaG9sZGVyUmVxdWVzdEVudGl0eVVzYWdlLFxuICBzZXRQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHlGcm9tVXJsLFxuICB1cGRhdGVQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHksXG59IGZyb20gJ0BvM3IvY29tcG9uZW50cyc7XG5cbi8qKlxuICogU2VydmljZSB0byBoYW5kbGUgYXN5bmMgUGxhY2Vob2xkZXJUZW1wbGF0ZSBhY3Rpb25zXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQbGFjZWhvbGRlclRlbXBsYXRlUmVzcG9uc2VFZmZlY3Qge1xuICAvKipcbiAgICogU2V0IHRoZSBQbGFjZWhvbGRlclJlcXVlc3QgZW50aXR5IHdpdGggdGhlIHJlcGx5IGNvbnRlbnQsIGRpc3BhdGNoIGZhaWxQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHkgaWYgaXQgY2F0Y2hlcyBhIGZhaWx1cmVcbiAgICogSGFuZGxlcyB0aGUgcmVuZGVyaW5nIG9mIHRoZSBIVE1MIGNvbnRlbnQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGNyZWF0ZXMgdGhlIGNvbWJpbmUgbGF0ZXN0IGZyb20gZmFjdHMgbGlzdCBpZiBuZWVkZWRcbiAgICogRGlzYWJsZXMgdW51c2VkIHRlbXBsYXRlcyByZWZyZXNoIGlmIHVzZWQgaXMgZmFsc2UgaW4gdGhlIHN0b3JlXG4gICAqL1xuICBwdWJsaWMgc2V0UGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5RnJvbVVybCQgPSBjcmVhdGVFZmZlY3QoKCkgPT5cbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXG4gICAgICBvZlR5cGUoc2V0UGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5RnJvbVVybCksXG4gICAgICBmcm9tQXBpRWZmZWN0U3dpdGNoTWFwQnlJZChcbiAgICAgICAgKHRlbXBsYXRlUmVzcG9uc2UsIGFjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGZhY3RzID0gdGVtcGxhdGVSZXNwb25zZS52YXJzID8gT2JqZWN0LmVudHJpZXModGVtcGxhdGVSZXNwb25zZS52YXJzKS5maWx0ZXIoKFssIHZhcmlhYmxlXSkgPT4gdmFyaWFibGUudHlwZSA9PT0gJ2ZhY3QnKSA6IFtdO1xuICAgICAgICAgIGNvbnN0IGZhY3RzU3RyZWFtc0xpc3QgPSB0aGlzLnJ1bGVzRW5naW5lU2VydmljZVxuICAgICAgICAgICAgPyBmYWN0cy5tYXAoKFt2YXJOYW1lLCBmYWN0XSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5ydWxlc0VuZ2luZVNlcnZpY2UhLmVuZ2luZS5yZXRyaWV2ZU9yQ3JlYXRlRmFjdFN0cmVhbShmYWN0LnZhbHVlKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoZmFjdFZhbHVlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgdmFyTmFtZSxcbiAgICAgICAgICAgICAgICAgIGZhY3ROYW1lOiBmYWN0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXAgLS0gbmFtaW5nIGNvbnZlbnRpb24gaW1wb3NlZCBieSBqc29ucGF0aC1wbHVzXG4gICAgICAgICAgICAgICAgICBmYWN0VmFsdWU6IChmYWN0LnBhdGggJiYgZmFjdFZhbHVlKSA/IEpTT05QYXRoKHsgd3JhcDogZmFsc2UsIGpzb246IGZhY3RWYWx1ZSwgcGF0aDogZmFjdC5wYXRoIH0pIDogZmFjdFZhbHVlXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2aW91cywgY3VycmVudCkgPT4gcHJldmlvdXMuZmFjdFZhbHVlID09PSBjdXJyZW50LmZhY3RWYWx1ZSlcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogW107XG5cbiAgICAgICAgICBjb25zdCBmYWN0c1N0cmVhbXNMaXN0JCA9IGZhY3RzU3RyZWFtc0xpc3QubGVuZ3RoID4gMCA/IGNvbWJpbmVMYXRlc3QoZmFjdHNTdHJlYW1zTGlzdCkgOiBvZihbXSk7XG4gICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW2ZhY3RzU3RyZWFtc0xpc3QkLCB0aGlzLnN0b3JlLnNlbGVjdChzZWxlY3RQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHlVc2FnZShhY3Rpb24uaWQpKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoW2ZhY3RzVXNlZEluVGVtcGxhdGUsIHBsYWNlaG9sZGVyUmVxdWVzdFVzYWdlXSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXBsYWNlaG9sZGVyUmVxdWVzdFVzYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFJlbmRlcmVkSFRNTCQodGVtcGxhdGVSZXNwb25zZS50ZW1wbGF0ZSwgdGVtcGxhdGVSZXNwb25zZS52YXJzLCBmYWN0c1VzZWRJblRlbXBsYXRlKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoeyByZW5kZXJlZFRlbXBsYXRlLCB1bmtub3duVHlwZUZvdW5kIH0pID0+XG4gICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgaW5zdGVhZCBvZiBzZXQgYmVjYXVzZSB1c2VkIGFscmVhZHkgc2V0IGJ5IHRoZSB1cGRhdGUgZnJvbSB1cmwgYWN0aW9uXG4gICAgICAgICAgICAgICAgICB1cGRhdGVQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHkoe1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi50ZW1wbGF0ZVJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVXJsOiBhY3Rpb24ucmVzb2x2ZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IGFjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHVua25vd25UeXBlRm91bmRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBhY3Rpb24ucmVxdWVzdElkXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yLCBhY3Rpb24pID0+IG9mKGZhaWxQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHkoeyBpZHM6IFthY3Rpb24uaWRdLCBlcnJvciwgcmVxdWVzdElkOiBhY3Rpb24ucmVxdWVzdElkIH0pKSxcbiAgICAgICAgKHJlcXVlc3RJZFBheWxvYWQsIGFjdGlvbikgPT4gY2FuY2VsUGxhY2Vob2xkZXJSZXF1ZXN0KHsgLi4ucmVxdWVzdElkUGF5bG9hZCwgaWQ6IGFjdGlvbi5pZCB9KVxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbnMkOiBBY3Rpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU6IFN0b3JlPFBsYWNlaG9sZGVyUmVxdWVzdFN0b3JlPixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHJ1bGVzRW5naW5lU2VydmljZTogUnVsZXNFbmdpbmVSdW5uZXJTZXJ2aWNlIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGR5bmFtaWNDb250ZW50U2VydmljZTogRHluYW1pY0NvbnRlbnRTZXJ2aWNlIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSB8IG51bGwpIHt9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGh0bWwgdGVtcGxhdGUsIHJlcGxhY2luZyBmYWN0cyBhbmQgdXJscyBhbmQgbG9jYWxpemF0aW9uS2V5c1xuICAgKiBAcGFyYW0gdGVtcGxhdGVcbiAgICogQHBhcmFtIHZhcnNcbiAgICogQHBhcmFtIGZhY3RzXG4gICAqL1xuICBwcml2YXRlIGdldFJlbmRlcmVkSFRNTCQodGVtcGxhdGU/OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBQbGFjZWhvbGRlclZhcmlhYmxlPiwgZmFjdHM/OiB7IHZhck5hbWU6IHN0cmluZzsgZmFjdE5hbWU6IHN0cmluZzsgZmFjdFZhbHVlOiBhbnkgfVtdKSB7XG4gICAgbGV0IHVua25vd25UeXBlRm91bmQgPSBmYWxzZTtcbiAgICBjb25zdCBmYWN0TWFwID0gKGZhY3RzIHx8IFtdKS5yZWR1Y2UoKG1hcHBpbmc6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGZhY3QpID0+IHtcbiAgICAgIG1hcHBpbmdbZmFjdC5mYWN0TmFtZV0gPSBmYWN0LmZhY3RWYWx1ZTtcbiAgICAgIHJldHVybiBtYXBwaW5nO1xuICAgIH0sIHt9KTtcbiAgICBjb25zdCBmYWN0TWFwRnJvbVZhcnMgPSAoZmFjdHMgfHwgW10pLnJlZHVjZSgobWFwcGluZzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZmFjdCkgPT4ge1xuICAgICAgbWFwcGluZ1tmYWN0LnZhck5hbWVdID0gZmFjdC5mYWN0VmFsdWU7XG4gICAgICByZXR1cm4gbWFwcGluZztcbiAgICB9LCB7fSk7XG4gICAgY29uc3QgcmVwbGFjZW1lbnRzJDogT2JzZXJ2YWJsZTx7IGVqc1ZhcjogUmVnRXhwOyB2YWx1ZTogc3RyaW5nIH0gfCBudWxsPltdID0gW107XG4gICAgaWYgKHZhcnMgJiYgdGVtcGxhdGUpIHtcbiAgICAgIGZvciAoY29uc3QgdmFyTmFtZSBpbiB2YXJzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFycywgdmFyTmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBlanNWYXIgPSBuZXcgUmVnRXhwKGA8JT1cXFxccyoke3Zhck5hbWV9XFxcXHMqJT5gLCAnZycpO1xuICAgICAgICAgIHN3aXRjaCAodmFyc1t2YXJOYW1lXS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdyZWxhdGl2ZVVybCc6IHtcbiAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzJC5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMuZHluYW1pY0NvbnRlbnRTZXJ2aWNlPy5nZXRNZWRpYVBhdGhTdHJlYW0odmFyc1t2YXJOYW1lXS52YWx1ZSkucGlwZShcbiAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICBtYXAoKHZhbHVlOiBzdHJpbmcpID0+ICh7IGVqc1ZhciwgdmFsdWUgfSkpXG4gICAgICAgICAgICAgICAgKSB8fCBvZih7IGVqc1ZhciwgdmFsdWU6IHZhcnNbdmFyTmFtZV0udmFsdWUgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdmdWxsVXJsJzoge1xuICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoZWpzVmFyLCB2YXJzW3Zhck5hbWVdLnZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdmYWN0Jzoge1xuICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoZWpzVmFyLCBmYWN0TWFwW3ZhcnNbdmFyTmFtZV0udmFsdWVdID8/ICcnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdsb2NhbGlzYXRpb24nOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpbmtlZFZhcnMgPSAodmFyc1t2YXJOYW1lXS52YXJzIHx8IFtdKS5yZWR1Y2UoKGFjYzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgcGFyYW1ldGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gdmFyc1twYXJhbWV0ZXJdLnZhbHVlO1xuICAgICAgICAgICAgICAgIGFjY1twYXJhbU5hbWVdID0gZmFjdE1hcFtwYXJhbU5hbWVdO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgY29uc3QgbGlua2VkUGFyYW1zID0gKE9iamVjdC5lbnRyaWVzKHZhcnNbdmFyTmFtZV0ucGFyYW1ldGVycyB8fCB7fSkpLnJlZHVjZSgoYWNjOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBbcGFyYW1LZXksIHBhcmFtVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW3BhcmFtS2V5XSA9IGZhY3RNYXBGcm9tVmFyc1twYXJhbVZhbHVlXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICB9LCBsaW5rZWRWYXJzKTtcbiAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzJC5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSh2YXJzW3Zhck5hbWVdLnZhbHVlLCBsaW5rZWRQYXJhbXMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIG1hcCgodmFsdWUpID0+ICh2YWx1ZSA/IHsgZWpzVmFyLCB2YWx1ZSB9IDogbnVsbCkpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IG9mKG51bGwpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgdW5rbm93blR5cGVGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVwbGFjZW1lbnRzJC5sZW5ndGggPiAwICYmICEhdGVtcGxhdGVcbiAgICAgID8gY29tYmluZUxhdGVzdChyZXBsYWNlbWVudHMkKS5waXBlKFxuICAgICAgICBtYXAoKHJlcGxhY2VtZW50cykgPT4gKHtcbiAgICAgICAgICByZW5kZXJlZFRlbXBsYXRlOiByZXBsYWNlbWVudHMucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgcmVwbGFjZW1lbnQpID0+XG4gICAgICAgICAgICAgIHJlcGxhY2VtZW50ID8gYWNjLnJlcGxhY2UocmVwbGFjZW1lbnQuZWpzVmFyLCByZXBsYWNlbWVudC52YWx1ZSkgOiBhY2MsXG4gICAgICAgICAgICB0ZW1wbGF0ZVxuICAgICAgICAgICksXG4gICAgICAgICAgdW5rbm93blR5cGVGb3VuZFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICAgIDogb2YoeyByZW5kZXJlZFRlbXBsYXRlOiB0ZW1wbGF0ZSwgdW5rbm93blR5cGVGb3VuZCB9KTtcbiAgfVxufVxuIl19