ngx-reactify 0.0.2 → 0.0.3

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,13 +2,14 @@ import { createComponent, EventEmitter } from '@angular/core';
2
2
  import { createApplication } from '@angular/platform-browser';
3
3
  import * as React from 'react';
4
4
  import { firstValueFrom } from 'rxjs';
5
- // declare const Zone;
6
- // const zone = Zone ? new Zone(Zone.current, { name: "@dotglitch_menu", properties: {} }) : null;
7
5
  /**
8
- * Wrap an angular component inside of a React memo object.
6
+ * Wrap an Angular component inside of a React memo object.
9
7
  * Will attempt to bind @Input and @Output properties if provided,
10
8
  * and will bind the react arguments directly as @Input properties.
11
9
  *
10
+ * Usage: An Angular top-level application with a ReactifyNgComponent react implementation
11
+ * that needs to embed Angular components as children of the react-wrapped component.
12
+ *
12
13
  * @experimental
13
14
  * @param componentClass Angular component
14
15
  * @param envInjector An `EnvironmentInjector` instance to be used for the component
@@ -17,84 +18,160 @@ import { firstValueFrom } from 'rxjs';
17
18
  * @param _outputs
18
19
  * @returns
19
20
  */
20
- export const ReactifyReactComponent = ({ component, appRef, injector, ngZone, staticInputs, staticOutputs, preSiblings, postSiblings, additionalChildren, rootElementName, containerElementName }) => React.memo((args) => {
21
- const id = Math.random().toString();
22
- React.useEffect(() => {
23
- try {
24
- const componentInstance = createComponent(component, {
25
- environmentInjector: appRef.injector,
26
- elementInjector: injector,
27
- hostElement: document.getElementById(id)
28
- });
29
- appRef.attachView(componentInstance.hostView);
30
- // @ts-ignore
31
- // component.hostView = hostView;
32
- Object.assign(staticInputs, args);
33
- const { inputs, outputs } = component['ɵcmp'];
34
- // Returns a list of entries that need to be set
35
- // This makes it so that unnecessary setters are not invoked.
36
- const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
37
- return componentInstance.instance[childKey] != staticInputs[parentKey];
38
- });
39
- updated.forEach(([parentKey, childKey]) => {
40
- if (staticInputs.hasOwnProperty(parentKey))
41
- componentInstance.instance[childKey] = staticInputs[parentKey];
42
- });
43
- const outputSubscriptions = {};
44
- // Get a list of unregistered outputs
45
- const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
46
- return !outputSubscriptions[parentKey];
47
- });
48
- // Reverse bind via subscription
49
- newOutputs.forEach(([parentKey, childKey]) => {
50
- if (!staticOutputs.hasOwnProperty(parentKey))
51
- return;
52
- const target = componentInstance.instance[childKey];
53
- const outputs = staticOutputs;
54
- const sub = target.subscribe((...args) => {
55
- // Run the callback in the provided zone
56
- ngZone.run(() => {
57
- outputs[parentKey](...args);
58
- });
59
- }); // Subscription
60
- outputSubscriptions[parentKey] = sub;
61
- });
62
- // Wrap the destroy method to safely release the subscriptions
63
- const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
64
- componentInstance.onDestroy = (cb) => {
65
- Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
66
- originalDestroy?.(cb);
67
- };
68
- componentInstance.changeDetectorRef.detectChanges();
69
- }
70
- catch (err) {
71
- console.error(err);
72
- }
73
- }, []);
74
- const elements = [
75
- ...(preSiblings || []),
76
- React.createElement(containerElementName || "div", { id }),
77
- ...(postSiblings || []),
78
- ...(additionalChildren || [])
79
- ].filter(e => e);
80
- return React.createElement(rootElementName || "div", {}, ...elements);
21
+ export const ReactifyAngularComponent = ({ component, appRef, injector, ngZone, staticInputs = {}, staticOutputs = {}, preSiblings = [], postSiblings = [], additionalChildren = [], rootElementName = '', containerElementName = '' }) => React.memo((args) => {
22
+ return ngZone.runOutsideAngular(() => {
23
+ const id = Math.random().toString();
24
+ React.useEffect(() => {
25
+ try {
26
+ const componentInstance = createComponent(component, {
27
+ environmentInjector: appRef.injector,
28
+ elementInjector: injector,
29
+ hostElement: document.getElementById(id)
30
+ });
31
+ appRef.attachView(componentInstance.hostView);
32
+ // @ts-ignore
33
+ // component.hostView = hostView;
34
+ Object.assign(staticInputs, args);
35
+ const { inputs, outputs } = component['ɵcmp'];
36
+ // Returns a list of entries that need to be set
37
+ // This makes it so that unnecessary setters are not invoked.
38
+ const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
39
+ return componentInstance.instance[childKey] != staticInputs[parentKey];
40
+ });
41
+ updated.forEach(([parentKey, childKey]) => {
42
+ if (staticInputs.hasOwnProperty(parentKey))
43
+ componentInstance.instance[childKey] = staticInputs[parentKey];
44
+ });
45
+ const outputSubscriptions = {};
46
+ // Get a list of unregistered outputs
47
+ const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
48
+ return !outputSubscriptions[parentKey];
49
+ });
50
+ // Reverse bind via subscription
51
+ newOutputs.forEach(([parentKey, childKey]) => {
52
+ if (!staticOutputs.hasOwnProperty(parentKey))
53
+ return;
54
+ const target = componentInstance.instance[childKey];
55
+ const outputs = staticOutputs;
56
+ const sub = target.subscribe((...args) => {
57
+ // Run the callback in the provided zone
58
+ ngZone.run(() => {
59
+ outputs[parentKey](...args);
60
+ });
61
+ }); // Subscription
62
+ outputSubscriptions[parentKey] = sub;
63
+ });
64
+ // Wrap the destroy method to safely release the subscriptions
65
+ const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
66
+ componentInstance.onDestroy = (cb) => {
67
+ Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
68
+ originalDestroy?.(cb);
69
+ };
70
+ componentInstance.changeDetectorRef.detectChanges();
71
+ }
72
+ catch (err) {
73
+ console.error(err);
74
+ }
75
+ }, []);
76
+ const elements = [
77
+ ...(preSiblings || []),
78
+ React.createElement(containerElementName || "div", { id }),
79
+ ...(postSiblings || []),
80
+ ...(additionalChildren || [])
81
+ ].filter(e => e);
82
+ return React.createElement(rootElementName || "div", {}, ...elements);
83
+ });
81
84
  });
