@nova-design-system/nova-angular 3.15.0 → 3.16.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 (35) hide show
  1. package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/context.mjs +6 -0
  2. package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/flags.mjs +42 -0
  3. package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/flex-render-component-ref.mjs +171 -0
  4. package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/flex-render-component.mjs +39 -0
  5. package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render/view.mjs +101 -0
  6. package/dist/nova-components/esm2022/lib/components/datatable.utils/flex-render.mjs +211 -0
  7. package/dist/nova-components/esm2022/lib/components/datatable.utils/index.mjs +49 -0
  8. package/dist/nova-components/esm2022/lib/components/datatable.utils/lazy-signal-initializer.mjs +43 -0
  9. package/dist/nova-components/esm2022/lib/components/datatable.utils/proxy.mjs +87 -0
  10. package/dist/nova-components/esm2022/lib/components/index.mjs +2 -0
  11. package/dist/nova-components/esm2022/lib/components/nv-datatable.component.mjs +158 -0
  12. package/dist/nova-components/esm2022/lib/nova-components.module.mjs +7 -5
  13. package/dist/nova-components/esm2022/lib/stencil-generated/component-value-accessors.mjs +37 -1
  14. package/dist/nova-components/esm2022/lib/stencil-generated/components.mjs +5 -34
  15. package/dist/nova-components/esm2022/lib/stencil-generated/index.mjs +1 -2
  16. package/dist/nova-components/esm2022/public-api.mjs +2 -1
  17. package/dist/nova-components/fesm2022/nova-components.mjs +927 -40
  18. package/dist/nova-components/fesm2022/nova-components.mjs.map +1 -1
  19. package/dist/nova-components/lib/components/datatable.utils/flex-render/context.d.ts +3 -0
  20. package/dist/nova-components/lib/components/datatable.utils/flex-render/flags.d.ts +40 -0
  21. package/dist/nova-components/lib/components/datatable.utils/flex-render/flex-render-component-ref.d.ts +39 -0
  22. package/dist/nova-components/lib/components/datatable.utils/flex-render/flex-render-component.d.ts +60 -0
  23. package/dist/nova-components/lib/components/datatable.utils/flex-render/view.d.ts +49 -0
  24. package/dist/nova-components/lib/components/datatable.utils/flex-render.d.ts +26 -0
  25. package/dist/nova-components/lib/components/datatable.utils/index.d.ts +6 -0
  26. package/dist/nova-components/lib/components/datatable.utils/lazy-signal-initializer.d.ts +5 -0
  27. package/dist/nova-components/lib/components/datatable.utils/proxy.d.ts +3 -0
  28. package/dist/nova-components/lib/components/index.d.ts +1 -0
  29. package/dist/nova-components/lib/components/nv-datatable.component.d.ts +46 -0
  30. package/dist/nova-components/lib/nova-components.module.d.ts +6 -5
  31. package/dist/nova-components/lib/stencil-generated/component-value-accessors.d.ts +8 -1
  32. package/dist/nova-components/lib/stencil-generated/components.d.ts +3 -21
  33. package/dist/nova-components/lib/stencil-generated/index.d.ts +1 -1
  34. package/dist/nova-components/public-api.d.ts +1 -0
  35. package/package.json +2 -1
