@zdigambar/ngx-element 3.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +1 -1
  2. package/esm2020/lib/ngx-element.component.mjs +105 -0
  3. package/esm2020/lib/ngx-element.module.mjs +34 -0
  4. package/esm2020/lib/ngx-element.service.mjs +135 -0
  5. package/esm2020/zdigambar-ngx-element.mjs +5 -0
  6. package/fesm2015/zdigambar-ngx-element.mjs +281 -0
  7. package/fesm2015/zdigambar-ngx-element.mjs.map +1 -0
  8. package/{fesm2015/zdigambar-ngx-element.js → fesm2020/zdigambar-ngx-element.mjs} +37 -38
  9. package/fesm2020/zdigambar-ngx-element.mjs.map +1 -0
  10. package/index.d.ts +6 -0
  11. package/lib/lazy-component-loaded-event.d.ts +1 -0
  12. package/lib/lazy-component-loaded-event.d.ts.map +1 -0
  13. package/lib/ngx-element.component.d.ts +4 -0
  14. package/lib/ngx-element.component.d.ts.map +1 -0
  15. package/lib/ngx-element.module.d.ts +6 -0
  16. package/lib/ngx-element.module.d.ts.map +1 -0
  17. package/lib/ngx-element.service.d.ts +4 -0
  18. package/lib/ngx-element.service.d.ts.map +1 -0
  19. package/lib/tokens.d.ts +1 -0
  20. package/lib/tokens.d.ts.map +1 -0
  21. package/package.json +24 -12
  22. package/public-api.d.ts +1 -0
  23. package/public-api.d.ts.map +1 -0
  24. package/zdigambar-ngx-element.d.ts.map +1 -0
  25. package/bundles/zdigambar-ngx-element.umd.js +0 -810
  26. package/bundles/zdigambar-ngx-element.umd.js.map +0 -1
  27. package/esm2015/lib/ngx-element.component.js +0 -105
  28. package/esm2015/lib/ngx-element.module.js +0 -33
  29. package/esm2015/lib/ngx-element.service.js +0 -136
  30. package/esm2015/zdigambar-ngx-element.js +0 -8
  31. package/fesm2015/zdigambar-ngx-element.js.map +0 -1
  32. package/zdigambar-ngx-element.d.ts +0 -7
  33. package/zdigambar-ngx-element.metadata.json +0 -1
  34. /package/{esm2015/lib/lazy-component-loaded-event.js → esm2020/lib/lazy-component-loaded-event.mjs} +0 -0
  35. /package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  36. /package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Supported version
1
+ # Supported Version
2
2
  | ngx-element | Angular |
3
3
  | ------------ | ------- |
4
4
  | 1.x.x | ^10.x.x |