82
- export const ReactifyAngularComponent2 = (component, props) => {
83
- const inputRef = React.useRef(null);
85
+ // TODO: Remove in major release.
86
+ export const ReactifyReactComponent = ReactifyAngularComponent;
87
+ /**
88
+ * Do not use this.
89
+ * @hidden
90
+ * @experimental
91
+ */
92
+ export function ReactifyAngularComponent3(component, ngZone, appRef, injector, props = {}, containerTag = 'div') {
84
93
  const ctx = this;
85
- React.useEffect(() => {
94
+ console.log("ReactifyAngularComponent3");
95
+ return ngZone.runOutsideAngular(() => {
86
96
  // Is there a better way to do this?
87
97
  let subscriptions;
88
98
  let app;
89
- (async () => {
90
- // Code to run when the component mounts
91
- app = await createApplication({ providers: [] });
92
- const base = app.bootstrap(component, inputRef.current);
99
+ let componentInstance;
100
+ React.useEffect(() => {
101
+ return () => {
102
+ // Code to run when the component unmounts
103
+ subscriptions?.forEach(s => s?.unsubscribe());
104
+ // app?.destroy();
105
+ appRef.detachView(componentInstance.hostView);
106
+ };
107
+ }, []);
108
+ return React.createElement(containerTag, {
109
+ ref: async (node) => {
110
+ // Not sure if this ever actually happens, added as a preventative measure
111
+ // to memory leaks.
112
+ subscriptions?.forEach(s => s?.unsubscribe());
113
+ app?.destroy();
114
+ // ngZone.run(async () => {
115
+ // Init an Angular application root & bootstrap it to a DOM element.
116
+ componentInstance = createComponent(component, {
117
+ environmentInjector: appRef.injector,
118
+ elementInjector: injector,
119
+ hostElement: node
120
+ });
121
+ appRef.attachView(componentInstance.hostView);
122
+ // app = await createApplication({ providers });
123
+ // const base = app.bootstrap(component, node);
124
+ // const { instance } = base;
125
+ // Wait for the JS to finish rendering and initing.
126
+ // await firstValueFrom(app.isStable);
127
+ // Now that everything has settled, bind inputs and outputs.
128
+ subscriptions = [];
129
+ Object.entries(props).filter(([k, v]) => {
130
+ // @Outputs are always Event Emitters (I think)
131
+ if (v instanceof EventEmitter) {
132
+ subscriptions.push(componentInstance.instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
133
+ }
134
+ else {
135
+ componentInstance.instance[k] = props[k];
136
+ }
137
+ });
138
+ // })
139
+ // app.tick();
140
+ }
141
+ });
142
+ });
143
+ }
144
+ /**
145
+ * Bootstrap an Angular component with `createApplication` and export it under a
146
+ * react Element.
147
+ * Usage: React top-level application embedding an Angular component.
148
+ */
149
+ export function ReactifyStandaloneAngularComponent(component, props = {}, providers = [], containerTag = 'div') {
150
+ const ctx = this;
151
+ // Is there a better way to do this?
152
+ let subscriptions;
153
+ let app;
154
+ React.useEffect(() => {
155
+ return () => {
156
+ // Code to run when the component unmounts
157
+ subscriptions?.forEach(s => s?.unsubscribe());
158
+ app?.destroy();
159
+ };
160
+ }, []);
161
+ return React.createElement(containerTag, { ref: async (node) => {
162
+ // Not sure if this ever actually happens, added as a preventative measure
163
+ // to memory leaks.
164
+ subscriptions?.forEach(s => s?.unsubscribe());
165
+ app?.destroy();
166
+ // Init an Angular application root & bootstrap it to a DOM element.
167
+ app = await createApplication({ providers });
168
+ const base = app.bootstrap(component, node);
93
169
  const { instance } = base;
170
+ // Wait for the JS to finish rendering and initing.
94
171
  await firstValueFrom(app.isStable);
95
- // App has now bootstrapped fully.
172
+ // Now that everything has settled, bind inputs and outputs.
96
173
  subscriptions = [];
97
- Object.entries(instance).filter(([k, v]) => {
174
+ Object.entries(props).filter(([k, v]) => {
98
175
  // @Outputs are always Event Emitters (I think)
99
176
  if (v instanceof EventEmitter) {
100
177
  subscriptions.push(instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
@@ -103,14 +180,7 @@ export const ReactifyAngularComponent2 = (component, props) => {
103
180
  instance[k] = props[k];
104
181
  }
105
182
  });
106
- })();
107
- return () => {
108
- // Code to run when the component unmounts
109
- subscriptions?.forEach(s => s?.unsubscribe());
110
- app?.destroy();
111
- };
112
- }, []); // Empty dependency array ensures this effect runs only once on mount and cleanup on unmount
113
- const obj = {};
114
- return React.createElement("div");
115
- };
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10by1yZWFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2FuZ3VsYXItdG8tcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBR3BELHNCQUFzQjtBQUN0QixrR0FBa0c7QUFFbEc7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxFQUNuQyxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxFQUNaLGFBQWEsRUFDYixXQUFXLEVBQ1gsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixlQUFlLEVBQ2Ysb0JBQW9CLEVBYXZCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtJQUV0QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDakIsSUFBSSxDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUMsU0FBUyxFQUFFO2dCQUNqRCxtQkFBbUIsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDcEMsZUFBZSxFQUFFLFFBQVE7Z0JBQ3pCLFdBQVcsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQzthQUMzQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lB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QUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsWUFBWSxZQUFZLEVBQUUsQ0FBQztvQkFDNUIsYUFBYSxDQUFDLElBQUksQ0FDZCxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDekQsQ0FBQztnQkFDTixDQUFDO3FCQUNJLENBQUM7b0JBQ0YsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVKLE9BQU8sR0FBRyxFQUFFO1lBQ1IsMENBQTBDO1lBQzFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM5QyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsNEZBQTRGO0lBRXBHLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUVmLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNyQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgY3JlYXRlQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cblxuLy8gZGVjbGFyZSBjb25zdCBab25lO1xuLy8gY29uc3Qgem9uZSA9IFpvbmUgPyBuZXcgWm9uZShab25lLmN1cnJlbnQsIHsgbmFtZTogXCJAZG90Z2xpdGNoX21lbnVcIiwgcHJvcGVydGllczoge30gfSkgOiBudWxsO1xuXG4vKipcbiAqIFdyYXAgYW4gYW5ndWxhciBjb21wb25lbnQgaW5zaWRlIG9mIGEgUmVhY3QgbWVtbyBvYmplY3QuXG4gKiBXaWxsIGF0dGVtcHQgdG8gYmluZCBASW5wdXQgYW5kIEBPdXRwdXQgcHJvcGVydGllcyBpZiBwcm92aWRlZCxcbiAqIGFuZCB3aWxsIGJpbmQgdGhlIHJlYWN0IGFyZ3VtZW50cyBkaXJlY3RseSBhcyBASW5wdXQgcHJvcGVydGllcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgQW5ndWxhciBjb21wb25lbnRcbiAqIEBwYXJhbSBlbnZJbmplY3RvciAgICBBbiBgRW52aXJvbm1lbnRJbmplY3RvcmAgaW5zdGFuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbXBvbmVudFxuICogQHBhcmFtIGluamVjdG9yICAgICAgIEFuIGBFbGVtZW50SW5qZWN0b3JgIGluc3RhbmNlXG4gKiBAcGFyYW0gX2lucHV0c1xuICogQHBhcmFtIF9vdXRwdXRzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgUmVhY3RpZnlSZWFjdENvbXBvbmVudCA9ICh7XG4gICAgY29tcG9uZW50LFxuICAgIGFwcFJlZixcbiAgICBpbmplY3RvcixcbiAgICBuZ1pvbmUsXG4gICAgc3RhdGljSW5wdXRzLFxuICAgIHN0YXRpY091dHB1dHMsXG4gICAgcHJlU2libGluZ3MsXG4gICAgcG9zdFNpYmxpbmdzLFxuICAgIGFkZGl0aW9uYWxDaGlsZHJlbixcbiAgICByb290RWxlbWVudE5hbWUsXG4gICAgY29udGFpbmVyRWxlbWVudE5hbWVcbn06IHtcbiAgICBjb21wb25lbnQ6IFR5cGU8YW55PixcbiAgICBhcHBSZWY6IE9taXQ8QXBwbGljYXRpb25SZWYsICdfcnVubmluZ1RpY2snPixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgbmdab25lOiBOZ1pvbmUsXG4gICAgc3RhdGljSW5wdXRzPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sXG4gICAgc3RhdGljT3V0cHV0cz86IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb247IH0sXG4gICAgcHJlU2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBwb3N0U2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBhZGRpdGlvbmFsQ2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICByb290RWxlbWVudE5hbWU/OiBQYXJhbWV0ZXJzPHR5cGVvZiBSZWFjdC5jcmVhdGVFbGVtZW50PlswXSxcbiAgICBjb250YWluZXJFbGVtZW50TmFtZT86IHN0cmluZztcbn0pID0+IFJlYWN0Lm1lbW8oKGFyZ3MpID0+IHtcblxuICAgIGNvbnN0IGlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGFwcFJlZi5pbmplY3RvcixcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5qZWN0b3I6IGluamVjdG9yLFxuICAgICAgICAgICAgICAgIGhvc3RFbGVtZW50OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wb25lbnQuaG9zdFZpZXcgPSBob3N0VmlldztcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0aWNJbnB1dHMsIGFyZ3MpO1xuXG4gICAgICAgICAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cyB9ID0gY29tcG9uZW50WyfJtWNtcCddO1xuXG4gICAgICAgICAgICAvLyBSZXR1cm5zIGEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZSBzZXRcbiAgICAgICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB1bm5lY2Vzc2FyeSBzZXR0ZXJzIGFyZSBub3QgaW52b2tlZC5cbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XSAhPSBzdGF0aWNJbnB1dHNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB1cGRhdGVkLmZvckVhY2goKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0aWNJbnB1dHMuaGFzT3duUHJvcGVydHkocGFyZW50S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldID0gc3RhdGljSW5wdXRzW3BhcmVudEtleV07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U3Vic2NyaXB0aW9uczogeyBba2V5OiBzdHJpbmddOiBTdWJzY3JpcHRpb247IH0gPSB7fTtcbiAgICAgICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIG91dHB1dHNcbiAgICAgICAgICAgIGNvbnN0IG5ld091dHB1dHMgPSBPYmplY3QuZW50cmllcyhvdXRwdXRzKS5maWx0ZXIoKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFJldmVyc2UgYmluZCB2aWEgc3Vic2NyaXB0aW9uXG4gICAgICAgICAgICBuZXdPdXRwdXRzLmZvckVhY2goKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3RhdGljT3V0cHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IEV2ZW50RW1pdHRlcjx1bmtub3duPiA9IGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRzID0gc3RhdGljT3V0cHV0cztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRhcmdldC5zdWJzY3JpYmUoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHRoZSBjYWxsYmFjayBpbiB0aGUgcHJvdmlkZWQgem9uZVxuICAgICAgICAgICAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbcGFyZW50S2V5XSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7IC8vIFN1YnNjcmlwdGlvblxuXG4gICAgICAgICAgICAgICAgb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldID0gc3ViO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFdyYXAgdGhlIGRlc3Ryb3kgbWV0aG9kIHRvIHNhZmVseSByZWxlYXNlIHRoZSBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3k/LmJpbmQoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2Uub25EZXN0cm95ID0gKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhvdXRwdXRTdWJzY3JpcHRpb25zKS5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LihjYik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXG4gICAgICAgIC4uLihwcmVTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyRWxlbWVudE5hbWUgfHwgXCJkaXZcIiwgeyBpZCB9KSxcbiAgICAgICAgLi4uKHBvc3RTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgIC4uLihhZGRpdGlvbmFsQ2hpbGRyZW4gfHwgW10pXG4gICAgXS5maWx0ZXIoZSA9PiBlKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHJvb3RFbGVtZW50TmFtZSB8fCBcImRpdlwiLCB7fSwgLi4uZWxlbWVudHMpO1xufSk7XG5cblxuZXhwb3J0IGNvbnN0IFJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDIgPSAoXG4gICAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgcHJvcHM6IGFueVxuKSA9PiB7XG4gICAgY29uc3QgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcblxuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW107XG4gICAgICAgIGxldCBhcHA6IEFwcGxpY2F0aW9uUmVmO1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ29kZSB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IG1vdW50c1xuICAgICAgICAgICAgYXBwID0gYXdhaXQgY3JlYXRlQXBwbGljYXRpb24oeyBwcm92aWRlcnM6IFtdIH0pO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGFwcC5ib290c3RyYXAoY29tcG9uZW50LCBpbnB1dFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICAgICAgICAgIC8vIEFwcCBoYXMgbm93IGJvb3RzdHJhcHBlZCBmdWxseS5cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGluc3RhbmNlKS5maWx0ZXIoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEBPdXRwdXRzIGFyZSBhbHdheXMgRXZlbnQgRW1pdHRlcnMgKEkgdGhpbmspXG4gICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba10/LnN1YnNjcmliZShldnQgPT4gcHJvcHNba10uY2FsbChjdHgsIGV2dCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrXSA9IHByb3BzW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pKClcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ29kZSB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zPy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICBhcHA/LmRlc3Ryb3koKTtcbiAgICAgICAgfTtcbiAgICB9LCBbXSk7IC8vIEVtcHR5IGRlcGVuZGVuY3kgYXJyYXkgZW5zdXJlcyB0aGlzIGVmZmVjdCBydW5zIG9ubHkgb25jZSBvbiBtb3VudCBhbmQgY2xlYW51cCBvbiB1bm1vdW50XG5cbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG59XG4iXX0=
183
+ base.changeDetectorRef.detectChanges();
184
+ } });
185
+ }
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10by1yZWFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2FuZ3VsYXItdG8tcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxlQUFlLEVBQUUsWUFBWSxFQUFnRCxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUdwRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEVBQ3JDLFNBQVMsRUFDVCxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEdBQUcsRUFBRSxFQUNqQixhQUFhLEdBQUcsRUFBRSxFQUNsQixXQUFXLEdBQUcsRUFBRSxFQUNoQixZQUFZLEdBQUcsRUFBRSxFQUNqQixrQkFBa0IsR0FBRyxFQUFFLEVBQ3ZCLGVBQWUsR0FBRyxFQUFFLEVBQ3BCLG9CQUFvQixHQUFHLEVBQUUsRUFhNUIsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBRXRCLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtRQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBSSxDQUFDO2dCQUVELE1BQU0saUJBQWlCLEdBQUcsZUFBZSxDQUFDLFNBQVMsRUFBRTtvQkFDakQsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFFBQVE7b0JBQ3BDLGVBQWUsRUFBRSxRQUFRO29CQUN6QixXQUFXLEVBQUUsUUFB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RSxDQUFDLENBQUM7WUFDOUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBRWYsb0VBQW9FO1lBQ3BFLEdBQUcsR0FBRyxNQUFNLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBRzFCLG1EQUFtRDtZQUNuRCxNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkMsNERBQTREO1lBQzVELGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNwQywrQ0FBK0M7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLFlBQVksRUFBRSxDQUFDO29CQUM1QixhQUFhLENBQUMsSUFBSSxDQUNkLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUN6RCxDQUFDO2dCQUNOLENBQUM7cUJBQ0ksQ0FBQztvQkFDRixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0MsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgY3JlYXRlQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIFByb3ZpZGVyLCBFbnZpcm9ubWVudFByb3ZpZGVycywgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVBcHBsaWNhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5cbi8qKlxuICogV3JhcCBhbiBBbmd1bGFyIGNvbXBvbmVudCBpbnNpZGUgb2YgYSBSZWFjdCBtZW1vIG9iamVjdC5cbiAqIFdpbGwgYXR0ZW1wdCB0byBiaW5kIEBJbnB1dCBhbmQgQE91dHB1dCBwcm9wZXJ0aWVzIGlmIHByb3ZpZGVkLFxuICogYW5kIHdpbGwgYmluZCB0aGUgcmVhY3QgYXJndW1lbnRzIGRpcmVjdGx5IGFzIEBJbnB1dCBwcm9wZXJ0aWVzLlxuICpcbiAqIFVzYWdlOiBBbiBBbmd1bGFyIHRvcC1sZXZlbCBhcHBsaWNhdGlvbiB3aXRoIGEgUmVhY3RpZnlOZ0NvbXBvbmVudCByZWFjdCBpbXBsZW1lbnRhdGlvblxuICogdGhhdCBuZWVkcyB0byBlbWJlZCBBbmd1bGFyIGNvbXBvbmVudHMgYXMgY2hpbGRyZW4gb2YgdGhlIHJlYWN0LXdyYXBwZWQgY29tcG9uZW50LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyBBbmd1bGFyIGNvbXBvbmVudFxuICogQHBhcmFtIGVudkluamVjdG9yICAgIEFuIGBFbnZpcm9ubWVudEluamVjdG9yYCBpbnN0YW5jZSB0byBiZSB1c2VkIGZvciB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0gaW5qZWN0b3IgICAgICAgQW4gYEVsZW1lbnRJbmplY3RvcmAgaW5zdGFuY2VcbiAqIEBwYXJhbSBfaW5wdXRzXG4gKiBAcGFyYW0gX291dHB1dHNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBSZWFjdGlmeUFuZ3VsYXJDb21wb25lbnQgPSAoe1xuICAgIGNvbXBvbmVudCxcbiAgICBhcHBSZWYsXG4gICAgaW5qZWN0b3IsXG4gICAgbmdab25lLFxuICAgIHN0YXRpY0lucHV0cyA9IHt9LFxuICAgIHN0YXRpY091dHB1dHMgPSB7fSxcbiAgICBwcmVTaWJsaW5ncyA9IFtdLFxuICAgIHBvc3RTaWJsaW5ncyA9IFtdLFxuICAgIGFkZGl0aW9uYWxDaGlsZHJlbiA9IFtdLFxuICAgIHJvb3RFbGVtZW50TmFtZSA9ICcnLFxuICAgIGNvbnRhaW5lckVsZW1lbnROYW1lID0gJydcbn06IHtcbiAgICBjb21wb25lbnQ6IFR5cGU8YW55PixcbiAgICBhcHBSZWY6IE9taXQ8QXBwbGljYXRpb25SZWYsICdfcnVubmluZ1RpY2snPixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgbmdab25lOiBOZ1pvbmUsXG4gICAgc3RhdGljSW5wdXRzPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sXG4gICAgc3RhdGljT3V0cHV0cz86IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb247IH0sXG4gICAgcHJlU2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBwb3N0U2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBhZGRpdGlvbmFsQ2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICByb290RWxlbWVudE5hbWU/OiBQYXJhbWV0ZXJzPHR5cGVvZiBSZWFjdC5jcmVhdGVFbGVtZW50PlswXSxcbiAgICBjb250YWluZXJFbGVtZW50TmFtZT86IHN0cmluZztcbn0pID0+IFJlYWN0Lm1lbW8oKGFyZ3MpID0+IHtcblxuICAgIHJldHVybiBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKTtcbiAgICAgICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogYXBwUmVmLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5qZWN0b3I6IGluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBob3N0RWxlbWVudDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBhcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5ob3N0VmlldyA9IGhvc3RWaWV3O1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0aWNJbnB1dHMsIGFyZ3MpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMgfSA9IGNvbXBvbmVudFsnybVjbXAnXTtcblxuICAgICAgICAgICAgICAgIC8vIFJldHVybnMgYSBsaXN0IG9mIGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIHNldFxuICAgICAgICAgICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB1bm5lY2Vzc2FyeSBzZXR0ZXJzIGFyZSBub3QgaW52b2tlZC5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gT2JqZWN0LmVudHJpZXMoaW5wdXRzKS5maWx0ZXIoKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldICE9IHN0YXRpY0lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdXBkYXRlZC5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY0lucHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldID0gc3RhdGljSW5wdXRzW3BhcmVudEtleV07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IFN1YnNjcmlwdGlvbjsgfSA9IHt9O1xuICAgICAgICAgICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIG91dHB1dHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdPdXRwdXRzID0gT2JqZWN0LmVudHJpZXMob3V0cHV0cykuZmlsdGVyKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFvdXRwdXRTdWJzY3JpcHRpb25zW3BhcmVudEtleV07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIGJpbmQgdmlhIHN1YnNjcmlwdGlvblxuICAgICAgICAgICAgICAgIG5ld091dHB1dHMuZm9yRWFjaCgoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGljT3V0cHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0OiBFdmVudEVtaXR0ZXI8dW5rbm93bj4gPSBjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZVtjaGlsZEtleV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBzdGF0aWNPdXRwdXRzO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRhcmdldC5zdWJzY3JpYmUoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgY2FsbGJhY2sgaW4gdGhlIHByb3ZpZGVkIHpvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbcGFyZW50S2V5XSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgLy8gU3Vic2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldID0gc3ViO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gV3JhcCB0aGUgZGVzdHJveSBtZXRob2QgdG8gc2FmZWx5IHJlbGVhc2UgdGhlIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3k/LmJpbmQoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLm9uRGVzdHJveSA9IChjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKG91dHB1dFN1YnNjcmlwdGlvbnMpLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LihjYik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IFtcbiAgICAgICAgICAgIC4uLihwcmVTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRhaW5lckVsZW1lbnROYW1lIHx8IFwiZGl2XCIsIHsgaWQgfSksXG4gICAgICAgICAgICAuLi4ocG9zdFNpYmxpbmdzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLihhZGRpdGlvbmFsQ2hpbGRyZW4gfHwgW10pXG4gICAgICAgIF0uZmlsdGVyKGUgPT4gZSk7XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQocm9vdEVsZW1lbnROYW1lIHx8IFwiZGl2XCIsIHt9LCAuLi5lbGVtZW50cyk7XG4gICAgfSlcbn0pO1xuLy8gVE9ETzogUmVtb3ZlIGluIG1ham9yIHJlbGVhc2UuXG5leHBvcnQgY29uc3QgUmVhY3RpZnlSZWFjdENvbXBvbmVudCA9IFJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDtcblxuLyoqXG4gKiBEbyBub3QgdXNlIHRoaXMuXG4gKiBAaGlkZGVuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWFjdGlmeUFuZ3VsYXJDb21wb25lbnQzKFxuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIG5nWm9uZTogTmdab25lLFxuICAgIGFwcFJlZjogT21pdDxBcHBsaWNhdGlvblJlZiwgJ19ydW5uaW5nVGljayc+LFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm9wczogYW55ID0ge30sXG4gICAgY29udGFpbmVyVGFnOiBzdHJpbmcgPSAnZGl2J1xuKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcbiAgICBjb25zb2xlLmxvZyhcIlJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDNcIilcblxuICAgIHJldHVybiBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xuICAgICAgICBsZXQgYXBwOiBBcHBsaWNhdGlvblJlZjtcbiAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlOiBDb21wb25lbnRSZWY8YW55PjtcblxuICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb2RlIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zPy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICAgICAgLy8gYXBwPy5kZXN0cm95KCk7XG5cbiAgICAgICAgICAgICAgICBhcHBSZWYuZGV0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyVGFnLCB7XG4gICAgICAgICAgICByZWY6IGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgaWYgdGhpcyBldmVyIGFjdHVhbGx5IGhhcHBlbnMsIGFkZGVkIGFzIGEgcHJldmVudGF0aXZlIG1lYXN1cmVcbiAgICAgICAgICAgICAgICAvLyB0byBtZW1vcnkgbGVha3MuXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgICAgIGFwcD8uZGVzdHJveSgpO1xuXG5cbiAgICAgICAgICAgICAgICAvLyBuZ1pvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJbml0IGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcm9vdCAmIGJvb3RzdHJhcCBpdCB0byBhIERPTSBlbGVtZW50LlxuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGFwcFJlZi5pbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluamVjdG9yOiBpbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnQ6IG5vZGVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudEluc3RhbmNlLmhvc3RWaWV3KTtcbiAgICAgICAgICAgICAgICAvLyBhcHAgPSBhd2FpdCBjcmVhdGVBcHBsaWNhdGlvbih7IHByb3ZpZGVycyB9KTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBiYXNlID0gYXBwLmJvb3RzdHJhcChjb21wb25lbnQsIG5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cblxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBKUyB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCBpbml0aW5nLlxuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCBldmVyeXRoaW5nIGhhcyBzZXR0bGVkLCBiaW5kIGlucHV0cyBhbmQgb3V0cHV0cy5cbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZpbHRlcigoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEBPdXRwdXRzIGFyZSBhbHdheXMgRXZlbnQgRW1pdHRlcnMgKEkgdGhpbmspXG4gICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2Vba10/LnN1YnNjcmliZShldnQgPT4gcHJvcHNba10uY2FsbChjdHgsIGV2dCkpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2Vba10gPSBwcm9wc1trXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIH0pXG5cbiAgICAgICAgICAgICAgICAvLyBhcHAudGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEJvb3RzdHJhcCBhbiBBbmd1bGFyIGNvbXBvbmVudCB3aXRoIGBjcmVhdGVBcHBsaWNhdGlvbmAgYW5kIGV4cG9ydCBpdCB1bmRlciBhXG4gKiByZWFjdCBFbGVtZW50LlxuICogVXNhZ2U6IFJlYWN0IHRvcC1sZXZlbCBhcHBsaWNhdGlvbiBlbWJlZGRpbmcgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWFjdGlmeVN0YW5kYWxvbmVBbmd1bGFyQ29tcG9uZW50KFxuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIHByb3BzOiBhbnkgPSB7fSxcbiAgICBwcm92aWRlcnM6IChQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKVtdID0gW10sXG4gICAgY29udGFpbmVyVGFnOiBzdHJpbmcgPSAnZGl2J1xuKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcblxuICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuICAgIGxldCBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXTtcbiAgICBsZXQgYXBwOiBBcHBsaWNhdGlvblJlZjtcblxuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDb2RlIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM/LmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgIGFwcD8uZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRhaW5lclRhZywgeyByZWY6IGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgZXZlciBhY3R1YWxseSBoYXBwZW5zLCBhZGRlZCBhcyBhIHByZXZlbnRhdGl2ZSBtZWFzdXJlXG4gICAgICAgIC8vIHRvIG1lbW9yeSBsZWFrcy5cbiAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICBhcHA/LmRlc3Ryb3koKTtcblxuICAgICAgICAvLyBJbml0IGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcm9vdCAmIGJvb3RzdHJhcCBpdCB0byBhIERPTSBlbGVtZW50LlxuICAgICAgICBhcHAgPSBhd2FpdCBjcmVhdGVBcHBsaWNhdGlvbih7IHByb3ZpZGVycyB9KTtcbiAgICAgICAgY29uc3QgYmFzZSA9IGFwcC5ib290c3RyYXAoY29tcG9uZW50LCBub2RlKTtcbiAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gYmFzZTtcblxuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBKUyB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCBpbml0aW5nLlxuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShhcHAuaXNTdGFibGUpO1xuXG4gICAgICAgIC8vIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHNldHRsZWQsIGJpbmQgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgICAgICBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5maWx0ZXIoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgLy8gQE91dHB1dHMgYXJlIGFsd2F5cyBFdmVudCBFbWl0dGVycyAoSSB0aGluaylcbiAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrXT8uc3Vic2NyaWJlKGV2dCA9PiBwcm9wc1trXS5jYWxsKGN0eCwgZXZ0KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Vba10gPSBwcm9wc1trXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYmFzZS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSB9KTtcbn1cbiJdfQ==
@@ -17,7 +17,7 @@ export class ReactifyNgComponent {
17
17
  }
18
18
  ngOnInit() {
19
19
  if (!this.ngReactComponent) {
20
- throw new Error("ReactMagicWrapperComponent cannot start without a provided ngReactComponent!");
20
+ throw new Error("ReactifyNgComponent cannot be inherited without a provided ngReactComponent!");
21
21
  }
22
22
  }
23
23
  ngOnChanges(changes) {
@@ -72,4 +72,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
72
72
  standalone: true
73
73
  }]
74
74
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.NgZone }] });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdG8tYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3JlYWN0LXRvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQyxTQUFTLEVBQXdLLE1BQU0sZUFBZSxDQUFDO0FBQy9PLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHcEQ7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTyxtQkFBbUI7SUFVNUIsWUFDcUIsV0FBNkIsRUFDN0IsTUFBYztRQURkLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBRW5DLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUF1QjtRQUMvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtZQUN4RCxPQUFNO1FBQ1YsQ0FBQztRQUFBLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRWxFLG9EQUFvRDtnQkFDcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakUsdUNBQXVDO2dCQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELDRDQUE0QztnQkFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNqQiwwQ0FBMEM7Z0JBQzFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTFDLG1FQUFtRTtnQkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUN4QiwyQkFBMkI7b0JBQzNCLG9EQUFvRDtvQkFDcEQsc0NBQXNDO29CQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNGLENBQUM7WUFDRCxPQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs4R0F0RVEsbUJBQW1CO2tHQUFuQixtQkFBbUIsd0dBSGxCLEVBQUU7OzJGQUdILG1CQUFtQjtrQkFML0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxRQUFRLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsSUFBSTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBBcHBsaWNhdGlvblJlZiwgQ29tcG9uZW50LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEVudmlyb25tZW50SW5qZWN0b3IsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFR5cGUsIFZpZXdDb250YWluZXJSZWYsIFZpZXdSZWYsIGNyZWF0ZUNvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCwgUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5cbi8qKlxuICogRXh0ZW5kIHRoaXMgY29tcG9uZW50IHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVcbiAqIGJpbmRpbmdzIHRvIGEgUmVhY3QgY29tcG9uZW50LlxuICpcbiAqICEgWW91IF9tdXN0XyBvdmVycmlkZSB0aGUgcHJvcGVydHkgYG5nUmVhY3RDb21wb25lbnRgXG4gKiBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGVycm9yc1xuICogYG92ZXJyaWRlIHJlYWRvbmx5IG5nUmVhY3RDb21wb25lbnQgPSBSZWFjdEZsb3dXcmFwcGFibGVDb21wb25lbnQ7YFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1yZWFjdC1tYWdpYy13cmFwcGVyJyxcbiAgICB0ZW1wbGF0ZTogYGAsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBSZWFjdGlmeU5nQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYWN0IGNvbXBvbmVudCB0byBiZSB3cmFwcGVkLlxuICAgICAqICEgTXVzdCBiZSBvdmVycmlkZGVuIGZvciB0aGlzIHdyYXBwZXIgdG8gd29ya1xuICAgICAqL1xuICAgIG5nUmVhY3RDb21wb25lbnQ6IFJlYWN0LkZ1bmN0aW9uQ29tcG9uZW50PGFueT4gfCBSZWFjdC5Db21wb25lbnRDbGFzczxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfcm9vdDogUm9vdDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdE1hZ2ljV3JhcHBlckNvbXBvbmVudCBjYW5ub3Qgc3RhcnQgd2l0aG91dCBhIHByb3ZpZGVkIG5nUmVhY3RDb21wb25lbnQhXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcz86IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fcm9vdD8udW5tb3VudCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbmRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5nUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVuZGVyIG5vIGNvbXBvbmVudC4gTWF5IGJlIGNvbnRleHQgaXNzdWVcIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdCA/Pz0gY3JlYXRlUm9vdCh0aGlzLm5nQ29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAvLyBMaXN0IGFsbCBrZXlzIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggYF9gIG5vciBgbmdgXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpLmZpbHRlcihrID0+ICEvXig/Ol98bmcpLy50ZXN0KGspKTtcblxuICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBjbGFzc1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BLZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhay5zdGFydHNXaXRoKFwib25cIikpO1xuICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgZXZlbnQgaGFuZGxlciBrZXlzIGZyb20gdGhlIGNsYXNzXG4gICAgICAgICAgICAgICAgY29uc3QgZXZ0S2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gay5zdGFydHNXaXRoKFwib25cIikpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7fTtcbiAgICAgICAgICAgICAgICAvLyBQcm9qZWN0IGFsbCBrZXkgcHJvcGVydGllcyBvbnRvIGBwcm9wc2BcbiAgICAgICAgICAgICAgICBwcm9wS2V5cy5mb3JFYWNoKGsgPT4gcHJvcHNba10gPSB0aGlzW2tdKTtcblxuICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZW5zdXJlIG5vIHpvbmUgaXMgbG9zdCBkdXJpbmcgdGhlIGV2ZW50IGVtaXR0ZXIgZmlyZXNcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5HdWFyZGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmluZCBhbGwgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgIC8vICEgaW1wb3J0YW50IEFuZ3VsYXIgdXNlcyBFdmVudEVtaXR0ZXIsIFJlYWN0IHVzZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGV2ZW50IGJpbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgZXZ0S2V5cy5mb3JFYWNoKGsgPT4gcHJvcHNba10gPSAoLi4uYXJncykgPT4gdGhpc1trXS5uZXh0KGFyZ3MpKTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdC5yZW5kZXIoUmVhY3QuY3JlYXRlRWxlbWVudCh0aGlzLm5nUmVhY3RDb21wb25lbnQsIHsgcHJvcHM6IHByb3BzIGFzIGFueSB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdG8tYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3JlYWN0LXRvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWlFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHcEQ7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTyxtQkFBbUI7SUFVNUIsWUFDdUIsV0FBNkIsRUFDN0IsTUFBYztRQURkLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBRXJDLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUF1QjtRQUMvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtZQUN4RCxPQUFNO1FBQ1YsQ0FBQztRQUFBLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRWxFLG9EQUFvRDtnQkFDcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakUsdUNBQXVDO2dCQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELDRDQUE0QztnQkFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNqQiwwQ0FBMEM7Z0JBQzFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTFDLG1FQUFtRTtnQkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUN4QiwyQkFBMkI7b0JBQzNCLG9EQUFvRDtvQkFDcEQsc0NBQXNDO29CQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ2IsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBWSxFQUFFLENBQUMsQ0FDdEUsQ0FBQztZQUNOLENBQUM7WUFDRCxPQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs4R0F4RVEsbUJBQW1CO2tHQUFuQixtQkFBbUIsd0dBSGxCLEVBQUU7OzJGQUdILG1CQUFtQjtrQkFML0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxRQUFRLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsSUFBSTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVJvb3QsIFJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcblxuXG4vKipcbiAqIEV4dGVuZCB0aGlzIGNvbXBvbmVudCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlXG4gKiBiaW5kaW5ncyB0byBhIFJlYWN0IGNvbXBvbmVudC5cbiAqXG4gKiAhIFlvdSBfbXVzdF8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGBuZ1JlYWN0Q29tcG9uZW50YFxuICogRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBlcnJvcnNcbiAqIGBvdmVycmlkZSByZWFkb25seSBuZ1JlYWN0Q29tcG9uZW50ID0gUmVhY3RGbG93V3JhcHBhYmxlQ29tcG9uZW50O2BcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtcmVhY3QtbWFnaWMtd3JhcHBlcicsXG4gICAgdGVtcGxhdGU6IGBgLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgUmVhY3RpZnlOZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFjdCBjb21wb25lbnQgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiAhIE11c3QgYmUgb3ZlcnJpZGRlbiBmb3IgdGhpcyB3cmFwcGVyIHRvIHdvcmtcbiAgICAgKi9cbiAgICBuZ1JlYWN0Q29tcG9uZW50OiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDxhbnk+IHwgUmVhY3QuQ29tcG9uZW50Q2xhc3M8YW55PjtcblxuICAgIHByaXZhdGUgX3Jvb3Q6IFJvb3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5nQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmVcbiAgICApIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5nUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0aWZ5TmdDb21wb25lbnQgY2Fubm90IGJlIGluaGVyaXRlZCB3aXRob3V0IGEgcHJvdmlkZWQgbmdSZWFjdENvbXBvbmVudCFcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzPzogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9yb290Py51bm1vdW50KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMubmdSZWFjdENvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJSZW5kZXIgbm8gY29tcG9uZW50LiBNYXkgYmUgY29udGV4dCBpc3N1ZVwiKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290ID8/PSBjcmVhdGVSb290KHRoaXMubmdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIExpc3QgYWxsIGtleXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgX2Agbm9yIGBuZ2BcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcykuZmlsdGVyKGsgPT4gIS9eKD86X3xuZykvLnRlc3QoaykpO1xuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIGNsYXNzXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcEtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFrLnN0YXJ0c1dpdGgoXCJvblwiKSk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBldmVudCBoYW5kbGVyIGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBldnRLZXlzID0ga2V5cy5maWx0ZXIoayA9PiBrLnN0YXJ0c1dpdGgoXCJvblwiKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHt9O1xuICAgICAgICAgICAgICAgIC8vIFByb2plY3QgYWxsIGtleSBwcm9wZXJ0aWVzIG9udG8gYHByb3BzYFxuICAgICAgICAgICAgICAgIHByb3BLZXlzLmZvckVhY2goayA9PiBwcm9wc1trXSA9IHRoaXNba10pO1xuXG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBlbnN1cmUgbm8gem9uZSBpcyBsb3N0IGR1cmluZyB0aGUgZXZlbnQgZW1pdHRlciBmaXJlc1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bkd1YXJkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCaW5kIGFsbCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgLy8gISBpbXBvcnRhbnQgQW5ndWxhciB1c2VzIEV2ZW50RW1pdHRlciwgUmVhY3QgdXNlc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgZXZlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICBldnRLZXlzLmZvckVhY2goayA9PiBwcm9wc1trXSA9ICguLi5hcmdzKSA9PiB0aGlzW2tdLm5leHQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yb290LnJlbmRlcihcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudCh0aGlzLm5nUmVhY3RDb21wb25lbnQsIHsgcHJvcHM6IHByb3BzIGFzIGFueSB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=
@@ -5,13 +5,14 @@ import * as React from 'react';
5
5
  import { firstValueFrom } from 'rxjs';
