slate-angular 1.6.5 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,19 +2,28 @@ import { ChangeDetectionStrategy, Component } from "@angular/core";
2
2
  import { BaseLeafComponent } from "../../view/base";
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "../string/string.component";
5
+ import * as i2 from "@angular/common";
5
6
  export class SlateDefaultLeafComponent extends BaseLeafComponent {
6
7
  }
7
8
  SlateDefaultLeafComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8
- SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `<span slateString [context]="context" [viewContext]="viewContext"><span>`, isInline: true, components: [{ type: i1.SlateStringComponent, selector: "span[slateString]", inputs: ["context"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9
+ SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `
10
+ <ng-container *ngIf="context.leaf['placeholder']">
11
+ <span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
12
+ </ng-container>
13
+ <span slateString [context]="context" [viewContext]="viewContext"><span>`, isInline: true, components: [{ type: i1.SlateStringComponent, selector: "span[slateString]", inputs: ["context"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9
14
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, decorators: [{
10
15
  type: Component,
11
16
  args: [{
12
17
  selector: 'span[slateDefaultLeaf]',
13
- template: `<span slateString [context]="context" [viewContext]="viewContext"><span>`,
18
+ template: `
19
+ <ng-container *ngIf="context.leaf['placeholder']">
20
+ <span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
21
+ </ng-container>
22
+ <span slateString [context]="context" [viewContext]="viewContext"><span>`,
14
23
  changeDetection: ChangeDetectionStrategy.OnPush,
15
24
  host: {
16
25
  'data-slate-leaf': 'true'
17
26
  }
18
27
  }]
19
28
  }] });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1sZWFmLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9jb21wb25lbnRzL2xlYWYvZGVmYXVsdC1sZWFmLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFVcEQsTUFBTSxPQUFPLHlCQUEwQixTQUFRLGlCQUFpQjs7c0hBQW5ELHlCQUF5QjswR0FBekIseUJBQXlCLDBJQU54QiwwRUFBMEU7MkZBTTNFLHlCQUF5QjtrQkFSckMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxRQUFRLEVBQUUsMEVBQTBFO29CQUNwRixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsSUFBSSxFQUFFO3dCQUNGLGlCQUFpQixFQUFFLE1BQU07cUJBQzVCO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJhc2VMZWFmQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3ZpZXcvYmFzZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NwYW5bc2xhdGVEZWZhdWx0TGVhZl0nLFxuICAgIHRlbXBsYXRlOiBgPHNwYW4gc2xhdGVTdHJpbmcgW2NvbnRleHRdPVwiY29udGV4dFwiIFt2aWV3Q29udGV4dF09XCJ2aWV3Q29udGV4dFwiPjxzcGFuPmAsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICAnZGF0YS1zbGF0ZS1sZWFmJzogJ3RydWUnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBTbGF0ZURlZmF1bHRMZWFmQ29tcG9uZW50IGV4dGVuZHMgQmFzZUxlYWZDb21wb25lbnQge1xufSJdfQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1sZWFmLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9jb21wb25lbnRzL2xlYWYvZGVmYXVsdC1sZWFmLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBY3BELE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxpQkFBaUI7O3NIQUFuRCx5QkFBeUI7MEdBQXpCLHlCQUF5QiwwSUFWeEI7Ozs7aUZBSW1FOzJGQU1wRSx5QkFBeUI7a0JBWnJDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFOzs7O2lGQUltRTtvQkFDN0UsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLElBQUksRUFBRTt3QkFDRixpQkFBaUIsRUFBRSxNQUFNO3FCQUM1QjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCYXNlTGVhZkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi92aWV3L2Jhc2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzcGFuW3NsYXRlRGVmYXVsdExlYWZdJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dC5sZWFmWydwbGFjZWhvbGRlciddXCI+XG4gICAgICAgICAgICA8c3BhbiBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiIGRhdGEtc2xhdGUtcGxhY2Vob2xkZXI9XCJ0cnVlXCIgc2xhdGUtcGxhY2Vob2xkZXI9XCJ0cnVlXCI+e3tjb250ZXh0LmxlYWZbJ3BsYWNlaG9sZGVyJ119fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxzcGFuIHNsYXRlU3RyaW5nIFtjb250ZXh0XT1cImNvbnRleHRcIiBbdmlld0NvbnRleHRdPVwidmlld0NvbnRleHRcIj48c3Bhbj5gLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ2RhdGEtc2xhdGUtbGVhZic6ICd0cnVlJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgU2xhdGVEZWZhdWx0TGVhZkNvbXBvbmVudCBleHRlbmRzIEJhc2VMZWFmQ29tcG9uZW50IHtcbn0iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3NyYy90eXBlcy9mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlUmFuZ2UgfSBmcm9tIFwic2xhdGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTbGF0ZVBsYWNlaG9sZGVyIGV4dGVuZHMgQmFzZVJhbmdlIHtcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbn1cbiJdfQ==
@@ -1,3 +1,4 @@
1
1
  export * from './error';
2
2
  export * from './view';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vdmlldyc7Il19
3
+ export * from './feature';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vdmlldyc7XG5leHBvcnQgKiBmcm9tICcuL2ZlYXR1cmUnO1xuIl19
@@ -18,7 +18,6 @@ export class ViewContainer {
18
18
  // first diff
19
19
  differ.diff(this.childrenComponent);
20
20
  const parentElement = this.elementRef.nativeElement.parentElement;
21
- let firstChildComponent = this.childrenComponent.first;
22
21
  if (this.childrenComponent.length > 0) {
23
22
  parentElement.insertBefore(this.createFragment(), this.elementRef.nativeElement);
24
23
  this.elementRef.nativeElement.remove();
@@ -26,41 +25,15 @@ export class ViewContainer {
26
25
  this.childrenComponent.changes.subscribe((value) => {
27
26
  const iterableChanges = differ.diff(this.childrenComponent);
28
27
  if (iterableChanges) {
29
- iterableChanges.forEachAddedItem((record) => {
30
- // first insert
31
- if (this.elementRef.nativeElement.parentElement && this.elementRef.nativeElement.parentElement === parentElement) {
32
- const fragment = document.createDocumentFragment();
33
- fragment.append(...record.item.rootNodes);
34
- parentElement.insertBefore(fragment, this.elementRef.nativeElement);
35
- this.elementRef.nativeElement.remove();
28
+ iterableChanges.forEachOperation((record, previousIndex, currentIndex) => {
29
+ // removed
30
+ if (currentIndex === null) {
36
31
  return;
37
32
  }
38
- // insert at start location
39
- if (record.currentIndex === 0 && firstChildComponent) {
40
- const fragment = document.createDocumentFragment();
41
- fragment.append(...record.item.rootNodes);
42
- parentElement.prepend(fragment);
43
- }
44
- else {
45
- // insert afterend of previous component end
46
- let previousRootNode = this.getPreviousRootNode(record.currentIndex);
47
- if (previousRootNode) {
48
- record.item.rootNodes.forEach((rootNode) => {
49
- previousRootNode.insertAdjacentElement('afterend', rootNode);
50
- previousRootNode = rootNode;
51
- });
52
- }
53
- else {
54
- this.viewContext.editor.onError({
55
- code: SlateErrorCode.NotFoundPreviousRootNodeError,
56
- name: 'not found previous rootNode',
57
- nativeError: null
58
- });
59
- }
60
- }
33
+ // added or moved
34
+ this.handleContainerItemChange(record, parentElement);
61
35
  });
62
36
  }
63
- firstChildComponent = this.childrenComponent.first;
64
37
  });
65
38
  }
66
39
  getPreviousRootNode(currentIndex) {
@@ -83,6 +56,39 @@ export class ViewContainer {
83
56
  });
84
57
  return fragment;
85
58
  }
59
+ handleContainerItemChange(record, parentElement) {
60
+ // first insert
61
+ if (this.elementRef.nativeElement.parentElement && this.elementRef.nativeElement.parentElement === parentElement) {
62
+ const fragment = document.createDocumentFragment();
63
+ fragment.append(...record.item.rootNodes);
64
+ parentElement.insertBefore(fragment, this.elementRef.nativeElement);
65
+ this.elementRef.nativeElement.remove();
66
+ return;
67
+ }
68
+ // insert at start location
69
+ if (record.currentIndex === 0) {
70
+ const fragment = document.createDocumentFragment();
71
+ fragment.append(...record.item.rootNodes);
72
+ parentElement.prepend(fragment);
73
+ }
74
+ else {
75
+ // insert afterend of previous component end
76
+ let previousRootNode = this.getPreviousRootNode(record.currentIndex);
77
+ if (previousRootNode) {
78
+ record.item.rootNodes.forEach((rootNode) => {
79
+ previousRootNode.insertAdjacentElement('afterend', rootNode);
80
+ previousRootNode = rootNode;
81
+ });
82
+ }
83
+ else {
84
+ this.viewContext.editor.onError({
85
+ code: SlateErrorCode.NotFoundPreviousRootNodeError,
86
+ name: 'not found previous rootNode',
87
+ nativeError: null
88
+ });
89
+ }
90
+ }
91
+ }
86
92
  }
87
93
  ViewContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: ViewContainer, deps: [{ token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive });
88
94
  ViewContainer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.7", type: ViewContainer, inputs: { viewContext: "viewContext" }, ngImport: i0 });
@@ -91,4 +97,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImpor
91
97
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.IterableDiffers }]; }, propDecorators: { viewContext: [{
92
98
  type: Input
93
99
  }] } });
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvc3JjL3ZpZXcvY29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBb0QsTUFBTSxlQUFlLENBQUM7QUFHOUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUVoRDs7OztHQUlHO0FBRUgsTUFBTSxPQUFnQixhQUFhO0lBSy9CLFlBQXNCLFVBQTJCLEVBQ25DLE9BQXdCO1FBRGhCLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQ25DLFlBQU8sR0FBUCxPQUFPLENBQWlCO0lBQ3RDLENBQUM7SUFFRCxlQUFlO1FBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzVFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUMvRSxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQzFDO1FB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QWM7UUFDVixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hELFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDOzswR0EvRWlCLGFBQWE7OEZBQWIsYUFBYTsyRkFBYixhQUFhO2tCQURsQyxTQUFTOytIQUlHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBJdGVyYWJsZUNoYW5nZVJlY29yZCwgSXRlcmFibGVEaWZmZXJzLCBRdWVyeUxpc3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU2xhdGVWaWV3Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB7IFZpZXdDb250YWluZXJJdGVtIH0gZnJvbSBcIi4vY29udGFpbmVyLWl0ZW1cIjtcbmltcG9ydCB7IFNsYXRlRXJyb3JDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9yXCI7XG5cbi8qKlxuICogdGhlIHNlcGNpYWwgY29udGFpbmVyIGZvciBhbmd1bGFyIHRlbXBsYXRlXG4gKiBBZGQgdGhlIHJvb3ROb2RlcyBvZiBlYWNoIGNoaWxkIGNvbXBvbmVudCB0byB0aGUgcGFyZW50RWxlbWVudFxuICogUmVtb3ZlIHVzZWxlc3MgRE9NIGVsZW1lbnRzLCBlZzogY29tbWVudC4uLlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWaWV3Q29udGFpbmVyPFQgZXh0ZW5kcyBWaWV3Q29udGFpbmVySXRlbT4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBhYnN0cmFjdCBjaGlsZHJlbkNvbXBvbmVudDogUXVlcnlMaXN0PFQ+O1xuXG4gICAgQElucHV0KCkgdmlld0NvbnRleHQ6IFNsYXRlVmlld0NvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZjxhbnk+LFxuICAgICAgICBwcm90ZWN0ZWQgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzKSB7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBjb25zdCBkaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh0aGlzLmNoaWxkcmVuQ29tcG9uZW50KS5jcmVhdGUoKGluZGV4LCBpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpcnN0IGRpZmZcbiAgICAgICAgZGlmZmVyLmRpZmYodGhpcy5jaGlsZHJlbkNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgbGV0IGZpcnN0Q2hpbGRDb21wb25lbnQgPSB0aGlzLmNoaWxkcmVuQ29tcG9uZW50LmZpcnN0O1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbkNvbXBvbmVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLmNyZWF0ZUZyYWdtZW50KCksIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hpbGRyZW5Db21wb25lbnQuY2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVyYWJsZUNoYW5nZXMgPSBkaWZmZXIuZGlmZih0aGlzLmNoaWxkcmVuQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGlmIChpdGVyYWJsZUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBpdGVyYWJsZUNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxUPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBpbnNlcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gcGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoLi4ucmVjb3JkLml0ZW0ucm9vdE5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYXQgc3RhcnQgbG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggPT09IDAgJiYgZmlyc3RDaGlsZENvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoLi4ucmVjb3JkLml0ZW0ucm9vdE5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQucHJlcGVuZChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYWZ0ZXJlbmQgb2YgcHJldmlvdXMgY29tcG9uZW50IGVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzUm9vdE5vZGUgPSB0aGlzLmdldFByZXZpb3VzUm9vdE5vZGUocmVjb3JkLmN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNSb290Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5pdGVtLnJvb3ROb2Rlcy5mb3JFYWNoKChyb290Tm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Jvb3ROb2RlLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCByb290Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUm9vdE5vZGUgPSByb290Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGV4dC5lZGl0b3Iub25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFNsYXRlRXJyb3JDb2RlLk5vdEZvdW5kUHJldmlvdXNSb290Tm9kZUVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbm90IGZvdW5kIHByZXZpb3VzIHJvb3ROb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXJyb3I6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdENoaWxkQ29tcG9uZW50ID0gdGhpcy5jaGlsZHJlbkNvbXBvbmVudC5maXJzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UHJldmlvdXNSb290Tm9kZShjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmlvdXNDb21wb25lbnQgPSB0aGlzLmNoaWxkcmVuQ29tcG9uZW50LmZpbmQoKGl0ZW0sIGluZGV4KSA9PiBpbmRleCA9PT0gY3VycmVudEluZGV4IC0gMSk7XG4gICAgICAgIGxldCBwcmV2aW91c1Jvb3ROb2RlID0gcHJldmlvdXNDb21wb25lbnQucm9vdE5vZGVzW3ByZXZpb3VzQ29tcG9uZW50LnJvb3ROb2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHByZXZpb3VzUm9vdE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1Jvb3ROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJldmlvdXNSb290Tm9kZShjdXJyZW50SW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUZyYWdtZW50KCkge1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbkNvbXBvbmVudC5mb3JFYWNoKChjb21wb25lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoLi4uY29tcG9uZW50LnJvb3ROb2Rlcyk7XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICB9XG59Il19
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvc3JjL3ZpZXcvY29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBb0QsTUFBTSxlQUFlLENBQUM7QUFHOUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUVoRDs7OztHQUlHO0FBRUgsTUFBTSxPQUFnQixhQUFhO0lBSy9CLFlBQXNCLFVBQTJCLEVBQ25DLE9BQXdCO1FBRGhCLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQ25DLFlBQU8sR0FBUCxPQUFPLENBQWlCO0lBQ3RDLENBQUM7SUFFRCxlQUFlO1FBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzVFLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUMvRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUss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RTtvQkFDdkMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUM3RCxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDO2FBQ047aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUM1QixJQUFJLEVBQUUsY0FBYyxDQUFDLDZCQUE2QjtvQkFDbEQsSUFBSSxFQUFFLDZCQUE2QjtvQkFDbkMsV0FBVyxFQUFFLElBQUk7aUJBQ3BCLENBQUMsQ0FBQTthQUNMO1NBQ0o7SUFDTCxDQUFDOzswR0F0RmlCLGFBQWE7OEZBQWIsYUFBYTsyRkFBYixhQUFhO2tCQURsQyxTQUFTOytIQUlHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBJdGVyYWJsZUNoYW5nZVJlY29yZCwgSXRlcmFibGVEaWZmZXJzLCBRdWVyeUxpc3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU2xhdGVWaWV3Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB7IFZpZXdDb250YWluZXJJdGVtIH0gZnJvbSBcIi4vY29udGFpbmVyLWl0ZW1cIjtcbmltcG9ydCB7IFNsYXRlRXJyb3JDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9yXCI7XG5cbi8qKlxuICogdGhlIHNlcGNpYWwgY29udGFpbmVyIGZvciBhbmd1bGFyIHRlbXBsYXRlXG4gKiBBZGQgdGhlIHJvb3ROb2RlcyBvZiBlYWNoIGNoaWxkIGNvbXBvbmVudCB0byB0aGUgcGFyZW50RWxlbWVudFxuICogUmVtb3ZlIHVzZWxlc3MgRE9NIGVsZW1lbnRzLCBlZzogY29tbWVudC4uLlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWaWV3Q29udGFpbmVyPFQgZXh0ZW5kcyBWaWV3Q29udGFpbmVySXRlbT4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBhYnN0cmFjdCBjaGlsZHJlbkNvbXBvbmVudDogUXVlcnlMaXN0PFQ+O1xuXG4gICAgQElucHV0KCkgdmlld0NvbnRleHQ6IFNsYXRlVmlld0NvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZjxhbnk+LFxuICAgICAgICBwcm90ZWN0ZWQgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzKSB7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBjb25zdCBkaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh0aGlzLmNoaWxkcmVuQ29tcG9uZW50KS5jcmVhdGUoKGluZGV4LCBpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpcnN0IGRpZmZcbiAgICAgICAgZGlmZmVyLmRpZmYodGhpcy5jaGlsZHJlbkNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5Db21wb25lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5jcmVhdGVGcmFnbWVudCgpLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuQ29tcG9uZW50LmNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlcmFibGVDaGFuZ2VzID0gZGlmZmVyLmRpZmYodGhpcy5jaGlsZHJlbkNvbXBvbmVudCk7XG4gICAgICAgICAgICBpZiAoaXRlcmFibGVDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgaXRlcmFibGVDaGFuZ2VzLmZvckVhY2hPcGVyYXRpb24oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8VD4sIHByZXZpb3VzSW5kZXg6IE51bWJlciwgY3VycmVudEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgb3IgbW92ZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb250YWluZXJJdGVtQ2hhbmdlKHJlY29yZCwgcGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFByZXZpb3VzUm9vdE5vZGUoY3VycmVudEluZGV4KSB7XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ29tcG9uZW50ID0gdGhpcy5jaGlsZHJlbkNvbXBvbmVudC5maW5kKChpdGVtLCBpbmRleCkgPT4gaW5kZXggPT09IGN1cnJlbnRJbmRleCAtIDEpO1xuICAgICAgICBsZXQgcHJldmlvdXNSb290Tm9kZSA9IHByZXZpb3VzQ29tcG9uZW50LnJvb3ROb2Rlc1twcmV2aW91c0NvbXBvbmVudC5yb290Tm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChwcmV2aW91c1Jvb3ROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNSb290Tm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFByZXZpb3VzUm9vdE5vZGUoY3VycmVudEluZGV4IC0gMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVGcmFnbWVudCgpIHtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5Db21wb25lbnQuZm9yRWFjaCgoY29tcG9uZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kKC4uLmNvbXBvbmVudC5yb290Tm9kZXMpO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgfVxuXG4gICAgaGFuZGxlQ29udGFpbmVySXRlbUNoYW5nZShyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPFQ+LCBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBmaXJzdCBpbnNlcnRcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gcGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoLi4ucmVjb3JkLml0ZW0ucm9vdE5vZGVzKTtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGZyYWdtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnNlcnQgYXQgc3RhcnQgbG9jYXRpb25cbiAgICAgICAgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kKC4uLnJlY29yZC5pdGVtLnJvb3ROb2Rlcyk7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LnByZXBlbmQoZnJhZ21lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5zZXJ0IGFmdGVyZW5kIG9mIHByZXZpb3VzIGNvbXBvbmVudCBlbmRcbiAgICAgICAgICAgIGxldCBwcmV2aW91c1Jvb3ROb2RlID0gdGhpcy5nZXRQcmV2aW91c1Jvb3ROb2RlKHJlY29yZC5jdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzUm9vdE5vZGUpIHtcbiAgICAgICAgICAgICAgICByZWNvcmQuaXRlbS5yb290Tm9kZXMuZm9yRWFjaCgocm9vdE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSb290Tm9kZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgcm9vdE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Jvb3ROb2RlID0gcm9vdE5vZGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQuZWRpdG9yLm9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBTbGF0ZUVycm9yQ29kZS5Ob3RGb3VuZFByZXZpb3VzUm9vdE5vZGVFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ25vdCBmb3VuZCBwcmV2aW91cyByb290Tm9kZScsXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUVycm9yOiBudWxsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
@@ -1869,7 +1869,6 @@ class ViewContainer {
1869
1869
  // first diff
1870
1870
  differ.diff(this.childrenComponent);
1871
1871
  const parentElement = this.elementRef.nativeElement.parentElement;
1872
- let firstChildComponent = this.childrenComponent.first;
1873
1872
  if (this.childrenComponent.length > 0) {
1874
1873
  parentElement.insertBefore(this.createFragment(), this.elementRef.nativeElement);
1875
1874
  this.elementRef.nativeElement.remove();
@@ -1877,41 +1876,15 @@ class ViewContainer {
1877
1876
  this.childrenComponent.changes.subscribe((value) => {
1878
1877
  const iterableChanges = differ.diff(this.childrenComponent);
1879
1878
  if (iterableChanges) {
1880
- iterableChanges.forEachAddedItem((record) => {
1881
- // first insert
1882
- if (this.elementRef.nativeElement.parentElement && this.elementRef.nativeElement.parentElement === parentElement) {
1883
- const fragment = document.createDocumentFragment();
1884
- fragment.append(...record.item.rootNodes);
1885
- parentElement.insertBefore(fragment, this.elementRef.nativeElement);
1886
- this.elementRef.nativeElement.remove();
1879
+ iterableChanges.forEachOperation((record, previousIndex, currentIndex) => {
1880
+ // removed
1881
+ if (currentIndex === null) {
1887
1882
  return;
1888
1883
  }
1889
- // insert at start location
1890
- if (record.currentIndex === 0 && firstChildComponent) {
1891
- const fragment = document.createDocumentFragment();
1892
- fragment.append(...record.item.rootNodes);
1893
- parentElement.prepend(fragment);
1894
- }
1895
- else {
1896
- // insert afterend of previous component end
1897
- let previousRootNode = this.getPreviousRootNode(record.currentIndex);
1898
- if (previousRootNode) {
1899
- record.item.rootNodes.forEach((rootNode) => {
1900
- previousRootNode.insertAdjacentElement('afterend', rootNode);
1901
- previousRootNode = rootNode;
1902
- });
1903
- }
1904
- else {
1905
- this.viewContext.editor.onError({
1906
- code: SlateErrorCode.NotFoundPreviousRootNodeError,
1907
- name: 'not found previous rootNode',
1908
- nativeError: null
1909
- });
1910
- }
1911
- }
1884
+ // added or moved
1885
+ this.handleContainerItemChange(record, parentElement);
1912
1886
  });
1913
1887
  }
1914
- firstChildComponent = this.childrenComponent.first;
1915
1888
  });
1916
1889
  }
1917
1890
  getPreviousRootNode(currentIndex) {
@@ -1934,6 +1907,39 @@ class ViewContainer {
1934
1907
  });
1935
1908
  return fragment;
1936
1909
  }
1910
+ handleContainerItemChange(record, parentElement) {
1911
+ // first insert
1912
+ if (this.elementRef.nativeElement.parentElement && this.elementRef.nativeElement.parentElement === parentElement) {
1913
+ const fragment = document.createDocumentFragment();
1914
+ fragment.append(...record.item.rootNodes);
1915
+ parentElement.insertBefore(fragment, this.elementRef.nativeElement);
1916
+ this.elementRef.nativeElement.remove();
1917
+ return;
1918
+ }
1919
+ // insert at start location
1920
+ if (record.currentIndex === 0) {
1921
+ const fragment = document.createDocumentFragment();
1922
+ fragment.append(...record.item.rootNodes);
1923
+ parentElement.prepend(fragment);
1924
+ }
1925
+ else {
1926
+ // insert afterend of previous component end
1927
+ let previousRootNode = this.getPreviousRootNode(record.currentIndex);
1928
+ if (previousRootNode) {
1929
+ record.item.rootNodes.forEach((rootNode) => {
1930
+ previousRootNode.insertAdjacentElement('afterend', rootNode);
1931
+ previousRootNode = rootNode;
1932
+ });
1933
+ }
1934
+ else {
1935
+ this.viewContext.editor.onError({
1936
+ code: SlateErrorCode.NotFoundPreviousRootNodeError,
1937
+ name: 'not found previous rootNode',
1938
+ nativeError: null
1939
+ });
1940
+ }
1941
+ }
1942
+ }
1937
1943
  }
1938
1944
  ViewContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: ViewContainer, deps: [{ token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive });
1939
1945
  ViewContainer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.7", type: ViewContainer, inputs: { viewContext: "viewContext" }, ngImport: i0 });
@@ -2014,12 +2020,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImpor
2014
2020
  class SlateDefaultLeafComponent extends BaseLeafComponent {
2015
2021
  }
2016
2022
  SlateDefaultLeafComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2017
- SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `<span slateString [context]="context" [viewContext]="viewContext"><span>`, isInline: true, components: [{ type: SlateStringComponent, selector: "span[slateString]", inputs: ["context"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2023
+ SlateDefaultLeafComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateDefaultLeafComponent, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `
2024
+ <ng-container *ngIf="context.leaf['placeholder']">
2025
+ <span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
2026
+ </ng-container>
2027
+ <span slateString [context]="context" [viewContext]="viewContext"><span>`, isInline: true, components: [{ type: SlateStringComponent, selector: "span[slateString]", inputs: ["context"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2018
2028
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateDefaultLeafComponent, decorators: [{
2019
2029
  type: Component,
2020
2030
  args: [{
2021
2031
  selector: 'span[slateDefaultLeaf]',
2022
- template: `<span slateString [context]="context" [viewContext]="viewContext"><span>`,
2032
+ template: `
2033
+ <ng-container *ngIf="context.leaf['placeholder']">
2034
+ <span contenteditable="false" data-slate-placeholder="true" slate-placeholder="true">{{context.leaf['placeholder']}}</span>
2035
+ </ng-container>
2036
+ <span slateString [context]="context" [viewContext]="viewContext"><span>`,
2023
2037
  changeDetection: ChangeDetectionStrategy.OnPush,
2024
2038
  host: {
2025
2039
  'data-slate-leaf': 'true'
@@ -2429,6 +2443,22 @@ class SlateEditableComponent {
2429
2443
  this.onTouchedCallback = () => { };
2430
2444
  this.onChangeCallback = () => { };
2431
2445
  this.decorate = () => [];
2446
+ this.placeholderDecorate = (editor) => {
2447
+ if (this.placeholder &&
2448
+ editor.children.length === 1 &&
2449
+ Array.from(Node.texts(editor)).length === 1 &&
2450
+ Node.string(editor) === '') {
2451
+ const start = Editor.start(editor, []);
2452
+ return [{
2453
+ placeholder: this.placeholder,
2454
+ anchor: start,
2455
+ focus: start
2456
+ }];
2457
+ }
2458
+ else {
2459
+ return [];
2460
+ }
2461
+ };
2432
2462
  this.isStrictDecorate = true;
2433
2463
  this.trackBy = () => null;
2434
2464
  this.readonly = false;
@@ -2500,6 +2530,7 @@ class SlateEditableComponent {
2500
2530
  });
2501
2531
  this.editor.children = normalize(value);
2502
2532
  }
2533
+ this.initializeContext();
2503
2534
  this.cdr.markForCheck();
2504
2535
  }
2505
2536
  }
@@ -2615,7 +2646,7 @@ class SlateEditableComponent {
2615
2646
  // need exec after this.cdr.detectChanges() to render HTML
2616
2647
  // need exec before this.toNativeSelection() to correct native selection
2617
2648
  if (this.isComposing) {
2618
- // Compposition input text be not rendered when user composition input with selection is expanded
2649
+ // Composition input text be not rendered when user composition input with selection is expanded
2619
2650
  // At this time, the following matching conditions are met, assign isComposing to false, and the status is wrong
2620
2651
  // this time condition is true and isComposiing is assigned false
2621
2652
  // Therefore, need to wait for the composition input text to be rendered before performing condition matching
@@ -2648,7 +2679,7 @@ class SlateEditableComponent {
2648
2679
  this.context = {
2649
2680
  parent: this.editor,
2650
2681
  selection: this.editor.selection,
2651
- decorations: this.decorate([this.editor, []]),
2682
+ decorations: this.generateDecorations(),
2652
2683
  decorate: this.decorate,
2653
2684
  readonly: this.readonly
2654
2685
  };
@@ -2665,20 +2696,26 @@ class SlateEditableComponent {
2665
2696
  };
2666
2697
  }
2667
2698
  detectContext() {
2699
+ const decorations = this.generateDecorations();
2668
2700
  if (this.context.selection !== this.editor.selection ||
2669
2701
  this.context.decorate !== this.decorate ||
2670
- this.context.readonly !== this.readonly) {
2671
- const decorations = this.decorate([this.editor, []]);
2672
- const isSameDecorations = isDecoratorRangeListEqual(this.context.decorations, decorations);
2702
+ this.context.readonly !== this.readonly ||
2703
+ !isDecoratorRangeListEqual(this.context.decorations, decorations)) {
2673
2704
  this.context = {
2674
2705
  parent: this.editor,
2675
2706
  selection: this.editor.selection,
2676
- decorations: isSameDecorations ? this.context.decorations : decorations,
2707
+ decorations: decorations,
2677
2708
  decorate: this.decorate,
2678
2709
  readonly: this.readonly
2679
2710
  };
2680
2711
  }
2681
2712
  }
2713
+ generateDecorations() {
2714
+ const decorations = this.decorate([this.editor, []]);
2715
+ const placeholderDecorations = this.isComposing ? [] : this.placeholderDecorate(this.editor);
2716
+ decorations.push(...placeholderDecorations);
2717
+ return decorations;
2718
+ }
2682
2719
  //#region event proxy
2683
2720
  addEventListener(eventName, listener, target = this.elementRef.nativeElement) {
2684
2721
  this.manualListeners.push(this.renderer2.listen(target, eventName, (event) => {
@@ -2897,6 +2934,8 @@ class SlateEditableComponent {
2897
2934
  // so we need avoid repeat isnertText by isComposing === true,
2898
2935
  this.isComposing = false;
2899
2936
  }
2937
+ this.detectContext();
2938
+ this.cdr.detectChanges();
2900
2939
  }
2901
2940
  onDOMCompositionStart(event) {
2902
2941
  const { selection } = this.editor;
@@ -2910,6 +2949,8 @@ class SlateEditableComponent {
2910
2949
  if (hasEditableTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.compositionStart)) {
2911
2950
  this.isComposing = true;
2912
2951
  }
2952
+ this.detectContext();
2953
+ this.cdr.detectChanges();
2913
2954
  }
2914
2955
  onDOMCopy(event) {
2915
2956
  const window = AngularEditor.getWindow(this.editor);
@@ -3179,6 +3220,25 @@ class SlateEditableComponent {
3179
3220
  return;
3180
3221
  }
3181
3222
  }
3223
+ else {
3224
+ if (IS_CHROME || IS_SAFARI) {
3225
+ // COMPAT: Chrome and Safari support `beforeinput` event but do not fire
3226
+ // an event when deleting backwards in a selected void inline node
3227
+ if (selection &&
3228
+ (hotkeys.isDeleteBackward(nativeEvent) ||
3229
+ hotkeys.isDeleteForward(nativeEvent)) &&
3230
+ Range.isCollapsed(selection)) {
3231
+ const currentNode = Node.parent(editor, selection.anchor.path);
3232
+ if (Element.isElement(currentNode) &&
3233
+ Editor.isVoid(editor, currentNode) &&
3234
+ Editor.isInline(editor, currentNode)) {
3235
+ event.preventDefault();
3236
+ Editor.deleteBackward(editor, { unit: 'block' });
3237
+ return;
3238
+ }
3239
+ }
3240
+ }
3241
+ }
3182
3242
  }
3183
3243
  catch (error) {
3184
3244
  this.editor.onError({ code: SlateErrorCode.OnDOMKeydownError, nativeError: error });
@@ -3241,11 +3301,11 @@ class SlateEditableComponent {
3241
3301
  }
3242
3302
  }
3243
3303
  SlateEditableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateEditableComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
3244
- SlateEditableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateEditableComponent, selector: "slate-editable", inputs: { editor: "editor", renderElement: "renderElement", renderLeaf: "renderLeaf", renderText: "renderText", decorate: "decorate", isStrictDecorate: "isStrictDecorate", trackBy: "trackBy", readonly: "readonly", beforeInput: "beforeInput", blur: "blur", click: "click", compositionEnd: "compositionEnd", compositionStart: "compositionStart", copy: "copy", cut: "cut", dragOver: "dragOver", dragStart: "dragStart", dragEnd: "dragEnd", drop: "drop", focus: "focus", keydown: "keydown", paste: "paste", spellCheck: "spellCheck", autoCorrect: "autoCorrect", autoCapitalize: "autoCapitalize" }, host: { properties: { "attr.contenteditable": "readonly ? undefined : true", "attr.role": "readonly ? undefined : 'textbox'", "attr.spellCheck": "!hasBeforeInputSupport ? false : spellCheck", "attr.autoCorrect": "!hasBeforeInputSupport ? 'false' : autoCorrect", "attr.autoCapitalize": "!hasBeforeInputSupport ? 'false' : autoCapitalize", "attr.data-slate-editor": "this.dataSlateEditor", "attr.data-slate-node": "this.dataSlateNode", "attr.data-gramm": "this.dataGramm" }, classAttribute: "slate-editable-container" }, providers: [{
3304
+ SlateEditableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.7", type: SlateEditableComponent, selector: "slate-editable", inputs: { editor: "editor", renderElement: "renderElement", renderLeaf: "renderLeaf", renderText: "renderText", decorate: "decorate", placeholderDecorate: "placeholderDecorate", isStrictDecorate: "isStrictDecorate", trackBy: "trackBy", readonly: "readonly", placeholder: "placeholder", beforeInput: "beforeInput", blur: "blur", click: "click", compositionEnd: "compositionEnd", compositionStart: "compositionStart", copy: "copy", cut: "cut", dragOver: "dragOver", dragStart: "dragStart", dragEnd: "dragEnd", drop: "drop", focus: "focus", keydown: "keydown", paste: "paste", spellCheck: "spellCheck", autoCorrect: "autoCorrect", autoCapitalize: "autoCapitalize" }, host: { properties: { "attr.contenteditable": "readonly ? undefined : true", "attr.role": "readonly ? undefined : 'textbox'", "attr.spellCheck": "!hasBeforeInputSupport ? false : spellCheck", "attr.autoCorrect": "!hasBeforeInputSupport ? 'false' : autoCorrect", "attr.autoCapitalize": "!hasBeforeInputSupport ? 'false' : autoCapitalize", "attr.data-slate-editor": "this.dataSlateEditor", "attr.data-slate-node": "this.dataSlateNode", "attr.data-gramm": "this.dataGramm" }, classAttribute: "slate-editable-container" }, providers: [{
3245
3305
  provide: NG_VALUE_ACCESSOR,
3246
3306
  useExisting: forwardRef(() => SlateEditableComponent),
3247
3307
  multi: true
3248
- }], viewQueries: [{ propertyName: "templateComponent", first: true, predicate: ["templateComponent"], descendants: true, static: true }, { propertyName: "templateElementRef", first: true, predicate: ["templateComponent"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<slate-children [children]=\"editor.children\" [context]=\"context\" [viewContext]=\"viewContext\" [viewContext]=\"viewContext\"></slate-children>\n<slate-string-template #templateComponent></slate-string-template>", components: [{ type: SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { type: SlateStringTemplateComponent, selector: "slate-string-template" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3308
+ }], viewQueries: [{ propertyName: "templateComponent", first: true, predicate: ["templateComponent"], descendants: true, static: true }, { propertyName: "templateElementRef", first: true, predicate: ["templateComponent"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<slate-children [children]=\"editor.children\" [context]=\"context\" [viewContext]=\"viewContext\"></slate-children>\n<slate-string-template #templateComponent></slate-string-template>", components: [{ type: SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { type: SlateStringTemplateComponent, selector: "slate-string-template" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3249
3309
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0, type: SlateEditableComponent, decorators: [{
3250
3310
  type: Component,
3251
3311
  args: [{
@@ -3276,12 +3336,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImpor
3276
3336
  type: Input
3277
3337
  }], decorate: [{
3278
3338
  type: Input
3339
+ }], placeholderDecorate: [{
3340
+ type: Input
3279
3341
  }], isStrictDecorate: [{
3280
3342
  type: Input
3281
3343
  }], trackBy: [{
3282
3344
  type: Input
3283
3345
  }], readonly: [{
3284
3346
  type: Input
3347
+ }], placeholder: [{
3348
+ type: Input
3285
3349
  }], beforeInput: [{
3286
3350
  type: Input
3287
3351
  }], blur: [{