@sitecore-jss/sitecore-jss-angular 21.5.2 → 21.5.3-canary.2

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 (66) hide show
  1. package/LICENSE.txt +202 -202
  2. package/README.md +7 -7
  3. package/angular.json +48 -48
  4. package/dist/README.md +7 -7
  5. package/dist/components/data-resolver-factory.d.ts +13 -13
  6. package/dist/components/date.directive.d.ts +20 -20
  7. package/dist/components/editframe.component.d.ts +22 -22
  8. package/dist/components/file.directive.d.ts +17 -17
  9. package/dist/components/generic-link.directive.d.ts +20 -20
  10. package/dist/components/guard-resolver-factory.d.ts +11 -11
  11. package/dist/components/hidden-rendering.component.d.ts +7 -7
  12. package/dist/components/image.directive.d.ts +35 -35
  13. package/dist/components/link.directive.d.ts +26 -26
  14. package/dist/components/missing-component.component.d.ts +7 -7
  15. package/dist/components/placeholder-loading.directive.d.ts +8 -8
  16. package/dist/components/placeholder.component.d.ts +59 -59
  17. package/dist/components/placeholder.token.d.ts +64 -64
  18. package/dist/components/raw.component.d.ts +12 -12
  19. package/dist/components/render-component.component.d.ts +33 -33
  20. package/dist/components/render-each.directive.d.ts +8 -8
  21. package/dist/components/render-empty.directive.d.ts +8 -8
  22. package/dist/components/rendering-field.d.ts +41 -41
  23. package/dist/components/rendering.d.ts +5 -5
  24. package/dist/components/rich-text.directive.d.ts +18 -18
  25. package/dist/components/router-link.directive.d.ts +19 -19
  26. package/dist/components/text.directive.d.ts +16 -16
  27. package/dist/esm2020/components/data-resolver-factory.mjs +58 -58
  28. package/dist/esm2020/components/date.directive.mjs +59 -59
  29. package/dist/esm2020/components/editframe.component.mjs +65 -65
  30. package/dist/esm2020/components/file.directive.mjs +44 -44
  31. package/dist/esm2020/components/generic-link.directive.mjs +64 -64
  32. package/dist/esm2020/components/guard-resolver-factory.mjs +85 -85
  33. package/dist/esm2020/components/hidden-rendering.component.mjs +20 -20
  34. package/dist/esm2020/components/image.directive.mjs +137 -137
  35. package/dist/esm2020/components/link.directive.mjs +117 -117
  36. package/dist/esm2020/components/missing-component.component.mjs +15 -15
  37. package/dist/esm2020/components/placeholder-loading.directive.mjs +15 -15
  38. package/dist/esm2020/components/placeholder.component.mjs +250 -250
  39. package/dist/esm2020/components/placeholder.token.mjs +23 -23
  40. package/dist/esm2020/components/raw.component.mjs +35 -35
  41. package/dist/esm2020/components/render-component.component.mjs +90 -90
  42. package/dist/esm2020/components/render-each.directive.mjs +15 -15
  43. package/dist/esm2020/components/render-empty.directive.mjs +15 -15
  44. package/dist/esm2020/components/rendering-field.mjs +1 -1
  45. package/dist/esm2020/components/rendering.mjs +7 -7
  46. package/dist/esm2020/components/rich-text.directive.mjs +62 -62
  47. package/dist/esm2020/components/router-link.directive.mjs +47 -47
  48. package/dist/esm2020/components/text.directive.mjs +57 -57
  49. package/dist/esm2020/jss-component-factory.service.mjs +82 -82
  50. package/dist/esm2020/lib.module.mjs +161 -161
  51. package/dist/esm2020/public_api.mjs +24 -24
  52. package/dist/esm2020/sitecore-jss-sitecore-jss-angular.mjs +4 -4
  53. package/dist/esm2020/utils.mjs +16 -16
  54. package/dist/fesm2015/sitecore-jss-sitecore-jss-angular.mjs +1406 -1406
  55. package/dist/fesm2020/sitecore-jss-sitecore-jss-angular.mjs +1413 -1413
  56. package/dist/index.d.ts +5 -5
  57. package/dist/jss-component-factory.service.d.ts +25 -25
  58. package/dist/lib.module.d.ts +46 -46
  59. package/dist/package.json +2 -2
  60. package/dist/public_api.d.ts +25 -25
  61. package/dist/utils.d.ts +7 -7
  62. package/ng-package.json +13 -13
  63. package/package.json +3 -3
  64. package/tsconfig.json +9 -9
  65. package/tsconfig.spec.json +16 -16
  66. package/typings/README.md +2 -2
