slate-angular 17.0.0-next.0 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/components/children/children-outlet.component.d.ts +9 -0
  2. package/components/children/children.component.d.ts +1 -6
  3. package/components/editable/editable.component.d.ts +15 -5
  4. package/components/leaf/token.d.ts +4 -0
  5. package/components/leaves/leaves.component.d.ts +1 -14
  6. package/components/string/default-string.component.d.ts +1 -1
  7. package/components/string/string.component.d.ts +8 -0
  8. package/components/text/token.d.ts +5 -0
  9. package/components/text/void-text.component.d.ts +0 -1
  10. package/esm2022/components/block-card/block-card.component.mjs +6 -6
  11. package/esm2022/components/children/children-outlet.component.mjs +22 -0
  12. package/esm2022/components/children/children.component.mjs +7 -35
  13. package/esm2022/components/editable/editable.component.mjs +143 -50
  14. package/esm2022/components/element/default-element.component.mjs +5 -5
  15. package/esm2022/components/element/element.component.mjs +5 -5
  16. package/esm2022/components/leaf/default-leaf.component.mjs +3 -3
  17. package/esm2022/components/leaf/token.mjs +3 -0
  18. package/esm2022/components/leaves/leaves.component.mjs +7 -52
  19. package/esm2022/components/string/default-string.component.mjs +5 -5
  20. package/esm2022/components/string/string.component.mjs +20 -10
  21. package/esm2022/components/string/template.component.mjs +3 -3
  22. package/esm2022/components/text/default-text.component.mjs +5 -5
  23. package/esm2022/components/text/token.mjs +4 -0
  24. package/esm2022/components/text/void-text.component.mjs +5 -9
  25. package/esm2022/custom-event/BeforeInputEventPlugin.mjs +1 -1
  26. package/esm2022/custom-event/FallbackCompositionState.mjs +1 -1
  27. package/esm2022/module.mjs +11 -26
  28. package/esm2022/plugins/angular-editor.mjs +65 -20
  29. package/esm2022/plugins/with-angular.mjs +5 -4
  30. package/esm2022/public-api.mjs +3 -2
  31. package/esm2022/utils/constants.mjs +2 -0
  32. package/esm2022/utils/dom.mjs +1 -1
  33. package/esm2022/utils/hotkeys.mjs +1 -1
  34. package/esm2022/utils/index.mjs +2 -1
  35. package/esm2022/utils/lines.mjs +1 -1
  36. package/esm2022/utils/range-list.mjs +1 -1
  37. package/esm2022/utils/restore-dom.mjs +1 -1
  38. package/esm2022/utils/throttle.mjs +18 -0
  39. package/esm2022/view/base.mjs +82 -28
  40. package/esm2022/view/container-item.mjs +5 -5
  41. package/esm2022/view/container.mjs +6 -86
  42. package/esm2022/view/context-change.mjs +13 -0
  43. package/esm2022/view/context.mjs +1 -1
  44. package/esm2022/view/render/leaves-render.mjs +107 -0
  45. package/esm2022/view/render/list-render.mjs +292 -0
  46. package/esm2022/view/render/utils.mjs +115 -0
  47. package/fesm2022/slate-angular.mjs +1189 -816
  48. package/fesm2022/slate-angular.mjs.map +1 -1
  49. package/module.d.ts +7 -8
  50. package/package.json +7 -7
  51. package/plugins/angular-editor.d.ts +17 -6
  52. package/public-api.d.ts +2 -1
  53. package/utils/constants.d.ts +1 -0
  54. package/utils/index.d.ts +1 -0
  55. package/utils/throttle.d.ts +2 -0
  56. package/view/base.d.ts +17 -4
  57. package/view/container.d.ts +3 -7
  58. package/view/{before-context-change.d.ts → context-change.d.ts} +4 -0
  59. package/view/context.d.ts +7 -2
  60. package/view/render/leaves-render.d.ts +21 -0
  61. package/view/render/list-render.d.ts +35 -0
  62. package/view/render/utils.d.ts +11 -0
  63. package/components/descendant/descendant.component.d.ts +0 -35
  64. package/components/leaf/leaf.component.d.ts +0 -16
  65. package/esm2022/components/descendant/descendant.component.mjs +0 -186
  66. package/esm2022/components/leaf/leaf.component.mjs +0 -38
  67. package/esm2022/view/before-context-change.mjs +0 -7
package/module.d.ts CHANGED
@@ -7,15 +7,14 @@ import * as i5 from "./components/text/void-text.component";
7
7
  import * as i6 from "./components/text/default-text.component";
8
8
  import * as i7 from "./components/string/string.component";
9
9
  import * as i8 from "./components/string/template.component";
10
- import * as i9 from "./components/descendant/descendant.component";
11
- import * as i10 from "./components/children/children.component";
12
- import * as i11 from "./components/block-card/block-card.component";
13
- import * as i12 from "./components/leaf/leaf.component";
14
- import * as i13 from "./components/leaves/leaves.component";
15
- import * as i14 from "./components/leaf/default-leaf.component";
16
- import * as i15 from "./components/string/default-string.component";
10
+ import * as i9 from "./components/children/children.component";
11
+ import * as i10 from "./components/block-card/block-card.component";
12
+ import * as i11 from "./components/leaves/leaves.component";
13
+ import * as i12 from "./components/leaf/default-leaf.component";
14
+ import * as i13 from "./components/string/default-string.component";
15
+ import * as i14 from "./components/children/children-outlet.component";
17
16
  export declare class SlateModule {
18
17
  static ɵfac: i0.ɵɵFactoryDeclaration<SlateModule, never>;
19
- static ɵmod: i0.ɵɵNgModuleDeclaration<SlateModule, never, [typeof i1.CommonModule, typeof i2.SlateEditable, typeof i3.SlateDefaultElement, typeof i4.SlateElement, typeof i5.SlateVoidText, typeof i6.SlateDefaultText, typeof i7.SlateString, typeof i8.SlateStringTemplate, typeof i9.SlateDescendant, typeof i10.SlateChildren, typeof i11.SlateBlockCard, typeof i12.SlateLeaf, typeof i13.SlateLeaves, typeof i14.SlateDefaultLeaf, typeof i15.SlateDefaultString], [typeof i2.SlateEditable, typeof i10.SlateChildren, typeof i4.SlateElement, typeof i13.SlateLeaves, typeof i7.SlateString, typeof i15.SlateDefaultString]>;
18
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SlateModule, never, [typeof i1.CommonModule, typeof i2.SlateEditable, typeof i3.SlateDefaultElement, typeof i4.SlateElement, typeof i5.SlateVoidText, typeof i6.SlateDefaultText, typeof i7.SlateString, typeof i8.SlateStringTemplate, typeof i9.SlateChildren, typeof i10.SlateBlockCard, typeof i11.SlateLeaves, typeof i12.SlateDefaultLeaf, typeof i13.SlateDefaultString, typeof i14.SlateChildrenOutlet], [typeof i2.SlateEditable, typeof i9.SlateChildren, typeof i14.SlateChildrenOutlet, typeof i4.SlateElement, typeof i11.SlateLeaves, typeof i7.SlateString, typeof i13.SlateDefaultString]>;
20
19
  static ɵinj: i0.ɵɵInjectorDeclaration<SlateModule>;
21
20
  }