6
6
  import { createRoot } from 'react-dom/client';
7
7
 
8
- // declare const Zone;
9
- // const zone = Zone ? new Zone(Zone.current, { name: "@dotglitch_menu", properties: {} }) : null;
10
8
  /**
11
- * Wrap an angular component inside of a React memo object.
9
+ * Wrap an Angular component inside of a React memo object.
12
10
  * Will attempt to bind @Input and @Output properties if provided,
13
11
  * and will bind the react arguments directly as @Input properties.
14
12
  *
13
+ * Usage: An Angular top-level application with a ReactifyNgComponent react implementation
14
+ * that needs to embed Angular components as children of the react-wrapped component.
15
+ *
15
16
  * @experimental
16
17
  * @param componentClass Angular component
17
18
  * @param envInjector An `EnvironmentInjector` instance to be used for the component
@@ -20,84 +21,160 @@ import { createRoot } from 'react-dom/client';
20
21
  * @param _outputs
21
22
  * @returns
22
23
  */
23
- const ReactifyReactComponent = ({ component, appRef, injector, ngZone, staticInputs, staticOutputs, preSiblings, postSiblings, additionalChildren, rootElementName, containerElementName }) => React.memo((args) => {
24
- const id = Math.random().toString();
25
- React.useEffect(() => {
26
- try {
27
- const componentInstance = createComponent(component, {
28
- environmentInjector: appRef.injector,
29
- elementInjector: injector,
30
- hostElement: document.getElementById(id)
31
- });
32
- appRef.attachView(componentInstance.hostView);
33
- // @ts-ignore
34
- // component.hostView = hostView;
35
- Object.assign(staticInputs, args);
36
- const { inputs, outputs } = component['ɵcmp'];
37
- // Returns a list of entries that need to be set
38
- // This makes it so that unnecessary setters are not invoked.
39
- const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
40
- return componentInstance.instance[childKey] != staticInputs[parentKey];
41
- });
42
- updated.forEach(([parentKey, childKey]) => {
43
- if (staticInputs.hasOwnProperty(parentKey))
44
- componentInstance.instance[childKey] = staticInputs[parentKey];
45
- });
46
- const outputSubscriptions = {};
47
- // Get a list of unregistered outputs
48
- const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
49
- return !outputSubscriptions[parentKey];
50
- });
51
- // Reverse bind via subscription
52
- newOutputs.forEach(([parentKey, childKey]) => {
53
- if (!staticOutputs.hasOwnProperty(parentKey))
54
- return;
55
- const target = componentInstance.instance[childKey];
56
- const outputs = staticOutputs;
57
- const sub = target.subscribe((...args) => {
58
- // Run the callback in the provided zone
59
- ngZone.run(() => {
60
- outputs[parentKey](...args);
61
- });
62
- }); // Subscription
63
- outputSubscriptions[parentKey] = sub;
64
- });
65
- // Wrap the destroy method to safely release the subscriptions
66
- const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
67
- componentInstance.onDestroy = (cb) => {
68
- Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
69
- originalDestroy?.(cb);
70
- };
71
- componentInstance.changeDetectorRef.detectChanges();
72
- }
73
- catch (err) {
74
- console.error(err);
75
- }
76
- }, []);
77
- const elements = [
78
- ...(preSiblings || []),
79
- React.createElement(containerElementName || "div", { id }),
80
- ...(postSiblings || []),
81
- ...(additionalChildren || [])
82
- ].filter(e => e);
83
- return React.createElement(rootElementName || "div", {}, ...elements);
24
+ const ReactifyAngularComponent = ({ component, appRef, injector, ngZone, staticInputs = {}, staticOutputs = {}, preSiblings = [], postSiblings = [], additionalChildren = [], rootElementName = '', containerElementName = '' }) => React.memo((args) => {
25
+ return ngZone.runOutsideAngular(() => {
26
+ const id = Math.random().toString();
27
+ React.useEffect(() => {
28
+ try {
29
+ const componentInstance = createComponent(component, {
30
+ environmentInjector: appRef.injector,
31
+ elementInjector: injector,
32
+ hostElement: document.getElementById(id)
33
+ });
34
+ appRef.attachView(componentInstance.hostView);
35
+ // @ts-ignore
36
+ // component.hostView = hostView;
37
+ Object.assign(staticInputs, args);
38
+ const { inputs, outputs } = component['ɵcmp'];
39
+ // Returns a list of entries that need to be set
40
+ // This makes it so that unnecessary setters are not invoked.
41
+ const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
42
+ return componentInstance.instance[childKey] != staticInputs[parentKey];
43
+ });
44
+ updated.forEach(([parentKey, childKey]) => {
45
+ if (staticInputs.hasOwnProperty(parentKey))
46
+ componentInstance.instance[childKey] = staticInputs[parentKey];
47
+ });
48
+ const outputSubscriptions = {};
49
+ // Get a list of unregistered outputs
50
+ const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
51
+ return !outputSubscriptions[parentKey];
52
+ });
53
+ // Reverse bind via subscription
54
+ newOutputs.forEach(([parentKey, childKey]) => {
55
+ if (!staticOutputs.hasOwnProperty(parentKey))
56
+ return;
57
+ const target = componentInstance.instance[childKey];
58
+ const outputs = staticOutputs;
59
+ const sub = target.subscribe((...args) => {
60
+ // Run the callback in the provided zone
61
+ ngZone.run(() => {
62
+ outputs[parentKey](...args);
63
+ });
64
+ }); // Subscription
65
+ outputSubscriptions[parentKey] = sub;
66
+ });
67
+ // Wrap the destroy method to safely release the subscriptions
68
+ const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
69
+ componentInstance.onDestroy = (cb) => {
70
+ Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
71
+ originalDestroy?.(cb);
72
+ };
73
+ componentInstance.changeDetectorRef.detectChanges();
74
+ }
75
+ catch (err) {
76
+ console.error(err);
77
+ }
78
+ }, []);
79
+ const elements = [
80
+ ...(preSiblings || []),
81
+ React.createElement(containerElementName || "div", { id }),
82
+ ...(postSiblings || []),
83
+ ...(additionalChildren || [])
84
+ ].filter(e => e);
85
+ return React.createElement(rootElementName || "div", {}, ...elements);
86
+ });
84
87
  });
