ngx-reactify 0.1.3 → 0.1.5

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { createComponent, EventEmitter, Component } from '@angular/core';
2
+ import { createComponent, EventEmitter, Directive } from '@angular/core';
3
3
  import { createApplication } from '@angular/platform-browser';
4
4
  import * as React from 'react';
5
5
  import { firstValueFrom } from 'rxjs';
@@ -296,9 +296,10 @@ const ReactifyAngularComponent3 = WrapAngularComponentInReact;
296
296
  * ```
297
297
  */
298
298
  class ReactifyNgComponent {
299
- constructor(ngContainer, ngZone) {
299
+ constructor(ngContainer, ngZone, ngChangeDetector) {
300
300
  this.ngContainer = ngContainer;
301
301
  this.ngZone = ngZone;
302
+ this.ngChangeDetector = ngChangeDetector;
302
303
  this._props = {};
303
304
  }
304
305
  ngOnInit() {
@@ -337,7 +338,24 @@ class ReactifyNgComponent {
337
338
  // Bind all event handlers.
338
339
  // ! important Angular uses EventEmitter, React uses
339
340
  // a different method of event binding
340
- evtKeys.forEach(k => this._props[k] = (...args) => this[k].next(args));
341
+ evtKeys.forEach(k => {
342
+ if (k.endsWith("Change") && Object.hasOwn(this, k.replace(/Change$/, ''))) {
343
+ // Detect if this should be treated as a 2-way binding. If so we'll assume
344
+ // there's only ever one item in the arguments list.
345
+ this._props[k] = (arg) => {
346
+ this[k].emit(arg);
347
+ this.ngChangeDetector.markForCheck();
348
+ };
349
+ }
350
+ else {
351
+ // We're assuming this is NOT a 2-way binding, just an event so we'll pass
352
+ // everything back to the parent component in an array.
353
+ this._props[k] = (...args) => {
354
+ this[k].emit(args);
355
+ this.ngChangeDetector.markForCheck();
356
+ };
357
+ }
358
+ });
341
359
  });
342
360
  this._reactElement = React.createElement(this.ngReactComponent, { props: this._props });
343
361
  this._root.render(this._reactElement);
@@ -347,17 +365,15 @@ class ReactifyNgComponent {
347
365
  }
348
366
  });
349
367
  }
350
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
351
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactifyNgComponent, isStandalone: true, selector: "ngx-reactify", usesOnChanges: true, ngImport: i0, template: ``, isInline: true }); }
368
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ReactifyNgComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
369
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: ReactifyNgComponent, isStandalone: true, usesOnChanges: true, ngImport: i0 }); }
352
370
  }
353
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, decorators: [{
354
- type: Component,
371
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ReactifyNgComponent, decorators: [{
372
+ type: Directive,
355
373
  args: [{
356
- selector: 'ngx-reactify',
357
- template: ``,
358
374
  standalone: true
359
375
  }]
360
- }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.NgZone }] });
376
+ }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }] });
361
377
 
362
378
  /**
363
379
  * Generated bundle index. Do not edit.
@@ -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, 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 * This is replaced by `WrapAngularComponentInReact`.\n * @deprecated\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 let outputSubscriptions: { [key: string]: Subscription; };\n let componentInstance: ComponentRef<any>;\n\n const tripChangeDetection = () =>\n componentInstance?.changeDetectorRef?.detectChanges();\n\n // These attributes will trigger change detection when they fire from\n // the underlying React element.\n // ... This will break things. FUCK.\n const attributes: Array<keyof React.DOMAttributes<any>> = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];\n\n const attrObj = {};\n attributes.forEach(a => attrObj[a] = tripChangeDetection);\n\n React.useEffect(() => {\n return () => {\n // Code to run when the component unmounts\n appRef?.detachView(componentInstance.hostView);\n Object.values(outputSubscriptions).forEach(s => s.unsubscribe());\n componentInstance?.destroy();\n };\n }, []);\n\n\n const elements = [\n ...(preSiblings || []),\n React.createElement(containerElementName || \"div\", {\n ...attrObj,\n ref: node => {\n const { inputs, outputs } = component['ɵcmp'];\n\n if (componentInstance) return;\n\n ngZone.run(() => {\n componentInstance = createComponent(component, {\n environmentInjector: appRef.injector,\n elementInjector: injector,\n hostElement: node\n });\n\n Object.assign(staticInputs, args);\n appRef.attachView(componentInstance.hostView);\n });\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 outputSubscriptions = {};\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 }),\n ...(postSiblings || []),\n ...(additionalChildren || [])\n ].filter(e => e);\n\n return React.createElement(rootElementName || \"div\", {}, ...elements);\n });\n});\n\n\n/**\n * Do not use this.\n * @hidden\n * @experimental\n */\nexport const ng2ReactProps = (obj = {}) => {\n const props = {};\n Object.entries(obj).forEach(([k, v]) => {\n // Omit things prefixed with an underscore\n if (k.startsWith('_')) return;\n\n // Omit output event emitters\n if (v instanceof EventEmitter) {\n props[k] = (...args) => v.emit([args]);\n }\n else {\n props[k] = v;\n }\n });\n return props;\n};\n\n/**\n * This method will create a React component that\n * wraps an Angular component.\n * @returns React.NamedExoticComponent\n *\n * @hidden\n * @experimental\n */\nexport function WrapAngularComponentInReact({\n component,\n ngZone,\n appRef,\n injector,\n props,\n containerTag,\n reactTemplate,\n projectableNodes\n}: {\n /**\n * Angular Component to be rendered within React\n */\n component: Type<any>,\n /**\n * Angular Application Reference. Used for bootstrapping\n * and change detection hierarchy.\n */\n appRef: Omit<ApplicationRef, '_runningTick'>,\n /**\n * Instance of NgZone class.\n * Very important to prevent Zone.js event performance issues.\n * Do not set if running Zoneless CD.\n */\n ngZone?: NgZone,\n /**\n * Static properties to be passed into the Angular instance.\n * Automatically generates event proxies for Angular EventEmitters.\n */\n props?: Record<string, any>,\n /**\n * Local Element Injector provided to the Angular object\n */\n injector?: Injector,\n /**\n * HTML Tag for the created DOM wrapper. Defaults to `div`.\n */\n containerTag?: string,\n /**\n * React Function template\n */\n reactTemplate?: (el: React.ReactElement) => React.ReactElement;\n /**\n * Nodes to be passed to the `ng-content` of the child Angular component.\n */\n projectableNodes?: Node[][];\n}) {\n props ??= {};\n containerTag ??= 'div';\n const ctx = this;\n\n const createWrappedElement = () => {\n reactTemplate ??= (el) => el;\n return React.memo((args) => {\n const _props = {};\n Object.assign(_props, props);\n Object.assign(_props, args);\n\n // Is there a better way to do this?\n let subscriptions: Subscription[];\n let componentInstance: ComponentRef<any>;\n\n React.useEffect(() => {\n return () => {\n // Cleanup and dispose leftover Angular objects\n appRef?.detachView(componentInstance.hostView);\n subscriptions?.forEach(s => s?.unsubscribe());\n componentInstance?.destroy();\n };\n }, []);\n\n const tripChangeDetection = () =>\n componentInstance?.changeDetectorRef?.detectChanges();\n\n // These attributes will trigger change detection when they fire from\n // the underlying React element.\n // ... This will break things. FUCK.\n const attributes: Array<keyof React.DOMAttributes<any>> = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];\n\n const attrObj = {};\n attributes.forEach(a => attrObj[a] = tripChangeDetection);\n\n return reactTemplate(React.createElement(containerTag, {\n ...attrObj,\n ref: async (node) => {\n if (componentInstance) return;\n\n // Not sure if this ever actually happens, added as a preventative measure\n // to memory leaks.\n subscriptions?.forEach(s => s?.unsubscribe());\n\n const bootstrap = () => {\n // Init the Angular component with the context of the root Angular app.\n componentInstance = createComponent(component, {\n environmentInjector: appRef.injector,\n elementInjector: injector,\n hostElement: node,\n projectableNodes: projectableNodes\n });\n appRef.attachView(componentInstance.hostView);\n };\n\n ngZone?.runTask\n ? ngZone?.runTask(bootstrap)\n : bootstrap();\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 componentInstance.changeDetectorRef.detectChanges();\n }\n }));\n });\n }\n\n return ngZone?.runOutsideAngular\n ? ngZone?.runOutsideAngular(createWrappedElement)\n : createWrappedElement();\n}\n\n/**\n * This method will automatically wrap an Angular\n * Component or Directive into a React object.\n * @Outputs (EventEmitters) will be automatically\n * linked into the input properties along with\n * all of the @Inputs.\n * @returns React.NamedExoticComponent\n * @experimental\n */\nexport const AutoWrapAngularObject = ({\n component,\n appRef,\n ngZone,\n instance,\n injector,\n containerTag,\n reactTemplate,\n}: (Parameters<typeof WrapAngularComponentInReact>[0] & {\n /**\n * Angular Component/Directive instance that will have properties bound to the created\n */\n instance?: InstanceType<Type<any>> | Record<string, any>,\n\n})) => {\n const props = ng2ReactProps(instance);\n\n return WrapAngularComponentInReact({\n component,\n ngZone,\n appRef,\n injector,\n containerTag,\n props,\n reactTemplate\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, {\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 // 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}\n\n\n\n// These exports exist to attempt to make the API have minimal breaking changes.\nexport const ReactifyReactComponent = ReactifyAngularComponent;\nexport const ReactifyAngularComponent3 = WrapAngularComponentInReact;;\n","import { AfterViewInit, Component, EventEmitter, NgZone, OnChanges, OnDestroy, SimpleChanges, ViewContainerRef } from '@angular/core';\nimport * as React from 'react';\nimport { createRoot, Root } from 'react-dom/client';\n\n\n/**\n * This component can be used to automatically wrap a React\n * component into Angular bindings with functional change detection.\n * All you need to provide is the @Input and @Output interface\n * for the component in order to tell Angular which keys correspond to what.\n *\n * ### You _must_ override the property `ngReactComponent`.\n *\n * Failure to do so will result in errors\n *\n * `override readonly ngReactComponent = SomeReactFunction;`\n *\n * Example:\n *\n * ```ts\n * @Component({\n * selector: \"app-react-wrapped\",\n * standalone: true\n * })\n * export class MyReactWrappedComponent extends ReactifyNgComponent {\n *\n * @Input() data: any;\n * @Input() options: any;\n * @Input() version: any;\n *\n * // Notice how we wrap the result in an array, this is important because\n * // React can pass multiple properties to a callback and Angular can't.\n * @Output() onClick = new EventEmitter<[any]>();\n *\n * }\n * ```\n */\n@Component({\n selector: 'ngx-reactify',\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 private _reactElement: React.ReactElement;\n\n private _props: Object = {};\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 => !(this[k] instanceof EventEmitter));\n // Get all event handler keys from the class\n const evtKeys = keys.filter(k => this[k] instanceof EventEmitter);\n\n // Project all key properties onto `props`\n propKeys.forEach(k => this._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 => this._props[k] = (...args) => this[k].next(args));\n })\n\n this._reactElement = React.createElement(this.ngReactComponent, { props: this._props as any });\n this._root.render(this._reactElement);\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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"}
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 * This is replaced by `WrapAngularComponentInReact`.\n * @deprecated\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 let outputSubscriptions: { [key: string]: Subscription; };\n let componentInstance: ComponentRef<any>;\n\n const tripChangeDetection = () =>\n componentInstance?.changeDetectorRef?.detectChanges();\n\n // These attributes will trigger change detection when they fire from\n // the underlying React element.\n // ... This will break things. FUCK.\n const attributes: Array<keyof React.DOMAttributes<any>> = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];\n\n const attrObj = {};\n attributes.forEach(a => attrObj[a] = tripChangeDetection);\n\n React.useEffect(() => {\n return () => {\n // Code to run when the component unmounts\n appRef?.detachView(componentInstance.hostView);\n Object.values(outputSubscriptions).forEach(s => s.unsubscribe());\n componentInstance?.destroy();\n };\n }, []);\n\n\n const elements = [\n ...(preSiblings || []),\n React.createElement(containerElementName || \"div\", {\n ...attrObj,\n ref: node => {\n const { inputs, outputs } = component['ɵcmp'];\n\n if (componentInstance) return;\n\n ngZone.run(() => {\n componentInstance = createComponent(component, {\n environmentInjector: appRef.injector,\n elementInjector: injector,\n hostElement: node\n });\n\n Object.assign(staticInputs, args);\n appRef.attachView(componentInstance.hostView);\n });\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 outputSubscriptions = {};\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 }),\n ...(postSiblings || []),\n ...(additionalChildren || [])\n ].filter(e => e);\n\n return React.createElement(rootElementName || \"div\", {}, ...elements);\n });\n});\n\n\n/**\n * Do not use this.\n * @hidden\n * @experimental\n */\nexport const ng2ReactProps = (obj = {}) => {\n const props = {};\n Object.entries(obj).forEach(([k, v]) => {\n // Omit things prefixed with an underscore\n if (k.startsWith('_')) return;\n\n // Omit output event emitters\n if (v instanceof EventEmitter) {\n props[k] = (...args) => v.emit([args]);\n }\n else {\n props[k] = v;\n }\n });\n return props;\n};\n\n/**\n * This method will create a React component that\n * wraps an Angular component.\n * @returns React.NamedExoticComponent\n *\n * @hidden\n * @experimental\n */\nexport function WrapAngularComponentInReact({\n component,\n ngZone,\n appRef,\n injector,\n props,\n containerTag,\n reactTemplate,\n projectableNodes\n}: {\n /**\n * Angular Component to be rendered within React\n */\n component: Type<any>,\n /**\n * Angular Application Reference. Used for bootstrapping\n * and change detection hierarchy.\n */\n appRef: Omit<ApplicationRef, '_runningTick'>,\n /**\n * Instance of NgZone class.\n * Very important to prevent Zone.js event performance issues.\n * Do not set if running Zoneless CD.\n */\n ngZone?: NgZone,\n /**\n * Static properties to be passed into the Angular instance.\n * Automatically generates event proxies for Angular EventEmitters.\n */\n props?: Record<string, any>,\n /**\n * Local Element Injector provided to the Angular object\n */\n injector?: Injector,\n /**\n * HTML Tag for the created DOM wrapper. Defaults to `div`.\n */\n containerTag?: string,\n /**\n * React Function template\n */\n reactTemplate?: (el: React.ReactElement) => React.ReactElement;\n /**\n * Nodes to be passed to the `ng-content` of the child Angular component.\n */\n projectableNodes?: Node[][];\n}) {\n props ??= {};\n containerTag ??= 'div';\n const ctx = this;\n\n const createWrappedElement = () => {\n reactTemplate ??= (el) => el;\n return React.memo((args) => {\n const _props = {};\n Object.assign(_props, props);\n Object.assign(_props, args);\n\n // Is there a better way to do this?\n let subscriptions: Subscription[];\n let componentInstance: ComponentRef<any>;\n\n React.useEffect(() => {\n return () => {\n // Cleanup and dispose leftover Angular objects\n appRef?.detachView(componentInstance.hostView);\n subscriptions?.forEach(s => s?.unsubscribe());\n componentInstance?.destroy();\n };\n }, []);\n\n const tripChangeDetection = () =>\n componentInstance?.changeDetectorRef?.detectChanges();\n\n // These attributes will trigger change detection when they fire from\n // the underlying React element.\n // ... This will break things. FUCK.\n const attributes: Array<keyof React.DOMAttributes<any>> = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];\n\n const attrObj = {};\n attributes.forEach(a => attrObj[a] = tripChangeDetection);\n\n return reactTemplate(React.createElement(containerTag, {\n ...attrObj,\n ref: async (node) => {\n if (componentInstance) return;\n\n // Not sure if this ever actually happens, added as a preventative measure\n // to memory leaks.\n subscriptions?.forEach(s => s?.unsubscribe());\n\n const bootstrap = () => {\n // Init the Angular component with the context of the root Angular app.\n componentInstance = createComponent(component, {\n environmentInjector: appRef.injector,\n elementInjector: injector,\n hostElement: node,\n projectableNodes: projectableNodes\n });\n appRef.attachView(componentInstance.hostView);\n };\n\n ngZone?.runTask\n ? ngZone?.runTask(bootstrap)\n : bootstrap();\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 componentInstance.changeDetectorRef.detectChanges();\n }\n }));\n });\n }\n\n return ngZone?.runOutsideAngular\n ? ngZone?.runOutsideAngular(createWrappedElement)\n : createWrappedElement();\n}\n\n/**\n * This method will automatically wrap an Angular\n * Component or Directive into a React object.\n * @Outputs (EventEmitters) will be automatically\n * linked into the input properties along with\n * all of the @Inputs.\n * @returns React.NamedExoticComponent\n * @experimental\n */\nexport const AutoWrapAngularObject = ({\n component,\n appRef,\n ngZone,\n instance,\n injector,\n containerTag,\n reactTemplate,\n}: (Parameters<typeof WrapAngularComponentInReact>[0] & {\n /**\n * Angular Component/Directive instance that will have properties bound to the created\n */\n instance?: InstanceType<Type<any>> | Record<string, any>,\n\n})) => {\n const props = ng2ReactProps(instance);\n\n return WrapAngularComponentInReact({\n component,\n ngZone,\n appRef,\n injector,\n containerTag,\n props,\n reactTemplate\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, {\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 // 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}\n\n\n\n// These exports exist to attempt to make the API have minimal breaking changes.\nexport const ReactifyReactComponent = ReactifyAngularComponent;\nexport const ReactifyAngularComponent3 = WrapAngularComponentInReact;;\n","import { AfterViewInit, ChangeDetectorRef, Directive, EventEmitter, NgZone, OnChanges, OnDestroy, SimpleChanges, ViewContainerRef } from '@angular/core';\nimport * as React from 'react';\nimport { createRoot, Root } from 'react-dom/client';\n\n/**\n * This component can be used to automatically wrap a React\n * component into Angular bindings with functional change detection.\n * All you need to provide is the @Input and @Output interface\n * for the component in order to tell Angular which keys correspond to what.\n *\n * ### You _must_ override the property `ngReactComponent`.\n *\n * Failure to do so will result in errors\n *\n * `override readonly ngReactComponent = SomeReactFunction;`\n *\n * Example:\n *\n * ```ts\n * @Component({\n * selector: \"app-react-wrapped\",\n * standalone: true\n * })\n * export class MyReactWrappedComponent extends ReactifyNgComponent {\n *\n * @Input() data: any;\n * @Input() options: any;\n * @Input() version: any;\n *\n * // Notice how we wrap the result in an array, this is important because\n * // React can pass multiple properties to a callback and Angular can't.\n * @Output() onClick = new EventEmitter<[any]>();\n *\n * }\n * ```\n */\n@Directive({\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 private _reactElement: React.ReactElement;\n\n private _props: Object = {};\n\n constructor(\n protected readonly ngContainer: ViewContainerRef,\n protected readonly ngZone: NgZone,\n protected readonly ngChangeDetector: ChangeDetectorRef\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 => !(this[k] instanceof EventEmitter));\n // Get all event handler keys from the class\n const evtKeys = keys.filter(k => this[k] instanceof EventEmitter);\n\n // Project all key properties onto `props`\n propKeys.forEach(k => this._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 => {\n if (k.endsWith(\"Change\") && Object.hasOwn(this, k.replace(/Change$/, ''))) {\n // Detect if this should be treated as a 2-way binding. If so we'll assume\n // there's only ever one item in the arguments list.\n this._props[k] = (arg) => {\n (this[k] as EventEmitter<any>).emit(arg);\n this.ngChangeDetector.markForCheck();\n }\n }\n else {\n // We're assuming this is NOT a 2-way binding, just an event so we'll pass\n // everything back to the parent component in an array.\n this._props[k] = (...args) => {\n (this[k] as EventEmitter<any>).emit(args);\n this.ngChangeDetector.markForCheck();\n }\n }\n });\n })\n\n this._reactElement = React.createElement(this.ngReactComponent, { props: this._props as any });\n this._root.render(this._reactElement);\n }\n catch(err) {\n console.error(err)\n }\n })\n }\n}\n\n// We replace all React functions with Angular EventEmitters\n// thus, anything typed as a function will automatically be transformed.\nexport type ReactifyPropsTypeToAngular<T> = {\n [K in keyof T]: T[K] extends (...args) => any ? EventEmitter<\n Parameters<T[K]> extends [any] ? Parameters<T[K]>[0] : Parameters<T[K]>\n > : T[K];\n};\n\n// export function ReactifyNgComponent2<T = any>(): new() => ReactifyNgComponent & ReactifyPropsTypeToAngular<T> {\n// return ReactifyNgComponent as never;\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.1.3",
3
+ "version": "0.1.5",
4
4
  "repository": {
5
5
  "url": "https://github.com/knackstedt/ngx-reactify"
6
6
  },
@@ -27,8 +27,6 @@
27
27
  },