package/package.json CHANGED
@@ -1,25 +1,25 @@
1
1
  {
2
2
  "name": "slate-angular",
3
- "version": "17.0.0-next.0",
3
+ "version": "17.1.0",
4
4
  "description": "Angular view layer for Slate",
5
5
  "author": "pubuzhixing <pubuzhixing@gmail.com>",
6
6
  "homepage": "https://github.com/worktile/slate-angular#readme",
7
7
  "license": "MIT",
8
8
  "peerDependencies": {
9
- "slate": ">= 0.63.0",
10
- "slate-history": "^0.66.0",
9
+ "slate": ">= 0.101.5",
10
+ "slate-history": "^0.100.0",
11
11
  "debug": "^4.1.1",
12
12
  "direction": "^2.0.1",
13
13
  "is-hotkey": "^0.2.0",
14
14
  "scroll-into-view-if-needed": "^2.2.20"
15
15
  },
16
16
  "dependencies": {
17
- "slate": "^0.72.8",
18
- "slate-history": "^0.66.0",
17
+ "slate": "^0.101.5",
18
+ "slate-history": "^0.100.0",
19
19
  "direction": "^2.0.1",
20
20
  "is-hotkey": "^0.2.0",
21
- "scroll-into-view-if-needed": "^2.2.20",
22
- "tslib": "^2.5.0"
21
+ "scroll-into-view-if-needed": "^3.1.0",
22
+ "tslib": "^2.6.2"
23
23
  },
24
24
  "exports": {
25
25
  ".": {
@@ -1,4 +1,4 @@
1
- import { Node, Path, Point, Range, BaseEditor } from 'slate';
1
+ import { Node, Path, Point, Range, Element, BaseEditor } from 'slate';
2
2
  import { DOMElement, DOMNode, DOMPoint, DOMRange, DOMSelection, DOMStaticRange } from '../utils/dom';
3
3
  import { Injector } from '@angular/core';
4
4
  import { NodeEntry } from 'slate';
@@ -17,6 +17,7 @@ export interface AngularEditor extends BaseEditor {
17
17
  onClick: (event: MouseEvent) => void;
18
18
  injector: Injector;
19
19
  isBlockCard: (node: Node) => boolean;
20
+ isExpanded: (node: Element) => boolean;
20
21
  onError: (errorData: SlateError) => void;
21
22
  hasRange: (editor: AngularEditor, range: Range) => boolean;
22
23
  }
@@ -112,27 +113,37 @@ export declare const AngularEditor: {
112
113
  /**
113
114
  * Find a Slate node from a native DOM `element`.
114
115
  */
115
- toSlateNode(editor: AngularEditor, domNode: DOMNode): Node;
116
+ toSlateNode<T extends boolean>(editor: AngularEditor, domNode: DOMNode, options?: {
117
+ suppressThrow: T;
118
+ }): T extends true ? Node : Node;
116
119
  /**
117
120
  * Get the target range from a DOM `event`.
118
121
  */
119
122
  findEventRange(editor: AngularEditor, event: any): Range;
120
- isLeafInEditor(editor: AngularEditor, leafNode: DOMElement): boolean;
123
+ isLeafInEditor(editor: AngularEditor, leafNode: DOMElement, options: {
124
+ suppressThrow: boolean;
125
+ }): boolean;
121
126
  /**
122
127
  * Find a Slate point from a DOM selection's `domNode` and `domOffset`.
123
128
  */
124
- toSlatePoint(editor: AngularEditor, domPoint: DOMPoint): Point;
129
+ toSlatePoint<T_1 extends boolean>(editor: AngularEditor, domPoint: DOMPoint, options: {
130
+ exactMatch?: boolean;
131
+ suppressThrow: T_1;
132
+ }): T_1 extends true ? import("slate").BasePoint : import("slate").BasePoint;
125
133
  /**
126
134
  * Find a Slate range from a DOM range or selection.
127
135
  */
128
- toSlateRange(editor: AngularEditor, domRange: DOMRange | DOMStaticRange | DOMSelection): Range;
136
+ toSlateRange<T_2 extends boolean>(editor: AngularEditor, domRange: DOMRange | DOMStaticRange | DOMSelection, options?: {
137
+ exactMatch?: boolean;
138
+ suppressThrow: T_2;
139
+ }): T_2 extends true ? import("slate").BaseRange : import("slate").BaseRange;
129
140
  isLeafBlock(editor: AngularEditor, node: Node): boolean;
130
141
  isBlockCardLeftCursor(editor: AngularEditor): boolean;
131
142
  isBlockCardRightCursor(editor: AngularEditor): boolean;
132
143
  getCardCursorNode(editor: AngularEditor, blockCardNode: Node, options: {
133
144
  direction: 'left' | 'right' | 'center';
134
145
  }): ChildNode;
135
- toSlateCardEntry(editor: AngularEditor, node: DOMNode): NodeEntry<Node>;
146
+ toSlateCardEntry(editor: AngularEditor, node: DOMNode): NodeEntry;
136
147
  /**
137
148
  * move native selection to card-left or card-right
138
149
  * @param editor
package/public-api.d.ts CHANGED
@@ -5,11 +5,12 @@ export * from './components/element/element.component';
5
5
  export * from './components/string/string.component';
6
6
  export * from './components/string/default-string.component';
7
7
  export * from './components/children/children.component';
8
+ export * from './components/children/children-outlet.component';
8
9
  export * from './components/leaves/leaves.component';
9
10
  export * from './module';
10
11
  export * from './types/error';
11
12
  export * from './view/base';
12
13
  export * from './view/context';
13
- export * from './view/before-context-change';
14
+ export * from './view/context-change';
14
15
  export * from './utils';
15
16
  export * from './types';
@@ -0,0 +1 @@
1
+ export declare const TRIPLE_CLICK = 3;
package/utils/index.d.ts CHANGED
@@ -7,3 +7,4 @@ export * from './key';
7
7
  export * from './range-list';
8
8
  export * from './block-card';
9
9
  export * from './global-normalize';
10
+ export * from './throttle';
@@ -0,0 +1,2 @@
1
+ export declare const createThrottleRAF: () => (fn: () => void) => void;
2
+ export type ThrottleRAF = (fn: () => void) => void;
package/view/base.d.ts CHANGED
@@ -1,8 +1,11 @@
1
- import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit } from '@angular/core';
1
+ import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit, ViewContainerRef } from '@angular/core';
2
2
  import { AngularEditor } from '../plugins/angular-editor';
3
3
  import { SlateViewContext, SlateElementContext, SlateTextContext, SlateLeafContext } from './context';
4
4
  import { Descendant, Element, Range, Text } from 'slate';
5
5
  import { SlateChildrenContext } from './context';
6
+ import { ListRender } from './render/list-render';
7
+ import { LeavesRender } from './render/leaves-render';
8
+ import { SlateChildrenOutlet } from '../components/children/children-outlet.component';
6
9
  import * as i0 from "@angular/core";
7
10
  /**
8
11
  * base class for template
@@ -17,6 +20,7 @@ export interface BaseEmbeddedView<T, K extends AngularEditor = AngularEditor> {
17
20
  export declare abstract class BaseComponent<T = SlateTextContext | SlateLeafContext | SlateElementContext, K extends AngularEditor = AngularEditor> {
18
21
  elementRef: ElementRef;
19
22
  cdr: ChangeDetectorRef;
23
+ initialized: boolean;
20
24
  protected _context: T;
21
25
  set context(value: T);
22
26
  get context(): T;
@@ -32,7 +36,6 @@ export declare abstract class BaseComponent<T = SlateTextContext | SlateLeafCont
32
36
  * base class for custom leaf component
33
37
  */
34
38
  export declare class BaseLeafComponent extends BaseComponent<SlateLeafContext> implements OnInit {
35
- initialized: boolean;
36
39
  placeholderElement: HTMLSpanElement;
37
40
  isSlateLeaf: boolean;
38
41
  get text(): Text;
@@ -50,8 +53,9 @@ export declare class BaseLeafComponent extends BaseComponent<SlateLeafContext> i
50
53
  * base class for custom element component
51
54
  */
52
55
  export declare class BaseElementComponent<T extends Element = Element, K extends AngularEditor = AngularEditor> extends BaseComponent<SlateElementContext<T>, K> implements OnInit, OnDestroy {
53
- initialized: boolean;
56
+ viewContainerRef: ViewContainerRef;
54
57
  childrenContext: SlateChildrenContext;
58
+ childrenOutletInstance?: SlateChildrenOutlet;
55
59
  get element(): T;
56
60
  get selection(): Range;
57
61
  get decorations(): Range[];
@@ -59,10 +63,15 @@ export declare class BaseElementComponent<T extends Element = Element, K extends
59
63
  get isCollapsed(): boolean;
60
64
  get isCollapsedAndNonReadonly(): boolean;
61
65
  get readonly(): boolean;
66
+ getOutletParent: () => any;
67
+ getOutletElement: () => HTMLElement;
68
+ listRender: ListRender;
62
69
  ngOnInit(): void;
70
+ afterViewInit(): void;
63
71
  updateWeakMap(): void;
64
72
  ngOnDestroy(): void;
65
73
  onContextChange(): void;
74
+ updateChildrenView(): void;
66
75
  getChildrenContext(): SlateChildrenContext;
67
76
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseElementComponent<any, any>, never>;
68
77
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseElementComponent<any, any>, never, never, {}, {}, never, never, false, never>;
@@ -71,8 +80,12 @@ export declare class BaseElementComponent<T extends Element = Element, K extends
71
80
  * base class for custom text component
72
81
  */
73
82
  export declare class BaseTextComponent<T extends Text = Text> extends BaseComponent<SlateTextContext<T>> implements OnInit, OnDestroy {
74
- initialized: boolean;
83
+ viewContainerRef: ViewContainerRef;
75
84
  get text(): T;
85
+ leavesRender: LeavesRender;
86
+ childrenOutletInstance?: SlateChildrenOutlet;
87
+ getOutletParent: () => any;
88
+ getOutletElement: () => HTMLElement;
76
89
  ngOnInit(): void;
77
90
  updateWeakMap(): void;
78
91
  ngOnDestroy(): void;
@@ -1,22 +1,18 @@
1
- import { AfterViewInit, ElementRef, IterableChangeRecord, IterableDiffers, QueryList } from '@angular/core';
1
+ import { ElementRef, IterableDiffers } from '@angular/core';
2
2
  import { SlateViewContext } from './context';
3
3
  import { ViewContainerItem } from './container-item';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
+ * @deprecated
6
7
  * the special container for angular template
7
8
  * Add the rootNodes of each child component to the parentElement
8
9
  * Remove useless DOM elements, eg: comment...
9
10
  */
10
- export declare abstract class ViewContainer<T extends ViewContainerItem> implements AfterViewInit {
11
+ export declare abstract class ViewContainer<T extends ViewContainerItem> {
11
12
  protected elementRef: ElementRef<any>;
12
13
  protected differs: IterableDiffers;
13
- abstract childrenComponent: QueryList<T>;
14
14
  viewContext: SlateViewContext;
15
15
  constructor(elementRef: ElementRef<any>, differs: IterableDiffers);
16
- ngAfterViewInit(): void;
17
- getPreviousRootNode(currentIndex: any): any;
18
- createFragment(): DocumentFragment;
19
- handleContainerItemChange(record: IterableChangeRecord<T>, parentElement: HTMLElement): void;
20
16
  static ɵfac: i0.ɵɵFactoryDeclaration<ViewContainer<any>, never>;
21
17
  static ɵdir: i0.ɵɵDirectiveDeclaration<ViewContainer<any>, never, never, { "viewContext": { "alias": "viewContext"; "required": false; }; }, {}, never, never, false, never>;
22
18
  }
@@ -1,4 +1,8 @@
1
1
  export interface BeforeContextChange<T> {
2
2
  beforeContextChange: (value: T) => void;
3
3
  }
4
+ export interface AfterContextChange {
5
+ afterContextChange: () => void;
6
+ }
4
7
  export declare function hasBeforeContextChange<T>(value: any): value is BeforeContextChange<T>;
8
+ export declare function hasAfterContextChange<T>(value: any): value is AfterContextChange;
package/view/context.d.ts CHANGED
@@ -1,10 +1,15 @@
1
1
  import { NodeEntry, Range, Element, Ancestor, Text } from 'slate';
2
2
  import { SlateStringTemplate } from '../components/string/template.component';
3
3
  import { AngularEditor } from '../plugins/angular-editor';
4
- import { ViewType } from '../types/view';
4
+ import { ComponentType, ViewType } from '../types/view';
5
+ import { BaseElementComponent, BaseLeafComponent, BaseTextComponent } from './base';
5
6
  export interface SlateViewContext<T extends AngularEditor = AngularEditor> {
6
7
  editor: T;
7
8
  templateComponent: SlateStringTemplate;
9
+ defaultElement: ComponentType<BaseElementComponent>;
10
+ defaultText: ComponentType<BaseTextComponent>;
11
+ defaultVoidText: ComponentType<BaseTextComponent>;
12
+ defaultLeaf: ComponentType<BaseLeafComponent>;
8
13
  trackBy: (element: Element) => any;
9
14
  renderElement?: (element: Element) => ViewType;
10
15
  renderLeaf?: (text: Text) => ViewType;
@@ -23,6 +28,7 @@ export interface SlateElementContext<T extends Element = Element> {
23
28
  selection: Range | null;
24
29
  decorations: Range[];
25
30
  attributes: SlateElementAttributes;
31
+ contentEditable?: boolean;
26
32
  decorate: (entry: NodeEntry) => Range[];
27
33
  readonly: boolean;
28
34
  }
@@ -43,7 +49,6 @@ export interface SlateElementAttributes {
43
49
  'data-slate-node': 'element';
44
50
  'data-slate-void'?: boolean;
45
51
  'data-slate-inline'?: boolean;
46
- contenteditable?: boolean;
47
52
  'data-slate-key'?: string;
48
53
  dir?: 'rtl';
49
54
  }
@@ -0,0 +1,21 @@
1
+ import { ViewContainerRef } from '@angular/core';
2
+ import { ViewType } from '../../types/view';
3
+ import { SlateLeafContext, SlateTextContext, SlateViewContext } from '../context';
4
+ export declare class LeavesRender {
5
+ private viewContext;
6
+ private viewContainerRef;
7
+ private getOutletParent;
8
+ private getOutletElement;
9
+ private leaves;
10
+ private views;
11
+ private contexts;
12
+ private viewTypes;
13
+ private differ;
14
+ constructor(viewContext: SlateViewContext, viewContainerRef: ViewContainerRef, getOutletParent: () => HTMLElement, getOutletElement: () => HTMLElement);
15
+ initialize(context: SlateTextContext): void;
16
+ update(context: SlateTextContext): void;
17
+ private getLeaves;
18
+ }
19
+ export declare function getContext(index: number, leafContexts: SlateLeafContext[]): SlateLeafContext;
20
+ export declare function getViewType(leafContext: SlateLeafContext, viewContext: SlateViewContext): ViewType;
21
+ export declare function trackBy(viewContext: SlateViewContext): (index: any, node: any) => any;
@@ -0,0 +1,35 @@
1
+ import { Ancestor, Descendant, Range, Path } from 'slate';
2
+ import { ComponentRef, EmbeddedViewRef, ViewContainerRef } from '@angular/core';
3
+ import { ViewType } from '../../types/view';
4
+ import { SlateChildrenContext, SlateElementContext, SlateTextContext, SlateViewContext } from '../context';
5
+ import { SlateBlockCard } from '../../components/block-card/block-card.component';
6
+ export declare class ListRender {
7
+ private viewContext;
8
+ private viewContainerRef;
9
+ private getOutletParent;
10
+ private getOutletElement;
11
+ private children;
12
+ private views;
13
+ private addedViews;
14
+ private blockCards;
15
+ private contexts;
16
+ private viewTypes;
17
+ private differ;
18
+ initialized: boolean;
19
+ constructor(viewContext: SlateViewContext, viewContainerRef: ViewContainerRef, getOutletParent: () => HTMLElement, getOutletElement: () => HTMLElement | null);
20
+ initialize(children: Descendant[], parent: Ancestor, childrenContext: SlateChildrenContext): void;
21
+ update(children: Descendant[], parent: Ancestor, childrenContext: SlateChildrenContext): void;
22
+ afterViewInit(): void;
23
+ destroy(): void;
24
+ }
25
+ export declare function getContext(index: number, item: Descendant, parentPath: Path, childrenContext: SlateChildrenContext, viewContext: SlateViewContext): SlateElementContext | SlateTextContext;
26
+ export declare function getCommonContext(index: number, item: Descendant, parentPath: Path, viewContext: SlateViewContext, childrenContext: SlateChildrenContext): {
27
+ selection: Range;
28
+ decorations: Range[];
29
+ };
30
+ export declare function getViewType(item: Descendant, parent: Ancestor, viewContext: SlateViewContext): ViewType;
31
+ export declare function createBlockCard(item: Descendant, view: EmbeddedViewRef<any> | ComponentRef<any>, viewContainerRef: ViewContainerRef, viewContext: SlateViewContext): ComponentRef<SlateBlockCard>;
32
+ export declare function trackBy(viewContext: SlateViewContext): (index: any, node: any) => any;
33
+ export declare function memoizedContext(viewContext: SlateViewContext, descendant: Descendant, prev: SlateElementContext | SlateTextContext, next: SlateElementContext | SlateTextContext): boolean;
34
+ export declare function memoizedElementContext(viewContext: SlateViewContext, prev: SlateElementContext, next: SlateElementContext): boolean;
35
+ export declare function memoizedTextContext(prev: SlateTextContext, next: SlateTextContext): boolean;
@@ -0,0 +1,11 @@
1
+ import { Descendant } from 'slate';
2
+ import { ComponentRef, EmbeddedViewRef, ViewContainerRef } from '@angular/core';
3
+ import { ViewType } from '../../types/view';
4
+ import { SlateElementContext, SlateLeafContext, SlateTextContext, SlateViewContext } from '../context';
5
+ import { SlateBlockCard } from '../../components/block-card/block-card.component';
6
+ export declare function createEmbeddedViewOrComponent(viewType: ViewType, context: any, viewContext: SlateViewContext, viewContainerRef: ViewContainerRef): ComponentRef<any> | EmbeddedViewRef<any>;
7
+ export declare function executeAfterViewInit(view: EmbeddedViewRef<any> | ComponentRef<any>): void;
8
+ export declare function updateContext(view: EmbeddedViewRef<any> | ComponentRef<any>, newContext: SlateElementContext | SlateTextContext | SlateLeafContext, viewContext: SlateViewContext): void;
9
+ export declare function mount(views: (EmbeddedViewRef<any> | ComponentRef<any>)[], blockCards: (ComponentRef<SlateBlockCard> | null)[] | null, outletParent: HTMLElement, outletElement: HTMLElement | null): void;
10
+ export declare function getRootNodes(ref: EmbeddedViewRef<any> | ComponentRef<any>, blockCard?: ComponentRef<SlateBlockCard>): HTMLElement[];
11
+ export declare function mountOnItemChange(index: number, item: Descendant, views: (EmbeddedViewRef<any> | ComponentRef<any>)[], blockCards: (ComponentRef<SlateBlockCard> | null)[] | null, outletParent: HTMLElement, firstRootNode: HTMLElement | null, viewContext: SlateViewContext): void;
@@ -1,35 +0,0 @@
1
- import { OnChanges, OnInit, ViewContainerRef } from '@angular/core';
2
- import { ViewContainerItem } from '../../view/container-item';
3
- import { Descendant, Range } from 'slate';
4
- import { SlateChildrenContext, SlateElementContext, SlateTextContext, SlateViewContext } from '../../view/context';
5
- import { BaseElementComponent, BaseTextComponent } from '../../view/base';
6
- import { ComponentType, ViewType } from '../../types/view';
7
- import * as i0 from "@angular/core";
8
- export declare class SlateDescendant extends ViewContainerItem<SlateElementContext | SlateTextContext, BaseElementComponent | BaseTextComponent> implements OnInit, OnChanges {
9
- protected viewContainerRef: ViewContainerRef;
10
- defaultElementComponentType: ComponentType<BaseElementComponent>;
11
- descendant: Descendant;
12
- context: SlateChildrenContext;
13
- viewContext: SlateViewContext;
14
- index: number;
15
- get rootNodes(): HTMLElement[];
16
- get isBlockCard(): boolean;
17
- constructor(viewContainerRef: ViewContainerRef, defaultElementComponentType: ComponentType<BaseElementComponent>);
18
- ngOnInit(): void;
19
- destroyView(): void;
20
- ngOnChanges(): void;
21
- destroyBlockCard(): void;
22
- createBlockCard(): void;
23
- updateBlockCard(): void;
24
- getCommonContext(): {
25
- selection: Range;
26
- decorations: Range[];
27
- };
28
- getContext(): SlateElementContext | SlateTextContext;
29
- getViewType(): ViewType;
30
- memoizedElementContext(prev: SlateElementContext, next: SlateElementContext): boolean;
31
- memoizedTextContext(prev: SlateTextContext, next: SlateTextContext): boolean;
32
- memoizedContext(prev: SlateElementContext | SlateTextContext, next: SlateElementContext | SlateTextContext): boolean;
33
- static ɵfac: i0.ɵɵFactoryDeclaration<SlateDescendant, never>;
34
- static ɵcmp: i0.ɵɵComponentDeclaration<SlateDescendant, "slate-descendant", never, { "descendant": { "alias": "descendant"; "required": false; }; "context": { "alias": "context"; "required": false; }; "viewContext": { "alias": "viewContext"; "required": false; }; "index": { "alias": "index"; "required": false; }; }, {}, never, never, true, never>;
35
- }
@@ -1,16 +0,0 @@
1
- import { OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
- import { ViewContainerItem } from '../../view/container-item';
3
- import { SlateLeafContext } from '../../view/context';
4
- import { BaseLeafComponent } from '../../view/base';
5
- import { ViewType } from '../../types/view';
6
- import * as i0 from "@angular/core";
7
- export declare class SlateLeaf extends ViewContainerItem<SlateLeafContext, BaseLeafComponent> implements OnInit, OnChanges {
8
- context: SlateLeafContext;
9
- ngOnInit(): void;
10
- getContext(): SlateLeafContext;
11
- getViewType(): ViewType;
12
- memoizedContext(prev: SlateLeafContext, next: SlateLeafContext): boolean;
13
- ngOnChanges(simpleChanges: SimpleChanges): void;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<SlateLeaf, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<SlateLeaf, "slate-leaf", never, { "context": { "alias": "context"; "required": false; }; }, {}, never, never, true, never>;
16
- }
@@ -1,186 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core';
2
- import { SlateBlockCard } from '../block-card/block-card.component';
3
- import { ViewContainerItem } from '../../view/container-item';
4
- import { Editor, Range, Element } from 'slate';
5
- import { AngularEditor } from '../../plugins/angular-editor';
6
- import { NODE_TO_INDEX, NODE_TO_PARENT } from '../../utils/weak-maps';
7
- import { SlateDefaultText } from '../text/default-text.component';
8
- import { SlateVoidText } from '../text/void-text.component';
9
- import { isDecoratorRangeListEqual } from '../../utils';
10
- import { SlateErrorCode } from '../../types';
11
- import { SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN } from '../element/default-element.component.token';
12
- import * as i0 from "@angular/core";
13
- export class SlateDescendant extends ViewContainerItem {
14
- get rootNodes() {
15
- if (this.blockCardComponentRef) {
16
- return [this.blockCardComponentRef.instance.nativeElement];
17
- }
18
- return super.getRootNodes();
19
- }
20
- get isBlockCard() {
21
- return this.viewContext.editor.isBlockCard(this.descendant);
22
- }
23
- constructor(viewContainerRef, defaultElementComponentType) {
24
- super(viewContainerRef);
25
- this.viewContainerRef = viewContainerRef;
26
- this.defaultElementComponentType = defaultElementComponentType;
27
- }
28
- ngOnInit() {
29
- NODE_TO_INDEX.set(this.descendant, this.index);
30
- NODE_TO_PARENT.set(this.descendant, this.context.parent);
31
- this.createView();
32
- if (this.isBlockCard) {
33
- this.createBlockCard();
34
- }
35
- }
36
- destroyView() {
37
- super.destroyView();
38
- this.destroyBlockCard();
39
- }
40
- ngOnChanges() {
41
- if (!this.initialized) {
42
- return;
43
- }
44
- NODE_TO_INDEX.set(this.descendant, this.index);
45
- NODE_TO_PARENT.set(this.descendant, this.context.parent);
46
- this.updateView();
47
- if (this.isBlockCard) {
48
- this.updateBlockCard();
49
- }
50
- }
51
- destroyBlockCard() {
52
- if (this.blockCardComponentRef) {
53
- this.blockCardComponentRef.destroy();
54
- this.blockCardComponentRef = null;
55
- }
56
- }
57
- createBlockCard() {
58
- const rootNodes = this.rootNodes;
59
- this.blockCardComponentRef = this.viewContainerRef.createComponent(SlateBlockCard);
60
- this.blockCardComponentRef.instance.initializeCenter(rootNodes);
61
- }
62
- updateBlockCard() {
63
- if (this.blockCardComponentRef) {
64
- return;
65
- }
66
- const rootNodes = this.rootNodes;
67
- this.createBlockCard();
68
- const firstRootNode = rootNodes[0];
69
- firstRootNode.replaceWith(this.blockCardComponentRef.instance.nativeElement);
70
- }
71
- getCommonContext() {
72
- const path = AngularEditor.findPath(this.viewContext.editor, this.context.parent);
73
- const p = path.concat(this.index);
74
- try {
75
- const range = Editor.range(this.viewContext.editor, p);
76
- const sel = this.context.selection && Range.intersection(range, this.context.selection);
77
- const ds = this.context.decorate([this.descendant, p]);
78
- for (const dec of this.context.decorations) {
79
- const d = Range.intersection(dec, range);
80
- if (d) {
81
- ds.push(d);
82
- }
83
- }
84
- return { selection: sel, decorations: ds };
85
- }
86
- catch (error) {
87
- this.viewContext.editor.onError({
88
- code: SlateErrorCode.GetStartPointError,
89
- nativeError: error
90
- });
91
- return { selection: null, decorations: [] };
92
- }
93
- }
94
- getContext() {
95
- if (Element.isElement(this.descendant)) {
96
- const computedContext = this.getCommonContext();
97
- const key = AngularEditor.findKey(this.viewContext.editor, this.descendant);
98
- const isInline = this.viewContext.editor.isInline(this.descendant);
99
- const isVoid = this.viewContext.editor.isVoid(this.descendant);
100
- const elementContext = {
101
- element: this.descendant,
102
- ...computedContext,
103
- attributes: {
104
- 'data-slate-node': 'element',
105
- 'data-slate-key': key.id
106
- },
107
- decorate: this.context.decorate,
108
- readonly: this.context.readonly
109
- };
110
- if (isInline) {
111
- elementContext.attributes['data-slate-inline'] = true;
112
- }
113
- if (isVoid) {
114
- elementContext.attributes['data-slate-void'] = true;
115
- elementContext.attributes.contenteditable = false;
116
- }
117
- return elementContext;
118
- }
119
- else {
120
- const computedContext = this.getCommonContext();
121
- const isLeafBlock = AngularEditor.isLeafBlock(this.viewContext.editor, this.context.parent);
122
- const textContext = {
123
- decorations: computedContext.decorations,
124
- isLast: isLeafBlock && this.index === this.context.parent.children.length - 1,
125
- parent: this.context.parent,
126
- text: this.descendant
127
- };
128
- return textContext;
129
- }
130
- }
131
- getViewType() {
132
- if (Element.isElement(this.descendant)) {
133
- return (this.viewContext.renderElement && this.viewContext.renderElement(this.descendant)) || this.defaultElementComponentType;
134
- }
135
- else {
136
- const isVoid = this.viewContext.editor.isVoid(this.context.parent);
137
- return isVoid
138
- ? SlateVoidText
139
- : (this.viewContext.renderText && this.viewContext.renderText(this.descendant)) || SlateDefaultText;
140
- }
141
- }
142
- memoizedElementContext(prev, next) {
143
- return (prev.element === next.element &&
144
- (!this.viewContext.isStrictDecorate || prev.decorate === next.decorate) &&
145
- prev.readonly === next.readonly &&
146
- isDecoratorRangeListEqual(prev.decorations, next.decorations) &&
147
- (prev.selection === next.selection || (!!prev.selection && !!next.selection && Range.equals(prev.selection, next.selection))));
148
- }
149
- memoizedTextContext(prev, next) {
150
- return (next.parent === prev.parent &&
151
- next.isLast === prev.isLast &&
152
- next.text === prev.text &&
153
- isDecoratorRangeListEqual(next.decorations, prev.decorations));
154
- }
155
- memoizedContext(prev, next) {
156
- if (Element.isElement(this.descendant)) {
157
- return this.memoizedElementContext(prev, next);
158
- }
159
- else {
160
- return this.memoizedTextContext(prev, next);
161
- }
162
- }
163
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDescendant, deps: [{ token: i0.ViewContainerRef }, { token: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
164
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDescendant, isStandalone: true, selector: "slate-descendant", inputs: { descendant: "descendant", context: "context", viewContext: "viewContext", index: "index" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
165
- }
166
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDescendant, decorators: [{
167
- type: Component,
168
- args: [{
169
- selector: 'slate-descendant',
170
- template: '',
171
- changeDetection: ChangeDetectionStrategy.OnPush,
172
- standalone: true
173
- }]
174
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: undefined, decorators: [{
175
- type: Inject,
176
- args: [SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN]
177
- }] }]; }, propDecorators: { descendant: [{
178
- type: Input
179
- }], context: [{
180
- type: Input
181
- }], viewContext: [{
182
- type: Input
183
- }], index: [{
184
- type: Input
185
- }] } });
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY2VuZGFudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvY29tcG9uZW50cy9kZXNjZW5kYW50L2Rlc2NlbmRhbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUUzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBUW5HLE1BQU0sT0FBTyxlQUNULFNBQVEsaUJBQW1HO0lBVzNHLElBQUksU0FBUztRQUNULElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsT0FBTyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDaEMsQ0FB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OzBCQTBCUSxNQUFNOzJCQUFDLHFDQUFxQzs0Q0FyQnhDLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNsYXRlQmxvY2tDYXJkIH0gZnJvbSAnLi4vYmxvY2stY2FyZC9ibG9jay1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3Q29udGFpbmVySXRlbSB9IGZyb20gJy4uLy4uL3ZpZXcvY29udGFpbmVyLWl0ZW0nO1xuaW1wb3J0IHsgRGVzY2VuZGFudCwgRWRpdG9yLCBSYW5nZSwgRWxlbWVudCB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IFNsYXRlQ2hpbGRyZW5Db250ZXh0LCBTbGF0ZUVsZW1lbnRDb250ZXh0LCBTbGF0ZVRleHRDb250ZXh0LCBTbGF0ZVZpZXdDb250ZXh0IH0gZnJvbSAnLi4vLi4vdmlldy9jb250ZXh0JztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICcuLi8uLi9wbHVnaW5zL2FuZ3VsYXItZWRpdG9yJztcbmltcG9ydCB7IE5PREVfVE9fSU5ERVgsIE5PREVfVE9fUEFSRU5UIH0gZnJvbSAnLi4vLi4vdXRpbHMvd2Vhay1tYXBzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50Q29tcG9uZW50LCBCYXNlVGV4dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ZpZXcvYmFzZSc7XG5pbXBvcnQgeyBTbGF0ZURlZmF1bHRUZXh0IH0gZnJvbSAnLi4vdGV4dC9kZWZhdWx0LXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFNsYXRlVm9pZFRleHQgfSBmcm9tICcuLi90ZXh0L3ZvaWQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNEZWNvcmF0b3JSYW5nZUxpc3RFcXVhbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIFZpZXdUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQgeyBTbGF0ZUVycm9yQ29kZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFNMQVRFX0RFRkFVTFRfRUxFTUVOVF9DT01QT05FTlRfVE9LRU4gfSBmcm9tICcuLi9lbGVtZW50L2RlZmF1bHQtZWxlbWVudC5jb21wb25lbnQudG9rZW4nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NsYXRlLWRlc2NlbmRhbnQnLFxuICAgIHRlbXBsYXRlOiAnJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFNsYXRlRGVzY2VuZGFudFxuICAgIGV4dGVuZHMgVmlld0NvbnRhaW5lckl0ZW08U2xhdGVFbGVtZW50Q29udGV4dCB8IFNsYXRlVGV4dENvbnRleHQsIEJhc2VFbGVtZW50Q29tcG9uZW50IHwgQmFzZVRleHRDb21wb25lbnQ+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICAgIEBJbnB1dCgpIGRlc2NlbmRhbnQ6IERlc2NlbmRhbnQ7XG5cbiAgICBASW5wdXQoKSBjb250ZXh0OiBTbGF0ZUNoaWxkcmVuQ29udGV4dDtcblxuICAgIEBJbnB1dCgpIHZpZXdDb250ZXh0OiBTbGF0ZVZpZXdDb250ZXh0O1xuXG4gICAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcblxuICAgIGdldCByb290Tm9kZXMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Um9vdE5vZGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzQmxvY2tDYXJkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dC5lZGl0b3IuaXNCbG9ja0NhcmQodGhpcy5kZXNjZW5kYW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIEBJbmplY3QoU0xBVEVfREVGQVVMVF9FTEVNRU5UX0NPTVBPTkVOVF9UT0tFTilcbiAgICAgICAgcHVibGljIGRlZmF1bHRFbGVtZW50Q29tcG9uZW50VHlwZTogQ29tcG9uZW50VHlwZTxCYXNlRWxlbWVudENvbXBvbmVudD5cbiAgICApIHtcbiAgICAgICAgc3VwZXIodmlld0NvbnRhaW5lclJlZik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIE5PREVfVE9fSU5ERVguc2V0KHRoaXMuZGVzY2VuZGFudCwgdGhpcy5pbmRleCk7XG4gICAgICAgIE5PREVfVE9fUEFSRU5ULnNldCh0aGlzLmRlc2NlbmRhbnQsIHRoaXMuY29udGV4dC5wYXJlbnQpO1xuICAgICAgICB0aGlzLmNyZWF0ZVZpZXcoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNCbG9ja0NhcmQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQmxvY2tDYXJkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95VmlldygpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveVZpZXcoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95QmxvY2tDYXJkKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE5PREVfVE9fSU5ERVguc2V0KHRoaXMuZGVzY2VuZGFudCwgdGhpcy5pbmRleCk7XG4gICAgICAgIE5PREVfVE9fUEFSRU5ULnNldCh0aGlzLmRlc2NlbmRhbnQsIHRoaXMuY29udGV4dC5wYXJlbnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNCbG9ja0NhcmQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmxvY2tDYXJkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95QmxvY2tDYXJkKCkge1xuICAgICAgICBpZiAodGhpcy5ibG9ja0NhcmRDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tDYXJkQ29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tDYXJkQ29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUJsb2NrQ2FyZCgpIHtcbiAgICAgICAgY29uc3Qgcm9vdE5vZGVzID0gdGhpcy5yb290Tm9kZXM7XG4gICAgICAgIHRoaXMuYmxvY2tDYXJkQ29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudDxTbGF0ZUJsb2NrQ2FyZD4oU2xhdGVCbG9ja0NhcmQpO1xuICAgICAgICB0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZi5pbnN0YW5jZS5pbml0aWFsaXplQ2VudGVyKHJvb3ROb2Rlcyk7XG4gICAgfVxuXG4gICAgdXBkYXRlQmxvY2tDYXJkKCkge1xuICAgICAgICBpZiAodGhpcy5ibG9ja0NhcmRDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb290Tm9kZXMgPSB0aGlzLnJvb3ROb2RlcztcbiAgICAgICAgdGhpcy5jcmVhdGVCbG9ja0NhcmQoKTtcbiAgICAgICAgY29uc3QgZmlyc3RSb290Tm9kZSA9IHJvb3ROb2Rlc1swXTtcbiAgICAgICAgZmlyc3RSb290Tm9kZS5yZXBsYWNlV2l0aCh0aGlzLmJsb2NrQ2FyZENvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBnZXRDb21tb25Db250ZXh0KCk6IHsgc2VsZWN0aW9uOiBSYW5nZTsgZGVjb3JhdGlvbnM6IFJhbmdlW10gfSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKHRoaXMudmlld0NvbnRleHQuZWRpdG9yLCB0aGlzLmNvbnRleHQucGFyZW50KTtcbiAgICAgICAgY29uc3QgcCA9IHBhdGguY29uY2F0KHRoaXMuaW5kZXgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBFZGl0b3IucmFuZ2UodGhpcy52aWV3Q29udGV4dC5lZGl0b3IsIHApO1xuICAgICAgICAgICAgY29uc3Qgc2VsID0gdGhpcy5jb250ZXh0LnNlbGVjdGlvbiAmJiBSYW5nZS5pbnRlcnNlY3Rpb24ocmFuZ2UsIHRoaXMuY29udGV4dC5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgZHMgPSB0aGlzLmNvbnRleHQuZGVjb3JhdGUoW3RoaXMuZGVzY2VuZGFudCwgcF0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgdGhpcy5jb250ZXh0LmRlY29yYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IFJhbmdlLmludGVyc2VjdGlvbihkZWMsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICBpZiAoZCkge1xuICAgICAgICAgICAgICAgICAgICBkcy5wdXNoKGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHNlbGVjdGlvbjogc2VsLCBkZWNvcmF0aW9uczogZHMgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQuZWRpdG9yLm9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGNvZGU6IFNsYXRlRXJyb3JDb2RlLkdldFN0YXJ0UG9pbnRFcnJvcixcbiAgICAgICAgICAgICAgICBuYXRpdmVFcnJvcjogZXJyb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgc2VsZWN0aW9uOiBudWxsLCBkZWNvcmF0aW9uczogW10gfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENvbnRleHQoKTogU2xhdGVFbGVtZW50Q29udGV4dCB8IFNsYXRlVGV4dENvbnRleHQge1xuICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQodGhpcy5kZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRDb250ZXh0ID0gdGhpcy5nZXRDb21tb25Db250ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBBbmd1bGFyRWRpdG9yLmZpbmRLZXkodGhpcy52aWV3Q29udGV4dC5lZGl0b3IsIHRoaXMuZGVzY2VuZGFudCk7XG4gICAgICAgICAgICBjb25zdCBpc0lubGluZSA9IHRoaXMudmlld0NvbnRleHQuZWRpdG9yLmlzSW5saW5lKHRoaXMuZGVzY2VuZGFudCk7XG4gICAgICAgICAgICBjb25zdCBpc1ZvaWQgPSB0aGlzLnZpZXdDb250ZXh0LmVkaXRvci5pc1ZvaWQodGhpcy5kZXNjZW5kYW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDb250ZXh0OiBTbGF0ZUVsZW1lbnRDb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZGVzY2VuZGFudCxcbiAgICAgICAgICAgICAgICAuLi5jb21wdXRlZENvbnRleHQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAnZGF0YS1zbGF0ZS1ub2RlJzogJ2VsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZGF0YS1zbGF0ZS1rZXknOiBrZXkuaWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlY29yYXRlOiB0aGlzLmNvbnRleHQuZGVjb3JhdGUsXG4gICAgICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMuY29udGV4dC5yZWFkb25seVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpc0lubGluZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRDb250ZXh0LmF0dHJpYnV0ZXNbJ2RhdGEtc2xhdGUtaW5saW5lJ10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzVm9pZCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRDb250ZXh0LmF0dHJpYnV0ZXNbJ2RhdGEtc2xhdGUtdm9pZCddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50Q29udGV4dC5hdHRyaWJ1dGVzLmNvbnRlbnRlZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRDb250ZXh0ID0gdGhpcy5nZXRDb21tb25Db250ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCBpc0xlYWZCbG9jayA9IEFuZ3VsYXJFZGl0b3IuaXNMZWFmQmxvY2sodGhpcy52aWV3Q29udGV4dC5lZGl0b3IsIHRoaXMuY29udGV4dC5wYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgdGV4dENvbnRleHQ6IFNsYXRlVGV4dENvbnRleHQgPSB7XG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnM6IGNvbXB1dGVkQ29udGV4dC5kZWNvcmF0aW9ucyxcbiAgICAgICAgICAgICAgICBpc0xhc3Q6IGlzTGVhZkJsb2NrICYmIHRoaXMuaW5kZXggPT09IHRoaXMuY29udGV4dC5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuY29udGV4dC5wYXJlbnQgYXMgRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmRlc2NlbmRhbnRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGV4dENvbnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRWaWV3VHlwZSgpOiBWaWV3VHlwZSB7XG4gICAgICAgIGlmIChFbGVtZW50LmlzRWxlbWVudCh0aGlzLmRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMudmlld0NvbnRleHQucmVuZGVyRWxlbWVudCAmJiB0aGlzLnZpZXdDb250ZXh0LnJlbmRlckVsZW1lbnQodGhpcy5kZXNjZW5kYW50KSkgfHwgdGhpcy5kZWZhdWx0RWxlbWVudENvbXBvbmVudFR5cGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZvaWQgPSB0aGlzLnZpZXdDb250ZXh0LmVkaXRvci5pc1ZvaWQodGhpcy5jb250ZXh0LnBhcmVudCBhcyBFbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBpc1ZvaWRcbiAgICAgICAgICAgICAgICA/IFNsYXRlVm9pZFRleHRcbiAgICAgICAgICAgICAgICA6ICh0aGlzLnZpZXdDb250ZXh0LnJlbmRlclRleHQgJiYgdGhpcy52aWV3Q29udGV4dC5yZW5kZXJUZXh0KHRoaXMuZGVzY2VuZGFudCkpIHx8IFNsYXRlRGVmYXVsdFRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vaXplZEVsZW1lbnRDb250ZXh0KHByZXY6IFNsYXRlRWxlbWVudENvbnRleHQsIG5leHQ6IFNsYXRlRWxlbWVudENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHByZXYuZWxlbWVudCA9PT0gbmV4dC5lbGVtZW50ICYmXG4gICAgICAgICAgICAoIXRoaXMudmlld0NvbnRleHQuaXNTdHJpY3REZWNvcmF0ZSB8fCBwcmV2LmRlY29yYXRlID09PSBuZXh0LmRlY29yYXRlKSAmJlxuICAgICAgICAgICAgcHJldi5yZWFkb25seSA9PT0gbmV4dC5yZWFkb25seSAmJlxuICAgICAgICAgICAgaXNEZWNvcmF0b3JSYW5nZUxpc3RFcXVhbChwcmV2LmRlY29yYXRpb25zLCBuZXh0LmRlY29yYXRpb25zKSAmJlxuICAgICAgICAgICAgKHByZXYuc2VsZWN0aW9uID09PSBuZXh0LnNlbGVjdGlvbiB8fCAoISFwcmV2LnNlbGVjdGlvbiAmJiAhIW5leHQuc2VsZWN0aW9uICYmIFJhbmdlLmVxdWFscyhwcmV2LnNlbGVjdGlvbiwgbmV4dC5zZWxlY3Rpb24pKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBtZW1vaXplZFRleHRDb250ZXh0KHByZXY6IFNsYXRlVGV4dENvbnRleHQsIG5leHQ6IFNsYXRlVGV4dENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5leHQucGFyZW50ID09PSBwcmV2LnBhcmVudCAmJlxuICAgICAgICAgICAgbmV4dC5pc0xhc3QgPT09IHByZXYuaXNMYXN0ICYmXG4gICAgICAgICAgICBuZXh0LnRleHQgPT09IHByZXYudGV4dCAmJlxuICAgICAgICAgICAgaXNEZWNvcmF0b3JSYW5nZUxpc3RFcXVhbChuZXh0LmRlY29yYXRpb25zLCBwcmV2LmRlY29yYXRpb25zKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG1lbW9pemVkQ29udGV4dChwcmV2OiBTbGF0ZUVsZW1lbnRDb250ZXh0IHwgU2xhdGVUZXh0Q29udGV4dCwgbmV4dDogU2xhdGVFbGVtZW50Q29udGV4dCB8IFNsYXRlVGV4dENvbnRleHQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEVsZW1lbnQuaXNFbGVtZW50KHRoaXMuZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lbW9pemVkRWxlbWVudENvbnRleHQocHJldiBhcyBTbGF0ZUVsZW1lbnRDb250ZXh0LCBuZXh0IGFzIFNsYXRlRWxlbWVudENvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVtb2l6ZWRUZXh0Q29udGV4dChwcmV2IGFzIFNsYXRlVGV4dENvbnRleHQsIG5leHQgYXMgU2xhdGVUZXh0Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=