85
- const ReactifyAngularComponent2 = (component, props) => {
86
- const inputRef = React.useRef(null);
88
+ // TODO: Remove in major release.
89
+ const ReactifyReactComponent = ReactifyAngularComponent;
90
+ /**
91
+ * Do not use this.
92
+ * @hidden
93
+ * @experimental
94
+ */
95
+ function ReactifyAngularComponent3(component, ngZone, appRef, injector, props = {}, containerTag = 'div') {
87
96
  const ctx = this;
88
- React.useEffect(() => {
97
+ console.log("ReactifyAngularComponent3");
98
+ return ngZone.runOutsideAngular(() => {
89
99
  // Is there a better way to do this?
90
100
  let subscriptions;
91
101
  let app;
92
- (async () => {
93
- // Code to run when the component mounts
94
- app = await createApplication({ providers: [] });
95
- const base = app.bootstrap(component, inputRef.current);
102
+ let componentInstance;
103
+ React.useEffect(() => {
104
+ return () => {
105
+ // Code to run when the component unmounts
106
+ subscriptions?.forEach(s => s?.unsubscribe());
107
+ // app?.destroy();
108
+ appRef.detachView(componentInstance.hostView);
109
+ };
110
+ }, []);
111
+ return React.createElement(containerTag, {
112
+ ref: async (node) => {
113
+ // Not sure if this ever actually happens, added as a preventative measure
114
+ // to memory leaks.
115
+ subscriptions?.forEach(s => s?.unsubscribe());
116
+ app?.destroy();
117
+ // ngZone.run(async () => {
118
+ // Init an Angular application root & bootstrap it to a DOM element.
119
+ componentInstance = createComponent(component, {
120
+ environmentInjector: appRef.injector,
121
+ elementInjector: injector,
122
+ hostElement: node
123
+ });
124
+ appRef.attachView(componentInstance.hostView);
125
+ // app = await createApplication({ providers });
126
+ // const base = app.bootstrap(component, node);
127
+ // const { instance } = base;
128
+ // Wait for the JS to finish rendering and initing.
129
+ // await firstValueFrom(app.isStable);
130
+ // Now that everything has settled, bind inputs and outputs.
131
+ subscriptions = [];
132
+ Object.entries(props).filter(([k, v]) => {
133
+ // @Outputs are always Event Emitters (I think)
134
+ if (v instanceof EventEmitter) {
135
+ subscriptions.push(componentInstance.instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
136
+ }
137
+ else {
138
+ componentInstance.instance[k] = props[k];
139
+ }
140
+ });
141
+ // })
142
+ // app.tick();
143
+ }
144
+ });
145
+ });
146
+ }
147
+ /**
148
+ * Bootstrap an Angular component with `createApplication` and export it under a
149
+ * react Element.
150
+ * Usage: React top-level application embedding an Angular component.
151
+ */
152
+ function ReactifyStandaloneAngularComponent(component, props = {}, providers = [], containerTag = 'div') {
153
+ const ctx = this;
154
+ // Is there a better way to do this?
155
+ let subscriptions;
156
+ let app;
157
+ React.useEffect(() => {
158
+ return () => {
159
+ // Code to run when the component unmounts
160
+ subscriptions?.forEach(s => s?.unsubscribe());
161
+ app?.destroy();
162
+ };
163
+ }, []);
164
+ return React.createElement(containerTag, { ref: async (node) => {
165
+ // Not sure if this ever actually happens, added as a preventative measure
166
+ // to memory leaks.
167
+ subscriptions?.forEach(s => s?.unsubscribe());
168
+ app?.destroy();
169
+ // Init an Angular application root & bootstrap it to a DOM element.
170
+ app = await createApplication({ providers });
171
+ const base = app.bootstrap(component, node);
96
172
  const { instance } = base;
173
+ // Wait for the JS to finish rendering and initing.
97
174
  await firstValueFrom(app.isStable);
98
- // App has now bootstrapped fully.
175
+ // Now that everything has settled, bind inputs and outputs.
99
176
  subscriptions = [];
100
- Object.entries(instance).filter(([k, v]) => {
177
+ Object.entries(props).filter(([k, v]) => {
101
178
  // @Outputs are always Event Emitters (I think)
102
179
  if (v instanceof EventEmitter) {
103
180
  subscriptions.push(instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
@@ -106,16 +183,9 @@ const ReactifyAngularComponent2 = (component, props) => {
106
183
  instance[k] = props[k];
107
184
  }
108
185
  });
109
- })();
110
- return () => {
111
- // Code to run when the component unmounts
112
- subscriptions?.forEach(s => s?.unsubscribe());
113
- app?.destroy();
114
- };
115
- }, []); // Empty dependency array ensures this effect runs only once on mount and cleanup on unmount
116
- const obj = {};
117
- return React.createElement("div");
118
- };
186
+ base.changeDetectorRef.detectChanges();
187
+ } });
188
+ }
119
189
 
120
190
  /**
121
191
  * Extend this component to automatically generate
@@ -132,7 +202,7 @@ class ReactifyNgComponent {
132
202
  }
133
203
  ngOnInit() {
134
204
  if (!this.ngReactComponent) {
135
- throw new Error("ReactMagicWrapperComponent cannot start without a provided ngReactComponent!");
205
+ throw new Error("ReactifyNgComponent cannot be inherited without a provided ngReactComponent!");
136
206
  }
137
207
  }
138
208
  ngOnChanges(changes) {
@@ -192,5 +262,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
192
262
  * Generated bundle index. Do not edit.
193
263
  */
194
264
 
195
- export { ReactifyAngularComponent2, ReactifyNgComponent, ReactifyReactComponent };
265
+ export { ReactifyAngularComponent, ReactifyAngularComponent3, ReactifyNgComponent, ReactifyReactComponent, ReactifyStandaloneAngularComponent };
196
266
  //# sourceMappingURL=ngx-reactify.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-reactify.mjs","sources":["../../../src/util/angular-to-react.ts","../../../src/util/react-to-angular.ts","../../../src/ngx-reactify.ts"],"sourcesContent":["import { Type, ApplicationRef, Injector, NgZone, createComponent, EventEmitter } from '@angular/core';\nimport { createApplication } from '@angular/platform-browser';\nimport * as React from 'react';\nimport { firstValueFrom, Subscription } from 'rxjs';\n\n\n// declare const Zone;\n// const zone = Zone ? new Zone(Zone.current, { name: \"@dotglitch_menu\", properties: {} }) : null;\n\n/**\n * Wrap an angular component inside of a React memo object.\n * Will attempt to bind @Input and @Output properties if provided,\n * and will bind the react arguments directly as @Input properties.\n *\n * @experimental\n * @param componentClass Angular component\n * @param envInjector An `EnvironmentInjector` instance to be used for the component\n * @param injector An `ElementInjector` instance\n * @param _inputs\n * @param _outputs\n * @returns\n */\nexport const ReactifyReactComponent = ({\n component,\n appRef,\n injector,\n ngZone,\n staticInputs,\n staticOutputs,\n preSiblings,\n postSiblings,\n additionalChildren,\n rootElementName,\n containerElementName\n}: {\n component: Type<any>,\n appRef: Omit<ApplicationRef, '_runningTick'>,\n injector: Injector,\n ngZone: NgZone,\n staticInputs?: { [key: string]: any; },\n staticOutputs?: { [key: string]: Function; },\n preSiblings?: React.ReactNode[],\n postSiblings?: React.ReactNode[],\n additionalChildren?: React.ReactNode[],\n rootElementName?: Parameters<typeof React.createElement>[0],\n containerElementName?: string;\n}) => React.memo((args) => {\n\n const id = Math.random().toString();\n React.useEffect(() => {\n try {\n\n const componentInstance = createComponent(component, {\n environmentInjector: appRef.injector,\n elementInjector: injector,\n hostElement: document.getElementById(id)\n });\n\n appRef.attachView(componentInstance.hostView);\n // @ts-ignore\n // component.hostView = hostView;\n\n Object.assign(staticInputs, args);\n\n const { inputs, outputs } = component['ɵcmp'];\n\n // Returns a list of entries that need to be set\n // This makes it so that unnecessary setters are not invoked.\n const updated = Object.entries(inputs).filter(([parentKey, childKey]: [string, string]) => {\n return componentInstance.instance[childKey] != staticInputs[parentKey];\n });\n\n updated.forEach(([parentKey, childKey]: [string, string]) => {\n if (staticInputs.hasOwnProperty(parentKey))\n componentInstance.instance[childKey] = staticInputs[parentKey];\n });\n\n const outputSubscriptions: { [key: string]: Subscription; } = {};\n // Get a list of unregistered outputs\n const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]: [string, string]) => {\n return !outputSubscriptions[parentKey];\n });\n\n // Reverse bind via subscription\n newOutputs.forEach(([parentKey, childKey]: [string, string]) => {\n if (!staticOutputs.hasOwnProperty(parentKey)) return;\n\n const target: EventEmitter<unknown> = componentInstance.instance[childKey];\n const outputs = staticOutputs;\n\n const sub = target.subscribe((...args) => {\n // Run the callback in the provided zone\n ngZone.run(() => {\n outputs[parentKey](...args);\n });\n }); // Subscription\n\n outputSubscriptions[parentKey] = sub;\n });\n\n // Wrap the destroy method to safely release the subscriptions\n const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);\n componentInstance.onDestroy = (cb) => {\n Object.values(outputSubscriptions).forEach(s => s.unsubscribe());\n originalDestroy?.(cb);\n };\n\n componentInstance.changeDetectorRef.detectChanges();\n }\n catch (err) {\n console.error(err);\n }\n }, []);\n\n const elements = [\n ...(preSiblings || []),\n React.createElement(containerElementName || \"div\", { id }),\n ...(postSiblings || []),\n ...(additionalChildren || [])\n ].filter(e => e);\n\n return React.createElement(rootElementName || \"div\", {}, ...elements);\n});\n\n\nexport const ReactifyAngularComponent2 = (\n component: Type<any>,\n props: any\n) => {\n const inputRef = React.useRef(null);\n const ctx = this;\n\n React.useEffect(() => {\n // Is there a better way to do this?\n let subscriptions: Subscription[];\n let app: ApplicationRef;\n (async () => {\n // Code to run when the component mounts\n app = await createApplication({ providers: [] });\n const base = app.bootstrap(component, inputRef.current);\n const { instance } = base;\n\n await firstValueFrom(app.isStable);\n\n // App has now bootstrapped fully.\n subscriptions = [];\n Object.entries(instance).filter(([k, v]) => {\n // @Outputs are always Event Emitters (I think)\n if (v instanceof EventEmitter) {\n subscriptions.push(\n instance[k]?.subscribe(evt => props[k].call(ctx, evt))\n );\n }\n else {\n instance[k] = props[k];\n }\n })\n })()\n\n return () => {\n // Code to run when the component unmounts\n subscriptions?.forEach(s => s?.unsubscribe());\n app?.destroy();\n };\n }, []); // Empty dependency array ensures this effect runs only once on mount and cleanup on unmount\n\n const obj = {};\n\n return React.createElement(\"div\")\n}\n","import { AfterViewInit, ApplicationRef, Component, ComponentFactoryResolver, EnvironmentInjector, EventEmitter, Injector, NgZone, OnChanges, OnDestroy, SimpleChanges, Type, ViewContainerRef, ViewRef, createComponent } from '@angular/core';\nimport * as React from 'react';\nimport { createRoot, Root } from 'react-dom/client';\n\n\n/**\n * Extend this component to automatically generate\n * bindings to a React component.\n *\n * ! You _must_ override the property `ngReactComponent`\n * Failure to do so will result in errors\n * `override readonly ngReactComponent = ReactFlowWrappableComponent;`\n */\n@Component({\n selector: 'app-react-magic-wrapper',\n template: ``,\n standalone: true\n})\nexport class ReactifyNgComponent implements OnChanges, OnDestroy, AfterViewInit {\n\n /**\n * The react component to be wrapped.\n * ! Must be overridden for this wrapper to work\n */\n ngReactComponent: React.FunctionComponent<any> | React.ComponentClass<any>;\n\n private _root: Root;\n\n constructor(\n private readonly ngContainer: ViewContainerRef,\n private readonly ngZone: NgZone\n ) {\n }\n\n ngOnInit() {\n if (!this.ngReactComponent) {\n throw new Error(\"ReactMagicWrapperComponent cannot start without a provided ngReactComponent!\");\n }\n }\n\n ngOnChanges(changes?: SimpleChanges): void {\n this._render();\n }\n\n ngAfterViewInit() {\n this._render();\n }\n\n ngOnDestroy() {\n this._root?.unmount();\n }\n\n private _render() {\n if (!this.ngReactComponent) {\n console.log(\"Render no component. May be context issue\")\n return\n };\n\n this.ngZone.runOutsideAngular(() => {\n try {\n this._root ??= createRoot(this.ngContainer.element.nativeElement);\n\n // List all keys that do not start with `_` nor `ng`\n const keys = Object.keys(this).filter(k => !/^(?:_|ng)/.test(k));\n\n // Get all property keys from the class\n const propKeys = keys.filter(k => !k.startsWith(\"on\"));\n // Get all event handler keys from the class\n const evtKeys = keys.filter(k => k.startsWith(\"on\"));\n\n const props = {};\n // Project all key properties onto `props`\n propKeys.forEach(k => props[k] = this[k]);\n\n // Attempt to ensure no zone is lost during the event emitter fires\n this.ngZone.runGuarded(() => {\n // Bind all event handlers.\n // ! important Angular uses EventEmitter, React uses\n // a different method of event binding\n evtKeys.forEach(k => props[k] = (...args) => this[k].next(args));\n })\n\n this._root.render(React.createElement(this.ngReactComponent, { props: props as any }));\n }\n catch(err) {\n console.error(err)\n }\n })\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["this"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-reactify.mjs","sources":["../../../src/util/angular-to-react.ts","../../../src/util/react-to-angular.ts","../../../src/ngx-reactify.ts"],"sourcesContent":["import { Type, ApplicationRef, Injector, NgZone, createComponent, EventEmitter, Provider, EnvironmentProviders, ComponentRef } from '@angular/core';\nimport { createApplication } from '@angular/platform-browser';\nimport * as React from 'react';\nimport { firstValueFrom, Subscription } from 'rxjs';\n\n\n/**\n * Wrap an Angular component inside of a React memo object.\n * Will attempt to bind @Input and @Output properties if provided,\n * and will bind the react arguments directly as @Input properties.\n *\n * Usage: An Angular top-level application with a ReactifyNgComponent react implementation\n * that needs to embed Angular components as children of the react-wrapped component.\n *\n * @experimental\n * @param componentClass Angular component\n * @param envInjector An `EnvironmentInjector` instance to be used for the component\n * @param injector An `ElementInjector` instance\n * @param _inputs\n * @param _outputs\n * @returns\n */\nexport const ReactifyAngularComponent = ({\n component,\n appRef,\n injector,\n ngZone,\n staticInputs = {},\n staticOutputs = {},\n preSiblings = [],\n postSiblings = [],\n additionalChildren = [],\n rootElementName = '',\n containerElementName = ''\n}: {\n component: Type<any>,\n appRef: Omit<ApplicationRef, '_runningTick'>,\n injector: Injector,\n ngZone: NgZone,\n staticInputs?: { [key: string]: any; },\n staticOutputs?: { [key: string]: Function; },\n preSiblings?: React.ReactNode[],\n postSiblings?: React.ReactNode[],\n additionalChildren?: React.ReactNode[],\n rootElementName?: Parameters<typeof React.createElement>[0],\n containerElementName?: string;\n}) => React.memo((args) => {\n\n return ngZone.runOutsideAngular(() => {\n const id = Math.random().toString();\n React.useEffect(() => {\n try {\n\n const componentInstance = createComponent(component, {\n environmentInjector: appRef.injector,\n elementInjector: injector,\n hostElement: document.getElementById(id)\n });\n\n appRef.attachView(componentInstance.hostView);\n // @ts-ignore\n // component.hostView = hostView;\n\n Object.assign(staticInputs, args);\n\n const { inputs, outputs } = component['ɵcmp'];\n\n // Returns a list of entries that need to be set\n // This makes it so that unnecessary setters are not invoked.\n const updated = Object.entries(inputs).filter(([parentKey, childKey]: [string, string]) => {\n return componentInstance.instance[childKey] != staticInputs[parentKey];\n });\n\n updated.forEach(([parentKey, childKey]: [string, string]) => {\n if (staticInputs.hasOwnProperty(parentKey))\n componentInstance.instance[childKey] = staticInputs[parentKey];\n });\n\n const outputSubscriptions: { [key: string]: Subscription; } = {};\n // Get a list of unregistered outputs\n const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]: [string, string]) => {\n return !outputSubscriptions[parentKey];\n });\n\n // Reverse bind via subscription\n newOutputs.forEach(([parentKey, childKey]: [string, string]) => {\n if (!staticOutputs.hasOwnProperty(parentKey)) return;\n\n const target: EventEmitter<unknown> = componentInstance.instance[childKey];\n const outputs = staticOutputs;\n\n const sub = target.subscribe((...args) => {\n // Run the callback in the provided zone\n ngZone.run(() => {\n outputs[parentKey](...args);\n });\n }); // Subscription\n\n outputSubscriptions[parentKey] = sub;\n });\n\n // Wrap the destroy method to safely release the subscriptions\n const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);\n componentInstance.onDestroy = (cb) => {\n Object.values(outputSubscriptions).forEach(s => s.unsubscribe());\n originalDestroy?.(cb);\n };\n\n componentInstance.changeDetectorRef.detectChanges();\n }\n catch (err) {\n console.error(err);\n }\n }, []);\n\n const elements = [\n ...(preSiblings || []),\n React.createElement(containerElementName || \"div\", { id }),\n ...(postSiblings || []),\n ...(additionalChildren || [])\n ].filter(e => e);\n\n return React.createElement(rootElementName || \"div\", {}, ...elements);\n })\n});\n// TODO: Remove in major release.\nexport const ReactifyReactComponent = ReactifyAngularComponent;\n\n/**\n * Do not use this.\n * @hidden\n * @experimental\n */\nexport function ReactifyAngularComponent3(\n component: Type<any>,\n ngZone: NgZone,\n appRef: Omit<ApplicationRef, '_runningTick'>,\n injector: Injector,\n props: any = {},\n containerTag: string = 'div'\n) {\n const ctx = this;\n console.log(\"ReactifyAngularComponent3\")\n\n return ngZone.runOutsideAngular(() => {\n // Is there a better way to do this?\n let subscriptions: Subscription[];\n let app: ApplicationRef;\n let componentInstance: ComponentRef<any>;\n\n React.useEffect(() => {\n return () => {\n // Code to run when the component unmounts\n subscriptions?.forEach(s => s?.unsubscribe());\n // app?.destroy();\n\n appRef.detachView(componentInstance.hostView);\n };\n }, []);\n\n return React.createElement(containerTag, {\n ref: async (node) => {\n // Not sure if this ever actually happens, added as a preventative measure\n // to memory leaks.\n subscriptions?.forEach(s => s?.unsubscribe());\n app?.destroy();\n\n\n // ngZone.run(async () => {\n // Init an Angular application root & bootstrap it to a DOM element.\n\n componentInstance = createComponent(component, {\n environmentInjector: appRef.injector,\n elementInjector: injector,\n hostElement: node\n });\n\n appRef.attachView(componentInstance.hostView);\n // app = await createApplication({ providers });\n // const base = app.bootstrap(component, node);\n // const { instance } = base;\n\n\n // Wait for the JS to finish rendering and initing.\n // await firstValueFrom(app.isStable);\n\n // Now that everything has settled, bind inputs and outputs.\n subscriptions = [];\n Object.entries(props).filter(([k, v]) => {\n // @Outputs are always Event Emitters (I think)\n if (v instanceof EventEmitter) {\n subscriptions.push(\n componentInstance.instance[k]?.subscribe(evt => props[k].call(ctx, evt))\n );\n }\n else {\n componentInstance.instance[k] = props[k];\n }\n });\n // })\n\n // app.tick();\n }\n });\n });\n}\n\n\n/**\n * Bootstrap an Angular component with `createApplication` and export it under a\n * react Element.\n * Usage: React top-level application embedding an Angular component.\n */\nexport function ReactifyStandaloneAngularComponent(\n component: Type<any>,\n props: any = {},\n providers: (Provider | EnvironmentProviders)[] = [],\n containerTag: string = 'div'\n) {\n const ctx = this;\n\n // Is there a better way to do this?\n let subscriptions: Subscription[];\n let app: ApplicationRef;\n\n React.useEffect(() => {\n return () => {\n // Code to run when the component unmounts\n subscriptions?.forEach(s => s?.unsubscribe());\n app?.destroy();\n };\n }, []);\n\n return React.createElement(containerTag, { ref: async (node) => {\n // Not sure if this ever actually happens, added as a preventative measure\n // to memory leaks.\n subscriptions?.forEach(s => s?.unsubscribe());\n app?.destroy();\n\n // Init an Angular application root & bootstrap it to a DOM element.\n app = await createApplication({ providers });\n const base = app.bootstrap(component, node);\n const { instance } = base;\n\n\n // Wait for the JS to finish rendering and initing.\n await firstValueFrom(app.isStable);\n\n // Now that everything has settled, bind inputs and outputs.\n subscriptions = [];\n Object.entries(props).filter(([k, v]) => {\n // @Outputs are always Event Emitters (I think)\n if (v instanceof EventEmitter) {\n subscriptions.push(\n instance[k]?.subscribe(evt => props[k].call(ctx, evt))\n );\n }\n else {\n instance[k] = props[k];\n }\n });\n\n base.changeDetectorRef.detectChanges();\n } });\n}\n","import { AfterViewInit, Component, NgZone, OnChanges, OnDestroy, SimpleChanges, ViewContainerRef } from '@angular/core';\nimport * as React from 'react';\nimport { createRoot, Root } from 'react-dom/client';\n\n\n/**\n * Extend this component to automatically generate\n * bindings to a React component.\n *\n * ! You _must_ override the property `ngReactComponent`\n * Failure to do so will result in errors\n * `override readonly ngReactComponent = ReactFlowWrappableComponent;`\n */\n@Component({\n selector: 'app-react-magic-wrapper',\n template: ``,\n standalone: true\n})\nexport class ReactifyNgComponent implements OnChanges, OnDestroy, AfterViewInit {\n\n /**\n * The react component to be wrapped.\n * ! Must be overridden for this wrapper to work\n */\n ngReactComponent: React.FunctionComponent<any> | React.ComponentClass<any>;\n\n private _root: Root;\n\n constructor(\n protected readonly ngContainer: ViewContainerRef,\n protected readonly ngZone: NgZone\n ) {\n }\n\n ngOnInit() {\n if (!this.ngReactComponent) {\n throw new Error(\"ReactifyNgComponent cannot be inherited without a provided ngReactComponent!\");\n }\n }\n\n ngOnChanges(changes?: SimpleChanges): void {\n this._render();\n }\n\n ngAfterViewInit() {\n this._render();\n }\n\n ngOnDestroy() {\n this._root?.unmount();\n }\n\n private _render() {\n if (!this.ngReactComponent) {\n console.log(\"Render no component. May be context issue\")\n return\n };\n\n this.ngZone.runOutsideAngular(() => {\n try {\n this._root ??= createRoot(this.ngContainer.element.nativeElement);\n\n // List all keys that do not start with `_` nor `ng`\n const keys = Object.keys(this).filter(k => !/^(?:_|ng)/.test(k));\n\n // Get all property keys from the class\n const propKeys = keys.filter(k => !k.startsWith(\"on\"));\n // Get all event handler keys from the class\n const evtKeys = keys.filter(k => k.startsWith(\"on\"));\n\n const props = {};\n // Project all key properties onto `props`\n propKeys.forEach(k => props[k] = this[k]);\n\n // Attempt to ensure no zone is lost during the event emitter fires\n this.ngZone.runGuarded(() => {\n // Bind all event handlers.\n // ! important Angular uses EventEmitter, React uses\n // a different method of event binding\n evtKeys.forEach(k => props[k] = (...args) => this[k].next(args));\n })\n\n this._root.render(\n React.createElement(this.ngReactComponent, { props: props as any })\n );\n }\n catch(err) {\n console.error(err)\n }\n })\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-reactify",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "repository": {
5
5
  "url": "https://github.com/knackstedt/ngx-reactify"
6
6
  },
@@ -1,10 +1,13 @@
1
- import { Type, ApplicationRef, Injector, NgZone } from '@angular/core';
1
+ import { Type, ApplicationRef, Injector, NgZone, Provider, EnvironmentProviders } from '@angular/core';
2
2
  import * as React from 'react';
3
3
  /**
4
- * Wrap an angular component inside of a React memo object.
4
+ * Wrap an Angular component inside of a React memo object.
5
5
  * Will attempt to bind @Input and @Output properties if provided,
6
6
  * and will bind the react arguments directly as @Input properties.
7
7
  *
8
+ * Usage: An Angular top-level application with a ReactifyNgComponent react implementation
9
+ * that needs to embed Angular components as children of the react-wrapped component.
10
+ *
8
11
  * @experimental
9
12
  * @param componentClass Angular component
10
13
  * @param envInjector An `EnvironmentInjector` instance to be used for the component
@@ -13,6 +16,23 @@ import * as React from 'react';
13
16
  * @param _outputs
14
17
  * @returns
15
18
  */
19
+ export declare const ReactifyAngularComponent: ({ component, appRef, injector, ngZone, staticInputs, staticOutputs, preSiblings, postSiblings, additionalChildren, rootElementName, containerElementName }: {
20
+ component: Type<any>;
21
+ appRef: Omit<ApplicationRef, '_runningTick'>;
22
+ injector: Injector;
23
+ ngZone: NgZone;
24
+ staticInputs?: {
25
+ [key: string]: any;
26
+ };
27
+ staticOutputs?: {
28
+ [key: string]: Function;
29
+ };
30
+ preSiblings?: React.ReactNode[];
31
+ postSiblings?: React.ReactNode[];
32
+ additionalChildren?: React.ReactNode[];
33
+ rootElementName?: Parameters<typeof React.createElement>[0];
34
+ containerElementName?: string;
35
+ }) => React.NamedExoticComponent<object>;
16
36
  export declare const ReactifyReactComponent: ({ component, appRef, injector, ngZone, staticInputs, staticOutputs, preSiblings, postSiblings, additionalChildren, rootElementName, containerElementName }: {
17
37
  component: Type<any>;
18
38
  appRef: Omit<ApplicationRef, '_runningTick'>;
@@ -30,5 +50,16 @@ export declare const ReactifyReactComponent: ({ component, appRef, injector, ngZ
30
50
  rootElementName?: Parameters<typeof React.createElement>[0];
31
51
  containerElementName?: string;
32
52
  }) => React.NamedExoticComponent<object>;
33
- export declare const ReactifyAngularComponent2: (component: Type<any>, props: any) => React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
53
+ /**
54
+ * Do not use this.
55
+ * @hidden
56
+ * @experimental
57
+ */
58
+ export declare function ReactifyAngularComponent3(component: Type<any>, ngZone: NgZone, appRef: Omit<ApplicationRef, '_runningTick'>, injector: Injector, props?: any, containerTag?: string): React.DOMElement<React.DOMAttributes<Element>, Element>;
59
+ /**
60
+ * Bootstrap an Angular component with `createApplication` and export it under a
61
+ * react Element.
62
+ * Usage: React top-level application embedding an Angular component.
63
+ */
64
+ export declare function ReactifyStandaloneAngularComponent(component: Type<any>, props?: any, providers?: (Provider | EnvironmentProviders)[], containerTag?: string): React.DOMElement<React.DOMAttributes<Element>, Element>;
34
65
  //# sourceMappingURL=angular-to-react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular-to-react.d.ts","sourceRoot":"","sources":["../../../src/util/angular-to-react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAiC,MAAM,eAAe,CAAC;AAEtG,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB;eAapB,KAAK,GAAG,CAAC;YACZ,KAAK,cAAc,EAAE,cAAc,CAAC;cAClC,QAAQ;YACV,MAAM;;;;;;;kBAGA,MAAM,SAAS,EAAE;mBAChB,MAAM,SAAS,EAAE;yBACX,MAAM,SAAS,EAAE;sBACpB,WAAW,OAAO,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;2BACpC,MAAM;wCA6E/B,CAAC;AAGH,eAAO,MAAM,yBAAyB,cACvB,KAAK,GAAG,CAAC,SACb,GAAG,mFA0Cb,CAAA"}
1
+ {"version":3,"file":"angular-to-react.d.ts","sourceRoot":"","sources":["../../../src/util/angular-to-react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAiC,QAAQ,EAAE,oBAAoB,EAAgB,MAAM,eAAe,CAAC;AAEpJ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,wBAAwB;eAatB,KAAK,GAAG,CAAC;YACZ,KAAK,cAAc,EAAE,cAAc,CAAC;cAClC,QAAQ;YACV,MAAM;;;;;;;kBAGA,MAAM,SAAS,EAAE;mBAChB,MAAM,SAAS,EAAE;yBACX,MAAM,SAAS,EAAE;sBACpB,WAAW,OAAO,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;2BACpC,MAAM;wCA+E/B,CAAC;AAEH,eAAO,MAAM,sBAAsB;eA3FpB,KAAK,GAAG,CAAC;YACZ,KAAK,cAAc,EAAE,cAAc,CAAC;cAClC,QAAQ;YACV,MAAM;;;;;;;kBAGA,MAAM,SAAS,EAAE;mBAChB,MAAM,SAAS,EAAE;yBACX,MAAM,SAAS,EAAE;sBACpB,WAAW,OAAO,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;2BACpC,MAAM;wCAiF6B,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,yBAAyB,CACrC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,EAC5C,QAAQ,EAAE,QAAQ,EAClB,KAAK,GAAE,GAAQ,EACf,YAAY,GAAE,MAAc,2DAkE/B;AAGD;;;;GAIG;AACH,wBAAgB,kCAAkC,CAC9C,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EACpB,KAAK,GAAE,GAAQ,EACf,SAAS,GAAE,CAAC,QAAQ,GAAG,oBAAoB,CAAC,EAAO,EACnD,YAAY,GAAE,MAAc,2DA+C/B"}
@@ -10,8 +10,8 @@ import * as i0 from "@angular/core";
10
10
  * `override readonly ngReactComponent = ReactFlowWrappableComponent;`
11
11
  */
12
12
  export declare class ReactifyNgComponent implements OnChanges, OnDestroy, AfterViewInit {
13
- private readonly ngContainer;
14
- private readonly ngZone;
13
+ protected readonly ngContainer: ViewContainerRef;
14
+ protected readonly ngZone: NgZone;
15
15
  /**
16
16
  * The react component to be wrapped.
17
17
  * ! Must be overridden for this wrapper to work
@@ -1 +1 @@
1
- {"version":3,"file":"react-to-angular.d.ts","sourceRoot":"","sources":["../../../src/util/react-to-angular.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoG,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAQ,gBAAgB,EAA4B,MAAM,eAAe,CAAC;AAC/O,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;;AAI/B;;;;;;;GAOG;AACH,qBAKa,mBAAoB,YAAW,SAAS,EAAE,SAAS,EAAE,aAAa;IAWvE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAV3B;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAE3E,OAAO,CAAC,KAAK,CAAO;gBAGC,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,MAAM;IAInC,QAAQ;IAMR,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAI1C,eAAe;IAIf,WAAW;IAIX,OAAO,CAAC,OAAO;yCAlCN,mBAAmB;2CAAnB,mBAAmB;CAuE/B"}
1
+ {"version":3,"file":"react-to-angular.d.ts","sourceRoot":"","sources":["../../../src/util/react-to-angular.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAa,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;;AAI/B;;;;;;;GAOG;AACH,qBAKa,mBAAoB,YAAW,SAAS,EAAE,SAAS,EAAE,aAAa;IAWvE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAVrC;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAE3E,OAAO,CAAC,KAAK,CAAO;gBAGG,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,MAAM;IAIrC,QAAQ;IAMR,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAI1C,eAAe;IAIf,WAAW;IAIX,OAAO,CAAC,OAAO;yCAlCN,mBAAmB;2CAAnB,mBAAmB;CAyE/B"}