28
28
  ".": {
29
29
  "types": "./index.d.ts",
30
- "esm2022": "./esm2022/ngx-reactify.mjs",
31
- "esm": "./esm2022/ngx-reactify.mjs",
32
30
  "default": "./fesm2022/ngx-reactify.mjs"
33
31
  }
34
32
  },
@@ -13,7 +13,7 @@ import * as React from 'react';
13
13
  */
14
14
  export declare const ReactifyAngularComponent: ({ component, appRef, injector, ngZone, staticInputs, staticOutputs, preSiblings, postSiblings, additionalChildren, rootElementName, containerElementName }: {
15
15
  component: Type<any>;
16
- appRef: Omit<ApplicationRef, '_runningTick'>;
16
+ appRef: Omit<ApplicationRef, "_runningTick">;
17
17
  injector: Injector;
18
18
  ngZone: NgZone;
19
19
  staticInputs?: {
@@ -89,49 +89,12 @@ export declare function WrapAngularComponentInReact({ component, ngZone, appRef,
89
89
  * @returns React.NamedExoticComponent
90
90
  * @experimental
91
91
  */
92
- export declare const AutoWrapAngularObject: ({ component, appRef, ngZone, instance, injector, containerTag, reactTemplate, }: {
93
- /**
94
- * Angular Component to be rendered within React
95
- */
96
- component: Type<any>;
97
- /**
98
- * Angular Application Reference. Used for bootstrapping
99
- * and change detection hierarchy.
100
- */
101
- appRef: Omit<ApplicationRef, '_runningTick'>;
102
- /**
103
- * Instance of NgZone class.
104
- * Very important to prevent Zone.js event performance issues.
105
- * Do not set if running Zoneless CD.
106
- */
107
- ngZone?: NgZone;
108
- /**
109
- * Static properties to be passed into the Angular instance.
110
- * Automatically generates event proxies for Angular EventEmitters.
111
- */
112
- props?: Record<string, any>;
113
- /**
114
- * Local Element Injector provided to the Angular object
115
- */
116
- injector?: Injector;
117
- /**
118
- * HTML Tag for the created DOM wrapper. Defaults to `div`.
119
- */
120
- containerTag?: string;
121
- /**
122
- * React Function template
123
- */
124
- reactTemplate?: (el: React.ReactElement) => React.ReactElement;
125
- /**
126
- * Nodes to be passed to the `ng-content` of the child Angular component.
127
- */
128
- projectableNodes?: Node[][];
129
- } & {
92
+ export declare const AutoWrapAngularObject: ({ component, appRef, ngZone, instance, injector, containerTag, reactTemplate, }: (Parameters<typeof WrapAngularComponentInReact>[0] & {
130
93
  /**
131
94
  * Angular Component/Directive instance that will have properties bound to the created
132
95
  */
133
96
  instance?: InstanceType<Type<any>> | Record<string, any>;
134
- }) => React.NamedExoticComponent<object>;
97
+ })) => React.NamedExoticComponent<object>;
135
98
  /**
136
99
  * Bootstrap an Angular component with `createApplication` and export it under a
137
100
  * react Element.
@@ -140,7 +103,7 @@ export declare const AutoWrapAngularObject: ({ component, appRef, ngZone, instan
140
103
  export declare function ReactifyStandaloneAngularComponent(component: Type<any>, props?: any, providers?: (Provider | EnvironmentProviders)[], containerTag?: string): React.DOMElement<React.DOMAttributes<Element>, Element>;
141
104
  export declare const ReactifyReactComponent: ({ component, appRef, injector, ngZone, staticInputs, staticOutputs, preSiblings, postSiblings, additionalChildren, rootElementName, containerElementName }: {
142
105
  component: Type<any>;
143
- appRef: Omit<ApplicationRef, '_runningTick'>;
106
+ appRef: Omit<ApplicationRef, "_runningTick">;
144
107
  injector: Injector;
145
108
  ngZone: NgZone;
146
109
  staticInputs?: {
@@ -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,QAAQ,EAAE,oBAAoB,EAAgB,MAAM,eAAe,CAAC;AAEpJ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;GAUG;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;wCAkG/B,CAAC;AAGH;;;;GAIG;AACH,eAAO,MAAM,aAAa,kBAezB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,EACxC,SAAS,EACT,MAAM,EACN,MAAM,EACN,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EACnB,EAAE;IACC;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB;;;OAGG;IACH,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC7C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;IAC/D;;OAEG;IACH,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;CAC/B,sCAmFA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB;IAlI9B;;OAEG;eACQ,KAAK,GAAG,CAAC;IACpB;;;OAGG;YACK,KAAK,cAAc,EAAE,cAAc,CAAC;IAC5C;;;;OAIG;aACM,MAAM;IACf;;;OAGG;YACK,OAAO,MAAM,EAAE,GAAG,CAAC;IAC3B;;OAEG;eACQ,QAAQ;IACnB;;OAEG;mBACY,MAAM;IACrB;;OAEG;yBACkB,MAAM,YAAY,KAAK,MAAM,YAAY;IAC9D;;OAEG;uBACgB,IAAI,EAAE,EAAE;;IAwG3B;;OAEG;eACQ,aAAa,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,MAAM,EAAE,GAAG,CAAC;wCAc3D,CAAC;AAEF;;;;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,2DAiD/B;AAKD,eAAO,MAAM,sBAAsB;eApXpB,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;wCA0W6B,CAAC;AAC/D,eAAO,MAAM,yBAAyB,oCAA8B,CAAC"}
1
+ {"version":3,"file":"angular-to-react.d.ts","sourceRoot":"","sources":["../../../src/util/angular-to-react.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AfterViewInit, NgZone, OnChanges, OnDestroy, SimpleChanges, ViewContainerRef } from '@angular/core';
1
+ import { AfterViewInit, ChangeDetectorRef, EventEmitter, NgZone, OnChanges, OnDestroy, SimpleChanges, ViewContainerRef } from '@angular/core';
2
2
  import * as React from 'react';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
@@ -36,6 +36,7 @@ import * as i0 from "@angular/core";
36
36
  export declare class ReactifyNgComponent implements OnChanges, OnDestroy, AfterViewInit {
37
37
  protected readonly ngContainer: ViewContainerRef;
38
38
  protected readonly ngZone: NgZone;
39
+ protected readonly ngChangeDetector: ChangeDetectorRef;
39
40
  /**
40
41
  * The react component to be wrapped.
41
42
  * ! Must be overridden for this wrapper to work
@@ -44,13 +45,16 @@ export declare class ReactifyNgComponent implements OnChanges, OnDestroy, AfterV
44
45
  private _root;
45
46
  private _reactElement;
46
47
  private _props;
47
- constructor(ngContainer: ViewContainerRef, ngZone: NgZone);
48
+ constructor(ngContainer: ViewContainerRef, ngZone: NgZone, ngChangeDetector: ChangeDetectorRef);
48
49
  ngOnInit(): void;
49
50
  ngOnChanges(changes?: SimpleChanges): void;
50
51
  ngAfterViewInit(): void;
51
52
  ngOnDestroy(): void;
52
53
  private _render;
53
54
  static ɵfac: i0.ɵɵFactoryDeclaration<ReactifyNgComponent, never>;
54
- static ɵcmp: i0.ɵɵComponentDeclaration<ReactifyNgComponent, "ngx-reactify", never, {}, {}, never, never, true, never>;
55
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ReactifyNgComponent, never, never, {}, {}, never, never, true, never>;
55
56
  }
57
+ export type ReactifyPropsTypeToAngular<T> = {
58
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? EventEmitter<Parameters<T[K]> extends [any] ? Parameters<T[K]>[0] : Parameters<T[K]>> : T[K];
59
+ };
56
60
  //# sourceMappingURL=react-to-angular.d.ts.map
@@ -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,EAA2B,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtI,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;;AAI/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAKa,mBAAoB,YAAW,SAAS,EAAE,SAAS,EAAE,aAAa;IAevE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAdrC;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAE3E,OAAO,CAAC,KAAK,CAAO;IAEpB,OAAO,CAAC,aAAa,CAAqB;IAE1C,OAAO,CAAC,MAAM,CAAc;gBAGL,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;yCAtCN,mBAAmB;2CAAnB,mBAAmB;CA2E/B"}
1
+ {"version":3,"file":"react-to-angular.d.ts","sourceRoot":"","sources":["../../../src/util/react-to-angular.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAa,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACzJ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;;AAG/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAGa,mBAAoB,YAAW,SAAS,EAAE,SAAS,EAAE,aAAa;IAevE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACjC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB;IAf1D;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAE3E,OAAO,CAAC,KAAK,CAAO;IAEpB,OAAO,CAAC,aAAa,CAAqB;IAE1C,OAAO,CAAC,MAAM,CAAc;gBAGL,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,iBAAiB;IAI1D,QAAQ;IAMR,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAI1C,eAAe;IAIf,WAAW;IAIX,OAAO,CAAC,OAAO;yCAvCN,mBAAmB;2CAAnB,mBAAmB;CA6F/B;AAID,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;KACvC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,OAAA,KAAK,GAAG,GAAG,YAAY,CACxD,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC1E,GAAG,CAAC,CAAC,CAAC,CAAC;CACX,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXJlYWN0aWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25neC1yZWFjdGlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -1,3 +0,0 @@
1
- export * from './util/angular-to-react';
2
- export * from './util/react-to-angular';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdXRpbC9hbmd1bGFyLXRvLXJlYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC9yZWFjdC10by1hbmd1bGFyJztcbiJdfQ==
@@ -1,262 +0,0 @@
1
- import { createComponent, EventEmitter } from '@angular/core';
2
- import { createApplication } from '@angular/platform-browser';
3
- import * as React from 'react';
4
- import { firstValueFrom } from 'rxjs';
5
- /**
6
- * Wrap an Angular component inside of a React memo object.
7
- * Will attempt to bind @Input and @Output properties if provided,
8
- * and will bind the react arguments directly as @Input properties.
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
- *
13
- * This is replaced by `WrapAngularComponentInReact`.
14
- * @deprecated
15
- */
16
- export const ReactifyAngularComponent = ({ component, appRef, injector, ngZone, staticInputs = {}, staticOutputs = {}, preSiblings = [], postSiblings = [], additionalChildren = [], rootElementName = '', containerElementName = '' }) => React.memo((args) => {
17
- return ngZone.runOutsideAngular(() => {
18
- let outputSubscriptions;
19
- let componentInstance;
20
- const tripChangeDetection = () => componentInstance?.changeDetectorRef?.detectChanges();
21
- // These attributes will trigger change detection when they fire from
22
- // the underlying React element.
23
- // ... This will break things. FUCK.
24
- const attributes = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];
25
- const attrObj = {};
26
- attributes.forEach(a => attrObj[a] = tripChangeDetection);
27
- React.useEffect(() => {
28
- return () => {
29
- // Code to run when the component unmounts
30
- appRef?.detachView(componentInstance.hostView);
31
- Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
32
- componentInstance?.destroy();
33
- };
34
- }, []);
35
- const elements = [
36
- ...(preSiblings || []),
37
- React.createElement(containerElementName || "div", {
38
- ...attrObj,
39
- ref: node => {
40
- const { inputs, outputs } = component['ɵcmp'];
41
- if (componentInstance)
42
- return;
43
- ngZone.run(() => {
44
- componentInstance = createComponent(component, {
45
- environmentInjector: appRef.injector,
46
- elementInjector: injector,
47
- hostElement: node
48
- });
49
- Object.assign(staticInputs, args);
50
- appRef.attachView(componentInstance.hostView);
51
- });
52
- // Returns a list of entries that need to be set
53
- // This makes it so that unnecessary setters are not invoked.
54
- const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
55
- return componentInstance.instance[childKey] != staticInputs[parentKey];
56
- });
57
- updated.forEach(([parentKey, childKey]) => {
58
- if (staticInputs.hasOwnProperty(parentKey))
59
- componentInstance.instance[childKey] = staticInputs[parentKey];
60
- });
61
- outputSubscriptions = {};
62
- // Get a list of unregistered outputs
63
- const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
64
- return !outputSubscriptions[parentKey];
65
- });
66
- // Reverse bind via subscription
67
- newOutputs.forEach(([parentKey, childKey]) => {
68
- if (!staticOutputs.hasOwnProperty(parentKey))
69
- return;
70
- const target = componentInstance.instance[childKey];
71
- const outputs = staticOutputs;
72
- const sub = target.subscribe((...args) => {
73
- // Run the callback in the provided zone
74
- ngZone.run(() => {
75
- outputs[parentKey](...args);
76
- });
77
- }); // Subscription
78
- outputSubscriptions[parentKey] = sub;
79
- });
80
- // Wrap the destroy method to safely release the subscriptions
81
- const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
82
- componentInstance.onDestroy = (cb) => {
83
- Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
84
- originalDestroy?.(cb);
85
- };
86
- componentInstance.changeDetectorRef.detectChanges();
87
- }
88
- }),
89
- ...(postSiblings || []),
90
- ...(additionalChildren || [])
91
- ].filter(e => e);
92
- return React.createElement(rootElementName || "div", {}, ...elements);
93
- });
94
- });
95
- /**
96
- * Do not use this.
97
- * @hidden
98
- * @experimental
99
- */
100
- export const ng2ReactProps = (obj = {}) => {
101
- const props = {};
102
- Object.entries(obj).forEach(([k, v]) => {
103
- // Omit things prefixed with an underscore
104
- if (k.startsWith('_'))
105
- return;
106
- // Omit output event emitters
107
- if (v instanceof EventEmitter) {
108
- props[k] = (...args) => v.emit([args]);
109
- }
110
- else {
111
- props[k] = v;
112
- }
113
- });
114
- return props;
115
- };
116
- /**
117
- * This method will create a React component that
118
- * wraps an Angular component.
119
- * @returns React.NamedExoticComponent
120
- *
121
- * @hidden
122
- * @experimental
123
- */
124
- export function WrapAngularComponentInReact({ component, ngZone, appRef, injector, props, containerTag, reactTemplate, projectableNodes }) {
125
- props ??= {};
126
- containerTag ??= 'div';
127
- const ctx = this;
128
- const createWrappedElement = () => {
129
- reactTemplate ??= (el) => el;
130
- return React.memo((args) => {
131
- const _props = {};
132
- Object.assign(_props, props);
133
- Object.assign(_props, args);
134
- // Is there a better way to do this?
135
- let subscriptions;
136
- let componentInstance;
137
- React.useEffect(() => {
138
- return () => {
139
- // Cleanup and dispose leftover Angular objects
140
- appRef?.detachView(componentInstance.hostView);
141
- subscriptions?.forEach(s => s?.unsubscribe());
142
- componentInstance?.destroy();
143
- };
144
- }, []);
145
- const tripChangeDetection = () => componentInstance?.changeDetectorRef?.detectChanges();
146
- // These attributes will trigger change detection when they fire from
147
- // the underlying React element.
148
- // ... This will break things. FUCK.
149
- const attributes = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];
150
- const attrObj = {};
151
- attributes.forEach(a => attrObj[a] = tripChangeDetection);
152
- return reactTemplate(React.createElement(containerTag, {
153
- ...attrObj,
154
- ref: async (node) => {
155
- if (componentInstance)
156
- return;
157
- // Not sure if this ever actually happens, added as a preventative measure
158
- // to memory leaks.
159
- subscriptions?.forEach(s => s?.unsubscribe());
160
- const bootstrap = () => {
161
- // Init the Angular component with the context of the root Angular app.
162
- componentInstance = createComponent(component, {
163
- environmentInjector: appRef.injector,
164
- elementInjector: injector,
165
- hostElement: node,
166
- projectableNodes: projectableNodes
167
- });
168
- appRef.attachView(componentInstance.hostView);
169
- };
170
- ngZone?.runTask
171
- ? ngZone?.runTask(bootstrap)
172
- : bootstrap();
173
- // Now that everything has settled, bind inputs and outputs.
174
- subscriptions = [];
175
- Object.entries(_props).filter(([k, v]) => {
176
- // @Outputs are always Event Emitters (I think)
177
- if (v instanceof EventEmitter) {
178
- subscriptions.push(componentInstance.instance[k]?.subscribe(evt => _props[k].call(ctx, evt)));
179
- }
180
- else {
181
- componentInstance.instance[k] = _props[k];
182
- }
183
- });
184
- componentInstance.changeDetectorRef.detectChanges();
185
- }
186
- }));
187
- });
188
- };
189
- return ngZone?.runOutsideAngular
190
- ? ngZone?.runOutsideAngular(createWrappedElement)
191
- : createWrappedElement();
192
- }
193
- /**
194
- * This method will automatically wrap an Angular
195
- * Component or Directive into a React object.
196
- * @Outputs (EventEmitters) will be automatically
197
- * linked into the input properties along with
198
- * all of the @Inputs.
199
- * @returns React.NamedExoticComponent
200
- * @experimental
201
- */
202
- export const AutoWrapAngularObject = ({ component, appRef, ngZone, instance, injector, containerTag, reactTemplate, }) => {
203
- const props = ng2ReactProps(instance);
204
- return WrapAngularComponentInReact({
205
- component,
206
- ngZone,
207
- appRef,
208
- injector,
209
- containerTag,
210
- props,
211
- reactTemplate
212
- });
213
- };
214
- /**
215
- * Bootstrap an Angular component with `createApplication` and export it under a
216
- * react Element.
217
- * Usage: React top-level application embedding an Angular component.
218
- */
219
- export function ReactifyStandaloneAngularComponent(component, props = {}, providers = [], containerTag = 'div') {
220
- const ctx = this;
221
- // Is there a better way to do this?
222
- let subscriptions;
223
- let app;
224
- React.useEffect(() => {
225
- return () => {
226
- // Code to run when the component unmounts
227
- subscriptions?.forEach(s => s?.unsubscribe());
228
- app?.destroy();
229
- };
230
- }, []);
231
- return React.createElement(containerTag, {
232
- ref: async (node) => {
233
- // Not sure if this ever actually happens, added as a preventative measure
234
- // to memory leaks.
235
- subscriptions?.forEach(s => s?.unsubscribe());
236
- app?.destroy();
237
- // Init an Angular application root & bootstrap it to a DOM element.
238
- app = await createApplication({ providers });
239
- const base = app.bootstrap(component, node);
240
- const { instance } = base;
241
- // Wait for the JS to finish rendering and initing.
242
- await firstValueFrom(app.isStable);
243
- // Now that everything has settled, bind inputs and outputs.
244
- subscriptions = [];
245
- Object.entries(props).filter(([k, v]) => {
246
- // @Outputs are always Event Emitters (I think)
247
- if (v instanceof EventEmitter) {
248
- subscriptions.push(instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
249
- }
250
- else {
251
- instance[k] = props[k];
252
- }
253
- });
254
- base.changeDetectorRef.detectChanges();
255
- }
256
- });
257
- }
258
- // These exports exist to attempt to make the API have minimal breaking changes.
259
- export const ReactifyReactComponent = ReactifyAngularComponent;
260
- export const ReactifyAngularComponent3 = WrapAngularComponentInReact;
261
- ;
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10by1yZWFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2FuZ3VsYXItdG8tcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxlQUFlLEVBQUUsWUFBWSxFQUFnRCxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUdwRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxFQUNyQyxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxHQUFHLEVBQUUsRUFDakIsYUFBYSxHQUFHLEVBQUUsRUFDbEIsV0FBVyxHQUFHLEVBQUUsRUFDaEIsWUFBWSxHQUFHLEVBQUUsRUFDakIsa0JBQWtCLEdBQUcsRUFBRSxFQUN2QixlQUFlLEdBQUcsRUFBRSxFQUNwQixvQkFBb0IsR0FBRyxFQUFFLEVBYTVCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtJQUV0QixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7UUFDakMsSUFBSSxtQkFBcUQsQ0FBQztRQUMxRCxJQUFJLGlCQUFvQyxDQUFDO1FBRXpDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFLENBQzdCLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxDQUFDO1FBRTFELHFFQUFxRTtRQUNyRSxnQ0FBZ0M7UUFDaEMsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUEwQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVB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Q0FBQyxZQUFZLFlBQVksRUFBRSxDQUFDO29CQUM1QixhQUFhLENBQUMsSUFBSSxDQUNkLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUN6RCxDQUFDO2dCQUNOLENBQUM7cUJBQ0ksQ0FBQztvQkFDRixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0MsQ0FBQztLQUNKLENBQUMsQ0FBQztBQUNQLENBQUM7QUFJRCxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsd0JBQXdCLENBQUM7QUFDL0QsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsMkJBQTJCLENBQUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSwgQXBwbGljYXRpb25SZWYsIEluamVjdG9yLCBOZ1pvbmUsIGNyZWF0ZUNvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBQcm92aWRlciwgRW52aXJvbm1lbnRQcm92aWRlcnMsIENvbXBvbmVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQXBwbGljYXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuXG4vKipcbiAqIFdyYXAgYW4gQW5ndWxhciBjb21wb25lbnQgaW5zaWRlIG9mIGEgUmVhY3QgbWVtbyBvYmplY3QuXG4gKiBXaWxsIGF0dGVtcHQgdG8gYmluZCBASW5wdXQgYW5kIEBPdXRwdXQgcHJvcGVydGllcyBpZiBwcm92aWRlZCxcbiAqIGFuZCB3aWxsIGJpbmQgdGhlIHJlYWN0IGFyZ3VtZW50cyBkaXJlY3RseSBhcyBASW5wdXQgcHJvcGVydGllcy5cbiAqXG4gKiBVc2FnZTogQW4gQW5ndWxhciB0b3AtbGV2ZWwgYXBwbGljYXRpb24gd2l0aCBhIFJlYWN0aWZ5TmdDb21wb25lbnQgcmVhY3QgaW1wbGVtZW50YXRpb25cbiAqIHRoYXQgbmVlZHMgdG8gZW1iZWQgQW5ndWxhciBjb21wb25lbnRzIGFzIGNoaWxkcmVuIG9mIHRoZSByZWFjdC13cmFwcGVkIGNvbXBvbmVudC5cbiAqXG4gKiBUaGlzIGlzIHJlcGxhY2VkIGJ5IGBXcmFwQW5ndWxhckNvbXBvbmVudEluUmVhY3RgLlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IFJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudCA9ICh7XG4gICAgY29tcG9uZW50LFxuICAgIGFwcFJlZixcbiAgICBpbmplY3RvcixcbiAgICBuZ1pvbmUsXG4gICAgc3RhdGljSW5wdXRzID0ge30sXG4gICAgc3RhdGljT3V0cHV0cyA9IHt9LFxuICAgIHByZVNpYmxpbmdzID0gW10sXG4gICAgcG9zdFNpYmxpbmdzID0gW10sXG4gICAgYWRkaXRpb25hbENoaWxkcmVuID0gW10sXG4gICAgcm9vdEVsZW1lbnROYW1lID0gJycsXG4gICAgY29udGFpbmVyRWxlbWVudE5hbWUgPSAnJ1xufToge1xuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIGFwcFJlZjogT21pdDxBcHBsaWNhdGlvblJlZiwgJ19ydW5uaW5nVGljayc+LFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgICBzdGF0aWNJbnB1dHM/OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSxcbiAgICBzdGF0aWNPdXRwdXRzPzogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbjsgfSxcbiAgICBwcmVTaWJsaW5ncz86IFJlYWN0LlJlYWN0Tm9kZVtdLFxuICAgIHBvc3RTaWJsaW5ncz86IFJlYWN0LlJlYWN0Tm9kZVtdLFxuICAgIGFkZGl0aW9uYWxDaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZVtdLFxuICAgIHJvb3RFbGVtZW50TmFtZT86IFBhcmFtZXRlcnM8dHlwZW9mIFJlYWN0LmNyZWF0ZUVsZW1lbnQ+WzBdLFxuICAgIGNvbnRhaW5lckVsZW1lbnROYW1lPzogc3RyaW5nO1xufSkgPT4gUmVhY3QubWVtbygoYXJncykgPT4ge1xuXG4gICAgcmV0dXJuIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIGxldCBvdXRwdXRTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IFN1YnNjcmlwdGlvbjsgfTtcbiAgICAgICAgbGV0IGNvbXBvbmVudEluc3RhbmNlOiBDb21wb25lbnRSZWY8YW55PjtcblxuICAgICAgICBjb25zdCB0cmlwQ2hhbmdlRGV0ZWN0aW9uID0gKCkgPT5cbiAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlPy5jaGFuZ2VEZXRlY3RvclJlZj8uZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIC8vIFRoZXNlIGF0dHJpYnV0ZXMgd2lsbCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gd2hlbiB0aGV5IGZpcmUgZnJvbVxuICAgICAgICAvLyB0aGUgdW5kZXJseWluZyBSZWFjdCBlbGVtZW50LlxuICAgICAgICAvLyAuLi4gVGhpcyB3aWxsIGJyZWFrIHRoaW5ncy4gRlVDSy5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlczogQXJyYXk8a2V5b2YgUmVhY3QuRE9NQXR0cmlidXRlczxhbnk+PiA9IFsnb25Db3B5JywgJ29uQ3V0JywgJ29uUGFzdGUnLCAnb25BYm9ydCcsICdvbkJsdXInLCAnb25Gb2N1cycsICdvbkNhblBsYXknLCAnb25DYW5QbGF5VGhyb3VnaCcsICdvbkNoYW5nZScsICdvbkNsaWNrJywgJ29uQ29udGV4dE1lbnUnLCAnb25Eb3VibGVDbGljaycsICdvbkRyYWcnLCAnb25EcmFnRW5kJywgJ29uRHJhZ0VudGVyJywgJ29uRHJhZ0xlYXZlJywgJ29uRHJhZ092ZXInLCAnb25EcmFnU3RhcnQnLCAnb25Ecm9wJywgJ29uRHVyYXRpb25DaGFuZ2UnLCAnb25FbXB0aWVkJywgJ29uRW5kZWQnLCAnb25JbnB1dCcsICdvbkludmFsaWQnLCAnb25LZXlEb3duJywgJ29uS2V5UHJlc3MnLCAnb25LZXlVcCcsICdvbkxvYWQnLCAnb25Mb2FkZWREYXRhJywgJ29uTG9hZGVkTWV0YWRhdGEnLCAnb25Mb2FkU3RhcnQnLCAnb25Nb3VzZURvd24nLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvbk1vdXNlTW92ZScsICdvbk1vdXNlT3V0JywgJ29uTW91c2VPdmVyJywgJ29uTW91c2VVcCcsICdvblBhdXNlJywgJ29uUGxheScsICdvblBsYXlpbmcnLCAnb25Qcm9ncmVzcycsICdvblJhdGVDaGFuZ2UnLCAnb25SZXNldCcsICdvblNjcm9sbCcsICdvblNlZWtlZCcsICdvblNlZWtpbmcnLCAnb25TZWxlY3QnLCAnb25TdGFsbGVkJywgJ29uU3VibWl0JywgJ29uU3VzcGVuZCcsICdvblRpbWVVcGRhdGUnLCAnb25Wb2x1bWVDaGFuZ2UnLCAnb25XYWl0aW5nJywgJ29uRXJyb3InXTtcblxuICAgICAgICBjb25zdCBhdHRyT2JqID0ge307XG4gICAgICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChhID0+IGF0dHJPYmpbYV0gPSB0cmlwQ2hhbmdlRGV0ZWN0aW9uKTtcblxuICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb2RlIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgICAgICAgICAgICBhcHBSZWY/LmRldGFjaFZpZXcoY29tcG9uZW50SW5zdGFuY2UuaG9zdFZpZXcpO1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMob3V0cHV0U3Vic2NyaXB0aW9ucykuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sIFtdKTtcblxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgICAgICAgICAgLi4uKHByZVNpYmxpbmdzIHx8IFtdKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyRWxlbWVudE5hbWUgfHwgXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIC4uLmF0dHJPYmosXG4gICAgICAgICAgICAgICAgcmVmOiBub2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMgfSA9IGNvbXBvbmVudFsnybVjbXAnXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50SW5zdGFuY2UpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGFwcFJlZi5pbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5qZWN0b3I6IGluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RFbGVtZW50OiBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0aWNJbnB1dHMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50SW5zdGFuY2UuaG9zdFZpZXcpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIGEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZSBzZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYWtlcyBpdCBzbyB0aGF0IHVubmVjZXNzYXJ5IHNldHRlcnMgYXJlIG5vdCBpbnZva2VkLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gT2JqZWN0LmVudHJpZXMoaW5wdXRzKS5maWx0ZXIoKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XSAhPSBzdGF0aWNJbnB1dHNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0aWNJbnB1dHMuaGFzT3duUHJvcGVydHkocGFyZW50S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZVtjaGlsZEtleV0gPSBzdGF0aWNJbnB1dHNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3Vic2NyaXB0aW9ucyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBvdXRwdXRzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld091dHB1dHMgPSBPYmplY3QuZW50cmllcyhvdXRwdXRzKS5maWx0ZXIoKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFvdXRwdXRTdWJzY3JpcHRpb25zW3BhcmVudEtleV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJldmVyc2UgYmluZCB2aWEgc3Vic2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIG5ld091dHB1dHMuZm9yRWFjaCgoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRpY091dHB1dHMuaGFzT3duUHJvcGVydHkocGFyZW50S2V5KSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IEV2ZW50RW1pdHRlcjx1bmtub3duPiA9IGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBzdGF0aWNPdXRwdXRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWIgPSB0YXJnZXQuc3Vic2NyaWJlKCguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHRoZSBjYWxsYmFjayBpbiB0aGUgcHJvdmlkZWQgem9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW3BhcmVudEtleV0oLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTsgLy8gU3Vic2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN1YnNjcmlwdGlvbnNbcGFyZW50S2V5XSA9IHN1YjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCB0aGUgZGVzdHJveSBtZXRob2QgdG8gc2FmZWx5IHJlbGVhc2UgdGhlIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50SW5zdGFuY2Uub25EZXN0cm95Py5iaW5kKGNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2Uub25EZXN0cm95ID0gKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKG91dHB1dFN1YnNjcmlwdGlvbnMpLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oY2IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLihwb3N0U2libGluZ3MgfHwgW10pLFxuICAgICAgICAgICAgLi4uKGFkZGl0aW9uYWxDaGlsZHJlbiB8fCBbXSlcbiAgICAgICAgXS5maWx0ZXIoZSA9PiBlKTtcblxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChyb290RWxlbWVudE5hbWUgfHwgXCJkaXZcIiwge30sIC4uLmVsZW1lbnRzKTtcbiAgICB9KTtcbn0pO1xuXG5cbi8qKlxuICogRG8gbm90IHVzZSB0aGlzLlxuICogQGhpZGRlblxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY29uc3QgbmcyUmVhY3RQcm9wcyA9IChvYmogPSB7fSkgPT4ge1xuICAgIGNvbnN0IHByb3BzID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgLy8gT21pdCB0aGluZ3MgcHJlZml4ZWQgd2l0aCBhbiB1bmRlcnNjb3JlXG4gICAgICAgIGlmIChrLnN0YXJ0c1dpdGgoJ18nKSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE9taXQgb3V0cHV0IGV2ZW50IGVtaXR0ZXJzXG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICBwcm9wc1trXSA9ICguLi5hcmdzKSA9PiB2LmVtaXQoW2FyZ3NdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb3BzW2tdID0gdjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwcm9wcztcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYSBSZWFjdCBjb21wb25lbnQgdGhhdFxuICogd3JhcHMgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gKiBAcmV0dXJucyBSZWFjdC5OYW1lZEV4b3RpY0NvbXBvbmVudFxuICpcbiAqIEBoaWRkZW5cbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdyYXBBbmd1bGFyQ29tcG9uZW50SW5SZWFjdCh7XG4gICAgY29tcG9uZW50LFxuICAgIG5nWm9uZSxcbiAgICBhcHBSZWYsXG4gICAgaW5qZWN0b3IsXG4gICAgcHJvcHMsXG4gICAgY29udGFpbmVyVGFnLFxuICAgIHJlYWN0VGVtcGxhdGUsXG4gICAgcHJvamVjdGFibGVOb2Rlc1xufToge1xuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgQ29tcG9uZW50IHRvIGJlIHJlbmRlcmVkIHdpdGhpbiBSZWFjdFxuICAgICAqL1xuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgQXBwbGljYXRpb24gUmVmZXJlbmNlLiBVc2VkIGZvciBib290c3RyYXBwaW5nXG4gICAgICogYW5kIGNoYW5nZSBkZXRlY3Rpb24gaGllcmFyY2h5LlxuICAgICAqL1xuICAgIGFwcFJlZjogT21pdDxBcHBsaWNhdGlvblJlZiwgJ19ydW5uaW5nVGljayc+LFxuICAgIC8qKlxuICAgICAqIEluc3RhbmNlIG9mIE5nWm9uZSBjbGFzcy5cbiAgICAgKiBWZXJ5IGltcG9ydGFudCB0byBwcmV2ZW50IFpvbmUuanMgZXZlbnQgcGVyZm9ybWFuY2UgaXNzdWVzLlxuICAgICAqIERvIG5vdCBzZXQgaWYgcnVubmluZyBab25lbGVzcyBDRC5cbiAgICAgKi9cbiAgICBuZ1pvbmU/OiBOZ1pvbmUsXG4gICAgLyoqXG4gICAgICogU3RhdGljIHByb3BlcnRpZXMgdG8gYmUgcGFzc2VkIGludG8gdGhlIEFuZ3VsYXIgaW5zdGFuY2UuXG4gICAgICogQXV0b21hdGljYWxseSBnZW5lcmF0ZXMgZXZlbnQgcHJveGllcyBmb3IgQW5ndWxhciBFdmVudEVtaXR0ZXJzLlxuICAgICAqL1xuICAgIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAvKipcbiAgICAgKiBMb2NhbCBFbGVtZW50IEluamVjdG9yIHByb3ZpZGVkIHRvIHRoZSBBbmd1bGFyIG9iamVjdFxuICAgICAqL1xuICAgIGluamVjdG9yPzogSW5qZWN0b3IsXG4gICAgLyoqXG4gICAgICogSFRNTCBUYWcgZm9yIHRoZSBjcmVhdGVkIERPTSB3cmFwcGVyLiBEZWZhdWx0cyB0byBgZGl2YC5cbiAgICAgKi9cbiAgICBjb250YWluZXJUYWc/OiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogUmVhY3QgRnVuY3Rpb24gdGVtcGxhdGVcbiAgICAgKi9cbiAgICByZWFjdFRlbXBsYXRlPzogKGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpID0+IFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAvKipcbiAgICAgKiBOb2RlcyB0byBiZSBwYXNzZWQgdG8gdGhlIGBuZy1jb250ZW50YCBvZiB0aGUgY2hpbGQgQW5ndWxhciBjb21wb25lbnQuXG4gICAgICovXG4gICAgcHJvamVjdGFibGVOb2Rlcz86IE5vZGVbXVtdO1xufSkge1xuICAgIHByb3BzID8/PSB7fTtcbiAgICBjb250YWluZXJUYWcgPz89ICdkaXYnO1xuICAgIGNvbnN0IGN0eCA9IHRoaXM7XG5cbiAgICBjb25zdCBjcmVhdGVXcmFwcGVkRWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgcmVhY3RUZW1wbGF0ZSA/Pz0gKGVsKSA9PiBlbDtcbiAgICAgICAgcmV0dXJuIFJlYWN0Lm1lbW8oKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9wcm9wcyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihfcHJvcHMsIHByb3BzKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oX3Byb3BzLCBhcmdzKTtcblxuICAgICAgICAgICAgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/XG4gICAgICAgICAgICBsZXQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW107XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2U6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gICAgICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW5kIGRpc3Bvc2UgbGVmdG92ZXIgQW5ndWxhciBvYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIGFwcFJlZj8uZGV0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM/LmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICBjb25zdCB0cmlwQ2hhbmdlRGV0ZWN0aW9uID0gKCkgPT5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZT8uY2hhbmdlRGV0ZWN0b3JSZWY/LmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgLy8gVGhlc2UgYXR0cmlidXRlcyB3aWxsIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB3aGVuIHRoZXkgZmlyZSBmcm9tXG4gICAgICAgICAgICAvLyB0aGUgdW5kZXJseWluZyBSZWFjdCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gLi4uIFRoaXMgd2lsbCBicmVhayB0aGluZ3MuIEZVQ0suXG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBBcnJheTxrZXlvZiBSZWFjdC5ET01BdHRyaWJ1dGVzPGFueT4+ID0gWydvbkNvcHknLCAnb25DdXQnLCAnb25QYXN0ZScsICdvbkFib3J0JywgJ29uQmx1cicsICdvbkZvY3VzJywgJ29uQ2FuUGxheScsICdvbkNhblBsYXlUaHJvdWdoJywgJ29uQ2hhbmdlJywgJ29uQ2xpY2snLCAnb25Db250ZXh0TWVudScsICdvbkRvdWJsZUNsaWNrJywgJ29uRHJhZycsICdvbkRyYWdFbmQnLCAnb25EcmFnRW50ZXInLCAnb25EcmFnTGVhdmUnLCAnb25EcmFnT3ZlcicsICdvbkRyYWdTdGFydCcsICdvbkRyb3AnLCAnb25EdXJhdGlvbkNoYW5nZScsICdvbkVtcHRpZWQnLCAnb25FbmRlZCcsICdvbklucHV0JywgJ29uSW52YWxpZCcsICdvbktleURvd24nLCAnb25LZXlQcmVzcycsICdvbktleVVwJywgJ29uTG9hZCcsICdvbkxvYWRlZERhdGEnLCAnb25Mb2FkZWRNZXRhZGF0YScsICdvbkxvYWRTdGFydCcsICdvbk1vdXNlRG93bicsICdvbk1vdXNlRW50ZXInLCAnb25Nb3VzZUxlYXZlJywgJ29uTW91c2VNb3ZlJywgJ29uTW91c2VPdXQnLCAnb25Nb3VzZU92ZXInLCAnb25Nb3VzZVVwJywgJ29uUGF1c2UnLCAnb25QbGF5JywgJ29uUGxheWluZycsICdvblByb2dyZXNzJywgJ29uUmF0ZUNoYW5nZScsICdvblJlc2V0JywgJ29uU2Nyb2xsJywgJ29uU2Vla2VkJywgJ29uU2Vla2luZycsICdvblNlbGVjdCcsICdvblN0YWxsZWQnLCAnb25TdWJtaXQnLCAnb25TdXNwZW5kJywgJ29uVGltZVVwZGF0ZScsICdvblZvbHVtZUNoYW5nZScsICdvbldhaXRpbmcnLCAnb25FcnJvciddO1xuXG4gICAgICAgICAgICBjb25zdCBhdHRyT2JqID0ge307XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmZvckVhY2goYSA9PiBhdHRyT2JqW2FdID0gdHJpcENoYW5nZURldGVjdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiByZWFjdFRlbXBsYXRlKFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyVGFnLCB7XG4gICAgICAgICAgICAgICAgLi4uYXR0ck9iaixcbiAgICAgICAgICAgICAgICByZWY6IGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRJbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgZXZlciBhY3R1YWxseSBoYXBwZW5zLCBhZGRlZCBhcyBhIHByZXZlbnRhdGl2ZSBtZWFzdXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIG1lbW9yeSBsZWFrcy5cbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3RzdHJhcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXQgdGhlIEFuZ3VsYXIgY29tcG9uZW50IHdpdGggdGhlIGNvbnRleHQgb2YgdGhlIHJvb3QgQW5ndWxhciBhcHAuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZSA9IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudEluamVjdG9yOiBhcHBSZWYuaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluamVjdG9yOiBpbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0RWxlbWVudDogbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0YWJsZU5vZGVzOiBwcm9qZWN0YWJsZU5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudEluc3RhbmNlLmhvc3RWaWV3KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBuZ1pvbmU/LnJ1blRhc2tcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmdab25lPy5ydW5UYXNrKGJvb3RzdHJhcClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYm9vdHN0cmFwKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc2V0dGxlZCwgYmluZCBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoX3Byb3BzKS5maWx0ZXIoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQE91dHB1dHMgYXJlIGFsd2F5cyBFdmVudCBFbWl0dGVycyAoSSB0aGluaylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZVtrXT8uc3Vic2NyaWJlKGV2dCA9PiBfcHJvcHNba10uY2FsbChjdHgsIGV2dCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2tdID0gX3Byb3BzW2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmdab25lPy5ydW5PdXRzaWRlQW5ndWxhclxuICAgICAgICA/IG5nWm9uZT8ucnVuT3V0c2lkZUFuZ3VsYXIoY3JlYXRlV3JhcHBlZEVsZW1lbnQpXG4gICAgICAgIDogY3JlYXRlV3JhcHBlZEVsZW1lbnQoKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgd3JhcCBhbiBBbmd1bGFyXG4gKiBDb21wb25lbnQgb3IgRGlyZWN0aXZlIGludG8gYSBSZWFjdCBvYmplY3QuXG4gKiBAT3V0cHV0cyAoRXZlbnRFbWl0dGVycykgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gKiBsaW5rZWQgaW50byB0aGUgaW5wdXQgcHJvcGVydGllcyBhbG9uZyB3aXRoXG4gKiBhbGwgb2YgdGhlIEBJbnB1dHMuXG4gKiBAcmV0dXJucyBSZWFjdC5OYW1lZEV4b3RpY0NvbXBvbmVudFxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY29uc3QgQXV0b1dyYXBBbmd1bGFyT2JqZWN0ID0gKHtcbiAgICBjb21wb25lbnQsXG4gICAgYXBwUmVmLFxuICAgIG5nWm9uZSxcbiAgICBpbnN0YW5jZSxcbiAgICBpbmplY3RvcixcbiAgICBjb250YWluZXJUYWcsXG4gICAgcmVhY3RUZW1wbGF0ZSxcbn06IChQYXJhbWV0ZXJzPHR5cGVvZiBXcmFwQW5ndWxhckNvbXBvbmVudEluUmVhY3Q+WzBdICYge1xuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgQ29tcG9uZW50L0RpcmVjdGl2ZSBpbnN0YW5jZSB0aGF0IHdpbGwgaGF2ZSBwcm9wZXJ0aWVzIGJvdW5kIHRvIHRoZSBjcmVhdGVkXG4gICAgICovXG4gICAgaW5zdGFuY2U/OiBJbnN0YW5jZVR5cGU8VHlwZTxhbnk+PiB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG5cbn0pKSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSBuZzJSZWFjdFByb3BzKGluc3RhbmNlKTtcblxuICAgIHJldHVybiBXcmFwQW5ndWxhckNvbXBvbmVudEluUmVhY3Qoe1xuICAgICAgICBjb21wb25lbnQsXG4gICAgICAgIG5nWm9uZSxcbiAgICAgICAgYXBwUmVmLFxuICAgICAgICBpbmplY3RvcixcbiAgICAgICAgY29udGFpbmVyVGFnLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgcmVhY3RUZW1wbGF0ZVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBCb290c3RyYXAgYW4gQW5ndWxhciBjb21wb25lbnQgd2l0aCBgY3JlYXRlQXBwbGljYXRpb25gIGFuZCBleHBvcnQgaXQgdW5kZXIgYVxuICogcmVhY3QgRWxlbWVudC5cbiAqIFVzYWdlOiBSZWFjdCB0b3AtbGV2ZWwgYXBwbGljYXRpb24gZW1iZWRkaW5nIGFuIEFuZ3VsYXIgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVhY3RpZnlTdGFuZGFsb25lQW5ndWxhckNvbXBvbmVudChcbiAgICBjb21wb25lbnQ6IFR5cGU8YW55PixcbiAgICBwcm9wczogYW55ID0ge30sXG4gICAgcHJvdmlkZXJzOiAoUHJvdmlkZXIgfCBFbnZpcm9ubWVudFByb3ZpZGVycylbXSA9IFtdLFxuICAgIGNvbnRhaW5lclRhZzogc3RyaW5nID0gJ2Rpdidcbikge1xuICAgIGNvbnN0IGN0eCA9IHRoaXM7XG5cbiAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cbiAgICBsZXQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW107XG4gICAgbGV0IGFwcDogQXBwbGljYXRpb25SZWY7XG5cbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ29kZSB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zPy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICBhcHA/LmRlc3Ryb3koKTtcbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjb250YWluZXJUYWcsIHtcbiAgICAgICAgcmVmOiBhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgLy8gTm90IHN1cmUgaWYgdGhpcyBldmVyIGFjdHVhbGx5IGhhcHBlbnMsIGFkZGVkIGFzIGEgcHJldmVudGF0aXZlIG1lYXN1cmVcbiAgICAgICAgICAgIC8vIHRvIG1lbW9yeSBsZWFrcy5cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM/LmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgIGFwcD8uZGVzdHJveSgpO1xuXG4gICAgICAgICAgICAvLyBJbml0IGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcm9vdCAmIGJvb3RzdHJhcCBpdCB0byBhIERPTSBlbGVtZW50LlxuICAgICAgICAgICAgYXBwID0gYXdhaXQgY3JlYXRlQXBwbGljYXRpb24oeyBwcm92aWRlcnMgfSk7XG4gICAgICAgICAgICBjb25zdCBiYXNlID0gYXBwLmJvb3RzdHJhcChjb21wb25lbnQsIG5vZGUpO1xuICAgICAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gYmFzZTtcblxuXG4gICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgSlMgdG8gZmluaXNoIHJlbmRlcmluZyBhbmQgaW5pdGluZy5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICAgICAgICAgIC8vIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHNldHRsZWQsIGJpbmQgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZpbHRlcigoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQE91dHB1dHMgYXJlIGFsd2F5cyBFdmVudCBFbWl0dGVycyAoSSB0aGluaylcbiAgICAgICAgICAgICAgICBpZiAodiBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrXT8uc3Vic2NyaWJlKGV2dCA9PiBwcm9wc1trXS5jYWxsKGN0eCwgZXZ0KSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW2tdID0gcHJvcHNba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGJhc2UuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cblxuXG4vLyBUaGVzZSBleHBvcnRzIGV4aXN0IHRvIGF0dGVtcHQgdG8gbWFrZSB0aGUgQVBJIGhhdmUgbWluaW1hbCBicmVha2luZyBjaGFuZ2VzLlxuZXhwb3J0IGNvbnN0IFJlYWN0aWZ5UmVhY3RDb21wb25lbnQgPSBSZWFjdGlmeUFuZ3VsYXJDb21wb25lbnQ7XG5leHBvcnQgY29uc3QgUmVhY3RpZnlBbmd1bGFyQ29tcG9uZW50MyA9IFdyYXBBbmd1bGFyQ29tcG9uZW50SW5SZWFjdDs7XG4iXX0=
@@ -1,100 +0,0 @@
1
- import { Component, EventEmitter } from '@angular/core';
2
- import * as React from 'react';
3
- import { createRoot } from 'react-dom/client';
4
- import * as i0 from "@angular/core";
5
- /**
6
- * This component can be used to automatically wrap a React
7
- * component into Angular bindings with functional change detection.
8
- * All you need to provide is the @Input and @Output interface
9
- * for the component in order to tell Angular which keys correspond to what.
10
- *
11
- * ### You _must_ override the property `ngReactComponent`.
12
- *
13
- * Failure to do so will result in errors
14
- *
15
- * `override readonly ngReactComponent = SomeReactFunction;`
16
- *
17
- * Example:
18
- *
19
- * ```ts
20
- * @Component({
21
- * selector: "app-react-wrapped",
22
- * standalone: true
23
- * })
24
- * export class MyReactWrappedComponent extends ReactifyNgComponent {
25
- *
26
- * @Input() data: any;
27
- * @Input() options: any;
28
- * @Input() version: any;
29
- *
30
- * // Notice how we wrap the result in an array, this is important because
31
- * // React can pass multiple properties to a callback and Angular can't.
32
- * @Output() onClick = new EventEmitter<[any]>();
33
- *
34
- * }
35
- * ```
36
- */
37
- export class ReactifyNgComponent {
38
- constructor(ngContainer, ngZone) {
39
- this.ngContainer = ngContainer;
40
- this.ngZone = ngZone;
41
- this._props = {};
42
- }
43
- ngOnInit() {
44
- if (!this.ngReactComponent) {
45
- throw new Error("ReactifyNgComponent cannot be inherited without a provided ngReactComponent!");
46
- }
47
- }
48
- ngOnChanges(changes) {
49
- this._render();
50
- }
51
- ngAfterViewInit() {
52
- this._render();
53
- }
54
- ngOnDestroy() {
55
- this._root?.unmount();
56
- }
57
- _render() {
58
- if (!this.ngReactComponent) {
59
- console.log("Render no component. May be context issue");
60
- return;
61
- }
62
- ;
63
- this.ngZone.runOutsideAngular(() => {
64
- try {
65
- this._root ??= createRoot(this.ngContainer.element.nativeElement);
66
- // List all keys that do not start with `_` nor `ng`
67
- const keys = Object.keys(this).filter(k => !/^(?:_|ng)/.test(k));
68
- // Get all property keys from the class
69
- const propKeys = keys.filter(k => !(this[k] instanceof EventEmitter));
70
- // Get all event handler keys from the class
71
- const evtKeys = keys.filter(k => this[k] instanceof EventEmitter);
72
- // Project all key properties onto `props`
73
- propKeys.forEach(k => this._props[k] = this[k]);
74
- // Attempt to ensure no zone is lost during the event emitter fires
75
- this.ngZone.runGuarded(() => {
76
- // Bind all event handlers.
77
- // ! important Angular uses EventEmitter, React uses
78
- // a different method of event binding
79
- evtKeys.forEach(k => this._props[k] = (...args) => this[k].next(args));
80
- });
81
- this._reactElement = React.createElement(this.ngReactComponent, { props: this._props });
82
- this._root.render(this._reactElement);
83
- }
84
- catch (err) {
85
- console.error(err);
86
- }
87
- });
88
- }
89
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
90
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactifyNgComponent, isStandalone: true, selector: "ngx-reactify", usesOnChanges: true, ngImport: i0, template: ``, isInline: true }); }
91
- }
92
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, decorators: [{
93
- type: Component,
94
- args: [{
95
- selector: 'ngx-reactify',
96
- template: ``,
97
- standalone: true
98
- }]
99
- }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.NgZone }] });
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdG8tYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3JlYWN0LXRvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFpRSxNQUFNLGVBQWUsQ0FBQztBQUN0SSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sa0JBQWtCLENBQUM7O0FBR3BEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBTUgsTUFBTSxPQUFPLG1CQUFtQjtJQWM1QixZQUN1QixXQUE2QixFQUM3QixNQUFjO1FBRGQsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFKN0IsV0FBTSxHQUFXLEVBQUUsQ0FBQztJQU01QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUM7UUFDcEcsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBdUI7UUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7WUFDeEQsT0FBTTtRQUNWLENBQUM7UUFBQSxDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDO2dCQUNELElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVsRSxvREFBb0Q7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWpFLHVDQUF1QztnQkFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDdEUsNENBQTRDO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxDQUFDO2dCQUVsRSwwQ0FBMEM7Z0JBQzFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoRCxtRUFBbUU7Z0JBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDeEIsMkJBQTJCO29CQUMzQixvREFBb0Q7b0JBQ3BELHNDQUFzQztvQkFDdEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsQ0FBQTtnQkFFRixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE9BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN0QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDOytHQTFFUSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw2RkFIbEIsRUFBRTs7NEZBR0gsbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxjQUFjO29CQUN4QixRQUFRLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsSUFBSTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcywgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCwgUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSB3cmFwIGEgUmVhY3RcbiAqIGNvbXBvbmVudCBpbnRvIEFuZ3VsYXIgYmluZGluZ3Mgd2l0aCBmdW5jdGlvbmFsIGNoYW5nZSBkZXRlY3Rpb24uXG4gKiBBbGwgeW91IG5lZWQgdG8gcHJvdmlkZSBpcyB0aGUgQElucHV0IGFuZCBAT3V0cHV0IGludGVyZmFjZVxuICogZm9yIHRoZSBjb21wb25lbnQgaW4gb3JkZXIgdG8gdGVsbCBBbmd1bGFyIHdoaWNoIGtleXMgY29ycmVzcG9uZCB0byB3aGF0LlxuICpcbiAqICMjIyBZb3UgX211c3RfIG92ZXJyaWRlIHRoZSBwcm9wZXJ0eSBgbmdSZWFjdENvbXBvbmVudGAuXG4gKlxuICogRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBlcnJvcnNcbiAqXG4gKiBgb3ZlcnJpZGUgcmVhZG9ubHkgbmdSZWFjdENvbXBvbmVudCA9IFNvbWVSZWFjdEZ1bmN0aW9uO2BcbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgQENvbXBvbmVudCh7XG4gKiAgICAgIHNlbGVjdG9yOiBcImFwcC1yZWFjdC13cmFwcGVkXCIsXG4gKiAgICAgIHN0YW5kYWxvbmU6IHRydWVcbiAqICB9KVxuICogIGV4cG9ydCBjbGFzcyBNeVJlYWN0V3JhcHBlZENvbXBvbmVudCBleHRlbmRzIFJlYWN0aWZ5TmdDb21wb25lbnQge1xuICpcbiAqICAgICAgQElucHV0KCkgZGF0YTogYW55O1xuICogICAgICBASW5wdXQoKSBvcHRpb25zOiBhbnk7XG4gKiAgICAgIEBJbnB1dCgpIHZlcnNpb246IGFueTtcbiAqXG4gKiAgICAgIC8vIE5vdGljZSBob3cgd2Ugd3JhcCB0aGUgcmVzdWx0IGluIGFuIGFycmF5LCB0aGlzIGlzIGltcG9ydGFudCBiZWNhdXNlXG4gKiAgICAgIC8vIFJlYWN0IGNhbiBwYXNzIG11bHRpcGxlIHByb3BlcnRpZXMgdG8gYSBjYWxsYmFjayBhbmQgQW5ndWxhciBjYW4ndC5cbiAqICAgICAgQE91dHB1dCgpIG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFthbnldPigpO1xuICpcbiAqIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1yZWFjdGlmeScsXG4gICAgdGVtcGxhdGU6IGBgLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgUmVhY3RpZnlOZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFjdCBjb21wb25lbnQgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiAhIE11c3QgYmUgb3ZlcnJpZGRlbiBmb3IgdGhpcyB3cmFwcGVyIHRvIHdvcmtcbiAgICAgKi9cbiAgICBuZ1JlYWN0Q29tcG9uZW50OiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDxhbnk+IHwgUmVhY3QuQ29tcG9uZW50Q2xhc3M8YW55PjtcblxuICAgIHByaXZhdGUgX3Jvb3Q6IFJvb3Q7XG5cbiAgICBwcml2YXRlIF9yZWFjdEVsZW1lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudDtcblxuICAgIHByaXZhdGUgX3Byb3BzOiBPYmplY3QgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBuZ1pvbmU6IE5nWm9uZVxuICAgICkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMubmdSZWFjdENvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3RpZnlOZ0NvbXBvbmVudCBjYW5ub3QgYmUgaW5oZXJpdGVkIHdpdGhvdXQgYSBwcm92aWRlZCBuZ1JlYWN0Q29tcG9uZW50IVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM/OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX3Jvb3Q/LnVubW91bnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW5kZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlbmRlciBubyBjb21wb25lbnQuIE1heSBiZSBjb250ZXh0IGlzc3VlXCIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QgPz89IGNyZWF0ZVJvb3QodGhpcy5uZ0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gTGlzdCBhbGwga2V5cyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGBfYCBub3IgYG5nYFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKS5maWx0ZXIoayA9PiAhL14oPzpffG5nKS8udGVzdChrKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wS2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gISh0aGlzW2tdIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBldmVudCBoYW5kbGVyIGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBldnRLZXlzID0ga2V5cy5maWx0ZXIoayA9PiB0aGlzW2tdIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKTtcblxuICAgICAgICAgICAgICAgIC8vIFByb2plY3QgYWxsIGtleSBwcm9wZXJ0aWVzIG9udG8gYHByb3BzYFxuICAgICAgICAgICAgICAgIHByb3BLZXlzLmZvckVhY2goayA9PiB0aGlzLl9wcm9wc1trXSA9IHRoaXNba10pO1xuXG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBlbnN1cmUgbm8gem9uZSBpcyBsb3N0IGR1cmluZyB0aGUgZXZlbnQgZW1pdHRlciBmaXJlc1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bkd1YXJkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCaW5kIGFsbCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgLy8gISBpbXBvcnRhbnQgQW5ndWxhciB1c2VzIEV2ZW50RW1pdHRlciwgUmVhY3QgdXNlc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgZXZlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICBldnRLZXlzLmZvckVhY2goayA9PiB0aGlzLl9wcm9wc1trXSA9ICguLi5hcmdzKSA9PiB0aGlzW2tdLm5leHQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFjdEVsZW1lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRoaXMubmdSZWFjdENvbXBvbmVudCwgeyBwcm9wczogdGhpcy5fcHJvcHMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QucmVuZGVyKHRoaXMuX3JlYWN0RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=