@@ -0,0 +1,105 @@
1
+ import { Component, Input, ViewChild, ViewContainerRef, ReflectiveInjector } from '@angular/core';
2
+ import { merge } from 'rxjs';
3
+ import { map } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./ngx-element.service";
6
+ export class NgxElementComponent {
7
+ constructor(ngxElementService, elementRef) {
8
+ this.ngxElementService = ngxElementService;
9
+ this.elementRef = elementRef;
10
+ }
11
+ /**
12
+ * Subscribe to event emitters of a lazy loaded and dynamically instantiated Angular component
13
+ * and dispatch them as Custom Events on the NgxElementComponent that is used in a template.
14
+ */
15
+ setProxiedOutputs(factory) {
16
+ const eventEmitters = factory.outputs.map(({ propName, templateName }) => {
17
+ const emitter = this.componentRef.instance[propName];
18
+ return emitter.pipe(map((value) => ({ name: templateName, value })));
19
+ });
20
+ const outputEvents = merge(...eventEmitters);
21
+ this.ngElementEventsSubscription = outputEvents.subscribe(subscription => {
22
+ const customEvent = document.createEvent('CustomEvent');
23
+ customEvent.initCustomEvent(subscription.name, false, false, subscription.value);
24
+ this.elementRef.nativeElement.dispatchEvent(customEvent);
25
+ });
26
+ }
27
+ ngOnInit() {
28
+ this.ngxElementService.getComponentToLoad(this.selector).subscribe(event => {
29
+ this.componentToLoad = event.componentClass;
30
+ this.componentFactoryResolver = this.ngxElementService.getComponentFactoryResolver(this.componentToLoad);
31
+ this.injector = this.ngxElementService.getInjector(this.componentToLoad);
32
+ const attributes = this.getElementAttributes();
33
+ this.createComponent(attributes);
34
+ });
35
+ }
36
+ createComponent(attributes) {
37
+ this.container.clear();
38
+ const factory = this.componentFactoryResolver.resolveComponentFactory(this.componentToLoad);
39
+ this.refInjector = ReflectiveInjector.resolveAndCreate([{ provide: this.componentToLoad, useValue: this.componentToLoad }], this.injector);
40
+ this.componentRef = this.container.createComponent(factory, 0, this.refInjector);
41
+ this.setAttributes(attributes);
42
+ this.listenToAttributeChanges();
43
+ this.setProxiedOutputs(factory);
44
+ }
45
+ setAttributes(attributes) {
46
+ attributes.forEach(attr => {
47
+ this.componentRef.instance[attr.name] = attr.value;
48
+ });
49
+ }
50
+ getElementAttributes() {
51
+ const attrs = this.elementRef.nativeElement.attributes;
52
+ const attributes = [];
53
+ for (let attr, i = 0; i < attrs.length; i++) {
54
+ attr = attrs[i];
55
+ if (attr.nodeName.match('^data-')) {
56
+ attributes.push({
57
+ name: this.camelCaseAttribute(attr.nodeName),
58
+ value: attr.nodeValue
59
+ });
60
+ }
61
+ }
62
+ return attributes;
63
+ }
64
+ camelCaseAttribute(attribute) {
65
+ const attr = attribute.replace('data-', '');
66
+ const chunks = attr.split('-');
67
+ if (chunks.length > 1) {
68
+ return chunks[0] + chunks.slice(1).map(chunk => chunk.replace(/^\w/, c => c.toUpperCase())).join('');
69
+ }
70
+ return attr;
71
+ }
72
+ listenToAttributeChanges() {
73
+ const observer = new MutationObserver(mutations => {
74
+ mutations.forEach(mutation => {
75
+ if (mutation.type === 'attributes') {
76
+ const attributes = this.getElementAttributes();
77
+ this.setAttributes(attributes);
78
+ }
79
+ });
80
+ });
81
+ observer.observe(this.elementRef.nativeElement, {
82
+ attributes: true
83
+ });
84
+ }
85
+ ngOnDestroy() {
86
+ this.componentRef.destroy();
87
+ this.ngElementEventsSubscription.unsubscribe();
88
+ }
89
+ }
90
+ NgxElementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementComponent, deps: [{ token: i1.NgxElementService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
91
+ NgxElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NgxElementComponent, selector: "lib-ngx-element", inputs: { selector: "selector" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
92
+ <ng-template #container></ng-template>
93
+ `, isInline: true });
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementComponent, decorators: [{
95
+ type: Component,
96
+ args: [{ selector: 'lib-ngx-element', template: `
97
+ <ng-template #container></ng-template>
98
+ ` }]
99
+ }], ctorParameters: function () { return [{ type: i1.NgxElementService }, { type: i0.ElementRef }]; }, propDecorators: { selector: [{
100
+ type: Input
101
+ }], container: [{
102
+ type: ViewChild,
103
+ args: ['container', { read: ViewContainerRef }]
104
+ }] } });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVsZW1lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVsZW1lbnQvc3JjL2xpYi9uZ3gtZWxlbWVudC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBR0wsU0FBUyxFQUNULGdCQUFnQixFQU1oQixrQkFBa0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7OztBQVNuQyxNQUFNLE9BQU8sbUJBQW1CO0lBWTlCLFlBQ1UsaUJBQW9DLEVBQ3BDLFVBQXNCO1FBRHRCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUM3QixDQUFDO0lBRUo7OztPQUdHO0lBQ0ssaUJBQWlCLENBQUMsT0FBOEI7UUFDdEQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUMsRUFBRSxFQUFFO1lBQ3JFLE1BQU0sT0FBTyxHQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQXNCLENBQUM7WUFDbkYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZ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WUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqRCxDQUFDOztnSEFoSFUsbUJBQW1CO29HQUFuQixtQkFBbUIsNEtBSUMsZ0JBQWdCLDZCQVRyQzs7R0FFVDsyRkFHVSxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsaUJBQWlCLFlBQ2pCOztHQUVUO2lJQU1RLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQzRDLFNBQVM7c0JBQTFELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBDb21wb25lbnRSZWYsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIE9uRGVzdHJveSxcbiAgRXZlbnRFbWl0dGVyLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgUmVmbGVjdGl2ZUluamVjdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ3hFbGVtZW50U2VydmljZX0gZnJvbSAnLi9uZ3gtZWxlbWVudC5zZXJ2aWNlJztcbmltcG9ydCB7bWVyZ2UsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbmd4LWVsZW1lbnQnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjY29udGFpbmVyPjwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgTmd4RWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIG5nRWxlbWVudEV2ZW50c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBASW5wdXQoKSBzZWxlY3Rvcjogc3RyaW5nO1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZn0pIGNvbnRhaW5lcjtcblxuICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+O1xuICBjb21wb25lbnRUb0xvYWQ6IFR5cGU8YW55PjtcbiAgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG4gIGluamVjdG9yOiBJbmplY3RvcjtcbiAgcmVmSW5qZWN0b3I6IFJlZmxlY3RpdmVJbmplY3RvcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5neEVsZW1lbnRTZXJ2aWNlOiBOZ3hFbGVtZW50U2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gZXZlbnQgZW1pdHRlcnMgb2YgYSBsYXp5IGxvYWRlZCBhbmQgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIEFuZ3VsYXIgY29tcG9uZW50XG4gICAqIGFuZCBkaXNwYXRjaCB0aGVtIGFzIEN1c3RvbSBFdmVudHMgb24gdGhlIE5neEVsZW1lbnRDb21wb25lbnQgdGhhdCBpcyB1c2VkIGluIGEgdGVtcGxhdGUuXG4gICAqL1xuICBwcml2YXRlIHNldFByb3hpZWRPdXRwdXRzKGZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55Pik6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50RW1pdHRlcnMgPSBmYWN0b3J5Lm91dHB1dHMubWFwKCh7cHJvcE5hbWUsIHRlbXBsYXRlTmFtZX0pID0+IHtcbiAgICAgIGNvbnN0IGVtaXR0ZXIgPSAodGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgYW55KVtwcm9wTmFtZV0gYXMgRXZlbnRFbWl0dGVyPGFueT47XG4gICAgICByZXR1cm4gZW1pdHRlci5waXBlKG1hcCgodmFsdWU6IGFueSkgPT4gKHtuYW1lOiB0ZW1wbGF0ZU5hbWUsIHZhbHVlfSkpKTtcbiAgICB9KTtcbiAgICBjb25zdCBvdXRwdXRFdmVudHMgPSBtZXJnZSguLi5ldmVudEVtaXR0ZXJzKTtcbiAgICB0aGlzLm5nRWxlbWVudEV2ZW50c1N1YnNjcmlwdGlvbiA9IG91dHB1dEV2ZW50cy5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gICAgICBjdXN0b21FdmVudC5pbml0Q3VzdG9tRXZlbnQoc3Vic2NyaXB0aW9uLm5hbWUsIGZhbHNlLCBmYWxzZSwgc3Vic2NyaXB0aW9uLnZhbHVlKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ3hFbGVtZW50U2VydmljZS5nZXRDb21wb25lbnRUb0xvYWQodGhpcy5zZWxlY3Rvcikuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuY29tcG9uZW50VG9Mb2FkID0gZXZlbnQuY29tcG9uZW50Q2xhc3M7XG4gICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IHRoaXMubmd4RWxlbWVudFNlcnZpY2UuZ2V0Q29tcG9uZW50RmFjdG9yeVJlc29sdmVyKHRoaXMuY29tcG9uZW50VG9Mb2FkKTtcbiAgICAgIHRoaXMuaW5qZWN0b3IgPSB0aGlzLm5neEVsZW1lbnRTZXJ2aWNlLmdldEluamVjdG9yKHRoaXMuY29tcG9uZW50VG9Mb2FkKTtcblxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKTtcbiAgICAgIHRoaXMuY3JlYXRlQ29tcG9uZW50KGF0dHJpYnV0ZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlQ29tcG9uZW50KGF0dHJpYnV0ZXMpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0aGlzLmNvbXBvbmVudFRvTG9hZCk7XG5cbiAgICB0aGlzLnJlZkluamVjdG9yID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoXG4gICAgICBbe3Byb3ZpZGU6IHRoaXMuY29tcG9uZW50VG9Mb2FkLCB1c2VWYWx1ZTogdGhpcy5jb21wb25lbnRUb0xvYWR9XSwgdGhpcy5pbmplY3RvclxuICAgICk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSwgMCwgdGhpcy5yZWZJbmplY3Rvcik7XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgdGhpcy5saXN0ZW5Ub0F0dHJpYnV0ZUNoYW5nZXMoKTtcbiAgICB0aGlzLnNldFByb3hpZWRPdXRwdXRzKGZhY3RvcnkpO1xuICB9XG5cbiAgc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2VbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBnZXRFbGVtZW50QXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRycyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgYXR0ciwgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgYXR0ciA9IGF0dHJzW2ldO1xuXG4gICAgICBpZiAoYXR0ci5ub2RlTmFtZS5tYXRjaCgnXmRhdGEtJykpIHtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiB0aGlzLmNhbWVsQ2FzZUF0dHJpYnV0ZShhdHRyLm5vZGVOYW1lKSxcbiAgICAgICAgICB2YWx1ZTogYXR0ci5ub2RlVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gIH1cblxuICBjYW1lbENhc2VBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlLnJlcGxhY2UoJ2RhdGEtJywgJycpO1xuICAgIGNvbnN0IGNodW5rcyA9IGF0dHIuc3BsaXQoJy0nKTtcblxuICAgIGlmIChjaHVua3MubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIGNodW5rc1swXSArIGNodW5rcy5zbGljZSgxKS5tYXAoY2h1bmsgPT4gY2h1bmsucmVwbGFjZSgvXlxcdy8sIGMgPT4gYy50b1VwcGVyQ2FzZSgpKSkuam9pbignJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHI7XG4gIH1cblxuICBsaXN0ZW5Ub0F0dHJpYnV0ZUNoYW5nZXMoKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgbXV0YXRpb25zLmZvckVhY2gobXV0YXRpb24gPT4ge1xuICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnKSB7XG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKTtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgIHRoaXMubmdFbGVtZW50RXZlbnRzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,34 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { createCustomElement } from '@angular/elements';
3
+ import { NgxElementComponent } from './ngx-element.component';
4
+ import { LAZY_CMPS_PATH_TOKEN } from './tokens';
5
+ import * as i0 from "@angular/core";
6
+ export class NgxElementModule {
7
+ constructor(injector) {
8
+ this.injector = injector;
9
+ const ngxElement = createCustomElement(NgxElementComponent, { injector });
10
+ customElements.define('ngx-element', ngxElement);
11
+ }
12
+ static forRoot(modulePaths) {
13
+ return {
14
+ ngModule: NgxElementModule,
15
+ providers: [
16
+ {
17
+ provide: LAZY_CMPS_PATH_TOKEN,
18
+ useValue: modulePaths
19
+ }
20
+ ]
21
+ };
22
+ }
23
+ ngDoBootstrap() { }
24
+ }
25
+ NgxElementModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule });
26
+ NgxElementModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule, declarations: [NgxElementComponent] });
27
+ NgxElementModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule });
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule, decorators: [{
29
+ type: NgModule,
30
+ args: [{
31
+ declarations: [NgxElementComponent]
32
+ }]
33
+ }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVsZW1lbnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVsZW1lbnQvc3JjL2xpYi9uZ3gtZWxlbWVudC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sVUFBVSxDQUFDOztBQUtoRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQW9CLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQWtCO1FBQy9CLE9BQU87WUFDTCxRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsb0JBQW9CO29CQUM3QixRQUFRLEVBQUUsV0FBVztpQkFDdEI7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsYUFBYSxLQUFJLENBQUM7OzZHQW5CUCxnQkFBZ0I7OEdBQWhCLGdCQUFnQixpQkFGVixtQkFBbUI7OEdBRXpCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUg1QixRQUFRO21CQUFDO29CQUNOLFlBQVksRUFBRSxDQUFDLG1CQUFtQixDQUFDO2lCQUN0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlLCBJbmplY3RvciwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlQ3VzdG9tRWxlbWVudCB9IGZyb20gJ0Bhbmd1bGFyL2VsZW1lbnRzJztcbmltcG9ydCB7IE5neEVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL25neC1lbGVtZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMQVpZX0NNUFNfUEFUSF9UT0tFTiB9IGZyb20gJy4vdG9rZW5zJztcblxuQE5nTW9kdWxlKHtcclxuICAgIGRlY2xhcmF0aW9uczogW05neEVsZW1lbnRDb21wb25lbnRdXHJcbn0pXG5leHBvcnQgY2xhc3MgTmd4RWxlbWVudE1vZHVsZSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBjb25zdCBuZ3hFbGVtZW50ID0gY3JlYXRlQ3VzdG9tRWxlbWVudChOZ3hFbGVtZW50Q29tcG9uZW50LCB7IGluamVjdG9yIH0pO1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnbmd4LWVsZW1lbnQnLCBuZ3hFbGVtZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JSb290KG1vZHVsZVBhdGhzOiBhbnlbXSk6IE1vZHVsZVdpdGhQcm92aWRlcnM8Tmd4RWxlbWVudE1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTmd4RWxlbWVudE1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTEFaWV9DTVBTX1BBVEhfVE9LRU4sXG4gICAgICAgICAgdXNlVmFsdWU6IG1vZHVsZVBhdGhzXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG5cbiAgbmdEb0Jvb3RzdHJhcCgpIHt9XG59XG4iXX0=
@@ -0,0 +1,135 @@
1
+ import { Injectable, Inject, NgModuleFactory, ComponentFactoryResolver } from '@angular/core';
2
+ import { LAZY_CMPS_PATH_TOKEN } from './tokens';
3
+ import { from } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export class NgxElementService {
6
+ constructor(modulePaths, compiler, injector) {
7
+ this.compiler = compiler;
8
+ this.injector = injector;
9
+ this.loadedComponents = new Map();
10
+ this.elementsLoading = new Map();
11
+ this.injectors = new Map();
12
+ this.componentFactoryResolvers = new Map();
13
+ const ELEMENT_MODULE_PATHS = new Map();
14
+ modulePaths.forEach(route => {
15
+ ELEMENT_MODULE_PATHS.set(route.selector, route);
16
+ });
17
+ this.componentsToLoad = ELEMENT_MODULE_PATHS;
18
+ }
19
+ receiveContext(component, injector) {
20
+ this.injectors.set(component, injector);
21
+ this.componentFactoryResolvers.set(component, injector.get(ComponentFactoryResolver));
22
+ }
23
+ getInjector(component) {
24
+ return this.injectors.get(component);
25
+ }
26
+ getComponentFactoryResolver(component) {
27
+ return this.componentFactoryResolvers.get(component);
28
+ }
29
+ getComponentsToLoad() {
30
+ return this.componentsToLoad;
31
+ }
32
+ getComponentToLoad(selector) {
33
+ // Returns observable that completes when the lazy module has been loaded.
34
+ const registered = this.loadComponent(selector);
35
+ return from(registered);
36
+ }
37
+ /**
38
+ * Allows to lazy load a component given its selector.
39
+ * If the component selector has been registered, it's according module
40
+ * will be fetched lazily
41
+ * @param componentTag selector of the component to load
42
+ */
43
+ loadComponent(componentSelector) {
44
+ if (this.elementsLoading.has(componentSelector)) {
45
+ return this.elementsLoading.get(componentSelector);
46
+ }
47
+ if (this.componentsToLoad.has(componentSelector)) {
48
+ const cmpRegistryEntry = this.componentsToLoad.get(componentSelector);
49
+ const path = cmpRegistryEntry.loadChildren;
50
+ const loadPromise = new Promise((resolve, reject) => {
51
+ path()
52
+ .then(elementModuleOrFactory => {
53
+ /**
54
+ * With View Engine, the NgModule factory is created and provided when loaded.
55
+ * With Ivy, only the NgModule class is provided loaded and must be compiled.
56
+ * This uses the same mechanism as the deprecated `SystemJsNgModuleLoader` in
57
+ * in `packages/core/src/linker/system_js_ng_module_factory_loader.ts`
58
+ * to pass on the NgModuleFactory, or compile the NgModule and return its NgModuleFactory.
59
+ */
60
+ if (elementModuleOrFactory instanceof NgModuleFactory) {
61
+ return elementModuleOrFactory;
62
+ }
63
+ else {
64
+ try {
65
+ return this.compiler.compileModuleAsync(elementModuleOrFactory);
66
+ }
67
+ catch (err) {
68
+ // return the error
69
+ reject(err);
70
+ // break the promise chain
71
+ throw err;
72
+ }
73
+ }
74
+ })
75
+ .then(moduleFactory => {
76
+ const elementModuleRef = moduleFactory.create(this.injector);
77
+ let componentClass;
78
+ if (typeof elementModuleRef.instance.customElementComponent === 'object') {
79
+ componentClass = elementModuleRef.instance.customElementComponent[componentSelector];
80
+ if (!componentClass) {
81
+ // tslint:disable-next-line: no-string-throw
82
+ throw `You specified multiple component elements in module ${elementModuleRef} but there was no match for tag
83
+ ${componentSelector} in ${JSON.stringify(elementModuleRef.instance.customElementComponent)}.
84
+ Make sure the selector in the module is aligned with the one specified in the lazy module definition.`;
85
+ }
86
+ }
87
+ else {
88
+ componentClass = elementModuleRef.instance.customElementComponent;
89
+ }
90
+ // Register injector of the lazy module.
91
+ // This is needed to share the entryComponents between the lazy module and the application
92
+ const moduleInjector = elementModuleRef.injector;
93
+ this.receiveContext(componentClass, moduleInjector);
94
+ this.loadedComponents.set(componentSelector, componentClass);
95
+ this.elementsLoading.delete(componentSelector);
96
+ this.componentsToLoad.delete(componentSelector);
97
+ resolve({
98
+ selector: componentSelector,
99
+ componentClass
100
+ });
101
+ })
102
+ .catch(err => {
103
+ this.elementsLoading.delete(componentSelector);
104
+ return Promise.reject(err);
105
+ });
106
+ });
107
+ this.elementsLoading.set(componentSelector, loadPromise);
108
+ return loadPromise;
109
+ }
110
+ else if (this.loadedComponents.has(componentSelector)) {
111
+ // component already loaded
112
+ return new Promise(resolve => {
113
+ resolve({
114
+ selector: componentSelector,
115
+ componentClass: this.loadedComponents.get(componentSelector)
116
+ });
117
+ });
118
+ }
119
+ else {
120
+ throw new Error(`Unrecognized component "${componentSelector}". Make sure it is registered in the component registry`);
121
+ }
122
+ }
123
+ }
124
+ NgxElementService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementService, deps: [{ token: LAZY_CMPS_PATH_TOKEN }, { token: i0.Compiler }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
125
+ NgxElementService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementService, providedIn: 'root' });
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementService, decorators: [{
127
+ type: Injectable,
128
+ args: [{
129
+ providedIn: 'root'
130
+ }]
131
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
132
+ type: Inject,
133
+ args: [LAZY_CMPS_PATH_TOKEN]
134
+ }] }, { type: i0.Compiler }, { type: i0.Injector }]; } });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVsZW1lbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lbGVtZW50L3NyYy9saWIvbmd4LWVsZW1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQTRCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSxVQUFVLENBQUM7QUFFbEUsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFLeEMsTUFBTSxPQUFPLGlCQUFpQjtJQVE1QixZQUVFLFdBRUcsRUFDSyxRQUFrQixFQUNsQixRQUFrQjtRQURsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFacEIscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7UUFDaEQsb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBdUMsQ0FBQztRQUV6RSxjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFDM0MsOEJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQXVDLENBQUM7UUFVekUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBQ3BELFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUM7SUFDL0MsQ0FBQztJQUVELGNBQWMsQ0FBQyxTQUFvQixFQUFFLFFBQWtCO1FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztR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QkFBb0I7a0hBVG5CLGlCQUFpQixjQUZoQixNQUFNOzJGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVVJLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBOZ01vZHVsZUZhY3RvcnksIFR5cGUsIENvbXBpbGVyLCBJbmplY3RvciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMQVpZX0NNUFNfUEFUSF9UT0tFTiwgTGF6eUNvbXBvbmVudERlZiB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IExhenlDbXBMb2FkZWRFdmVudCB9IGZyb20gJy4vbGF6eS1jb21wb25lbnQtbG9hZGVkLWV2ZW50JztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20gfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTmd4RWxlbWVudFNlcnZpY2Uge1xuICBwcml2YXRlIGNvbXBvbmVudHNUb0xvYWQ6IE1hcDxzdHJpbmcsIExhenlDb21wb25lbnREZWY+O1xuICBwcml2YXRlIGxvYWRlZENvbXBvbmVudHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZTxhbnk+PigpO1xuICBwcml2YXRlIGVsZW1lbnRzTG9hZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPExhenlDbXBMb2FkZWRFdmVudD4+KCk7XG5cbiAgaW5qZWN0b3JzID0gbmV3IE1hcDxUeXBlPGFueT4sIEluamVjdG9yPigpO1xuICBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJzID0gbmV3IE1hcDxUeXBlPGFueT4sIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExBWllfQ01QU19QQVRIX1RPS0VOKVxuICAgIG1vZHVsZVBhdGhzOiB7XG4gICAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgfVtdLFxuICAgIHByaXZhdGUgY29tcGlsZXI6IENvbXBpbGVyLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge1xuICAgIGNvbnN0IEVMRU1FTlRfTU9EVUxFX1BBVEhTID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBtb2R1bGVQYXRocy5mb3JFYWNoKHJvdXRlID0+IHtcbiAgICAgIEVMRU1FTlRfTU9EVUxFX1BBVEhTLnNldChyb3V0ZS5zZWxlY3Rvciwgcm91dGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb21wb25lbnRzVG9Mb2FkID0gRUxFTUVOVF9NT0RVTEVfUEFUSFM7XG4gIH1cblxuICByZWNlaXZlQ29udGV4dChjb21wb25lbnQ6IFR5cGU8YW55PiwgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5pbmplY3RvcnMuc2V0KGNvbXBvbmVudCwgaW5qZWN0b3IpO1xuICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVycy5zZXQoY29tcG9uZW50LCBpbmplY3Rvci5nZXQoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSk7XG4gIH1cblxuICBnZXRJbmplY3Rvcihjb21wb25lbnQ6IFR5cGU8YW55Pik6IEluamVjdG9yIHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3RvcnMuZ2V0KGNvbXBvbmVudCk7XG4gIH1cblxuICBnZXRDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIoY29tcG9uZW50OiBUeXBlPGFueT4pOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcnMuZ2V0KGNvbXBvbmVudCk7XG4gIH1cblxuICBnZXRDb21wb25lbnRzVG9Mb2FkKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHNUb0xvYWQ7XG4gIH1cblxuICBnZXRDb21wb25lbnRUb0xvYWQoc2VsZWN0b3I6IHN0cmluZyk6IE9ic2VydmFibGU8TGF6eUNtcExvYWRlZEV2ZW50PiB7XG4gICAgLy8gUmV0dXJucyBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIHdoZW4gdGhlIGxhenkgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZC5cbiAgICBjb25zdCByZWdpc3RlcmVkID0gdGhpcy5sb2FkQ29tcG9uZW50KHNlbGVjdG9yKTtcbiAgICByZXR1cm4gZnJvbShyZWdpc3RlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gbGF6eSBsb2FkIGEgY29tcG9uZW50IGdpdmVuIGl0cyBzZWxlY3Rvci5cbiAgICogSWYgdGhlIGNvbXBvbmVudCBzZWxlY3RvciBoYXMgYmVlbiByZWdpc3RlcmVkLCBpdCdzIGFjY29yZGluZyBtb2R1bGVcbiAgICogd2lsbCBiZSBmZXRjaGVkIGxhemlseVxuICAgKiBAcGFyYW0gY29tcG9uZW50VGFnIHNlbGVjdG9yIG9mIHRoZSBjb21wb25lbnQgdG8gbG9hZFxuICAgKi9cbiAgbG9hZENvbXBvbmVudChjb21wb25lbnRTZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxMYXp5Q21wTG9hZGVkRXZlbnQ+IHtcbiAgICBpZiAodGhpcy5lbGVtZW50c0xvYWRpbmcuaGFzKGNvbXBvbmVudFNlbGVjdG9yKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNMb2FkaW5nLmdldChjb21wb25lbnRTZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcG9uZW50c1RvTG9hZC5oYXMoY29tcG9uZW50U2VsZWN0b3IpKSB7XG4gICAgICBjb25zdCBjbXBSZWdpc3RyeUVudHJ5ID0gdGhpcy5jb21wb25lbnRzVG9Mb2FkLmdldChjb21wb25lbnRTZWxlY3Rvcik7XG4gICAgICBjb25zdCBwYXRoID0gY21wUmVnaXN0cnlFbnRyeS5sb2FkQ2hpbGRyZW47XG5cbiAgICAgIGNvbnN0IGxvYWRQcm9taXNlID0gbmV3IFByb21pc2U8TGF6eUNtcExvYWRlZEV2ZW50PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIChwYXRoKCkgYXMgUHJvbWlzZTxOZ01vZHVsZUZhY3Rvcnk8YW55PiB8IFR5cGU8YW55Pj4pXG4gICAgICAgICAgLnRoZW4oZWxlbWVudE1vZHVsZU9yRmFjdG9yeSA9PiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdpdGggVmlldyBFbmdpbmUsIHRoZSBOZ01vZHVsZSBmYWN0b3J5IGlzIGNyZWF0ZWQgYW5kIHByb3ZpZGVkIHdoZW4gbG9hZGVkLlxuICAgICAgICAgICAgICogV2l0aCBJdnksIG9ubHkgdGhlIE5nTW9kdWxlIGNsYXNzIGlzIHByb3ZpZGVkIGxvYWRlZCBhbmQgbXVzdCBiZSBjb21waWxlZC5cbiAgICAgICAgICAgICAqIFRoaXMgdXNlcyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIGRlcHJlY2F0ZWQgYFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJgIGluXG4gICAgICAgICAgICAgKiBpbiBgcGFja2FnZXMvY29yZS9zcmMvbGlua2VyL3N5c3RlbV9qc19uZ19tb2R1bGVfZmFjdG9yeV9sb2FkZXIudHNgXG4gICAgICAgICAgICAgKiB0byBwYXNzIG9uIHRoZSBOZ01vZHVsZUZhY3RvcnksIG9yIGNvbXBpbGUgdGhlIE5nTW9kdWxlIGFuZCByZXR1cm4gaXRzIE5nTW9kdWxlRmFjdG9yeS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRNb2R1bGVPckZhY3RvcnkgaW5zdGFuY2VvZiBOZ01vZHVsZUZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRNb2R1bGVPckZhY3Rvcnk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyLmNvbXBpbGVNb2R1bGVBc3luYyhlbGVtZW50TW9kdWxlT3JGYWN0b3J5KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBlcnJvclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuXG4gICAgICAgICAgICAgICAgLy8gYnJlYWsgdGhlIHByb21pc2UgY2hhaW5cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKG1vZHVsZUZhY3RvcnkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50TW9kdWxlUmVmID0gbW9kdWxlRmFjdG9yeS5jcmVhdGUodGhpcy5pbmplY3Rvcik7XG4gICAgICAgICAgICAgIGxldCBjb21wb25lbnRDbGFzcztcblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRNb2R1bGVSZWYuaW5zdGFuY2UuY3VzdG9tRWxlbWVudENvbXBvbmVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcyA9IGVsZW1lbnRNb2R1bGVSZWYuaW5zdGFuY2UuY3VzdG9tRWxlbWVudENvbXBvbmVudFtjb21wb25lbnRTZWxlY3Rvcl07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXN0cmluZy10aHJvd1xuICAgICAgICAgICAgICAgICAgdGhyb3cgYFlvdSBzcGVjaWZpZWQgbXVsdGlwbGUgY29tcG9uZW50IGVsZW1lbnRzIGluIG1vZHVsZSAke2VsZW1lbnRNb2R1bGVSZWZ9IGJ1dCB0aGVyZSB3YXMgbm8gbWF0Y2ggZm9yIHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgJHtjb21wb25lbnRTZWxlY3Rvcn0gaW4gJHtKU09OLnN0cmluZ2lmeShlbGVtZW50TW9kdWxlUmVmLmluc3RhbmNlLmN1c3RvbUVsZW1lbnRDb21wb25lbnQpfS5cbiAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHN1cmUgdGhlIHNlbGVjdG9yIGluIHRoZSBtb2R1bGUgaXMgYWxpZ25lZCB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSBsYXp5IG1vZHVsZSBkZWZpbml0aW9uLmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzID0gZWxlbWVudE1vZHVsZVJlZi5pbnN0YW5jZS5jdXN0b21FbGVtZW50Q29tcG9uZW50O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgaW5qZWN0b3Igb2YgdGhlIGxhenkgbW9kdWxlLlxuICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzaGFyZSB0aGUgZW50cnlDb21wb25lbnRzIGJldHdlZW4gdGhlIGxhenkgbW9kdWxlIGFuZCB0aGUgYXBwbGljYXRpb25cbiAgICAgICAgICAgICAgY29uc3QgbW9kdWxlSW5qZWN0b3IgPSBlbGVtZW50TW9kdWxlUmVmLmluamVjdG9yO1xuICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVDb250ZXh0KGNvbXBvbmVudENsYXNzLCBtb2R1bGVJbmplY3Rvcik7XG5cbiAgICAgICAgICAgICAgdGhpcy5sb2FkZWRDb21wb25lbnRzLnNldChjb21wb25lbnRTZWxlY3RvciwgY29tcG9uZW50Q2xhc3MpO1xuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzTG9hZGluZy5kZWxldGUoY29tcG9uZW50U2VsZWN0b3IpO1xuICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNUb0xvYWQuZGVsZXRlKGNvbXBvbmVudFNlbGVjdG9yKTtcblxuICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogY29tcG9uZW50U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3NcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHNMb2FkaW5nLmRlbGV0ZShjb21wb25lbnRTZWxlY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmVsZW1lbnRzTG9hZGluZy5zZXQoY29tcG9uZW50U2VsZWN0b3IsIGxvYWRQcm9taXNlKTtcbiAgICAgIHJldHVybiBsb2FkUHJvbWlzZTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5sb2FkZWRDb21wb25lbnRzLmhhcyhjb21wb25lbnRTZWxlY3RvcikpIHtcbiAgICAgIC8vIGNvbXBvbmVudCBhbHJlYWR5IGxvYWRlZFxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBzZWxlY3RvcjogY29tcG9uZW50U2VsZWN0b3IsXG4gICAgICAgICAgY29tcG9uZW50Q2xhc3M6IHRoaXMubG9hZGVkQ29tcG9uZW50cy5nZXQoY29tcG9uZW50U2VsZWN0b3IpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVucmVjb2duaXplZCBjb21wb25lbnQgXCIke2NvbXBvbmVudFNlbGVjdG9yfVwiLiBNYWtlIHN1cmUgaXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgY29tcG9uZW50IHJlZ2lzdHJ5YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemRpZ2FtYmFyLW5neC1lbGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVsZW1lbnQvc3JjL3pkaWdhbWJhci1uZ3gtZWxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,281 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, ComponentFactoryResolver, NgModuleFactory, Injectable, Inject, ReflectiveInjector, ViewContainerRef, Component, Input, ViewChild, NgModule } from '@angular/core';
3
+ import { createCustomElement } from '@angular/elements';
4
+ import { from, merge } from 'rxjs';
5
+ import { map } from 'rxjs/operators';
6
+
7
+ /* Injection token to provide the element path modules. */
8
+ const LAZY_CMPS_PATH_TOKEN = new InjectionToken('ngx-lazy-cmp-registry');
9
+
10
+ class NgxElementService {
11
+ constructor(modulePaths, compiler, injector) {
12
+ this.compiler = compiler;
13
+ this.injector = injector;
14
+ this.loadedComponents = new Map();
15
+ this.elementsLoading = new Map();
16
+ this.injectors = new Map();
17
+ this.componentFactoryResolvers = new Map();
18
+ const ELEMENT_MODULE_PATHS = new Map();
19
+ modulePaths.forEach(route => {
20
+ ELEMENT_MODULE_PATHS.set(route.selector, route);
21
+ });
22
+ this.componentsToLoad = ELEMENT_MODULE_PATHS;
23
+ }
24
+ receiveContext(component, injector) {
25
+ this.injectors.set(component, injector);
26
+ this.componentFactoryResolvers.set(component, injector.get(ComponentFactoryResolver));
27
+ }
28
+ getInjector(component) {
29
+ return this.injectors.get(component);
30
+ }
31
+ getComponentFactoryResolver(component) {
32
+ return this.componentFactoryResolvers.get(component);
33
+ }
34
+ getComponentsToLoad() {
35
+ return this.componentsToLoad;
36
+ }
37
+ getComponentToLoad(selector) {
38
+ // Returns observable that completes when the lazy module has been loaded.
39
+ const registered = this.loadComponent(selector);
40
+ return from(registered);
41
+ }
42
+ /**
43
+ * Allows to lazy load a component given its selector.
44
+ * If the component selector has been registered, it's according module
45
+ * will be fetched lazily
46
+ * @param componentTag selector of the component to load
47
+ */
48
+ loadComponent(componentSelector) {
49
+ if (this.elementsLoading.has(componentSelector)) {
50
+ return this.elementsLoading.get(componentSelector);
51
+ }
52
+ if (this.componentsToLoad.has(componentSelector)) {
53
+ const cmpRegistryEntry = this.componentsToLoad.get(componentSelector);
54
+ const path = cmpRegistryEntry.loadChildren;
55
+ const loadPromise = new Promise((resolve, reject) => {
56
+ path()
57
+ .then(elementModuleOrFactory => {
58
+ /**
59
+ * With View Engine, the NgModule factory is created and provided when loaded.
60
+ * With Ivy, only the NgModule class is provided loaded and must be compiled.
61
+ * This uses the same mechanism as the deprecated `SystemJsNgModuleLoader` in
62
+ * in `packages/core/src/linker/system_js_ng_module_factory_loader.ts`
63
+ * to pass on the NgModuleFactory, or compile the NgModule and return its NgModuleFactory.
64
+ */
65
+ if (elementModuleOrFactory instanceof NgModuleFactory) {
66
+ return elementModuleOrFactory;
67
+ }
68
+ else {
69
+ try {
70
+ return this.compiler.compileModuleAsync(elementModuleOrFactory);
71
+ }
72
+ catch (err) {
73
+ // return the error
74
+ reject(err);
75
+ // break the promise chain
76
+ throw err;
77
+ }
78
+ }
79
+ })
80
+ .then(moduleFactory => {
81
+ const elementModuleRef = moduleFactory.create(this.injector);
82
+ let componentClass;
83
+ if (typeof elementModuleRef.instance.customElementComponent === 'object') {
84
+ componentClass = elementModuleRef.instance.customElementComponent[componentSelector];
85
+ if (!componentClass) {
86
+ // tslint:disable-next-line: no-string-throw
87
+ throw `You specified multiple component elements in module ${elementModuleRef} but there was no match for tag
88
+ ${componentSelector} in ${JSON.stringify(elementModuleRef.instance.customElementComponent)}.
89
+ Make sure the selector in the module is aligned with the one specified in the lazy module definition.`;
90
+ }
91
+ }
92
+ else {
93
+ componentClass = elementModuleRef.instance.customElementComponent;
94
+ }
95
+ // Register injector of the lazy module.
96
+ // This is needed to share the entryComponents between the lazy module and the application
97
+ const moduleInjector = elementModuleRef.injector;
98
+ this.receiveContext(componentClass, moduleInjector);
99
+ this.loadedComponents.set(componentSelector, componentClass);
100
+ this.elementsLoading.delete(componentSelector);
101
+ this.componentsToLoad.delete(componentSelector);
102
+ resolve({
103
+ selector: componentSelector,
104
+ componentClass
105
+ });
106
+ })
107
+ .catch(err => {
108
+ this.elementsLoading.delete(componentSelector);
109
+ return Promise.reject(err);
110
+ });
111
+ });
112
+ this.elementsLoading.set(componentSelector, loadPromise);
113
+ return loadPromise;
114
+ }
115
+ else if (this.loadedComponents.has(componentSelector)) {
116
+ // component already loaded
117
+ return new Promise(resolve => {
118
+ resolve({
119
+ selector: componentSelector,
120
+ componentClass: this.loadedComponents.get(componentSelector)
121
+ });
122
+ });
123
+ }
124
+ else {
125
+ throw new Error(`Unrecognized component "${componentSelector}". Make sure it is registered in the component registry`);
126
+ }
127
+ }
128
+ }
129
+ NgxElementService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementService, deps: [{ token: LAZY_CMPS_PATH_TOKEN }, { token: i0.Compiler }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
130
+ NgxElementService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementService, providedIn: 'root' });
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementService, decorators: [{
132
+ type: Injectable,
133
+ args: [{
134
+ providedIn: 'root'
135
+ }]
136
+ }], ctorParameters: function () {
137
+ return [{ type: undefined, decorators: [{
138
+ type: Inject,
139
+ args: [LAZY_CMPS_PATH_TOKEN]
140
+ }] }, { type: i0.Compiler }, { type: i0.Injector }];
141
+ } });
142
+
143
+ class NgxElementComponent {
144
+ constructor(ngxElementService, elementRef) {
145
+ this.ngxElementService = ngxElementService;
146
+ this.elementRef = elementRef;
147
+ }
148
+ /**
149
+ * Subscribe to event emitters of a lazy loaded and dynamically instantiated Angular component
150
+ * and dispatch them as Custom Events on the NgxElementComponent that is used in a template.
151
+ */
152
+ setProxiedOutputs(factory) {
153
+ const eventEmitters = factory.outputs.map(({ propName, templateName }) => {
154
+ const emitter = this.componentRef.instance[propName];
155
+ return emitter.pipe(map((value) => ({ name: templateName, value })));
156
+ });
157
+ const outputEvents = merge(...eventEmitters);
158
+ this.ngElementEventsSubscription = outputEvents.subscribe(subscription => {
159
+ const customEvent = document.createEvent('CustomEvent');
160
+ customEvent.initCustomEvent(subscription.name, false, false, subscription.value);
161
+ this.elementRef.nativeElement.dispatchEvent(customEvent);
162
+ });
163
+ }
164
+ ngOnInit() {
165
+ this.ngxElementService.getComponentToLoad(this.selector).subscribe(event => {
166
+ this.componentToLoad = event.componentClass;
167
+ this.componentFactoryResolver = this.ngxElementService.getComponentFactoryResolver(this.componentToLoad);
168
+ this.injector = this.ngxElementService.getInjector(this.componentToLoad);
169
+ const attributes = this.getElementAttributes();
170
+ this.createComponent(attributes);
171
+ });
172
+ }
173
+ createComponent(attributes) {
174
+ this.container.clear();
175
+ const factory = this.componentFactoryResolver.resolveComponentFactory(this.componentToLoad);
176
+ this.refInjector = ReflectiveInjector.resolveAndCreate([{ provide: this.componentToLoad, useValue: this.componentToLoad }], this.injector);
177
+ this.componentRef = this.container.createComponent(factory, 0, this.refInjector);
178
+ this.setAttributes(attributes);
179
+ this.listenToAttributeChanges();
180
+ this.setProxiedOutputs(factory);
181
+ }
182
+ setAttributes(attributes) {
183
+ attributes.forEach(attr => {
184
+ this.componentRef.instance[attr.name] = attr.value;
185
+ });
186
+ }
187
+ getElementAttributes() {
188
+ const attrs = this.elementRef.nativeElement.attributes;
189
+ const attributes = [];
190
+ for (let attr, i = 0; i < attrs.length; i++) {
191
+ attr = attrs[i];
192
+ if (attr.nodeName.match('^data-')) {
193
+ attributes.push({
194
+ name: this.camelCaseAttribute(attr.nodeName),
195
+ value: attr.nodeValue
196
+ });
197
+ }
198
+ }
199
+ return attributes;
200
+ }
201
+ camelCaseAttribute(attribute) {
202
+ const attr = attribute.replace('data-', '');
203
+ const chunks = attr.split('-');
204
+ if (chunks.length > 1) {
205
+ return chunks[0] + chunks.slice(1).map(chunk => chunk.replace(/^\w/, c => c.toUpperCase())).join('');
206
+ }
207
+ return attr;
208
+ }
209
+ listenToAttributeChanges() {
210
+ const observer = new MutationObserver(mutations => {
211
+ mutations.forEach(mutation => {
212
+ if (mutation.type === 'attributes') {
213
+ const attributes = this.getElementAttributes();
214
+ this.setAttributes(attributes);
215
+ }
216
+ });
217
+ });
218
+ observer.observe(this.elementRef.nativeElement, {
219
+ attributes: true
220
+ });
221
+ }
222
+ ngOnDestroy() {
223
+ this.componentRef.destroy();
224
+ this.ngElementEventsSubscription.unsubscribe();
225
+ }
226
+ }
227
+ NgxElementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementComponent, deps: [{ token: NgxElementService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
228
+ NgxElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NgxElementComponent, selector: "lib-ngx-element", inputs: { selector: "selector" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
229
+ <ng-template #container></ng-template>
230
+ `, isInline: true });
231
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementComponent, decorators: [{
232
+ type: Component,
233
+ args: [{ selector: 'lib-ngx-element', template: `
234
+ <ng-template #container></ng-template>
235
+ ` }]
236
+ }], ctorParameters: function () { return [{ type: NgxElementService }, { type: i0.ElementRef }]; }, propDecorators: { selector: [{
237
+ type: Input
238
+ }], container: [{
239
+ type: ViewChild,
240
+ args: ['container', { read: ViewContainerRef }]
241
+ }] } });
242
+
243
+ class NgxElementModule {
244
+ constructor(injector) {
245
+ this.injector = injector;
246
+ const ngxElement = createCustomElement(NgxElementComponent, { injector });
247
+ customElements.define('ngx-element', ngxElement);
248
+ }
249
+ static forRoot(modulePaths) {
250
+ return {
251
+ ngModule: NgxElementModule,
252
+ providers: [
253
+ {
254
+ provide: LAZY_CMPS_PATH_TOKEN,
255
+ useValue: modulePaths
256
+ }
257
+ ]
258
+ };
259
+ }
260
+ ngDoBootstrap() { }
261
+ }
262
+ NgxElementModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule });
263
+ NgxElementModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule, declarations: [NgxElementComponent] });
264
+ NgxElementModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule });
265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgxElementModule, decorators: [{
266
+ type: NgModule,
267
+ args: [{
268
+ declarations: [NgxElementComponent]
269
+ }]
270
+ }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
271
+
272
+ /*
273
+ * Public API Surface of ngx-element
274
+ */
275
+
276
+ /**
277
+ * Generated bundle index. Do not edit.
278
+ */
279
+
280
+ export { NgxElementModule };
281
+ //# sourceMappingURL=zdigambar-ngx-element.mjs.map