@decaf-ts/for-angular 0.0.3 → 0.0.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.
- package/LICENSE.md +659 -21
- package/README.md +37 -242
- package/dist/lib/README.md +92 -0
- package/dist/lib/assets/i18n/en.json +131 -0
- package/dist/lib/assets/images/angular-logo.svg +45 -0
- package/dist/lib/assets/images/decaf-logo-black.svg +22 -0
- package/dist/lib/assets/images/decaf-logo-lw.svg +50 -0
- package/dist/lib/assets/images/decaf-logo-white.svg +22 -0
- package/dist/lib/assets/images/decaf-logo.svg +54 -0
- package/dist/lib/components/component-renderer/component-renderer.component.d.ts +267 -0
- package/dist/lib/components/crud-field/crud-field.component.d.ts +447 -0
- package/dist/lib/components/crud-form/crud-form.component.d.ts +102 -0
- package/dist/lib/components/model-renderer/model-renderer.component.d.ts +97 -0
- package/dist/lib/engine/DynamicModule.d.ts +17 -0
- package/dist/{for-angular → lib}/engine/NgxCrudFormField.d.ts +37 -30
- package/dist/lib/engine/NgxFormService.d.ts +167 -0
- package/dist/lib/engine/NgxRenderingEngine.d.ts +128 -0
- package/dist/lib/engine/NgxRenderingEngine2.d.ts +251 -0
- package/dist/lib/engine/ValidatorFactory.d.ts +15 -0
- package/dist/lib/engine/constants.d.ts +151 -0
- package/dist/lib/engine/decorators.d.ts +25 -0
- package/dist/lib/engine/index.d.ts +15 -0
- package/dist/lib/engine/types.d.ts +293 -0
- package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +309 -0
- package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +288 -0
- package/dist/lib/esm2022/components/crud-form/constants.mjs +14 -0
- package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +140 -0
- package/dist/lib/esm2022/components/crud-form/types.mjs +2 -0
- package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +137 -0
- package/dist/lib/esm2022/engine/DynamicModule.mjs +18 -0
- package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +117 -0
- package/dist/lib/esm2022/engine/NgxFormService.mjs +315 -0
- package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +194 -0
- package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +333 -0
- package/dist/lib/esm2022/engine/ValidatorFactory.mjs +102 -0
- package/dist/lib/esm2022/engine/constants.mjs +160 -0
- package/dist/lib/esm2022/engine/decorators.mjs +38 -0
- package/dist/lib/esm2022/engine/index.mjs +16 -0
- package/dist/lib/esm2022/engine/types.mjs +2 -0
- package/dist/lib/esm2022/for-angular.module.mjs +118 -0
- package/dist/lib/esm2022/interfaces.mjs +2 -0
- package/dist/lib/esm2022/public-apis.mjs +13 -0
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs +2138 -0
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
- package/dist/lib/for-angular.module.d.ts +44 -0
- package/dist/lib/interfaces.d.ts +28 -0
- package/dist/lib/public-apis.d.ts +12 -0
- package/package.json +74 -25
- package/dist/for-angular/README.md +0 -297
- package/dist/for-angular/assets/i18n/en.json +0 -21
- package/dist/for-angular/components/decaf-crud-field/decaf-crud-field.component.d.ts +0 -22
- package/dist/for-angular/components/decaf-crud-form/decaf-crud-form.component.d.ts +0 -28
- package/dist/for-angular/components/decaf-model-renderer/decaf-model-renderer.component.d.ts +0 -20
- package/dist/for-angular/directives/decaf-field.directive.d.ts +0 -8
- package/dist/for-angular/engine/DynamicModule.d.ts +0 -2
- package/dist/for-angular/engine/NgxFormService.d.ts +0 -119
- package/dist/for-angular/engine/NgxRenderingEngine.d.ts +0 -17
- package/dist/for-angular/engine/ValidatorFactory.d.ts +0 -4
- package/dist/for-angular/engine/constants.d.ts +0 -10
- package/dist/for-angular/engine/decorators.d.ts +0 -1
- package/dist/for-angular/engine/index.d.ts +0 -5
- package/dist/for-angular/engine/types.d.ts +0 -32
- package/dist/for-angular/esm2022/components/decaf-crud-field/decaf-crud-field.component.mjs +0 -66
- package/dist/for-angular/esm2022/components/decaf-crud-form/constants.mjs +0 -14
- package/dist/for-angular/esm2022/components/decaf-crud-form/decaf-crud-form.component.mjs +0 -84
- package/dist/for-angular/esm2022/components/decaf-crud-form/types.mjs +0 -2
- package/dist/for-angular/esm2022/components/decaf-model-renderer/decaf-model-renderer.component.mjs +0 -46
- package/dist/for-angular/esm2022/directives/decaf-field.directive.mjs +0 -23
- package/dist/for-angular/esm2022/engine/DynamicModule.mjs +0 -3
- package/dist/for-angular/esm2022/engine/NgxCrudFormField.mjs +0 -118
- package/dist/for-angular/esm2022/engine/NgxFormService.mjs +0 -232
- package/dist/for-angular/esm2022/engine/NgxRenderingEngine.mjs +0 -35
- package/dist/for-angular/esm2022/engine/ValidatorFactory.mjs +0 -48
- package/dist/for-angular/esm2022/engine/constants.mjs +0 -12
- package/dist/for-angular/esm2022/engine/decorators.mjs +0 -17
- package/dist/for-angular/esm2022/engine/index.mjs +0 -6
- package/dist/for-angular/esm2022/engine/types.mjs +0 -2
- package/dist/for-angular/esm2022/interfaces.mjs +0 -2
- package/dist/for-angular/esm2022/public-apis.mjs +0 -5
- package/dist/for-angular/fesm2022/decaf-ts-for-angular.mjs +0 -675
- package/dist/for-angular/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
- package/dist/for-angular/interfaces.d.ts +0 -8
- package/dist/for-angular/public-apis.d.ts +0 -4
- /package/dist/{for-angular/components/decaf-crud-form → lib/components/crud-form}/constants.d.ts +0 -0
- /package/dist/{for-angular/components/decaf-crud-form → lib/components/crud-form}/types.d.ts +0 -0
- /package/dist/{for-angular → lib}/esm2022/decaf-ts-for-angular.mjs +0 -0
- /package/dist/{for-angular → lib}/index.d.ts +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Component, EventEmitter, Injector, Input, Output, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
+
import { Model, sf } from '@decaf-ts/decorator-validation';
|
|
3
|
+
import { NgComponentOutlet } from '@angular/common';
|
|
4
|
+
import { AngularEngineKeys, BaseComponentProps, NgxRenderingEngine2, } from '../../engine';
|
|
5
|
+
import { ForAngularModule } from 'src/lib/for-angular.module';
|
|
6
|
+
import { ComponentRendererComponent } from '../component-renderer/component-renderer.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
/**
|
|
10
|
+
* @description Component for rendering dynamic models
|
|
11
|
+
* @summary This component is responsible for dynamically rendering models,
|
|
12
|
+
* handling model changes, and managing event subscriptions for the rendered components.
|
|
13
|
+
* It uses the NgxRenderingEngine2 to render the models and supports both string and Model inputs.
|
|
14
|
+
* @class
|
|
15
|
+
* @template M - Type extending Model
|
|
16
|
+
* @param {Injector} injector - Angular Injector for dependency injection
|
|
17
|
+
* @example
|
|
18
|
+
* <ngx-decaf-model-renderer
|
|
19
|
+
* [model]="myModel"
|
|
20
|
+
* [globals]="globalVariables"
|
|
21
|
+
* (listenEvent)="handleEvent($event)">
|
|
22
|
+
* </ngx-decaf-model-renderer>
|
|
23
|
+
* @mermaid
|
|
24
|
+
* sequenceDiagram
|
|
25
|
+
* participant App
|
|
26
|
+
* participant ModelRenderer
|
|
27
|
+
* participant RenderingEngine
|
|
28
|
+
* participant Model
|
|
29
|
+
* App->>ModelRenderer: Input model
|
|
30
|
+
* ModelRenderer->>Model: Parse if string
|
|
31
|
+
* Model-->>ModelRenderer: Parsed model
|
|
32
|
+
* ModelRenderer->>RenderingEngine: Render model
|
|
33
|
+
* RenderingEngine-->>ModelRenderer: Rendered output
|
|
34
|
+
* ModelRenderer->>ModelRenderer: Subscribe to events
|
|
35
|
+
* ModelRenderer-->>App: Emit events
|
|
36
|
+
*/
|
|
37
|
+
export class ModelRendererComponent {
|
|
38
|
+
constructor(injector) {
|
|
39
|
+
this.injector = injector;
|
|
40
|
+
/**
|
|
41
|
+
* @description Global variables to be passed to the rendered component
|
|
42
|
+
*/
|
|
43
|
+
this.globals = {};
|
|
44
|
+
/**
|
|
45
|
+
* @description Event emitter for custom events from the rendered component
|
|
46
|
+
*/
|
|
47
|
+
this.listenEvent = new EventEmitter();
|
|
48
|
+
this.JSON = JSON;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @description Refreshes the rendered model
|
|
52
|
+
* @param {string | M} model - The model to be rendered
|
|
53
|
+
*/
|
|
54
|
+
refresh(model) {
|
|
55
|
+
model =
|
|
56
|
+
typeof model === 'string'
|
|
57
|
+
? Model.build({}, JSON.parse(model))
|
|
58
|
+
: model;
|
|
59
|
+
this.output = model.render(this.globals || {}, this.vcr, this.injector, this.inner);
|
|
60
|
+
if (this.output?.inputs)
|
|
61
|
+
this.rendererId = sf(AngularEngineKeys.RENDERED_ID, this.output.inputs['rendererId']);
|
|
62
|
+
this.instance = this.output?.instance;
|
|
63
|
+
this.subscribeEvents();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @description Lifecycle hook that is called when data-bound properties of a directive change
|
|
67
|
+
* @param {SimpleChanges} changes - Object containing changes
|
|
68
|
+
*/
|
|
69
|
+
ngOnChanges(changes) {
|
|
70
|
+
if (changes[BaseComponentProps.MODEL]) {
|
|
71
|
+
const { currentValue, previousValue, firstChange } = changes[BaseComponentProps.MODEL];
|
|
72
|
+
this.refresh(currentValue);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* @description Lifecycle hook that is called when a directive, pipe, or service is destroyed
|
|
77
|
+
* @return {Promise<void>}
|
|
78
|
+
*/
|
|
79
|
+
async ngOnDestroy() {
|
|
80
|
+
if (this.instance) {
|
|
81
|
+
this.unsubscribeEvents();
|
|
82
|
+
await NgxRenderingEngine2.destroy();
|
|
83
|
+
}
|
|
84
|
+
this.output = undefined;
|
|
85
|
+
}
|
|
86
|
+
subscribeEvents() {
|
|
87
|
+
if (this.instance) {
|
|
88
|
+
const componentKeys = Object.keys(this.instance);
|
|
89
|
+
for (const key of componentKeys) {
|
|
90
|
+
const value = this.instance[key];
|
|
91
|
+
if (value instanceof EventEmitter)
|
|
92
|
+
this.instance[key].subscribe((event) => {
|
|
93
|
+
this.listenEvent.emit({
|
|
94
|
+
component: this.output?.component.name || '',
|
|
95
|
+
name: key,
|
|
96
|
+
...event,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @description Unsubscribes from events emitted by the rendered component
|
|
104
|
+
*/
|
|
105
|
+
unsubscribeEvents() {
|
|
106
|
+
if (this.instance) {
|
|
107
|
+
const componentKeys = Object.keys(this.instance);
|
|
108
|
+
for (const key of componentKeys) {
|
|
109
|
+
const value = this.instance[key];
|
|
110
|
+
if (value instanceof EventEmitter)
|
|
111
|
+
this.instance[key].unsubscribe();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModelRendererComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
116
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ModelRendererComponent, isStandalone: true, selector: "ngx-decaf-model-renderer", inputs: { model: "model", globals: "globals", rendererId: "rendererId" }, outputs: { listenEvent: "listenEvent" }, viewQueries: [{ propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }, { propertyName: "vcr", first: true, predicate: ["componentOuter"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: " <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "parent"], outputs: ["listenEvent"] }] }); }
|
|
117
|
+
}
|
|
118
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ModelRendererComponent, decorators: [{
|
|
119
|
+
type: Component,
|
|
120
|
+
args: [{ standalone: true, imports: [ForAngularModule, NgComponentOutlet, ComponentRendererComponent], selector: 'ngx-decaf-model-renderer', template: " <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n" }]
|
|
121
|
+
}], ctorParameters: () => [{ type: i0.Injector }], propDecorators: { model: [{
|
|
122
|
+
type: Input,
|
|
123
|
+
args: [{ required: true }]
|
|
124
|
+
}], globals: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], inner: [{
|
|
127
|
+
type: ViewChild,
|
|
128
|
+
args: ['inner', { read: TemplateRef, static: true }]
|
|
129
|
+
}], rendererId: [{
|
|
130
|
+
type: Input
|
|
131
|
+
}], vcr: [{
|
|
132
|
+
type: ViewChild,
|
|
133
|
+
args: ['componentOuter', { static: true, read: ViewContainerRef }]
|
|
134
|
+
}], listenEvent: [{
|
|
135
|
+
type: Output
|
|
136
|
+
}] } });
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBRWxCLG1CQUFtQixHQUVwQixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7O0FBRWhHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFRSCxNQUFNLE9BQU8sc0JBQXNCO0lBdURqQyxZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBN0N0Qzs7V0FFRztRQUVILFlBQU8sR0FBNEIsRUFBRSxDQUFDO1FBeUJ0Qzs7V0FFRztRQUVILGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUE0RnRDLFNBQUksR0FBRyxJQUFJLENBQUM7SUFoRlUsQ0FBQztJQUUxQzs7O09BR0c7SUFDSyxPQUFPLENBQUMsS0FBaUI7UUFDL0IsS0FBSztZQUNILE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3ZCLENBQUMsQ0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFPO2dCQUMzQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ1osSUFBSSxDQUFDLE1BQU0sR0FBSSxLQUErQixDQUFDLE1BQU0sQ0FDbkQsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQ1IsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTTtZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FDbEIsaUJBQWlCLENBQUMsV0FBVyxFQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQThCLENBQUMsWUFBWSxDQUFXLENBQ3BFLENBQUM7UUFDSixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksS0FBSyxZQUFZLFlBQVk7b0JBQzlCLElBQUksQ0FBQyxRQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQStCLEVBQUUsRUFBRTt3QkFDN0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7NEJBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksRUFBRTs0QkFDNUMsSUFBSSxFQUFFLEdBQUc7NEJBQ1QsR0FBRyxLQUFLO3lCQUNpQixDQUFDLENBQUM7b0JBQy9CLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakMsSUFBSSxLQUFLLFlBQVksWUFBWTtvQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7K0dBcklVLHNCQUFzQjttR0FBdEIsc0JBQXNCLGtSQW1CTCxXQUFXLDhHQWlCWSxnQkFBZ0IsZ0VDbkdyRSxnbUJBb0JBLHlERHNDWSxnQkFBZ0IsdVNBQXFCLDBCQUEwQjs7NEZBSzlELHNCQUFzQjtrQkFQbEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQyxZQUNoRSwwQkFBMEI7NkVBWXBDLEtBQUs7c0JBREosS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBT3pCLE9BQU87c0JBRE4sS0FBSztnQkFPTixLQUFLO3NCQURKLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVl2RCxVQUFVO3NCQURULEtBQUs7Z0JBT04sR0FBRztzQkFERixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBT3JFLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kZWwsIHNmIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFuZ3VsYXJEeW5hbWljT3V0cHV0LFxuICBBbmd1bGFyRW5naW5lS2V5cyxcbiAgQmFzZUNvbXBvbmVudFByb3BzLFxuICBCYXNlQ3VzdG9tRXZlbnQsXG4gIE5neFJlbmRlcmluZ0VuZ2luZTIsXG4gIFJlbmRlcmVkTW9kZWwsXG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgTW9kZWxSZW5kZXJDdXN0b21FdmVudCB9IGZyb20gJ3NyYy9saWIvZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICdzcmMvbGliL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5pbXBvcnQgeyBSZW5kZXJhYmxlIH0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBmb3IgcmVuZGVyaW5nIGR5bmFtaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3IgZHluYW1pY2FsbHkgcmVuZGVyaW5nIG1vZGVscyxcbiAqIGhhbmRsaW5nIG1vZGVsIGNoYW5nZXMsIGFuZCBtYW5hZ2luZyBldmVudCBzdWJzY3JpcHRpb25zIGZvciB0aGUgcmVuZGVyZWQgY29tcG9uZW50cy5cbiAqIEl0IHVzZXMgdGhlIE5neFJlbmRlcmluZ0VuZ2luZTIgdG8gcmVuZGVyIHRoZSBtb2RlbHMgYW5kIHN1cHBvcnRzIGJvdGggc3RyaW5nIGFuZCBNb2RlbCBpbnB1dHMuXG4gKiBAY2xhc3NcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7SW5qZWN0b3J9IGluamVjdG9yIC0gQW5ndWxhciBJbmplY3RvciBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb25cbiAqIEBleGFtcGxlXG4gKiA8bmd4LWRlY2FmLW1vZGVsLXJlbmRlcmVyXG4gKiAgIFttb2RlbF09XCJteU1vZGVsXCJcbiAqICAgW2dsb2JhbHNdPVwiZ2xvYmFsVmFyaWFibGVzXCJcbiAqICAgKGxpc3RlbkV2ZW50KT1cImhhbmRsZUV2ZW50KCRldmVudClcIj5cbiAqIDwvbmd4LWRlY2FmLW1vZGVsLXJlbmRlcmVyPlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgTW9kZWxSZW5kZXJlclxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgQXBwLT4+TW9kZWxSZW5kZXJlcjogSW5wdXQgbW9kZWxcbiAqICAgTW9kZWxSZW5kZXJlci0+Pk1vZGVsOiBQYXJzZSBpZiBzdHJpbmdcbiAqICAgTW9kZWwtLT4+TW9kZWxSZW5kZXJlcjogUGFyc2VkIG1vZGVsXG4gKiAgIE1vZGVsUmVuZGVyZXItPj5SZW5kZXJpbmdFbmdpbmU6IFJlbmRlciBtb2RlbFxuICogICBSZW5kZXJpbmdFbmdpbmUtLT4+TW9kZWxSZW5kZXJlcjogUmVuZGVyZWQgb3V0cHV0XG4gKiAgIE1vZGVsUmVuZGVyZXItPj5Nb2RlbFJlbmRlcmVyOiBTdWJzY3JpYmUgdG8gZXZlbnRzXG4gKiAgIE1vZGVsUmVuZGVyZXItLT4+QXBwOiBFbWl0IGV2ZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0ZvckFuZ3VsYXJNb2R1bGUsIE5nQ29tcG9uZW50T3V0bGV0LCBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudF0sXG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLW1vZGVsLXJlbmRlcmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgTW9kZWxSZW5kZXJlckNvbXBvbmVudDxNIGV4dGVuZHMgTW9kZWw+XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFJlbmRlcmVkTW9kZWwge1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5wdXQgbW9kZWwgdG8gYmUgcmVuZGVyZWRcbiAgICogQHN1bW1hcnkgQ2FuIGJlIGEgTW9kZWwgaW5zdGFuY2Ugb3IgYSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1vZGVsXG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBtb2RlbCE6IE0gfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHbG9iYWwgdmFyaWFibGVzIHRvIGJlIHBhc3NlZCB0byB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBnbG9iYWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGVtcGxhdGUgcmVmZXJlbmNlIGZvciBpbm5lciBjb250ZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdpbm5lcicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBpbm5lcj86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPdXRwdXQgb2YgdGhlIHJlbmRlcmVkIG1vZGVsXG4gICAqL1xuICBvdXRwdXQ/OiBBbmd1bGFyRHluYW1pY091dHB1dDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVuZGVyZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJlbmRlcmVySWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWaWV3IGNvbnRhaW5lciByZWZlcmVuY2UgZm9yIGR5bmFtaWMgY29tcG9uZW50IHJlbmRlcmluZ1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50T3V0ZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICB2Y3IhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgY3VzdG9tIGV2ZW50cyBmcm9tIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBsaXN0ZW5FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8TW9kZWxSZW5kZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluc3RhbmNlIG9mIHRoZSBOZ3hSZW5kZXJpbmdFbmdpbmUyXG4gICAqL1xuICBwcml2YXRlIHJlbmRlciE6IE5neFJlbmRlcmluZ0VuZ2luZTI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnN0YW5jZSBvZiB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGluc3RhbmNlITogS2V5VmFsdWUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgdGhlIHJlbmRlcmVkIG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgTX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWRcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaChtb2RlbDogc3RyaW5nIHwgTSkge1xuICAgIG1vZGVsID1cbiAgICAgIHR5cGVvZiBtb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyAoTW9kZWwuYnVpbGQoe30sIEpTT04ucGFyc2UobW9kZWwpKSBhcyBNKVxuICAgICAgICA6IG1vZGVsO1xuICAgIHRoaXMub3V0cHV0ID0gKG1vZGVsIGFzIHVua25vd24gYXMgUmVuZGVyYWJsZSkucmVuZGVyPEFuZ3VsYXJEeW5hbWljT3V0cHV0PihcbiAgICAgIHRoaXMuZ2xvYmFscyB8fCB7fSxcbiAgICAgIHRoaXMudmNyLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgIHRoaXMuaW5uZXIsXG4gICAgKTtcbiAgICBpZiAodGhpcy5vdXRwdXQ/LmlucHV0cylcbiAgICAgIHRoaXMucmVuZGVyZXJJZCA9IHNmKFxuICAgICAgICBBbmd1bGFyRW5naW5lS2V5cy5SRU5ERVJFRF9JRCxcbiAgICAgICAgKHRoaXMub3V0cHV0LmlucHV0cyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVsncmVuZGVyZXJJZCddIGFzIHN0cmluZyxcbiAgICAgICk7XG4gICAgdGhpcy5pbnN0YW5jZSA9IHRoaXMub3V0cHV0Py5pbnN0YW5jZTtcbiAgICB0aGlzLnN1YnNjcmliZUV2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGRhdGEtYm91bmQgcHJvcGVydGllcyBvZiBhIGRpcmVjdGl2ZSBjaGFuZ2VcbiAgICogQHBhcmFtIHtTaW1wbGVDaGFuZ2VzfSBjaGFuZ2VzIC0gT2JqZWN0IGNvbnRhaW5pbmcgY2hhbmdlc1xuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBmaXJzdENoYW5nZSB9ID0gY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdO1xuICAgICAgdGhpcy5yZWZyZXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGlzIGRlc3Ryb3llZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgbmdPbkRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgIGF3YWl0IE5neFJlbmRlcmluZ0VuZ2luZTIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnN0YW5jZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpXG4gICAgICAgICAgKHRoaXMuaW5zdGFuY2UgYXMgS2V5VmFsdWUpW2tleV0uc3Vic2NyaWJlKChldmVudDogUGFydGlhbDxCYXNlQ3VzdG9tRXZlbnQ+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMub3V0cHV0Py5jb21wb25lbnQubmFtZSB8fCAnJyxcbiAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICAgIH0gYXMgTW9kZWxSZW5kZXJDdXN0b21FdmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnN1YnNjcmliZXMgZnJvbSBldmVudHMgZW1pdHRlZCBieSB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHVuc3Vic2NyaWJlRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnN0YW5jZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpXG4gICAgICAgICAgdGhpcy5pbnN0YW5jZVtrZXldLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEpTT04gPSBKU09OO1xufVxuIiwiICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudE91dGVyPjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjaW5uZXI+XG4gICAgPGRpdiAgW2lkXT1cInJlbmRlcmVySWQgfHwgbnVsbFwiPlxuICAgICAgQGZvciAoY2hpbGQgb2Ygb3V0cHV0Py5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgQGlmKGNoaWxkPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXIgW3BhcmVudF09XCJjaGlsZFwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICNjaGlsZENvbXBvbmVudHNcbiAgICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgICBjaGlsZC5jb21wb25lbnQ7XG4gICAgICAgICAgICAgIGluamVjdG9yOiBjaGlsZC5pbmplY3RvcjtcbiAgICAgICAgICAgICAgaW5wdXRzOiBjaGlsZC5pbnB1dHM7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6Y2hpbGQuY29udGVudDtcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Abstract base class for dynamic Angular modules
|
|
3
|
+
* @summary The DynamicModule serves as a base class for Angular modules that need to be
|
|
4
|
+
* dynamically loaded or configured at runtime. It provides a common type for the rendering
|
|
5
|
+
* engine to identify and work with dynamic modules.
|
|
6
|
+
* @class DynamicModule
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* @NgModule({
|
|
10
|
+
* declarations: [MyComponent],
|
|
11
|
+
* imports: [CommonModule]
|
|
12
|
+
* })
|
|
13
|
+
* export class MyDynamicModule extends DynamicModule {}
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export class DynamicModule {
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL0R5bmFtaWNNb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE9BQWdCLGFBQWE7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGR5bmFtaWMgQW5ndWxhciBtb2R1bGVzXG4gKiBAc3VtbWFyeSBUaGUgRHluYW1pY01vZHVsZSBzZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBBbmd1bGFyIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGJlXG4gKiBkeW5hbWljYWxseSBsb2FkZWQgb3IgY29uZmlndXJlZCBhdCBydW50aW1lLiBJdCBwcm92aWRlcyBhIGNvbW1vbiB0eXBlIGZvciB0aGUgcmVuZGVyaW5nXG4gKiBlbmdpbmUgdG8gaWRlbnRpZnkgYW5kIHdvcmsgd2l0aCBkeW5hbWljIG1vZHVsZXMuXG4gKiBAY2xhc3MgRHluYW1pY01vZHVsZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBOZ01vZHVsZSh7XG4gKiAgIGRlY2xhcmF0aW9uczogW015Q29tcG9uZW50XSxcbiAqICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgTXlEeW5hbWljTW9kdWxlIGV4dGVuZHMgRHluYW1pY01vZHVsZSB7fVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeW5hbWljTW9kdWxlIHt9XG4iXX0=
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { RenderingError } from '@decaf-ts/ui-decorators';
|
|
2
|
+
import { InternalError, OperationKeys } from '@decaf-ts/db-decorators';
|
|
3
|
+
import { NgxFormService } from './NgxFormService';
|
|
4
|
+
import { sf } from '@decaf-ts/decorator-validation';
|
|
5
|
+
/**
|
|
6
|
+
* @class NgxCrudFormField
|
|
7
|
+
* @implements {FieldProperties}
|
|
8
|
+
* @implements {ControlValueAccessor}
|
|
9
|
+
* @summary Abstract class representing a CRUD form field for Angular applications
|
|
10
|
+
* @description This class provides the base implementation for CRUD form fields in Angular,
|
|
11
|
+
* implementing both CrudFormField and ControlValueAccessor interfaces.
|
|
12
|
+
*/
|
|
13
|
+
export class NgxCrudFormField {
|
|
14
|
+
constructor(elementRef) {
|
|
15
|
+
this.elementRef = elementRef;
|
|
16
|
+
/**
|
|
17
|
+
* @summary String formatting function
|
|
18
|
+
* @description Provides access to the sf function for error message formatting
|
|
19
|
+
* @prop {function(string, ...string): string} sf - String formatting function
|
|
20
|
+
*/
|
|
21
|
+
this.sf = sf;
|
|
22
|
+
/**
|
|
23
|
+
* @summary Change callback function
|
|
24
|
+
* @description Function called when the field value changes
|
|
25
|
+
* @property {function(): unknown} onChange - onChange event handler
|
|
26
|
+
*/
|
|
27
|
+
this.onChange = () => {
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* @summary Touch callback function
|
|
31
|
+
* @description Function called when the field is touched
|
|
32
|
+
* @property {function(): unknown} onTouch - onTouch event handler
|
|
33
|
+
*/
|
|
34
|
+
this.onTouch = () => {
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @summary Write value to the field
|
|
39
|
+
* @description Sets the value of the field
|
|
40
|
+
* @param {string} obj - The value to be set
|
|
41
|
+
*/
|
|
42
|
+
writeValue(obj) {
|
|
43
|
+
this.value = obj;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @summary Register change callback
|
|
47
|
+
* @description Registers a function to be called when the field value changes
|
|
48
|
+
* @param {function(): unknown} fn - The function to be called on change
|
|
49
|
+
*/
|
|
50
|
+
registerOnChange(fn) {
|
|
51
|
+
this.onChange = fn;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @summary Register touch callback
|
|
55
|
+
* @description Registers a function to be called when the field is touched
|
|
56
|
+
* @param {function(): unknown} fn - The function to be called on touch
|
|
57
|
+
*/
|
|
58
|
+
registerOnTouched(fn) {
|
|
59
|
+
this.onTouch = fn;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @summary Set disabled state
|
|
63
|
+
* @description Sets the disabled state of the field
|
|
64
|
+
* @param {boolean} isDisabled - Whether the field should be disabled
|
|
65
|
+
*/
|
|
66
|
+
setDisabledState(isDisabled) {
|
|
67
|
+
this.disabled = isDisabled;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @summary After view initialization logic
|
|
71
|
+
* @description Performs necessary setup after the view has been initialized
|
|
72
|
+
* @returns {HTMLElement} The parent element of the field
|
|
73
|
+
*/
|
|
74
|
+
afterViewInit() {
|
|
75
|
+
let parent;
|
|
76
|
+
switch (this.operation) {
|
|
77
|
+
case OperationKeys.READ:
|
|
78
|
+
case OperationKeys.DELETE:
|
|
79
|
+
return this.component.nativeElement.parentElement;
|
|
80
|
+
case OperationKeys.CREATE:
|
|
81
|
+
case OperationKeys.UPDATE:
|
|
82
|
+
try {
|
|
83
|
+
parent = NgxFormService.getParentEl(this.component.nativeElement, 'div');
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
throw new RenderingError(`Unable to retrieve parent form element for the ${this.operation}: ${e instanceof Error ? e.message : e}`);
|
|
87
|
+
}
|
|
88
|
+
// NgxFormService.register(parent.id, this.formGroup, this as AngularFieldDefinition);
|
|
89
|
+
return parent;
|
|
90
|
+
default:
|
|
91
|
+
throw new InternalError(`Invalid operation: ${this.operation}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @summary Cleanup on component destruction
|
|
96
|
+
* @description Unregisters the field when the component is destroyed
|
|
97
|
+
*/
|
|
98
|
+
onDestroy() {
|
|
99
|
+
if (this.formGroup)
|
|
100
|
+
NgxFormService.unregister(this.formGroup);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @summary Get field errors
|
|
104
|
+
* @description Retrieves all errors associated with the field
|
|
105
|
+
* @returns {Array<{key: string, message: string}>} An array of error objects
|
|
106
|
+
*/
|
|
107
|
+
getErrors(parent) {
|
|
108
|
+
const collapsableContainer = parent.closest('ion-accordion-group');
|
|
109
|
+
if (collapsableContainer)
|
|
110
|
+
collapsableContainer.setAttribute('value', 'open');
|
|
111
|
+
return Object.keys(this.formControl.errors ?? {}).map(key => ({
|
|
112
|
+
key: key,
|
|
113
|
+
message: key,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Q3J1ZEZvcm1GaWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neENydWRGb3JtRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRSxPQUFPLEVBQWtCLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd2RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQWdCLGdCQUFnQjtJQW9EcEMsWUFBZ0MsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQVN0RDs7OztXQUlHO1FBQ0gsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVSOzs7O1dBSUc7UUFDSCxhQUFRLEdBQWtCLEdBQUcsRUFBRTtRQUMvQixDQUFDLENBQUM7UUFFRjs7OztXQUlHO1FBQ0gsWUFBTyxHQUFrQixHQUFHLEVBQUU7UUFDOUIsQ0FBQyxDQUFDO0lBN0JGLENBQUM7SUErQkQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBaUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxFQUFpQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFFLFVBQW1CO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYTtRQUNYLElBQUksTUFBbUIsQ0FBQztRQUN4QixRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixLQUFLLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDeEIsS0FBSyxhQUFhLENBQUMsTUFBTTtnQkFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7WUFDcEQsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLEtBQUssYUFBYSxDQUFDLE1BQU07Z0JBQ3ZCLElBQUksQ0FBQztvQkFDSCxNQUFNLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztnQkFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksY0FBYyxDQUFDLGtEQUFrRCxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RJLENBQUM7Z0JBQ0Qsc0ZBQXNGO2dCQUN0RixPQUFPLE1BQU0sQ0FBQztZQUNoQjtnQkFDRSxNQUFNLElBQUksYUFBYSxDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDUCxJQUFHLElBQUksQ0FBQyxTQUFTO1lBQ2YsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsTUFBbUI7UUFDM0IsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbkUsSUFBRyxvQkFBb0I7WUFDckIsb0JBQW9CLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RCxHQUFHLEVBQUUsR0FBRztZQUNSLE9BQU8sRUFBRSxHQUFHO1NBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWVsZFByb3BlcnRpZXMsIFJlbmRlcmluZ0Vycm9yIH0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgUG9zc2libGVJbnB1dFR5cGVzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDcnVkT3BlcmF0aW9ucywgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4Rm9ybVNlcnZpY2UgfSBmcm9tICcuL05neEZvcm1TZXJ2aWNlJztcbmltcG9ydCB7IHNmIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcblxuLyoqXG4gKiBAY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZFxuICogQGltcGxlbWVudHMge0ZpZWxkUHJvcGVydGllc31cbiAqIEBpbXBsZW1lbnRzIHtDb250cm9sVmFsdWVBY2Nlc3Nvcn1cbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIENSVUQgZm9ybSBmaWVsZCBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnNcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBDUlVEIGZvcm0gZmllbGRzIGluIEFuZ3VsYXIsXG4gKiBpbXBsZW1lbnRpbmcgYm90aCBDcnVkRm9ybUZpZWxkIGFuZCBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGaWVsZFByb3BlcnRpZXMge1xuICAvKipcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQncyBlbGVtZW50XG4gICAqIEBkZXNjcmlwdGlvbiBFbGVtZW50UmVmIHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50J3MgbmF0aXZlIGVsZW1lbnRcbiAgICovXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEN1cnJlbnQgQ1JVRCBvcGVyYXRpb25cbiAgICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgQ1JVRCBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqL1xuICBvcGVyYXRpb24hOiBDcnVkT3BlcmF0aW9ucztcblxuICAvKipcbiAgICogQHN1bW1hcnkgRm9ybSBncm91cCBmb3IgdGhlIGZpZWxkXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIEZvcm1Hcm91cCBpbnN0YW5jZSBmb3IgdGhlIGZpZWxkXG4gICAqL1xuICBmb3JtR3JvdXAhOiBGb3JtR3JvdXAgfCB1bmRlZmluZWQ7XG5cbiAgZm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcblxuICBuYW1lITogc3RyaW5nO1xuXG4gIHBhdGghOiBzdHJpbmc7XG5cbiAgY2hpbGRPZj86IHN0cmluZztcblxuICB0eXBlITogUG9zc2libGVJbnB1dFR5cGVzO1xuXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcblxuICAvLyBWYWxpZGF0aW9uXG5cbiAgZm9ybWF0Pzogc3RyaW5nO1xuICBoaWRkZW4/OiBib29sZWFuO1xuICBtYXg/OiBudW1iZXIgfCBEYXRlO1xuICBtYXhsZW5ndGg/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlciB8IERhdGU7XG4gIG1pbmxlbmd0aD86IG51bWJlcjtcbiAgcGF0dGVybj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHN0ZXA/OiBudW1iZXI7XG4gIGVxdWFscz86IHN0cmluZztcbiAgZGlmZmVyZW50Pzogc3RyaW5nO1xuICBsZXNzVGhhbj86IHN0cmluZztcbiAgbGVzc1RoYW5PckVxdWFsPzogc3RyaW5nO1xuICBncmVhdGVyVGhhbj86IHN0cmluZztcbiAgZ3JlYXRlclRoYW5PckVxdWFsPzogc3RyaW5nO1xuXG4gIHZhbHVlITogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBQYXJlbnQgSFRNTCBlbGVtZW50XG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBIVE1MIGVsZW1lbnQgb2YgdGhlIGZpZWxkXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyZW50PzogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFN0cmluZyBmb3JtYXR0aW5nIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNmIGZ1bmN0aW9uIGZvciBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmdcbiAgICogQHByb3Age2Z1bmN0aW9uKHN0cmluZywgLi4uc3RyaW5nKTogc3RyaW5nfSBzZiAtIFN0cmluZyBmb3JtYXR0aW5nIGZ1bmN0aW9uXG4gICAqL1xuICBzZiA9IHNmO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDaGFuZ2UgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBmaWVsZCB2YWx1ZSBjaGFuZ2VzXG4gICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKTogdW5rbm93bn0gb25DaGFuZ2UgLSBvbkNoYW5nZSBldmVudCBoYW5kbGVyXG4gICAqL1xuICBvbkNoYW5nZTogKCkgPT4gdW5rbm93biA9ICgpID0+IHtcbiAgfTtcblxuICAvKipcbiAgICogQHN1bW1hcnkgVG91Y2ggY2FsbGJhY2sgZnVuY3Rpb25cbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBmaWVsZCBpcyB0b3VjaGVkXG4gICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKTogdW5rbm93bn0gb25Ub3VjaCAtIG9uVG91Y2ggZXZlbnQgaGFuZGxlclxuICAgKi9cbiAgb25Ub3VjaDogKCkgPT4gdW5rbm93biA9ICgpID0+IHtcbiAgfTtcblxuICAvKipcbiAgICogQHN1bW1hcnkgV3JpdGUgdmFsdWUgdG8gdGhlIGZpZWxkXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iaiAtIFRoZSB2YWx1ZSB0byBiZSBzZXRcbiAgICovXG4gIHdyaXRlVmFsdWUob2JqOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGNoYW5nZSBjYWxsYmFja1xuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZpZWxkIHZhbHVlIGNoYW5nZXNcbiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmtub3dufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gY2hhbmdlXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIHRvdWNoIGNhbGxiYWNrXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmllbGQgaXMgdG91Y2hlZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IHVua25vd259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiB0b3VjaFxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXQgZGlzYWJsZWQgc3RhdGVcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGlzYWJsZWQgLSBXaGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICovXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBBZnRlciB2aWV3IGluaXRpYWxpemF0aW9uIGxvZ2ljXG4gICAqIEBkZXNjcmlwdGlvbiBQZXJmb3JtcyBuZWNlc3Nhcnkgc2V0dXAgYWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGZpZWxkXG4gICAqL1xuICBhZnRlclZpZXdJbml0KCk6IEhUTUxFbGVtZW50IHtcbiAgICBsZXQgcGFyZW50OiBIVE1MRWxlbWVudDtcbiAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlIE9wZXJhdGlvbktleXMuUkVBRDpcbiAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5ERUxFVEU6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICBjYXNlIE9wZXJhdGlvbktleXMuQ1JFQVRFOlxuICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLlVQREFURTpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQgPSBOZ3hGb3JtU2VydmljZS5nZXRQYXJlbnRFbCh0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LCAnZGl2Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYFVuYWJsZSB0byByZXRyaWV2ZSBwYXJlbnQgZm9ybSBlbGVtZW50IGZvciB0aGUgJHt0aGlzLm9wZXJhdGlvbn06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZ3hGb3JtU2VydmljZS5yZWdpc3RlcihwYXJlbnQuaWQsIHRoaXMuZm9ybUdyb3VwLCB0aGlzIGFzIEFuZ3VsYXJGaWVsZERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEludmFsaWQgb3BlcmF0aW9uOiAke3RoaXMub3BlcmF0aW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDbGVhbnVwIG9uIGNvbXBvbmVudCBkZXN0cnVjdGlvblxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgdGhlIGZpZWxkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcbiAgICovXG4gIG9uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLmZvcm1Hcm91cClcbiAgICAgIE5neEZvcm1TZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5mb3JtR3JvdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdldCBmaWVsZCBlcnJvcnNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbGwgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGRcbiAgICogQHJldHVybnMge0FycmF5PHtrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nfT59IEFuIGFycmF5IG9mIGVycm9yIG9iamVjdHNcbiAgICovXG4gIGdldEVycm9ycyhwYXJlbnQ6IEhUTUxFbGVtZW50KTogeyBrZXk6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nOyB9W10ge1xuICAgIGNvbnN0IGNvbGxhcHNhYmxlQ29udGFpbmVyID0gcGFyZW50LmNsb3Nlc3QoJ2lvbi1hY2NvcmRpb24tZ3JvdXAnKTtcbiAgICBpZihjb2xsYXBzYWJsZUNvbnRhaW5lcilcbiAgICAgIGNvbGxhcHNhYmxlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgndmFsdWUnLCAnb3BlbicpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZvcm1Db250cm9sLmVycm9ycyA/PyB7fSkubWFwKGtleSA9PiAoe1xuICAgICAga2V5OiBrZXksXG4gICAgICBtZXNzYWdlOiBrZXksXG4gICAgfSkpO1xuICB9XG59XG4iXX0=
|