@@ -1,16 +1,16 @@
1
- import { Directive } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class PlaceholderLoadingDirective {
4
- constructor(templateRef) {
5
- this.templateRef = templateRef;
6
- }
7
- }
8
- PlaceholderLoadingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
9
- PlaceholderLoadingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: PlaceholderLoadingDirective, selector: "[scPlaceholderLoading]", ngImport: i0 });
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, decorators: [{
11
- type: Directive,
12
- args: [{
13
- selector: '[scPlaceholderLoading]',
14
- }]
15
- }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
1
+ import { Directive } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class PlaceholderLoadingDirective {
4
+ constructor(templateRef) {
5
+ this.templateRef = templateRef;
6
+ }
7
+ }
8
+ PlaceholderLoadingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
9
+ PlaceholderLoadingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: PlaceholderLoadingDirective, selector: "[scPlaceholderLoading]", ngImport: i0 });
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderLoadingDirective, decorators: [{
11
+ type: Directive,
12
+ args: [{
13
+ selector: '[scPlaceholderLoading]',
14
+ }]
15
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
16
16
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXItbG9hZGluZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9wbGFjZWhvbGRlci1sb2FkaW5nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFlLE1BQU0sZUFBZSxDQUFDOztBQUt2RCxNQUFNLE9BQU8sMkJBQTJCO0lBQ3RDLFlBQW1CLFdBQWlDO1FBQWpDLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtJQUFHLENBQUM7O3dIQUQ3QywyQkFBMkI7NEdBQTNCLDJCQUEyQjsyRkFBM0IsMkJBQTJCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx3QkFBd0I7aUJBQ25DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbc2NQbGFjZWhvbGRlckxvYWRpbmddJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBsYWNlaG9sZGVyTG9hZGluZ0RpcmVjdGl2ZSB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPikge31cclxufVxyXG4iXX0=
@@ -1,266 +1,266 @@
1
- /* eslint-disable @angular-eslint/no-conflicting-lifecycle */
2
- import { isPlatformServer } from '@angular/common';
3
- import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
4
- import { UrlTree } from '@angular/router';
5
- import { Observable } from 'rxjs';
6
- import { takeWhile } from 'rxjs/operators';
7
- import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
8
- import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
9
- import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from './placeholder.token';
10
- import { RenderEachDirective } from './render-each.directive';
11
- import { RenderEmptyDirective } from './render-empty.directive';
12
- import { isRawRendering } from './rendering';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "../jss-component-factory.service";
15
- import * as i2 from "@angular/router";
16
- import * as i3 from "@angular/common";
17
- /**
18
- * @param {ComponentRendering} rendering
19
- * @param {string} name
20
- */
21
- function getPlaceholder(rendering, name) {
22
- if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
23
- return rendering.placeholders[name];
24
- }
25
- return null;
26
- }
27
- export class PlaceholderComponent {
28
- constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
29
- // eslint-disable-next-line @typescript-eslint/ban-types
30
- platformId) {
31
- this.differs = differs;
32
- this.componentFactory = componentFactory;
33
- this.changeDetectorRef = changeDetectorRef;
34
- this.elementRef = elementRef;
35
- this.renderer = renderer;
36
- this.router = router;
37
- this.missingComponentComponent = missingComponentComponent;
38
- this.hiddenRenderingComponent = hiddenRenderingComponent;
39
- this.guardResolver = guardResolver;
40
- this.dataResolver = dataResolver;
41
- this.platformId = platformId;
42
- this.clientOnly = false;
43
- this.loaded = new EventEmitter();
44
- this.isLoading = true;
45
- this._componentInstances = [];
46
- this.destroyed = false;
47
- this.parentStyleAttribute = '';
48
- }
49
- set inputs(value) {
50
- this._inputs = value;
51
- if (!this._differ && value) {
52
- this._differ = this.differs.find(value).create();
53
- }
54
- }
55
- ngOnInit() {
56
- // just to ensure the element exists
57
- const elem = this.elementRef.nativeElement;
58
- if (elem) {
59
- const attributes = elem.attributes;
60
- for (let i = 0; i < attributes.length; i++) {
61
- const attr = attributes.item(i);
62
- if (attr && attr.name.indexOf('_ngcontent') !== -1) {
63
- this.parentStyleAttribute = attr.name;
64
- }
65
- }
66
- }
67
- }
68
- ngOnDestroy() {
69
- this.destroyed = true;
70
- this._componentInstances = [];
71
- }
72
- ngOnChanges(changes) {
73
- if (changes.rendering || changes.renderings) {
74
- this._render();
75
- }
76
- }
77
- ngDoCheck() {
78
- if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
79
- return;
80
- }
81
- const changes = this._differ.diff(this._inputs);
82
- if (!changes) {
83
- return;
84
- }
85
- const updates = {};
86
- changes.forEachRemovedItem((change) => (updates[change.key] = null));
87
- changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
88
- changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
89
- this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
90
- }
91
- _setComponentInputs(componentInstance, inputs) {
92
- Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
93
- }
94
- _subscribeComponentOutputs(componentInstance, outputs) {
95
- Object.keys(outputs)
96
- .filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
97
- .forEach((output) => componentInstance[output]
98
- .pipe(takeWhile(() => !this.destroyed))
99
- .subscribe(outputs[output]));
100
- }
101
- async _render() {
102
- if (this.clientOnly && isPlatformServer(this.platformId)) {
103
- return;
104
- }
105
- this._componentInstances = [];
106
- this.view.clear();
107
- if (!this.rendering && !this.renderings) {
108
- return;
109
- }
110
- if (!this.name && !this.renderings) {
111
- console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
112
- this.isLoading = false;
113
- return;
114
- }
115
- const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
116
- if (!placeholder) {
117
- console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
118
- this.isLoading = false;
119
- return;
120
- }
121
- // if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
122
- const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
123
- if (this.renderEmptyTemplate && placeholderIsEmpty) {
124
- this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
125
- renderings: placeholder,
126
- });
127
- this.isLoading = false;
128
- }
129
- else {
130
- const factories = await this.componentFactory.getComponents(placeholder);
131
- try {
132
- const nonGuarded = await this.guardResolver(factories);
133
- const withData = await this.dataResolver(nonGuarded);
134
- withData.forEach((rendering, index) => {
135
- if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
136
- this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
137
- }
138
- else {
139
- this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
140
- }
141
- });
142
- this.isLoading = false;
143
- this.changeDetectorRef.markForCheck();
144
- this.loaded.emit(this.name);
145
- }
146
- catch (e) {
147
- this.isLoading = false;
148
- if (e instanceof UrlTree) {
149
- this.router.navigateByUrl(e);
150
- }
151
- else if (typeof e === 'string') {
152
- this.router.navigate([e]);
153
- }
154
- else if (Array.isArray(e)) {
155
- this.router.navigate(e);
156
- }
157
- else {
158
- throw e;
159
- }
160
- }
161
- }
162
- }
163
- _renderTemplatedComponent(rendering, index) {
164
- // the render-each template takes care of all component mapping etc
165
- // generally using <sc-render-component> which is about like _renderEmbeddedComponent()
166
- // as a separate component
167
- this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
168
- rendering,
169
- index,
170
- });
171
- }
172
- _renderEmbeddedComponent(rendering, data, index) {
173
- if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
174
- rendering.componentImplementation = this.hiddenRenderingComponent;
175
- }
176
- if (!rendering.componentImplementation) {
177
- const componentName = rendering.componentDefinition.componentName;
1
+ /* eslint-disable @angular-eslint/no-conflicting-lifecycle */
2
+ import { isPlatformServer } from '@angular/common';
3
+ import { Component, ContentChild, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewContainerRef, } from '@angular/core';
4
+ import { UrlTree } from '@angular/router';
5
+ import { Observable } from 'rxjs';
6
+ import { takeWhile } from 'rxjs/operators';
7
+ import { HIDDEN_RENDERING_NAME } from './hidden-rendering.component';
8
+ import { PlaceholderLoadingDirective } from './placeholder-loading.directive';
9
+ import { DATA_RESOLVER, GUARD_RESOLVER, PLACEHOLDER_HIDDEN_RENDERING_COMPONENT, PLACEHOLDER_MISSING_COMPONENT_COMPONENT, } from './placeholder.token';
10
+ import { RenderEachDirective } from './render-each.directive';
11
+ import { RenderEmptyDirective } from './render-empty.directive';
12
+ import { isRawRendering } from './rendering';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../jss-component-factory.service";
15
+ import * as i2 from "@angular/router";
16
+ import * as i3 from "@angular/common";
17
+ /**
18
+ * @param {ComponentRendering} rendering
19
+ * @param {string} name
20
+ */
21
+ function getPlaceholder(rendering, name) {
22
+ if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
23
+ return rendering.placeholders[name];
24
+ }
25
+ return null;
26
+ }
27
+ export class PlaceholderComponent {
28
+ constructor(differs, componentFactory, changeDetectorRef, elementRef, renderer, router, missingComponentComponent, hiddenRenderingComponent, guardResolver, dataResolver,
29
+ // eslint-disable-next-line @typescript-eslint/ban-types
30
+ platformId) {
31
+ this.differs = differs;
32
+ this.componentFactory = componentFactory;
33
+ this.changeDetectorRef = changeDetectorRef;
34
+ this.elementRef = elementRef;
35
+ this.renderer = renderer;
36
+ this.router = router;
37
+ this.missingComponentComponent = missingComponentComponent;
38
+ this.hiddenRenderingComponent = hiddenRenderingComponent;
39
+ this.guardResolver = guardResolver;
40
+ this.dataResolver = dataResolver;
41
+ this.platformId = platformId;
42
+ this.clientOnly = false;
43
+ this.loaded = new EventEmitter();
44
+ this.isLoading = true;
45
+ this._componentInstances = [];
46
+ this.destroyed = false;
47
+ this.parentStyleAttribute = '';
48
+ }
49
+ set inputs(value) {
50
+ this._inputs = value;
51
+ if (!this._differ && value) {
52
+ this._differ = this.differs.find(value).create();
53
+ }
54
+ }
55
+ ngOnInit() {
56
+ // just to ensure the element exists
57
+ const elem = this.elementRef.nativeElement;
58
+ if (elem) {
59
+ const attributes = elem.attributes;
60
+ for (let i = 0; i < attributes.length; i++) {
61
+ const attr = attributes.item(i);
62
+ if (attr && attr.name.indexOf('_ngcontent') !== -1) {
63
+ this.parentStyleAttribute = attr.name;
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ngOnDestroy() {
69
+ this.destroyed = true;
70
+ this._componentInstances = [];
71
+ }
72
+ ngOnChanges(changes) {
73
+ if (changes.rendering || changes.renderings) {
74
+ this._render();
75
+ }
76
+ }
77
+ ngDoCheck() {
78
+ if (!this._differ || !this._inputs || this._componentInstances.length === 0) {
79
+ return;
80
+ }
81
+ const changes = this._differ.diff(this._inputs);
82
+ if (!changes) {
83
+ return;
84
+ }
85
+ const updates = {};
86
+ changes.forEachRemovedItem((change) => (updates[change.key] = null));
87
+ changes.forEachAddedItem((change) => (updates[change.key] = change.currentValue));
88
+ changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
89
+ this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
90
+ }
91
+ _setComponentInputs(componentInstance, inputs) {
92
+ Object.entries(inputs).forEach(([input, inputValue]) => (componentInstance[input] = inputValue));
93
+ }
94
+ _subscribeComponentOutputs(componentInstance, outputs) {
95
+ Object.keys(outputs)
96
+ .filter((output) => componentInstance[output] && componentInstance[output] instanceof Observable)
97
+ .forEach((output) => componentInstance[output]
98
+ .pipe(takeWhile(() => !this.destroyed))
99
+ .subscribe(outputs[output]));
100
+ }
101
+ async _render() {
102
+ if (this.clientOnly && isPlatformServer(this.platformId)) {
103
+ return;
104
+ }
105
+ this._componentInstances = [];
106
+ this.view.clear();
107
+ if (!this.rendering && !this.renderings) {
108
+ return;
109
+ }
110
+ if (!this.name && !this.renderings) {
111
+ console.warn('Placeholder name was not specified, and explicit renderings array was not passed. Placeholder requires either name and rendering, or renderings.');
112
+ this.isLoading = false;
113
+ return;
114
+ }
115
+ const placeholder = this.renderings || getPlaceholder(this.rendering, this.name || '');
116
+ if (!placeholder) {
117
+ console.warn(`Placeholder '${this.name}' was not found in the current rendering data`, JSON.stringify(this.rendering, null, 2));
118
+ this.isLoading = false;
119
+ return;
120
+ }
121
+ // if the placeholder is empty (contains only raw renderings), then we may need to use the empty template if it's defined
122
+ const placeholderIsEmpty = placeholder.every((rendering) => isRawRendering(rendering));
123
+ if (this.renderEmptyTemplate && placeholderIsEmpty) {
124
+ this.view.createEmbeddedView(this.renderEmptyTemplate.templateRef, {
125
+ renderings: placeholder,
126
+ });
127
+ this.isLoading = false;
128
+ }
129
+ else {
130
+ const factories = await this.componentFactory.getComponents(placeholder);
131
+ try {
132
+ const nonGuarded = await this.guardResolver(factories);
133
+ const withData = await this.dataResolver(nonGuarded);
134
+ withData.forEach((rendering, index) => {
135
+ if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
136
+ this._renderTemplatedComponent(rendering.factory.componentDefinition, index);
137
+ }
138
+ else {
139
+ this._renderEmbeddedComponent(rendering.factory, rendering.data, index);
140
+ }
141
+ });
142
+ this.isLoading = false;
143
+ this.changeDetectorRef.markForCheck();
144
+ this.loaded.emit(this.name);
145
+ }
146
+ catch (e) {
147
+ this.isLoading = false;
148
+ if (e instanceof UrlTree) {
149
+ this.router.navigateByUrl(e);
150
+ }
151
+ else if (typeof e === 'string') {
152
+ this.router.navigate([e]);
153
+ }
154
+ else if (Array.isArray(e)) {
155
+ this.router.navigate(e);
156
+ }
157
+ else {
158
+ throw e;
159
+ }
160
+ }
161
+ }
162
+ }
163
+ _renderTemplatedComponent(rendering, index) {
164
+ // the render-each template takes care of all component mapping etc
165
+ // generally using <sc-render-component> which is about like _renderEmbeddedComponent()
166
+ // as a separate component
167
+ this.view.createEmbeddedView(this.renderEachTemplate.templateRef, {
168
+ rendering,
169
+ index,
170
+ });
171
+ }
172
+ _renderEmbeddedComponent(rendering, data, index) {
173
+ if (rendering.componentDefinition.componentName === HIDDEN_RENDERING_NAME) {
174
+ rendering.componentImplementation = this.hiddenRenderingComponent;
175
+ }
176
+ if (!rendering.componentImplementation) {
177
+ const componentName = rendering.componentDefinition.componentName;
178
178
  console.error(`Placeholder ${this.name} contains unknown component ${componentName}.`, `Ensure component is mapped, like:
179
179
  JssModule.withComponents([
180
180
  { name: '${componentName}', type: ${componentName}Component }
181
- ])`);
182
- rendering.componentImplementation = this.missingComponentComponent;
183
- }
184
- // apply the parent style attribute _ngcontent
185
- // work-around for https://github.com/angular/angular/issues/12215
186
- const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
187
- index: index,
188
- });
189
- if (this.parentStyleAttribute) {
190
- this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
191
- }
192
- const componentInstance = createdComponentRef.instance;
193
- componentInstance.rendering = rendering.componentDefinition;
194
- componentInstance.data = data;
195
- if (this._inputs) {
196
- this._setComponentInputs(componentInstance, this._inputs);
197
- }
198
- if (this.outputs) {
199
- this._subscribeComponentOutputs(componentInstance, this.outputs);
200
- }
201
- this._componentInstances.push(componentInstance);
202
- }
203
- }
204
- PlaceholderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
181
+ ])`);
182
+ rendering.componentImplementation = this.missingComponentComponent;
183
+ }
184
+ // apply the parent style attribute _ngcontent
185
+ // work-around for https://github.com/angular/angular/issues/12215
186
+ const createdComponentRef = this.view.createComponent(rendering.componentImplementation, {
187
+ index: index,
188
+ });
189
+ if (this.parentStyleAttribute) {
190
+ this.renderer.setAttribute(createdComponentRef.location.nativeElement, this.parentStyleAttribute, '');
191
+ }
192
+ const componentInstance = createdComponentRef.instance;
193
+ componentInstance.rendering = rendering.componentDefinition;
194
+ componentInstance.data = data;
195
+ if (this._inputs) {
196
+ this._setComponentInputs(componentInstance, this._inputs);
197
+ }
198
+ if (this.outputs) {
199
+ this._subscribeComponentOutputs(componentInstance, this.outputs);
200
+ }
201
+ this._componentInstances.push(componentInstance);
202
+ }
203
+ }
204
+ PlaceholderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.JssComponentFactoryService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Router }, { token: PLACEHOLDER_MISSING_COMPONENT_COMPONENT }, { token: PLACEHOLDER_HIDDEN_RENDERING_COMPONENT }, { token: GUARD_RESOLVER }, { token: DATA_RESOLVER }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
205
205
  PlaceholderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: PlaceholderComponent, selector: "sc-placeholder,[sc-placeholder]", inputs: { name: "name", rendering: "rendering", renderings: "renderings", outputs: "outputs", clientOnly: "clientOnly", inputs: "inputs" }, outputs: { loaded: "loaded" }, queries: [{ propertyName: "renderEachTemplate", first: true, predicate: RenderEachDirective, descendants: true, static: true }, { propertyName: "renderEmptyTemplate", first: true, predicate: RenderEmptyDirective, descendants: true, static: true }, { propertyName: "placeholderLoading", first: true, predicate: PlaceholderLoadingDirective, descendants: true, static: true }], viewQueries: [{ propertyName: "view", first: true, predicate: ["view"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
206
206
  <ng-template
207
207
  *ngIf="isLoading"
208
208
  [ngTemplateOutlet]="placeholderLoading?.templateRef"
209
209
  ></ng-template>
210
210
  <ng-template #view></ng-template>
211
- `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
212
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, decorators: [{
213
- type: Component,
214
- args: [{
215
- selector: 'sc-placeholder,[sc-placeholder]',
211
+ `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PlaceholderComponent, decorators: [{
213
+ type: Component,
214
+ args: [{
215
+ selector: 'sc-placeholder,[sc-placeholder]',
216
216
  template: `
217
217
  <ng-template
218
218
  *ngIf="isLoading"
219
219
  [ngTemplateOutlet]="placeholderLoading?.templateRef"
220
220
  ></ng-template>
221
221
  <ng-template #view></ng-template>
222
- `,
223
- }]
224
- }], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
225
- type: Inject,
226
- args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
227
- }] }, { type: i0.Type, decorators: [{
228
- type: Inject,
229
- args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
230
- }] }, { type: undefined, decorators: [{
231
- type: Inject,
232
- args: [GUARD_RESOLVER]
233
- }] }, { type: undefined, decorators: [{
234
- type: Inject,
235
- args: [DATA_RESOLVER]
236
- }] }, { type: Object, decorators: [{
237
- type: Inject,
238
- args: [PLATFORM_ID]
239
- }] }]; }, propDecorators: { name: [{
240
- type: Input
241
- }], rendering: [{
242
- type: Input
243
- }], renderings: [{
244
- type: Input
245
- }], outputs: [{
246
- type: Input
247
- }], clientOnly: [{
248
- type: Input
249
- }], loaded: [{
250
- type: Output
251
- }], renderEachTemplate: [{
252
- type: ContentChild,
253
- args: [RenderEachDirective, { static: true }]
254
- }], renderEmptyTemplate: [{
255
- type: ContentChild,
256
- args: [RenderEmptyDirective, { static: true }]
257
- }], placeholderLoading: [{
258
- type: ContentChild,
259
- args: [PlaceholderLoadingDirective, { static: true }]
260
- }], view: [{
261
- type: ViewChild,
262
- args: ['view', { read: ViewContainerRef, static: true }]
263
- }], inputs: [{
264
- type: Input
265
- }] } });
222
+ `,
223
+ }]
224
+ }], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.JssComponentFactoryService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Router }, { type: i0.Type, decorators: [{
225
+ type: Inject,
226
+ args: [PLACEHOLDER_MISSING_COMPONENT_COMPONENT]
227
+ }] }, { type: i0.Type, decorators: [{
228
+ type: Inject,
229
+ args: [PLACEHOLDER_HIDDEN_RENDERING_COMPONENT]
230
+ }] }, { type: undefined, decorators: [{
231
+ type: Inject,
232
+ args: [GUARD_RESOLVER]
233
+ }] }, { type: undefined, decorators: [{
234
+ type: Inject,
235
+ args: [DATA_RESOLVER]
236
+ }] }, { type: Object, decorators: [{
237
+ type: Inject,
238
+ args: [PLATFORM_ID]
239
+ }] }]; }, propDecorators: { name: [{
240
+ type: Input
241
+ }], rendering: [{
242
+ type: Input
243
+ }], renderings: [{
244
+ type: Input
245
+ }], outputs: [{
246
+ type: Input
247
+ }], clientOnly: [{
248
+ type: Input
249
+ }], loaded: [{
250
+ type: Output
251
+ }], renderEachTemplate: [{
252
+ type: ContentChild,
253
+ args: [RenderEachDirective, { static: true }]
254
+ }], renderEmptyTemplate: [{
255
+ type: ContentChild,
256
+ args: [RenderEmptyDirective, { static: true }]
257
+ }], placeholderLoading: [{
258
+ type: ContentChild,
259
+ args: [PlaceholderLoadingDirective, { static: true }]
260
+ }], view: [{
261
+ type: ViewChild,
262
+ args: ['view', { read: ViewContainerRef, static: true }]
263
+ }], inputs: [{
264
+ type: Input
265
+ }] } });
266
266
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGxhY2Vob2xkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFHWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFNTCxNQUFNLEVBQ04sV0FBVyxFQUlYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFRLE9BQU8sRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlFLE9BQU8sRUFFTCxhQUFhLEVBRWIsY0FBYyxFQUNkLHNDQUFzQyxFQUN0Qyx1Q0FBdUMsR0FDeEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQUU3Qzs7O0dBR0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxTQUE2QixFQUFFLElBQVk7SUFDakUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFN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LEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8tY29uZmxpY3RpbmctbGlmZWN5Y2xlICovXHJcbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgRG9DaGVjayxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgS2V5VmFsdWVEaWZmZXIsXHJcbiAgS2V5VmFsdWVEaWZmZXJzLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBQTEFURk9STV9JRCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBUeXBlLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhLCBVcmxUcmVlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJpbmcsIEh0bWxFbGVtZW50UmVuZGVyaW5nIH0gZnJvbSAnQHNpdGVjb3JlLWpzcy9zaXRlY29yZS1qc3MvbGF5b3V0JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc3VsdCxcclxuICBKc3NDb21wb25lbnRGYWN0b3J5U2VydmljZSxcclxufSBmcm9tICcuLi9qc3MtY29tcG9uZW50LWZhY3Rvcnkuc2VydmljZSc7XHJcbmltcG9ydCB7IEhJRERFTl9SRU5ERVJJTkdfTkFNRSB9IGZyb20gJy4vaGlkZGVuLXJlbmRlcmluZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQbGFjZWhvbGRlckxvYWRpbmdEaXJlY3RpdmUgfSBmcm9tICcuL3BsYWNlaG9sZGVyLWxvYWRpbmcuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtcclxuICBEYXRhUmVzb2x2ZXIsXHJcbiAgREFUQV9SRVNPTFZFUixcclxuICBHdWFyZFJlc29sdmVyLFxyXG4gIEdVQVJEX1JFU09MVkVSLFxyXG4gIFBMQUNFSE9MREVSX0hJRERFTl9SRU5ERVJJTkdfQ09NUE9ORU5ULFxyXG4gIFBMQUNFSE9MREVSX01JU1NJTkdfQ09NUE9ORU5UX0NPTVBPTkVOVCxcclxufSBmcm9tICcuL3BsYWNlaG9sZGVyLnRva2VuJztcclxuaW1wb3J0IHsgUmVuZGVyRWFjaERpcmVjdGl2ZSB9IGZyb20gJy4vcmVuZGVyLWVhY2guZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUmVuZGVyRW1wdHlEaXJlY3RpdmUgfSBmcm9tICcuL3JlbmRlci1lbXB0eS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBpc1Jhd1JlbmRlcmluZyB9IGZyb20gJy4vcmVuZGVyaW5nJztcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0NvbXBvbmVudFJlbmRlcmluZ30gcmVuZGVyaW5nXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRQbGFjZWhvbGRlcihyZW5kZXJpbmc6IENvbXBvbmVudFJlbmRlcmluZywgbmFtZTogc3RyaW5nKSB7XHJcbiAgaWYgKHJlbmRlcmluZyAmJiByZW5kZXJpbmcucGxhY2Vob2xkZXJzICYmIE9iamVjdC5rZXlzKHJlbmRlcmluZy5wbGFjZWhvbGRlcnMpLmxlbmd0aCA+IDApIHtcclxuICAgIHJldHVybiByZW5kZXJpbmcucGxhY2Vob2xkZXJzW25hbWVdO1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGYWN0b3J5V2l0aERhdGEge1xyXG4gIGZhY3Rvcnk6IENvbXBvbmVudEZhY3RvcnlSZXN1bHQ7XHJcbiAgZGF0YT86IERhdGE7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2MtcGxhY2Vob2xkZXIsW3NjLXBsYWNlaG9sZGVyXScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAqbmdJZj1cImlzTG9hZGluZ1wiXHJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyTG9hZGluZz8udGVtcGxhdGVSZWZcIlxyXG4gICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI3ZpZXc+PC9uZy10ZW1wbGF0ZT5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGxhY2Vob2xkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgRG9DaGVjaywgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBuYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlbmRlcmluZzogQ29tcG9uZW50UmVuZGVyaW5nO1xyXG4gIEBJbnB1dCgpIHJlbmRlcmluZ3M/OiBBcnJheTxDb21wb25lbnRSZW5kZXJpbmcgfCBIdG1sRWxlbWVudFJlbmRlcmluZz47XHJcbiAgQElucHV0KCkgb3V0cHV0czogeyBbazogc3RyaW5nXTogKGV2ZW50VHlwZTogdW5rbm93bikgPT4gdm9pZCB9O1xyXG4gIEBJbnB1dCgpIGNsaWVudE9ubHkgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xyXG5cclxuICBAQ29udGVudENoaWxkKFJlbmRlckVhY2hEaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIHJlbmRlckVhY2hUZW1wbGF0ZTogUmVuZGVyRWFjaERpcmVjdGl2ZTtcclxuICBAQ29udGVudENoaWxkKFJlbmRlckVtcHR5RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSByZW5kZXJFbXB0eVRlbXBsYXRlOiBSZW5kZXJFbXB0eURpcmVjdGl2ZTtcclxuICBAQ29udGVudENoaWxkKFBsYWNlaG9sZGVyTG9hZGluZ0RpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwbGFjZWhvbGRlckxvYWRpbmc/OiBQbGFjZWhvbGRlckxvYWRpbmdEaXJlY3RpdmU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpZXcnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHZpZXc6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9pbnB1dHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xyXG4gIHByaXZhdGUgX2RpZmZlcjogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCB1bmtub3duPjtcclxuICBwcml2YXRlIF9jb21wb25lbnRJbnN0YW5jZXM6IHsgW3Byb3A6IHN0cmluZ106IHVua25vd24gfVtdID0gW107XHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIHBhcmVudFN0eWxlQXR0cmlidXRlID0gJyc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3Rvcnk6IEpzc0NvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgQEluamVjdChQTEFDRUhPTERFUl9NSVNTSU5HX0NPTVBPTkVOVF9DT01QT05FTlQpXHJcbiAgICBwcml2YXRlIG1pc3NpbmdDb21wb25lbnRDb21wb25lbnQ6IFR5cGU8dW5rbm93bj4sXHJcbiAgICBASW5qZWN0KFBMQUNFSE9MREVSX0hJRERFTl9SRU5ERVJJTkdfQ09NUE9ORU5UKSBwcml2YXRlIGhpZGRlblJlbmRlcmluZ0NvbXBvbmVudDogVHlwZTx1bmtub3duPixcclxuICAgIEBJbmplY3QoR1VBUkRfUkVTT0xWRVIpIHByaXZhdGUgZ3VhcmRSZXNvbHZlcjogR3VhcmRSZXNvbHZlcixcclxuICAgIEBJbmplY3QoREFUQV9SRVNPTFZFUikgcHJpdmF0ZSBkYXRhUmVzb2x2ZXI6IERhdGFSZXNvbHZlcixcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdFxyXG4gICkge31cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgaW5wdXRzKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xyXG4gICAgdGhpcy5faW5wdXRzID0gdmFsdWU7XHJcbiAgICBpZiAoIXRoaXMuX2RpZmZlciAmJiB2YWx1ZSkge1xyXG4gICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIGp1c3QgdG8gZW5zdXJlIHRoZSBlbGVtZW50IGV4aXN0c1xyXG4gICAgY29uc3QgZWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGlmIChlbGVtKSB7XHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCA9IGVsZW0uYXR0cmlidXRlcztcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYXR0cjogQXR0ciB8IG51bGwgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7XHJcbiAgICAgICAgaWYgKGF0dHIgJiYgYXR0ci5uYW1lLmluZGV4T2YoJ19uZ2NvbnRlbnQnKSAhPT0gLTEpIHtcclxuICAgICAgICAgIHRoaXMucGFyZW50U3R5bGVBdHRyaWJ1dGUgPSBhdHRyLm5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucmVuZGVyaW5nIHx8IGNoYW5nZXMucmVuZGVyaW5ncykge1xyXG4gICAgICB0aGlzLl9yZW5kZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpIHtcclxuICAgIGlmICghdGhpcy5fZGlmZmVyIHx8ICF0aGlzLl9pbnB1dHMgfHwgdGhpcy5fY29tcG9uZW50SW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX2lucHV0cyk7XHJcbiAgICBpZiAoIWNoYW5nZXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXBkYXRlczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcclxuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChjaGFuZ2UpID0+ICh1cGRhdGVzW2NoYW5nZS5rZXldID0gbnVsbCkpO1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChjaGFuZ2UpID0+ICh1cGRhdGVzW2NoYW5nZS5rZXldID0gY2hhbmdlLmN1cnJlbnRWYWx1ZSkpO1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oKGNoYW5nZSkgPT4gKHVwZGF0ZXNbY2hhbmdlLmtleV0gPSBjaGFuZ2UuY3VycmVudFZhbHVlKSk7XHJcbiAgICB0aGlzLl9jb21wb25lbnRJbnN0YW5jZXMuZm9yRWFjaCgoY29tcG9uZW50SW5zdGFuY2UpID0+XHJcbiAgICAgIHRoaXMuX3NldENvbXBvbmVudElucHV0cyhjb21wb25lbnRJbnN0YW5jZSwgdXBkYXRlcylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRDb21wb25lbnRJbnB1dHMoXHJcbiAgICBjb21wb25lbnRJbnN0YW5jZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sXHJcbiAgICBpbnB1dHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9XHJcbiAgKSB7XHJcbiAgICBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZvckVhY2goXHJcbiAgICAgIChbaW5wdXQsIGlucHV0VmFsdWVdKSA9PiAoY29tcG9uZW50SW5zdGFuY2VbaW5wdXRdID0gaW5wdXRWYWx1ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdWJzY3JpYmVDb21wb25lbnRPdXRwdXRzKFxyXG4gICAgY29tcG9uZW50SW5zdGFuY2U6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LFxyXG4gICAgb3V0cHV0czogeyBbazogc3RyaW5nXTogKGV2ZW50VHlwZTogdW5rbm93bikgPT4gdm9pZCB9XHJcbiAgKSB7XHJcbiAgICBPYmplY3Qua2V5cyhvdXRwdXRzKVxyXG4gICAgICAuZmlsdGVyKFxyXG4gICAgICAgIChvdXRwdXQpID0+IGNvbXBvbmVudEluc3RhbmNlW291dHB1dF0gJiYgY29tcG9uZW50SW5zdGFuY2Vbb3V0cHV0XSBpbnN0YW5jZW9mIE9ic2VydmFibGVcclxuICAgICAgKVxyXG4gICAgICAuZm9yRWFjaCgob3V0cHV0KSA9PlxyXG4gICAgICAgIChjb21wb25lbnRJbnN0YW5jZVtvdXRwdXRdIGFzIE9ic2VydmFibGU8dW5rbm93bj4pXHJcbiAgICAgICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gIXRoaXMuZGVzdHJveWVkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUob3V0cHV0c1tvdXRwdXRdKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuY2xpZW50T25seSAmJiBpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2NvbXBvbmVudEluc3RhbmNlcyA9IFtdO1xyXG4gICAgdGhpcy52aWV3LmNsZWFyKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmluZyAmJiAhdGhpcy5yZW5kZXJpbmdzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMubmFtZSAmJiAhdGhpcy5yZW5kZXJpbmdzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAnUGxhY2Vob2xkZXIgbmFtZSB3YXMgbm90IHNwZWNpZmllZCwgYW5kIGV4cGxpY2l0IHJlbmRlcmluZ3MgYXJyYXkgd2FzIG5vdCBwYXNzZWQuIFBsYWNlaG9sZGVyIHJlcXVpcmVzIGVpdGhlciBuYW1lIGFuZCByZW5kZXJpbmcsIG9yIHJlbmRlcmluZ3MuJ1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnJlbmRlcmluZ3MgfHwgZ2V0UGxhY2Vob2xkZXIodGhpcy5yZW5kZXJpbmcsIHRoaXMubmFtZSB8fCAnJyk7XHJcblxyXG4gICAgaWYgKCFwbGFjZWhvbGRlcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFBsYWNlaG9sZGVyICcke3RoaXMubmFtZX0nIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGRhdGFgLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucmVuZGVyaW5nLCBudWxsLCAyKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgdGhlIHBsYWNlaG9sZGVyIGlzIGVtcHR5IChjb250YWlucyBvbmx5IHJhdyByZW5kZXJpbmdzKSwgdGhlbiB3ZSBtYXkgbmVlZCB0byB1c2UgdGhlIGVtcHR5IHRlbXBsYXRlIGlmIGl0J3MgZGVmaW5lZFxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJJc0VtcHR5ID0gcGxhY2Vob2xkZXIuZXZlcnkoXHJcbiAgICAgIChyZW5kZXJpbmc6IENvbXBvbmVudFJlbmRlcmluZyB8IEh0bWxFbGVtZW50UmVuZGVyaW5nKSA9PiBpc1Jhd1JlbmRlcmluZyhyZW5kZXJpbmcpXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLnJlbmRlckVtcHR5VGVtcGxhdGUgJiYgcGxhY2Vob2xkZXJJc0VtcHR5KSB7XHJcbiAgICAgIHRoaXMudmlldy5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5yZW5kZXJFbXB0eVRlbXBsYXRlLnRlbXBsYXRlUmVmLCB7XHJcbiAgICAgICAgcmVuZGVyaW5nczogcGxhY2Vob2xkZXIsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5jb21wb25lbnRGYWN0b3J5LmdldENvbXBvbmVudHMocGxhY2Vob2xkZXIpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBub25HdWFyZGVkID0gYXdhaXQgdGhpcy5ndWFyZFJlc29sdmVyKGZhY3Rvcmllcyk7XHJcbiAgICAgICAgY29uc3Qgd2l0aERhdGEgPSBhd2FpdCB0aGlzLmRhdGFSZXNvbHZlcihub25HdWFyZGVkKTtcclxuXHJcbiAgICAgICAgd2l0aERhdGEuZm9yRWFjaCgocmVuZGVyaW5nLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMucmVuZGVyRWFjaFRlbXBsYXRlICYmICFpc1Jhd1JlbmRlcmluZyhyZW5kZXJpbmcuZmFjdG9yeS5jb21wb25lbnREZWZpbml0aW9uKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUZW1wbGF0ZWRDb21wb25lbnQocmVuZGVyaW5nLmZhY3RvcnkuY29tcG9uZW50RGVmaW5pdGlvbiwgaW5kZXgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyRW1iZWRkZWRDb21wb25lbnQocmVuZGVyaW5nLmZhY3RvcnksIHJlbmRlcmluZy5kYXRhLCBpbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLmxvYWRlZC5lbWl0KHRoaXMubmFtZSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVXJsVHJlZSkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2VdKTtcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyVGVtcGxhdGVkQ29tcG9uZW50KFxyXG4gICAgcmVuZGVyaW5nOiBDb21wb25lbnRSZW5kZXJpbmcgfCBIdG1sRWxlbWVudFJlbmRlcmluZyxcclxuICAgIGluZGV4OiBudW1iZXJcclxuICApIHtcclxuICAgIC8vIHRoZSByZW5kZXItZWFjaCB0ZW1wbGF0ZSB0YWtlcyBjYXJlIG9mIGFsbCBjb21wb25lbnQgbWFwcGluZyBldGNcclxuICAgIC8vIGdlbmVyYWxseSB1c2luZyA8c2MtcmVuZGVyLWNvbXBvbmVudD4gd2hpY2ggaXMgYWJvdXQgbGlrZSBfcmVuZGVyRW1iZWRkZWRDb21wb25lbnQoKVxyXG4gICAgLy8gYXMgYSBzZXBhcmF0ZSBjb21wb25lbnRcclxuICAgIHRoaXMudmlldy5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5yZW5kZXJFYWNoVGVtcGxhdGUudGVtcGxhdGVSZWYsIHtcclxuICAgICAgcmVuZGVyaW5nLFxyXG4gICAgICBpbmRleCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyRW1iZWRkZWRDb21wb25lbnQocmVuZGVyaW5nOiBDb21wb25lbnRGYWN0b3J5UmVzdWx0LCBkYXRhOiBEYXRhLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChyZW5kZXJpbmcuY29tcG9uZW50RGVmaW5pdGlvbiBhcyBDb21wb25lbnRSZW5kZXJpbmcpLmNvbXBvbmVudE5hbWUgPT09IEhJRERFTl9SRU5ERVJJTkdfTkFNRVxyXG4gICAgKSB7XHJcbiAgICAgIHJlbmRlcmluZy5jb21wb25lbnRJbXBsZW1lbnRhdGlvbiA9IHRoaXMuaGlkZGVuUmVuZGVyaW5nQ29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVuZGVyaW5nLmNvbXBvbmVudEltcGxlbWVudGF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAocmVuZGVyaW5nLmNvbXBvbmVudERlZmluaXRpb24gYXMgQ29tcG9uZW50UmVuZGVyaW5nKS5jb21wb25lbnROYW1lO1xyXG4gICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgIGBQbGFjZWhvbGRlciAke3RoaXMubmFtZX0gY29udGFpbnMgdW5rbm93biBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfS5gLFxyXG4gICAgICAgIGBFbnN1cmUgY29tcG9uZW50IGlzIG1hcHBlZCwgbGlrZTpcclxuICAgICAgICBKc3NNb2R1bGUud2l0aENvbXBvbmVudHMoW1xyXG4gICAgICAgICAgeyBuYW1lOiAnJHtjb21wb25lbnROYW1lfScsIHR5cGU6ICR7Y29tcG9uZW50TmFtZX1Db21wb25lbnQgfVxyXG4gICAgICAgIF0pYFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcmVuZGVyaW5nLmNvbXBvbmVudEltcGxlbWVudGF0aW9uID0gdGhpcy5taXNzaW5nQ29tcG9uZW50Q29tcG9uZW50O1xyXG4gICAgfVxyXG4gICAgLy8gYXBwbHkgdGhlIHBhcmVudCBzdHlsZSBhdHRyaWJ1dGUgX25nY29udGVudFxyXG4gICAgLy8gd29yay1hcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEyMjE1XHJcbiAgICBjb25zdCBjcmVhdGVkQ29tcG9uZW50UmVmID0gdGhpcy52aWV3LmNyZWF0ZUNvbXBvbmVudChyZW5kZXJpbmcuY29tcG9uZW50SW1wbGVtZW50YXRpb24sIHtcclxuICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5wYXJlbnRTdHlsZUF0dHJpYnV0ZSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcclxuICAgICAgICBjcmVhdGVkQ29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgdGhpcy5wYXJlbnRTdHlsZUF0dHJpYnV0ZSxcclxuICAgICAgICAnJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlZENvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICAgIGNvbXBvbmVudEluc3RhbmNlLnJlbmRlcmluZyA9IHJlbmRlcmluZy5jb21wb25lbnREZWZpbml0aW9uO1xyXG4gICAgY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IGRhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lucHV0cykge1xyXG4gICAgICB0aGlzLl9zZXRDb21wb25lbnRJbnB1dHMoY29tcG9uZW50SW5zdGFuY2UsIHRoaXMuX2lucHV0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vdXRwdXRzKSB7XHJcbiAgICAgIHRoaXMuX3N1YnNjcmliZUNvbXBvbmVudE91dHB1dHMoY29tcG9uZW50SW5zdGFuY2UsIHRoaXMub3V0cHV0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jb21wb25lbnRJbnN0YW5jZXMucHVzaChjb21wb25lbnRJbnN0YW5jZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==