@@ -0,0 +1,6 @@
1
+ import { inject, InjectionToken } from '@angular/core';
2
+ export const FlexRenderComponentProps = new InjectionToken('[@tanstack/angular-table] Flex render component context props');
3
+ export function injectFlexRenderContext() {
4
+ return inject(FlexRenderComponentProps);
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25vdmEtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXRhYmxlLnV0aWxzL2ZsZXgtcmVuZGVyL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFdEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxjQUFjLENBRXhELCtEQUErRCxDQUFDLENBQUE7QUFFbEUsTUFBTSxVQUFVLHVCQUF1QjtJQUNyQyxPQUFPLE1BQU0sQ0FBSSx3QkFBd0IsQ0FBQyxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxuZXhwb3J0IGNvbnN0IEZsZXhSZW5kZXJDb21wb25lbnRQcm9wcyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxcbiAgTm9uTnVsbGFibGU8dW5rbm93bj5cbj4oJ1tAdGFuc3RhY2svYW5ndWxhci10YWJsZV0gRmxleCByZW5kZXIgY29tcG9uZW50IGNvbnRleHQgcHJvcHMnKVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0RmxleFJlbmRlckNvbnRleHQ8VCBleHRlbmRzIE5vbk51bGxhYmxlPHVua25vd24+PigpOiBUIHtcbiAgcmV0dXJuIGluamVjdDxUPihGbGV4UmVuZGVyQ29tcG9uZW50UHJvcHMpXG59XG4iXX0=
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Flags used to manage and optimize the rendering lifecycle of content of the cell,
3
+ * while using FlexRenderDirective.
4
+ */
5
+ export var FlexRenderFlags;
6
+ (function (FlexRenderFlags) {
7
+ /**
8
+ * Indicates that the view is being created for the first time or will be cleared during the next update phase.
9
+ * This is the initial state and will transition after the first ngDoCheck.
10
+ */
11
+ FlexRenderFlags[FlexRenderFlags["ViewFirstRender"] = 1] = "ViewFirstRender";
12
+ /**
13
+ * Represents a state where the view is not dirty, meaning no changes require rendering updates.
14
+ */
15
+ FlexRenderFlags[FlexRenderFlags["Pristine"] = 2] = "Pristine";
16
+ /**
17
+ * Indicates the `content` property has been modified or the view requires a complete re-render.
18
+ * When this flag is enabled, the view will be cleared and recreated from scratch.
19
+ */
20
+ FlexRenderFlags[FlexRenderFlags["ContentChanged"] = 4] = "ContentChanged";
21
+ /**
22
+ * Indicates that the `props` property reference has changed.
23
+ * When this flag is enabled, the view context is updated based on the type of the content.
24
+ *
25
+ * For Component view, inputs will be updated and view will be marked as dirty.
26
+ * For TemplateRef and primitive values, view will be marked as dirty
27
+ */
28
+ FlexRenderFlags[FlexRenderFlags["PropsReferenceChanged"] = 8] = "PropsReferenceChanged";
29
+ /**
30
+ * Indicates that the current rendered view needs to be checked for changes.
31
+ */
32
+ FlexRenderFlags[FlexRenderFlags["DirtyCheck"] = 16] = "DirtyCheck";
33
+ /**
34
+ * Indicates that a signal within the `content(props)` result has changed
35
+ */
36
+ FlexRenderFlags[FlexRenderFlags["DirtySignal"] = 32] = "DirtySignal";
37
+ /**
38
+ * Indicates that the first render effect has been checked at least one time.
39
+ */
40
+ FlexRenderFlags[FlexRenderFlags["RenderEffectChecked"] = 64] = "RenderEffectChecked";
41
+ })(FlexRenderFlags || (FlexRenderFlags = {}));
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ub3ZhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGF0YWJsZS51dGlscy9mbGV4LXJlbmRlci9mbGFncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQU4sSUFBWSxlQW1DWDtBQW5DRCxXQUFZLGVBQWU7SUFDekI7OztPQUdHO0lBQ0gsMkVBQXdCLENBQUE7SUFDeEI7O09BRUc7SUFDSCw2REFBaUIsQ0FBQTtJQUNqQjs7O09BR0c7SUFDSCx5RUFBdUIsQ0FBQTtJQUN2Qjs7Ozs7O09BTUc7SUFDSCx1RkFBOEIsQ0FBQTtJQUM5Qjs7T0FFRztJQUNILGtFQUFtQixDQUFBO0lBQ25COztPQUVHO0lBQ0gsb0VBQW9CLENBQUE7SUFDcEI7O09BRUc7SUFDSCxvRkFBNEIsQ0FBQTtBQUM5QixDQUFDLEVBbkNXLGVBQWUsS0FBZixlQUFlLFFBbUMxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxhZ3MgdXNlZCB0byBtYW5hZ2UgYW5kIG9wdGltaXplIHRoZSByZW5kZXJpbmcgbGlmZWN5Y2xlIG9mIGNvbnRlbnQgb2YgdGhlIGNlbGwsXG4gKiB3aGlsZSB1c2luZyBGbGV4UmVuZGVyRGlyZWN0aXZlLlxuICovXG5leHBvcnQgZW51bSBGbGV4UmVuZGVyRmxhZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgaXMgYmVpbmcgY3JlYXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUgb3Igd2lsbCBiZSBjbGVhcmVkIGR1cmluZyB0aGUgbmV4dCB1cGRhdGUgcGhhc2UuXG4gICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUgYW5kIHdpbGwgdHJhbnNpdGlvbiBhZnRlciB0aGUgZmlyc3QgbmdEb0NoZWNrLlxuICAgKi9cbiAgVmlld0ZpcnN0UmVuZGVyID0gMSA8PCAwLFxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIHN0YXRlIHdoZXJlIHRoZSB2aWV3IGlzIG5vdCBkaXJ0eSwgbWVhbmluZyBubyBjaGFuZ2VzIHJlcXVpcmUgcmVuZGVyaW5nIHVwZGF0ZXMuXG4gICAqL1xuICBQcmlzdGluZSA9IDEgPDwgMSxcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgYGNvbnRlbnRgIHByb3BlcnR5IGhhcyBiZWVuIG1vZGlmaWVkIG9yIHRoZSB2aWV3IHJlcXVpcmVzIGEgY29tcGxldGUgcmUtcmVuZGVyLlxuICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBlbmFibGVkLCB0aGUgdmlldyB3aWxsIGJlIGNsZWFyZWQgYW5kIHJlY3JlYXRlZCBmcm9tIHNjcmF0Y2guXG4gICAqL1xuICBDb250ZW50Q2hhbmdlZCA9IDEgPDwgMixcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBgcHJvcHNgIHByb3BlcnR5IHJlZmVyZW5jZSBoYXMgY2hhbmdlZC5cbiAgICogV2hlbiB0aGlzIGZsYWcgaXMgZW5hYmxlZCwgdGhlIHZpZXcgY29udGV4dCBpcyB1cGRhdGVkIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBjb250ZW50LlxuICAgKlxuICAgKiBGb3IgQ29tcG9uZW50IHZpZXcsIGlucHV0cyB3aWxsIGJlIHVwZGF0ZWQgYW5kIHZpZXcgd2lsbCBiZSBtYXJrZWQgYXMgZGlydHkuXG4gICAqIEZvciBUZW1wbGF0ZVJlZiBhbmQgcHJpbWl0aXZlIHZhbHVlcywgdmlldyB3aWxsIGJlIG1hcmtlZCBhcyBkaXJ0eVxuICAgKi9cbiAgUHJvcHNSZWZlcmVuY2VDaGFuZ2VkID0gMSA8PCAzLFxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgcmVuZGVyZWQgdmlldyBuZWVkcyB0byBiZSBjaGVja2VkIGZvciBjaGFuZ2VzLlxuICAgKi9cbiAgRGlydHlDaGVjayA9IDEgPDwgNCxcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IGEgc2lnbmFsIHdpdGhpbiB0aGUgYGNvbnRlbnQocHJvcHMpYCByZXN1bHQgaGFzIGNoYW5nZWRcbiAgICovXG4gIERpcnR5U2lnbmFsID0gMSA8PCA1LFxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGZpcnN0IHJlbmRlciBlZmZlY3QgaGFzIGJlZW4gY2hlY2tlZCBhdCBsZWFzdCBvbmUgdGltZS5cbiAgICovXG4gIFJlbmRlckVmZmVjdENoZWNrZWQgPSAxIDw8IDYsXG59XG4iXX0=
@@ -0,0 +1,171 @@
1
+ import { ChangeDetectorRef, inject, Injectable, KeyValueDiffers, OutputEmitterRef, ViewContainerRef, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class FlexRenderComponentFactory {
4
+ #viewContainerRef = inject(ViewContainerRef);
5
+ createComponent(flexRenderComponent, componentInjector) {
6
+ const componentRef = this.#viewContainerRef.createComponent(flexRenderComponent.component, {
7
+ injector: componentInjector,
8
+ });
9
+ const view = new FlexRenderComponentRef(componentRef, flexRenderComponent, componentInjector);
10
+ const { inputs, outputs } = flexRenderComponent;
11
+ if (inputs)
12
+ view.setInputs(inputs);
13
+ if (outputs)
14
+ view.setOutputs(outputs);
15
+ return view;
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: FlexRenderComponentFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
18
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: FlexRenderComponentFactory }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: FlexRenderComponentFactory, decorators: [{
21
+ type: Injectable
22
+ }] });
23
+ export class FlexRenderComponentRef {
24
+ #keyValueDiffersFactory;
25
+ #componentData;
26
+ #inputValueDiffer;
27
+ #outputRegistry;
28
+ constructor(componentRef, componentData, componentInjector) {
29
+ this.componentRef = componentRef;
30
+ this.componentInjector = componentInjector;
31
+ this.#componentData = componentData;
32
+ this.#keyValueDiffersFactory = componentInjector.get(KeyValueDiffers);
33
+ this.#outputRegistry = new FlexRenderComponentOutputManager(this.#keyValueDiffersFactory, this.outputs);
34
+ this.#inputValueDiffer = this.#keyValueDiffersFactory
35
+ .find(this.inputs)
36
+ .create();
37
+ this.#inputValueDiffer.diff(this.inputs);
38
+ this.componentRef.onDestroy(() => this.#outputRegistry.unsubscribeAll());
39
+ }
40
+ get component() {
41
+ return this.#componentData.component;
42
+ }
43
+ get inputs() {
44
+ return this.#componentData.inputs ?? {};
45
+ }
46
+ get outputs() {
47
+ return this.#componentData.outputs ?? {};
48
+ }
49
+ /**
50
+ * Get component input and output diff by the given item
51
+ */
52
+ diff(item) {
53
+ return {
54
+ inputDiff: this.#inputValueDiffer.diff(item.inputs ?? {}),
55
+ outputDiff: this.#outputRegistry.diff(item.outputs ?? {}),
56
+ };
57
+ }
58
+ /**
59
+ *
60
+ * @param compare Whether the current ref component instance is the same as the given one
61
+ */
62
+ eqType(compare) {
63
+ return compare.component === this.component;
64
+ }
65
+ /**
66
+ * Tries to update current component refs input by the new given content component.
67
+ */
68
+ update(content) {
69
+ const eq = this.eqType(content);
70
+ if (!eq)
71
+ return;
72
+ const { inputDiff, outputDiff } = this.diff(content);
73
+ if (inputDiff) {
74
+ inputDiff.forEachAddedItem(item => this.setInput(item.key, item.currentValue));
75
+ inputDiff.forEachChangedItem(item => this.setInput(item.key, item.currentValue));
76
+ inputDiff.forEachRemovedItem(item => this.setInput(item.key, undefined));
77
+ }
78
+ if (outputDiff) {
79
+ outputDiff.forEachAddedItem(item => {
80
+ this.setOutput(item.key, item.currentValue);
81
+ });
82
+ outputDiff.forEachChangedItem(item => {
83
+ if (item.currentValue) {
84
+ this.#outputRegistry.setListener(item.key, item.currentValue);
85
+ }
86
+ else {
87
+ this.#outputRegistry.unsubscribe(item.key);
88
+ }
89
+ });
90
+ outputDiff.forEachRemovedItem(item => {
91
+ this.#outputRegistry.unsubscribe(item.key);
92
+ });
93
+ }
94
+ this.#componentData = content;
95
+ }
96
+ markAsDirty() {
97
+ this.componentRef.injector.get(ChangeDetectorRef).markForCheck();
98
+ }
99
+ setInputs(inputs) {
100
+ for (const prop in inputs) {
101
+ this.setInput(prop, inputs[prop]);
102
+ }
103
+ }
104
+ setInput(key, value) {
105
+ if (this.#componentData.allowedInputNames.includes(key)) {
106
+ this.componentRef.setInput(key, value);
107
+ }
108
+ }
109
+ setOutputs(outputs) {
110
+ this.#outputRegistry.unsubscribeAll();
111
+ for (const prop in outputs) {
112
+ this.setOutput(prop, outputs[prop]);
113
+ }
114
+ }
115
+ setOutput(outputName, emit) {
116
+ if (!this.#componentData.allowedOutputNames.includes(outputName))
117
+ return;
118
+ if (!emit) {
119
+ this.#outputRegistry.unsubscribe(outputName);
120
+ return;
121
+ }
122
+ const hasListener = this.#outputRegistry.hasListener(outputName);
123
+ this.#outputRegistry.setListener(outputName, emit);
124
+ if (hasListener) {
125
+ return;
126
+ }
127
+ const instance = this.componentRef.instance;
128
+ const output = instance[outputName];
129
+ if (output && output instanceof OutputEmitterRef) {
130
+ output.subscribe(value => {
131
+ this.#outputRegistry.getListener(outputName)?.(value);
132
+ });
133
+ }
134
+ }
135
+ }
136
+ class FlexRenderComponentOutputManager {
137
+ #outputSubscribers = {};
138
+ #outputListeners = {};
139
+ #valueDiffer;
140
+ constructor(keyValueDiffers, initialOutputs) {
141
+ this.#valueDiffer = keyValueDiffers.find(initialOutputs).create();
142
+ if (initialOutputs) {
143
+ this.#valueDiffer.diff(initialOutputs);
144
+ }
145
+ }
146
+ hasListener(outputName) {
147
+ return outputName in this.#outputListeners;
148
+ }
149
+ setListener(outputName, callback) {
150
+ this.#outputListeners[outputName] = callback;
151
+ }
152
+ getListener(outputName) {
153
+ return this.#outputListeners[outputName];
154
+ }
155
+ unsubscribeAll() {
156
+ for (const prop in this.#outputSubscribers) {
157
+ this.unsubscribe(prop);
158
+ }
159
+ }
160
+ unsubscribe(outputName) {
161
+ if (outputName in this.#outputSubscribers) {
162
+ this.#outputSubscribers[outputName]?.unsubscribe();
163
+ delete this.#outputSubscribers[outputName];
164
+ delete this.#outputListeners[outputName];
165
+ }
166
+ }
167
+ diff(outputs) {
168
+ return this.#valueDiffer.diff(outputs ?? {});
169
+ }
170
+ }
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXItY29tcG9uZW50LXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25vdmEtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXRhYmxlLnV0aWxzL2ZsZXgtcmVuZGVyL2ZsZXgtcmVuZGVyLWNvbXBvbmVudC1yZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUVqQixNQUFNLEVBQ04sVUFBVSxFQUdWLGVBQWUsRUFDZixnQkFBZ0IsRUFFaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFBOztBQUl0QixNQUFNLE9BQU8sMEJBQTBCO0lBQ3JDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTVDLGVBQWUsQ0FDYixtQkFBMkMsRUFDM0MsaUJBQTJCO1FBRTNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQ3pELG1CQUFtQixDQUFDLFNBQVMsRUFDN0I7WUFDRSxRQUFRLEVBQUUsaUJBQWlCO1NBQzVCLENBQ0YsQ0FBQTtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksc0JBQXNCLENBQ3JDLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsaUJBQWlCLENBQ2xCLENBQUE7UUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLG1CQUFtQixDQUFBO1FBRS9DLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbEMsSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVyQyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7OEdBekJVLDBCQUEwQjtrSEFBMUIsMEJBQTBCOzsyRkFBMUIsMEJBQTBCO2tCQUR0QyxVQUFVOztBQTZCWCxNQUFNLE9BQU8sc0JBQXNCO0lB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LENBQUE7WUFDMUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsT0FBc0U7UUFDekUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudFJlZixcbiAgaW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBJbmplY3RvcixcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgT3V0cHV0RW1pdHRlclJlZixcbiAgT3V0cHV0UmVmU3Vic2NyaXB0aW9uLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgRmxleFJlbmRlckNvbXBvbmVudCB9IGZyb20gJy4vZmxleC1yZW5kZXItY29tcG9uZW50J1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmxleFJlbmRlckNvbXBvbmVudEZhY3Rvcnkge1xuICAjdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKVxuXG4gIGNyZWF0ZUNvbXBvbmVudDxUPihcbiAgICBmbGV4UmVuZGVyQ29tcG9uZW50OiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+LFxuICAgIGNvbXBvbmVudEluamVjdG9yOiBJbmplY3RvclxuICApOiBGbGV4UmVuZGVyQ29tcG9uZW50UmVmPFQ+IHtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLiN2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgIGZsZXhSZW5kZXJDb21wb25lbnQuY29tcG9uZW50LFxuICAgICAge1xuICAgICAgICBpbmplY3RvcjogY29tcG9uZW50SW5qZWN0b3IsXG4gICAgICB9XG4gICAgKVxuICAgIGNvbnN0IHZpZXcgPSBuZXcgRmxleFJlbmRlckNvbXBvbmVudFJlZihcbiAgICAgIGNvbXBvbmVudFJlZixcbiAgICAgIGZsZXhSZW5kZXJDb21wb25lbnQsXG4gICAgICBjb21wb25lbnRJbmplY3RvclxuICAgIClcblxuICAgIGNvbnN0IHsgaW5wdXRzLCBvdXRwdXRzIH0gPSBmbGV4UmVuZGVyQ29tcG9uZW50XG5cbiAgICBpZiAoaW5wdXRzKSB2aWV3LnNldElucHV0cyhpbnB1dHMpXG4gICAgaWYgKG91dHB1dHMpIHZpZXcuc2V0T3V0cHV0cyhvdXRwdXRzKVxuXG4gICAgcmV0dXJuIHZpZXdcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxleFJlbmRlckNvbXBvbmVudFJlZjxUPiB7XG4gIHJlYWRvbmx5ICNrZXlWYWx1ZURpZmZlcnNGYWN0b3J5OiBLZXlWYWx1ZURpZmZlcnNcbiAgI2NvbXBvbmVudERhdGE6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD5cbiAgI2lucHV0VmFsdWVEaWZmZXI6IEtleVZhbHVlRGlmZmVyPHN0cmluZywgdW5rbm93bj5cblxuICByZWFkb25seSAjb3V0cHV0UmVnaXN0cnk6IEZsZXhSZW5kZXJDb21wb25lbnRPdXRwdXRNYW5hZ2VyXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8VD4sXG4gICAgY29tcG9uZW50RGF0YTogRmxleFJlbmRlckNvbXBvbmVudDxUPixcbiAgICByZWFkb25seSBjb21wb25lbnRJbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7XG4gICAgdGhpcy4jY29tcG9uZW50RGF0YSA9IGNvbXBvbmVudERhdGFcbiAgICB0aGlzLiNrZXlWYWx1ZURpZmZlcnNGYWN0b3J5ID0gY29tcG9uZW50SW5qZWN0b3IuZ2V0KEtleVZhbHVlRGlmZmVycylcblxuICAgIHRoaXMuI291dHB1dFJlZ2lzdHJ5ID0gbmV3IEZsZXhSZW5kZXJDb21wb25lbnRPdXRwdXRNYW5hZ2VyKFxuICAgICAgdGhpcy4ja2V5VmFsdWVEaWZmZXJzRmFjdG9yeSxcbiAgICAgIHRoaXMub3V0cHV0c1xuICAgIClcblxuICAgIHRoaXMuI2lucHV0VmFsdWVEaWZmZXIgPSB0aGlzLiNrZXlWYWx1ZURpZmZlcnNGYWN0b3J5XG4gICAgICAuZmluZCh0aGlzLmlucHV0cylcbiAgICAgIC5jcmVhdGUoKVxuICAgIHRoaXMuI2lucHV0VmFsdWVEaWZmZXIuZGlmZih0aGlzLmlucHV0cylcblxuICAgIHRoaXMuY29tcG9uZW50UmVmLm9uRGVzdHJveSgoKSA9PiB0aGlzLiNvdXRwdXRSZWdpc3RyeS51bnN1YnNjcmliZUFsbCgpKVxuICB9XG5cbiAgZ2V0IGNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcG9uZW50RGF0YS5jb21wb25lbnRcbiAgfVxuXG4gIGdldCBpbnB1dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbXBvbmVudERhdGEuaW5wdXRzID8/IHt9XG4gIH1cblxuICBnZXQgb3V0cHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcG9uZW50RGF0YS5vdXRwdXRzID8/IHt9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbXBvbmVudCBpbnB1dCBhbmQgb3V0cHV0IGRpZmYgYnkgdGhlIGdpdmVuIGl0ZW1cbiAgICovXG4gIGRpZmYoaXRlbTogRmxleFJlbmRlckNvbXBvbmVudDxUPikge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dERpZmY6IHRoaXMuI2lucHV0VmFsdWVEaWZmZXIuZGlmZihpdGVtLmlucHV0cyA/PyB7fSksXG4gICAgICBvdXRwdXREaWZmOiB0aGlzLiNvdXRwdXRSZWdpc3RyeS5kaWZmKGl0ZW0ub3V0cHV0cyA/PyB7fSksXG4gICAgfVxuICB9XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29tcGFyZSBXaGV0aGVyIHRoZSBjdXJyZW50IHJlZiBjb21wb25lbnQgaW5zdGFuY2UgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIG9uZVxuICAgKi9cbiAgZXFUeXBlKGNvbXBhcmU6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29tcGFyZS5jb21wb25lbnQgPT09IHRoaXMuY29tcG9uZW50XG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdG8gdXBkYXRlIGN1cnJlbnQgY29tcG9uZW50IHJlZnMgaW5wdXQgYnkgdGhlIG5ldyBnaXZlbiBjb250ZW50IGNvbXBvbmVudC5cbiAgICovXG4gIHVwZGF0ZShjb250ZW50OiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+KSB7XG4gICAgY29uc3QgZXEgPSB0aGlzLmVxVHlwZShjb250ZW50KVxuICAgIGlmICghZXEpIHJldHVyblxuICAgIGNvbnN0IHsgaW5wdXREaWZmLCBvdXRwdXREaWZmIH0gPSB0aGlzLmRpZmYoY29udGVudClcbiAgICBpZiAoaW5wdXREaWZmKSB7XG4gICAgICBpbnB1dERpZmYuZm9yRWFjaEFkZGVkSXRlbShpdGVtID0+XG4gICAgICAgIHRoaXMuc2V0SW5wdXQoaXRlbS5rZXksIGl0ZW0uY3VycmVudFZhbHVlKVxuICAgICAgKVxuICAgICAgaW5wdXREaWZmLmZvckVhY2hDaGFuZ2VkSXRlbShpdGVtID0+XG4gICAgICAgIHRoaXMuc2V0SW5wdXQoaXRlbS5rZXksIGl0ZW0uY3VycmVudFZhbHVlKVxuICAgICAgKVxuICAgICAgaW5wdXREaWZmLmZvckVhY2hSZW1vdmVkSXRlbShpdGVtID0+IHRoaXMuc2V0SW5wdXQoaXRlbS5rZXksIHVuZGVmaW5lZCkpXG4gICAgfVxuICAgIGlmIChvdXRwdXREaWZmKSB7XG4gICAgICBvdXRwdXREaWZmLmZvckVhY2hBZGRlZEl0ZW0oaXRlbSA9PiB7XG4gICAgICAgIHRoaXMuc2V0T3V0cHV0KGl0ZW0ua2V5LCBpdGVtLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH0pXG4gICAgICBvdXRwdXREaWZmLmZvckVhY2hDaGFuZ2VkSXRlbShpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkuc2V0TGlzdGVuZXIoaXRlbS5rZXksIGl0ZW0uY3VycmVudFZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI291dHB1dFJlZ2lzdHJ5LnVuc3Vic2NyaWJlKGl0ZW0ua2V5KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgb3V0cHV0RGlmZi5mb3JFYWNoUmVtb3ZlZEl0ZW0oaXRlbSA9PiB7XG4gICAgICAgIHRoaXMuI291dHB1dFJlZ2lzdHJ5LnVuc3Vic2NyaWJlKGl0ZW0ua2V5KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLiNjb21wb25lbnREYXRhID0gY29udGVudFxuICB9XG5cbiAgbWFya0FzRGlydHkoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmKS5tYXJrRm9yQ2hlY2soKVxuICB9XG5cbiAgc2V0SW5wdXRzKGlucHV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gaW5wdXRzKSB7XG4gICAgICB0aGlzLnNldElucHV0KHByb3AsIGlucHV0c1twcm9wXSlcbiAgICB9XG4gIH1cblxuICBzZXRJbnB1dChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy4jY29tcG9uZW50RGF0YS5hbGxvd2VkSW5wdXROYW1lcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5zZXRJbnB1dChrZXksIHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHNldE91dHB1dHMoXG4gICAgb3V0cHV0czogUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPlsnZW1pdCddIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgID5cbiAgKSB7XG4gICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmVBbGwoKVxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBvdXRwdXRzKSB7XG4gICAgICB0aGlzLnNldE91dHB1dChwcm9wLCBvdXRwdXRzW3Byb3BdKVxuICAgIH1cbiAgfVxuXG4gIHNldE91dHB1dChcbiAgICBvdXRwdXROYW1lOiBzdHJpbmcsXG4gICAgZW1pdDogT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPlsnZW1pdCddIHwgdW5kZWZpbmVkIHwgbnVsbFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI2NvbXBvbmVudERhdGEuYWxsb3dlZE91dHB1dE5hbWVzLmluY2x1ZGVzKG91dHB1dE5hbWUpKSByZXR1cm5cbiAgICBpZiAoIWVtaXQpIHtcbiAgICAgIHRoaXMuI291dHB1dFJlZ2lzdHJ5LnVuc3Vic2NyaWJlKG91dHB1dE5hbWUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoYXNMaXN0ZW5lciA9IHRoaXMuI291dHB1dFJlZ2lzdHJ5Lmhhc0xpc3RlbmVyKG91dHB1dE5hbWUpXG4gICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkuc2V0TGlzdGVuZXIob3V0cHV0TmFtZSwgZW1pdClcblxuICAgIGlmIChoYXNMaXN0ZW5lcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZVxuICAgIGNvbnN0IG91dHB1dCA9IGluc3RhbmNlW291dHB1dE5hbWUgYXMga2V5b2YgdHlwZW9mIGluc3RhbmNlXVxuICAgIGlmIChvdXRwdXQgJiYgb3V0cHV0IGluc3RhbmNlb2YgT3V0cHV0RW1pdHRlclJlZikge1xuICAgICAgb3V0cHV0LnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgIHRoaXMuI291dHB1dFJlZ2lzdHJ5LmdldExpc3RlbmVyKG91dHB1dE5hbWUpPy4odmFsdWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50T3V0cHV0TWFuYWdlciB7XG4gIHJlYWRvbmx5ICNvdXRwdXRTdWJzY3JpYmVyczogUmVjb3JkPHN0cmluZywgT3V0cHV0UmVmU3Vic2NyaXB0aW9uPiA9IHt9XG4gIHJlYWRvbmx5ICNvdXRwdXRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD4gPSB7fVxuXG4gIHJlYWRvbmx5ICN2YWx1ZURpZmZlcjogS2V5VmFsdWVEaWZmZXI8XG4gICAgc3RyaW5nLFxuICAgIHVuZGVmaW5lZCB8IG51bGwgfCBPdXRwdXRFbWl0dGVyUmVmPHVua25vd24+WydlbWl0J11cbiAgPlxuXG4gIGNvbnN0cnVjdG9yKGtleVZhbHVlRGlmZmVyczogS2V5VmFsdWVEaWZmZXJzLCBpbml0aWFsT3V0cHV0czogYW55KSB7XG4gICAgdGhpcy4jdmFsdWVEaWZmZXIgPSBrZXlWYWx1ZURpZmZlcnMuZmluZChpbml0aWFsT3V0cHV0cykuY3JlYXRlKClcbiAgICBpZiAoaW5pdGlhbE91dHB1dHMpIHtcbiAgICAgIHRoaXMuI3ZhbHVlRGlmZmVyLmRpZmYoaW5pdGlhbE91dHB1dHMpXG4gICAgfVxuICB9XG5cbiAgaGFzTGlzdGVuZXIob3V0cHV0TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG91dHB1dE5hbWUgaW4gdGhpcy4jb3V0cHV0TGlzdGVuZXJzXG4gIH1cblxuICBzZXRMaXN0ZW5lcihvdXRwdXROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICB0aGlzLiNvdXRwdXRMaXN0ZW5lcnNbb3V0cHV0TmFtZV0gPSBjYWxsYmFja1xuICB9XG5cbiAgZ2V0TGlzdGVuZXIob3V0cHV0TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI291dHB1dExpc3RlbmVyc1tvdXRwdXROYW1lXVxuICB9XG5cbiAgdW5zdWJzY3JpYmVBbGwoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIHRoaXMuI291dHB1dFN1YnNjcmliZXJzKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKHByb3ApXG4gICAgfVxuICB9XG5cbiAgdW5zdWJzY3JpYmUob3V0cHV0TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKG91dHB1dE5hbWUgaW4gdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnMpIHtcbiAgICAgIHRoaXMuI291dHB1dFN1YnNjcmliZXJzW291dHB1dE5hbWVdPy51bnN1YnNjcmliZSgpXG4gICAgICBkZWxldGUgdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnNbb3V0cHV0TmFtZV1cbiAgICAgIGRlbGV0ZSB0aGlzLiNvdXRwdXRMaXN0ZW5lcnNbb3V0cHV0TmFtZV1cbiAgICB9XG4gIH1cblxuICBkaWZmKG91dHB1dHM6IFJlY29yZDxzdHJpbmcsIE91dHB1dEVtaXR0ZXJSZWY8dW5rbm93bj5bJ2VtaXQnXSB8IHVuZGVmaW5lZD4pIHtcbiAgICByZXR1cm4gdGhpcy4jdmFsdWVEaWZmZXIuZGlmZihvdXRwdXRzID8/IHt9KVxuICB9XG59XG4iXX0=
@@ -0,0 +1,39 @@
1
+ import { reflectComponentType, } from '@angular/core';
2
+ /**
3
+ * Helper function to create a [@link FlexRenderComponent] instance, with better type-safety.
4
+ *
5
+ * - options object must be passed when the given component instance contains at least one required signal input.
6
+ * - options/inputs is typed with the given component inputs
7
+ * - options/outputs is typed with the given component outputs
8
+ */
9
+ export function flexRenderComponent(component, ...options) {
10
+ const { inputs, injector, outputs } = options?.[0] ?? {};
11
+ return new FlexRenderComponent(component, inputs, injector, outputs);
12
+ }
13
+ /**
14
+ * Wrapper class for a component that will be used as content for {@link FlexRenderDirective}
15
+ *
16
+ * Prefer {@link flexRenderComponent} helper for better type-safety
17
+ */
18
+ export class FlexRenderComponent {
19
+ constructor(component, inputs, injector, outputs) {
20
+ this.component = component;
21
+ this.inputs = inputs;
22
+ this.injector = injector;
23
+ this.outputs = outputs;
24
+ this.allowedInputNames = [];
25
+ this.allowedOutputNames = [];
26
+ const mirror = reflectComponentType(component);
27
+ if (!mirror) {
28
+ throw new Error(`[@tanstack-table/angular] The provided symbol is not a component`);
29
+ }
30
+ this.mirror = mirror;
31
+ for (const input of this.mirror.inputs) {
32
+ this.allowedInputNames.push(input.propName);
33
+ }
34
+ for (const output of this.mirror.outputs) {
35
+ this.allowedOutputNames.push(output.propName);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXItY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbm92YS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRhdGFibGUudXRpbHMvZmxleC1yZW5kZXIvZmxleC1yZW5kZXItY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFLTCxvQkFBb0IsR0FFckIsTUFBTSxlQUFlLENBQUE7QUE0RHRCOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FLakMsU0FBMkIsRUFDM0IsR0FBRyxPQUUrQztJQUVsRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDeEQsT0FBTyxJQUFJLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3RFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQUs5QixZQUNXLFNBQTJCLEVBQzNCLE1BQTJCLEVBQzNCLFFBQW1CLEVBQ25CLE9BQTZCO1FBSDdCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFdBQU0sR0FBTixNQUFNLENBQXFCO1FBQzNCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFQL0Isc0JBQWlCLEdBQWEsRUFBRSxDQUFBO1FBQ2hDLHVCQUFrQixHQUFhLEVBQUUsQ0FBQTtRQVF4QyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUNiLGtFQUFrRSxDQUNuRSxDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBQ0QsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9DLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnRNaXJyb3IsXG4gIEluamVjdG9yLFxuICBJbnB1dFNpZ25hbCxcbiAgT3V0cHV0RW1pdHRlclJlZixcbiAgcmVmbGVjdENvbXBvbmVudFR5cGUsXG4gIFR5cGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5cbnR5cGUgSW5wdXRzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBJbnB1dFNpZ25hbDxpbmZlciBSPlxuICAgID8gS1xuICAgIDogbmV2ZXJdPzogVFtLXSBleHRlbmRzIElucHV0U2lnbmFsPGluZmVyIFI+ID8gUiA6IG5ldmVyXG59XG5cbnR5cGUgT3V0cHV0czxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgT3V0cHV0RW1pdHRlclJlZjxpbmZlciBSPlxuICAgID8gS1xuICAgIDogbmV2ZXJdPzogVFtLXSBleHRlbmRzIE91dHB1dEVtaXR0ZXJSZWY8aW5mZXIgUj5cbiAgICA/IE91dHB1dEVtaXR0ZXJSZWY8Uj5bJ2VtaXQnXVxuICAgIDogbmV2ZXJcbn1cblxudHlwZSBPcHRpb25hbEtleXM8VCwgSyA9IGtleW9mIFQ+ID0gSyBleHRlbmRzIGtleW9mIFRcbiAgPyBUW0tdIGV4dGVuZHMgUmVxdWlyZWQ8VD5bS11cbiAgICA/IHVuZGVmaW5lZCBleHRlbmRzIFRbS11cbiAgICAgID8gS1xuICAgICAgOiBuZXZlclxuICAgIDogS1xuICA6IG5ldmVyXG5cbmludGVyZmFjZSBGbGV4UmVuZGVyUmVxdWlyZWRPcHRpb25zPFxuICBUSW5wdXRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVE91dHB1dHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiB7XG4gIC8qKlxuICAgKiBDb21wb25lbnQgaW5zdGFuY2UgaW5wdXRzLiBUaGV5IHdpbGwgYmUgc2V0IHZpYSBbY29tcG9uZW50UmVmLnNldElucHV0IEFQSV0oaHR0cHM6Ly9hbmd1bGFyLmRldi9hcGkvY29yZS9Db21wb25lbnRSZWYjc2V0SW5wdXQpXG4gICAqL1xuICBpbnB1dHM6IFRJbnB1dHNcbiAgLyoqXG4gICAqIENvbXBvbmVudCBpbnN0YW5jZSBvdXRwdXRzLlxuICAgKi9cbiAgb3V0cHV0cz86IFRPdXRwdXRzXG4gIC8qKlxuICAgKiBPcHRpb25hbCB7QGxpbmsgSW5qZWN0b3J9IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBjb21wb25lbnRcbiAgICovXG4gIGluamVjdG9yPzogSW5qZWN0b3Jcbn1cblxuaW50ZXJmYWNlIEZsZXhSZW5kZXJPcHRpb25zPFxuICBUSW5wdXRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVE91dHB1dHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiB7XG4gIC8qKlxuICAgKiBDb21wb25lbnQgaW5zdGFuY2UgaW5wdXRzLiBUaGV5IHdpbGwgYmUgc2V0IHZpYSBbY29tcG9uZW50UmVmLnNldElucHV0IEFQSV0oaHR0cHM6Ly9hbmd1bGFyLmRldi9hcGkvY29yZS9Db21wb25lbnRSZWYjc2V0SW5wdXQpXG4gICAqL1xuICBpbnB1dHM/OiBUSW5wdXRzXG4gIC8qKlxuICAgKiBDb21wb25lbnQgaW5zdGFuY2Ugb3V0cHV0cy5cbiAgICovXG4gIG91dHB1dHM/OiBUT3V0cHV0c1xuICAvKipcbiAgICogT3B0aW9uYWwge0BsaW5rIEluamVjdG9yfSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBpbmplY3Rvcj86IEluamVjdG9yXG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFtAbGluayBGbGV4UmVuZGVyQ29tcG9uZW50XSBpbnN0YW5jZSwgd2l0aCBiZXR0ZXIgdHlwZS1zYWZldHkuXG4gKlxuICogLSBvcHRpb25zIG9iamVjdCBtdXN0IGJlIHBhc3NlZCB3aGVuIHRoZSBnaXZlbiBjb21wb25lbnQgaW5zdGFuY2UgY29udGFpbnMgYXQgbGVhc3Qgb25lIHJlcXVpcmVkIHNpZ25hbCBpbnB1dC5cbiAqIC0gb3B0aW9ucy9pbnB1dHMgaXMgdHlwZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcG9uZW50IGlucHV0c1xuICogLSBvcHRpb25zL291dHB1dHMgaXMgdHlwZWQgd2l0aCB0aGUgZ2l2ZW4gY29tcG9uZW50IG91dHB1dHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsZXhSZW5kZXJDb21wb25lbnQ8XG4gIFRDb21wb25lbnQgPSBhbnksXG4gIFRJbnB1dHMgZXh0ZW5kcyBJbnB1dHM8VENvbXBvbmVudD4gPSBJbnB1dHM8VENvbXBvbmVudD4sXG4gIFRPdXRwdXRzIGV4dGVuZHMgT3V0cHV0czxUQ29tcG9uZW50PiA9IE91dHB1dHM8VENvbXBvbmVudD4sXG4+KFxuICBjb21wb25lbnQ6IFR5cGU8VENvbXBvbmVudD4sXG4gIC4uLm9wdGlvbnM6IE9wdGlvbmFsS2V5czxUSW5wdXRzPiBleHRlbmRzIG5ldmVyXG4gICAgPyBbRmxleFJlbmRlck9wdGlvbnM8VElucHV0cywgVE91dHB1dHM+P11cbiAgICA6IFtGbGV4UmVuZGVyUmVxdWlyZWRPcHRpb25zPFRJbnB1dHMsIFRPdXRwdXRzPl1cbikge1xuICBjb25zdCB7IGlucHV0cywgaW5qZWN0b3IsIG91dHB1dHMgfSA9IG9wdGlvbnM/LlswXSA/PyB7fVxuICByZXR1cm4gbmV3IEZsZXhSZW5kZXJDb21wb25lbnQoY29tcG9uZW50LCBpbnB1dHMsIGluamVjdG9yLCBvdXRwdXRzKVxufVxuXG4vKipcbiAqIFdyYXBwZXIgY2xhc3MgZm9yIGEgY29tcG9uZW50IHRoYXQgd2lsbCBiZSB1c2VkIGFzIGNvbnRlbnQgZm9yIHtAbGluayBGbGV4UmVuZGVyRGlyZWN0aXZlfVxuICpcbiAqIFByZWZlciB7QGxpbmsgZmxleFJlbmRlckNvbXBvbmVudH0gaGVscGVyIGZvciBiZXR0ZXIgdHlwZS1zYWZldHlcbiAqL1xuZXhwb3J0IGNsYXNzIEZsZXhSZW5kZXJDb21wb25lbnQ8VENvbXBvbmVudCA9IGFueT4ge1xuICByZWFkb25seSBtaXJyb3I6IENvbXBvbmVudE1pcnJvcjxUQ29tcG9uZW50PlxuICByZWFkb25seSBhbGxvd2VkSW5wdXROYW1lczogc3RyaW5nW10gPSBbXVxuICByZWFkb25seSBhbGxvd2VkT3V0cHV0TmFtZXM6IHN0cmluZ1tdID0gW11cblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBjb21wb25lbnQ6IFR5cGU8VENvbXBvbmVudD4sXG4gICAgcmVhZG9ubHkgaW5wdXRzPzogSW5wdXRzPFRDb21wb25lbnQ+LFxuICAgIHJlYWRvbmx5IGluamVjdG9yPzogSW5qZWN0b3IsXG4gICAgcmVhZG9ubHkgb3V0cHV0cz86IE91dHB1dHM8VENvbXBvbmVudD5cbiAgKSB7XG4gICAgY29uc3QgbWlycm9yID0gcmVmbGVjdENvbXBvbmVudFR5cGUoY29tcG9uZW50KVxuICAgIGlmICghbWlycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbQHRhbnN0YWNrLXRhYmxlL2FuZ3VsYXJdIFRoZSBwcm92aWRlZCBzeW1ib2wgaXMgbm90IGEgY29tcG9uZW50YFxuICAgICAgKVxuICAgIH1cbiAgICB0aGlzLm1pcnJvciA9IG1pcnJvclxuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdGhpcy5taXJyb3IuaW5wdXRzKSB7XG4gICAgICB0aGlzLmFsbG93ZWRJbnB1dE5hbWVzLnB1c2goaW5wdXQucHJvcE5hbWUpXG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIHRoaXMubWlycm9yLm91dHB1dHMpIHtcbiAgICAgIHRoaXMuYWxsb3dlZE91dHB1dE5hbWVzLnB1c2gob3V0cHV0LnByb3BOYW1lKVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,101 @@
1
+ import { TemplateRef, Type } from '@angular/core';
2
+ import { FlexRenderComponent } from './flex-render-component';
3
+ export function mapToFlexRenderTypedContent(content) {
4
+ if (content === null || content === undefined) {
5
+ return { kind: 'null' };
6
+ }
7
+ if (typeof content === 'string' || typeof content === 'number') {
8
+ return { kind: 'primitive', content };
9
+ }
10
+ if (content instanceof FlexRenderComponent) {
11
+ return { kind: 'flexRenderComponent', content };
12
+ }
13
+ else if (content instanceof TemplateRef) {
14
+ return { kind: 'templateRef', content };
15
+ }
16
+ else if (content instanceof Type) {
17
+ return { kind: 'component', content };
18
+ }
19
+ else {
20
+ return { kind: 'primitive', content };
21
+ }
22
+ }
23
+ export class FlexRenderView {
24
+ #previousContent;
25
+ #content;
26
+ constructor(initialContent, view) {
27
+ this.#content = initialContent;
28
+ this.view = view;
29
+ }
30
+ get previousContent() {
31
+ return this.#previousContent ?? { kind: 'null' };
32
+ }
33
+ get content() {
34
+ return this.#content;
35
+ }
36
+ set content(content) {
37
+ this.#previousContent = this.#content;
38
+ this.#content = content;
39
+ }
40
+ }
41
+ export class FlexRenderTemplateView extends FlexRenderView {
42
+ constructor(initialContent, view) {
43
+ super(initialContent, view);
44
+ }
45
+ updateProps(props) {
46
+ this.view.markForCheck();
47
+ }
48
+ dirtyCheck() {
49
+ // Basically a no-op. When the view is created via EmbeddedViewRef, we don't need to do any manual update
50
+ // since this type of content has a proxy as a context, then every time the root component is checked for changes,
51
+ // the property getter will be re-evaluated.
52
+ //
53
+ // If in a future we need to manually mark the view as dirty, just uncomment next line
54
+ // this.view.markForCheck()
55
+ }
56
+ onDestroy(callback) {
57
+ this.view.onDestroy(callback);
58
+ }
59
+ }
60
+ export class FlexRenderComponentView extends FlexRenderView {
61
+ constructor(initialContent, view) {
62
+ super(initialContent, view);
63
+ }
64
+ updateProps(props) {
65
+ switch (this.content.kind) {
66
+ case 'component': {
67
+ this.view.setInputs(props);
68
+ break;
69
+ }
70
+ case 'flexRenderComponent': {
71
+ // No-op. When FlexRenderFlags.PropsReferenceChanged is set,
72
+ // FlexRenderComponent will be updated into `dirtyCheck`.
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ dirtyCheck() {
78
+ switch (this.content.kind) {
79
+ case 'component': {
80
+ // Component context is currently valuated with the cell context. Since it's reference
81
+ // shouldn't change, we force mark the component as dirty in order to re-evaluate function invocation in view.
82
+ // NOTE: this should behave like having a component with ChangeDetectionStrategy.Default
83
+ this.view.markAsDirty();
84
+ break;
85
+ }
86
+ case 'flexRenderComponent': {
87
+ // Given context instance will always have a different reference than the previous one,
88
+ // so instead of recreating the entire view, we will only update the current view
89
+ if (this.view.eqType(this.content.content)) {
90
+ this.view.update(this.content.content);
91
+ }
92
+ this.view.markAsDirty();
93
+ break;
94
+ }
95
+ }
96
+ }
97
+ onDestroy(callback) {
98
+ this.view.componentRef.onDestroy(callback);
99
+ }
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25vdmEtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXRhYmxlLnV0aWxzL2ZsZXgtcmVuZGVyL3ZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFtQixXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRWxFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBWTdELE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsT0FBK0I7SUFFL0IsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFDRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMvRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUN2QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLFlBQVksbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ2pELENBQUM7U0FBTSxJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUN6QyxDQUFDO1NBQU0sSUFBSSxPQUFPLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDbkMsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUE7SUFDdkMsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUs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O0lBQzVDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsZXhSZW5kZXJDb21wb25lbnRSZWYgfSBmcm9tICcuL2ZsZXgtcmVuZGVyLWNvbXBvbmVudC1yZWYnXG5pbXBvcnQgeyBFbWJlZGRlZFZpZXdSZWYsIFRlbXBsYXRlUmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB0eXBlIHsgRmxleFJlbmRlckNvbnRlbnQgfSBmcm9tICcuLi9mbGV4LXJlbmRlcidcbmltcG9ydCB7IEZsZXhSZW5kZXJDb21wb25lbnQgfSBmcm9tICcuL2ZsZXgtcmVuZGVyLWNvbXBvbmVudCdcblxuZXhwb3J0IHR5cGUgRmxleFJlbmRlclR5cGVkQ29udGVudCA9XG4gIHwgeyBraW5kOiAnbnVsbCcgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdwcmltaXRpdmUnXG4gICAgICBjb250ZW50OiBzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfVxuICB8IHsga2luZDogJ2ZsZXhSZW5kZXJDb21wb25lbnQnOyBjb250ZW50OiBGbGV4UmVuZGVyQ29tcG9uZW50PHVua25vd24+IH1cbiAgfCB7IGtpbmQ6ICd0ZW1wbGF0ZVJlZic7IGNvbnRlbnQ6IFRlbXBsYXRlUmVmPHVua25vd24+IH1cbiAgfCB7IGtpbmQ6ICdjb21wb25lbnQnOyBjb250ZW50OiBUeXBlPHVua25vd24+IH1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvRmxleFJlbmRlclR5cGVkQ29udGVudChcbiAgY29udGVudDogRmxleFJlbmRlckNvbnRlbnQ8YW55PlxuKTogRmxleFJlbmRlclR5cGVkQ29udGVudCB7XG4gIGlmIChjb250ZW50ID09PSBudWxsIHx8IGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IGtpbmQ6ICdudWxsJyB9XG4gIH1cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyBraW5kOiAncHJpbWl0aXZlJywgY29udGVudCB9XG4gIH1cbiAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBGbGV4UmVuZGVyQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHsga2luZDogJ2ZsZXhSZW5kZXJDb21wb25lbnQnLCBjb250ZW50IH1cbiAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICByZXR1cm4geyBraW5kOiAndGVtcGxhdGVSZWYnLCBjb250ZW50IH1cbiAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgVHlwZSkge1xuICAgIHJldHVybiB7IGtpbmQ6ICdjb21wb25lbnQnLCBjb250ZW50IH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyBraW5kOiAncHJpbWl0aXZlJywgY29udGVudCB9XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsZXhSZW5kZXJWaWV3PFxuICBUVmlldyBleHRlbmRzIEZsZXhSZW5kZXJDb21wb25lbnRSZWY8YW55PiB8IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPiB8IG51bGwsXG4+IHtcbiAgcmVhZG9ubHkgdmlldzogVFZpZXdcbiAgI3ByZXZpb3VzQ29udGVudDogRmxleFJlbmRlclR5cGVkQ29udGVudCB8IHVuZGVmaW5lZFxuICAjY29udGVudDogRmxleFJlbmRlclR5cGVkQ29udGVudFxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBpbml0aWFsQ29udGVudDogRXhjbHVkZTxGbGV4UmVuZGVyVHlwZWRDb250ZW50LCB7IGtpbmQ6ICdudWxsJyB9PixcbiAgICB2aWV3OiBUVmlld1xuICApIHtcbiAgICB0aGlzLiNjb250ZW50ID0gaW5pdGlhbENvbnRlbnRcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gIH1cblxuICBnZXQgcHJldmlvdXNDb250ZW50KCk6IEZsZXhSZW5kZXJUeXBlZENvbnRlbnQge1xuICAgIHJldHVybiB0aGlzLiNwcmV2aW91c0NvbnRlbnQgPz8geyBraW5kOiAnbnVsbCcgfVxuICB9XG5cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRcbiAgfVxuXG4gIHNldCBjb250ZW50KGNvbnRlbnQ6IEZsZXhSZW5kZXJUeXBlZENvbnRlbnQpIHtcbiAgICB0aGlzLiNwcmV2aW91c0NvbnRlbnQgPSB0aGlzLiNjb250ZW50XG4gICAgdGhpcy4jY29udGVudCA9IGNvbnRlbnRcbiAgfVxuXG4gIGFic3RyYWN0IHVwZGF0ZVByb3BzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZFxuXG4gIGFic3RyYWN0IGRpcnR5Q2hlY2soKTogdm9pZFxuXG4gIGFic3RyYWN0IG9uRGVzdHJveShjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyVGVtcGxhdGVWaWV3IGV4dGVuZHMgRmxleFJlbmRlclZpZXc8XG4gIEVtYmVkZGVkVmlld1JlZjx1bmtub3duPlxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGluaXRpYWxDb250ZW50OiBFeHRyYWN0PFxuICAgICAgRmxleFJlbmRlclR5cGVkQ29udGVudCxcbiAgICAgIHsga2luZDogJ3ByaW1pdGl2ZScgfCAndGVtcGxhdGVSZWYnIH1cbiAgICA+LFxuICAgIHZpZXc6IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPlxuICApIHtcbiAgICBzdXBlcihpbml0aWFsQ29udGVudCwgdmlldylcbiAgfVxuXG4gIG92ZXJyaWRlIHVwZGF0ZVByb3BzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdGhpcy52aWV3Lm1hcmtGb3JDaGVjaygpXG4gIH1cblxuICBvdmVycmlkZSBkaXJ0eUNoZWNrKCkge1xuICAgIC8vIEJhc2ljYWxseSBhIG5vLW9wLiBXaGVuIHRoZSB2aWV3IGlzIGNyZWF0ZWQgdmlhIEVtYmVkZGVkVmlld1JlZiwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgbWFudWFsIHVwZGF0ZVxuICAgIC8vIHNpbmNlIHRoaXMgdHlwZSBvZiBjb250ZW50IGhhcyBhIHByb3h5IGFzIGEgY29udGV4dCwgdGhlbiBldmVyeSB0aW1lIHRoZSByb290IGNvbXBvbmVudCBpcyBjaGVja2VkIGZvciBjaGFuZ2VzLFxuICAgIC8vIHRoZSBwcm9wZXJ0eSBnZXR0ZXIgd2lsbCBiZSByZS1ldmFsdWF0ZWQuXG4gICAgLy9cbiAgICAvLyBJZiBpbiBhIGZ1dHVyZSB3ZSBuZWVkIHRvIG1hbnVhbGx5IG1hcmsgdGhlIHZpZXcgYXMgZGlydHksIGp1c3QgdW5jb21tZW50IG5leHQgbGluZVxuICAgIC8vIHRoaXMudmlldy5tYXJrRm9yQ2hlY2soKVxuICB9XG5cbiAgb3ZlcnJpZGUgb25EZXN0cm95KGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgIHRoaXMudmlldy5vbkRlc3Ryb3koY2FsbGJhY2spXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZsZXhSZW5kZXJDb21wb25lbnRWaWV3IGV4dGVuZHMgRmxleFJlbmRlclZpZXc8XG4gIEZsZXhSZW5kZXJDb21wb25lbnRSZWY8dW5rbm93bj5cbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBpbml0aWFsQ29udGVudDogRXh0cmFjdDxcbiAgICAgIEZsZXhSZW5kZXJUeXBlZENvbnRlbnQsXG4gICAgICB7IGtpbmQ6ICdjb21wb25lbnQnIHwgJ2ZsZXhSZW5kZXJDb21wb25lbnQnIH1cbiAgICA+LFxuICAgIHZpZXc6IEZsZXhSZW5kZXJDb21wb25lbnRSZWY8dW5rbm93bj5cbiAgKSB7XG4gICAgc3VwZXIoaW5pdGlhbENvbnRlbnQsIHZpZXcpXG4gIH1cblxuICBvdmVycmlkZSB1cGRhdGVQcm9wcyhwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN3aXRjaCAodGhpcy5jb250ZW50LmtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgdGhpcy52aWV3LnNldElucHV0cyhwcm9wcylcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2ZsZXhSZW5kZXJDb21wb25lbnQnOiB7XG4gICAgICAgIC8vIE5vLW9wLiBXaGVuIEZsZXhSZW5kZXJGbGFncy5Qcm9wc1JlZmVyZW5jZUNoYW5nZWQgaXMgc2V0LFxuICAgICAgICAvLyBGbGV4UmVuZGVyQ29tcG9uZW50IHdpbGwgYmUgdXBkYXRlZCBpbnRvIGBkaXJ0eUNoZWNrYC5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXJ0eUNoZWNrKCkge1xuICAgIHN3aXRjaCAodGhpcy5jb250ZW50LmtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgLy8gQ29tcG9uZW50IGNvbnRleHQgaXMgY3VycmVudGx5IHZhbHVhdGVkIHdpdGggdGhlIGNlbGwgY29udGV4dC4gU2luY2UgaXQncyByZWZlcmVuY2VcbiAgICAgICAgLy8gc2hvdWxkbid0IGNoYW5nZSwgd2UgZm9yY2UgbWFyayB0aGUgY29tcG9uZW50IGFzIGRpcnR5IGluIG9yZGVyIHRvIHJlLWV2YWx1YXRlIGZ1bmN0aW9uIGludm9jYXRpb24gaW4gdmlldy5cbiAgICAgICAgLy8gTk9URTogdGhpcyBzaG91bGQgYmVoYXZlIGxpa2UgaGF2aW5nIGEgY29tcG9uZW50IHdpdGggQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdFxuICAgICAgICB0aGlzLnZpZXcubWFya0FzRGlydHkoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnZmxleFJlbmRlckNvbXBvbmVudCc6IHtcbiAgICAgICAgLy8gR2l2ZW4gY29udGV4dCBpbnN0YW5jZSB3aWxsIGFsd2F5cyBoYXZlIGEgZGlmZmVyZW50IHJlZmVyZW5jZSB0aGFuIHRoZSBwcmV2aW91cyBvbmUsXG4gICAgICAgIC8vIHNvIGluc3RlYWQgb2YgcmVjcmVhdGluZyB0aGUgZW50aXJlIHZpZXcsIHdlIHdpbGwgb25seSB1cGRhdGUgdGhlIGN1cnJlbnQgdmlld1xuICAgICAgICBpZiAodGhpcy52aWV3LmVxVHlwZSh0aGlzLmNvbnRlbnQuY29udGVudCkpIHtcbiAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlKHRoaXMuY29udGVudC5jb250ZW50KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlldy5tYXJrQXNEaXJ0eSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgb25EZXN0cm95KGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgIHRoaXMudmlldy5jb21wb25lbnRSZWYub25EZXN0cm95KGNhbGxiYWNrKVxuICB9XG59XG4iXX0=