@ngxs/form-plugin 3.8.1-dev.master-22b962e → 3.8.1-dev.master-66dd672

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,399 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@ngxs/store'), require('@angular/forms'), require('rxjs'), require('rxjs/operators')) :
3
- typeof define === 'function' && define.amd ? define('@ngxs/form-plugin', ['exports', '@angular/core', '@ngxs/store', '@angular/forms', 'rxjs', 'rxjs/operators'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.ngxs = global.ngxs || {}, global.ngxs["form-plugin"] = {}), global.ng.core, global["ngxs-store"], global.ng.forms, global.rxjs, global.rxjs.operators));
5
- })(this, (function (exports, i0, i1, i2, rxjs, operators) { 'use strict';
6
-
7
- function _interopNamespace(e) {
8
- if (e && e.__esModule) return e;
9
- var n = Object.create(null);
10
- if (e) {
11
- Object.keys(e).forEach(function (k) {
12
- if (k !== 'default') {
13
- var d = Object.getOwnPropertyDescriptor(e, k);
14
- Object.defineProperty(n, k, d.get ? d : {
15
- enumerable: true,
16
- get: function () { return e[k]; }
17
- });
18
- }
19
- });
20
- }
21
- n["default"] = e;
22
- return Object.freeze(n);
23
- }
24
-
25
- var i0__namespace = /*#__PURE__*/_interopNamespace(i0);
26
- var i1__namespace = /*#__PURE__*/_interopNamespace(i1);
27
- var i2__namespace = /*#__PURE__*/_interopNamespace(i2);
28
-
29
- var UpdateFormStatus = /** @class */ (function () {
30
- function UpdateFormStatus(payload) {
31
- this.payload = payload;
32
- }
33
- return UpdateFormStatus;
34
- }());
35
- UpdateFormStatus.type = '[Forms] Update Form Status';
36
- var UpdateFormValue = /** @class */ (function () {
37
- function UpdateFormValue(payload) {
38
- this.payload = payload;
39
- }
40
- return UpdateFormValue;
41
- }());
42
- UpdateFormValue.type = '[Forms] Update Form Value';
43
- var UpdateForm = /** @class */ (function () {
44
- function UpdateForm(payload) {
45
- this.payload = payload;
46
- }
47
- return UpdateForm;
48
- }());
49
- UpdateForm.type = '[Forms] Update Form';
50
- var UpdateFormDirty = /** @class */ (function () {
51
- function UpdateFormDirty(payload) {
52
- this.payload = payload;
53
- }
54
- return UpdateFormDirty;
55
- }());
56
- UpdateFormDirty.type = '[Forms] Update Form Dirty';
57
- var SetFormDirty = /** @class */ (function () {
58
- function SetFormDirty(payload) {
59
- this.payload = payload;
60
- }
61
- return SetFormDirty;
62
- }());
63
- SetFormDirty.type = '[Forms] Set Form Dirty';
64
- var SetFormPristine = /** @class */ (function () {
65
- function SetFormPristine(payload) {
66
- this.payload = payload;
67
- }
68
- return SetFormPristine;
69
- }());
70
- SetFormPristine.type = '[Forms] Set Form Pristine';
71
- var UpdateFormErrors = /** @class */ (function () {
72
- function UpdateFormErrors(payload) {
73
- this.payload = payload;
74
- }
75
- return UpdateFormErrors;
76
- }());
77
- UpdateFormErrors.type = '[Forms] Update Form Errors';
78
- var SetFormDisabled = /** @class */ (function () {
79
- function SetFormDisabled(payload) {
80
- this.payload = payload;
81
- }
82
- return SetFormDisabled;
83
- }());
84
- SetFormDisabled.type = '[Forms] Set Form Disabled';
85
- var SetFormEnabled = /** @class */ (function () {
86
- function SetFormEnabled(payload) {
87
- this.payload = payload;
88
- }
89
- return SetFormEnabled;
90
- }());
91
- SetFormEnabled.type = '[Forms] Set Form Enabled';
92
- var ResetForm = /** @class */ (function () {
93
- function ResetForm(payload) {
94
- this.payload = payload;
95
- }
96
- return ResetForm;
97
- }());
98
- ResetForm.type = '[Forms] Reset Form';
99
-
100
- var NgxsFormPlugin = /** @class */ (function () {
101
- function NgxsFormPlugin() {
102
- }
103
- NgxsFormPlugin.prototype.handle = function (state, event, next) {
104
- var type = i1.getActionTypeFromInstance(event);
105
- var nextState = state;
106
- if (type === UpdateFormValue.type || type === UpdateForm.type || type === ResetForm.type) {
107
- var value = event.payload.value;
108
- var payloadValue = Array.isArray(value)
109
- ? value.slice()
110
- : isObjectLike(value)
111
- ? Object.assign({}, value) : value;
112
- var path = this.joinPathWithPropertyPath(event);
113
- nextState = i1.setValue(nextState, path, payloadValue);
114
- }
115
- if (type === ResetForm.type) {
116
- var model = i1.getValue(nextState, event.payload.path + ".model");
117
- nextState = i1.setValue(nextState, "" + event.payload.path, { model: model });
118
- }
119
- if (type === UpdateFormStatus.type || type === UpdateForm.type) {
120
- nextState = i1.setValue(nextState, event.payload.path + ".status", event.payload.status);
121
- }
122
- if (type === UpdateFormErrors.type || type === UpdateForm.type) {
123
- nextState = i1.setValue(nextState, event.payload.path + ".errors", Object.assign({}, event.payload.errors));
124
- }
125
- if (type === UpdateFormDirty.type || type === UpdateForm.type) {
126
- nextState = i1.setValue(nextState, event.payload.path + ".dirty", event.payload.dirty);
127
- }
128
- if (type === SetFormDirty.type) {
129
- nextState = i1.setValue(nextState, event.payload + ".dirty", true);
130
- }
131
- if (type === SetFormPristine.type) {
132
- nextState = i1.setValue(nextState, event.payload + ".dirty", false);
133
- }
134
- if (type === SetFormDisabled.type) {
135
- nextState = i1.setValue(nextState, event.payload + ".disabled", true);
136
- }
137
- if (type === SetFormEnabled.type) {
138
- nextState = i1.setValue(nextState, event.payload + ".disabled", false);
139
- }
140
- return next(nextState, event);
141
- };
142
- NgxsFormPlugin.prototype.joinPathWithPropertyPath = function (_a) {
143
- var payload = _a.payload;
144
- var path = payload.path + ".model";
145
- if (payload.propertyPath) {
146
- path += "." + payload.propertyPath;
147
- }
148
- return path;
149
- };
150
- return NgxsFormPlugin;
151
- }());
152
- /** @nocollapse */ NgxsFormPlugin.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: NgxsFormPlugin, deps: [], target: i0__namespace.ɵɵFactoryTarget.Injectable });
153
- /** @nocollapse */ NgxsFormPlugin.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: NgxsFormPlugin });
154
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: NgxsFormPlugin, decorators: [{
155
- type: i0.Injectable
156
- }] });
157
- function isObjectLike(target) {
158
- return target !== null && typeof target === 'object';
159
- }
160
-
161
- var FormDirective = /** @class */ (function () {
162
- function FormDirective(_actions$, _store, _formGroupDirective, _cd) {
163
- this._actions$ = _actions$;
164
- this._store = _store;
165
- this._formGroupDirective = _formGroupDirective;
166
- this._cd = _cd;
167
- this.path = null;
168
- this._debounce = 100;
169
- this._clearDestroy = false;
170
- this._updating = false;
171
- this._destroy$ = new rxjs.Subject();
172
- }
173
- Object.defineProperty(FormDirective.prototype, "debounce", {
174
- get: function () {
175
- return this._debounce;
176
- },
177
- set: function (debounce) {
178
- this._debounce = Number(debounce);
179
- },
180
- enumerable: false,
181
- configurable: true
182
- });
183
- Object.defineProperty(FormDirective.prototype, "clearDestroy", {
184
- get: function () {
185
- return this._clearDestroy;
186
- },
187
- set: function (val) {
188
- this._clearDestroy = val != null && "" + val !== 'false';
189
- },
190
- enumerable: false,
191
- configurable: true
192
- });
193
- FormDirective.prototype.ngOnInit = function () {
194
- var _this = this;
195
- this._actions$
196
- .pipe(i1.ofActionDispatched(ResetForm), operators.filter(function (action) { return action.payload.path === _this.path; }), operators.takeUntil(this._destroy$))
197
- .subscribe(function (_a) {
198
- var value = _a.payload.value;
199
- _this.form.reset(value);
200
- _this.updateFormStateWithRawValue(true);
201
- _this._cd.markForCheck();
202
- });
203
- this.getStateStream(this.path + ".model").subscribe(function (model) {
204
- if (_this._updating || !model) {
205
- return;
206
- }
207
- _this.form.patchValue(model);
208
- _this._cd.markForCheck();
209
- });
210
- this.getStateStream(this.path + ".dirty").subscribe(function (dirty) {
211
- if (_this.form.dirty === dirty || typeof dirty !== 'boolean') {
212
- return;
213
- }
214
- if (dirty) {
215
- _this.form.markAsDirty();
216
- }
217
- else {
218
- _this.form.markAsPristine();
219
- }
220
- _this._cd.markForCheck();
221
- });
222
- // On first state change, sync form model, status and dirty with state
223
- this._store
224
- .selectOnce(function (state) { return i1.getValue(state, _this.path); })
225
- .subscribe(function () {
226
- _this._store.dispatch([
227
- new UpdateFormValue({
228
- path: _this.path,
229
- value: _this.form.getRawValue()
230
- }),
231
- new UpdateFormStatus({
232
- path: _this.path,
233
- status: _this.form.status
234
- }),
235
- new UpdateFormDirty({
236
- path: _this.path,
237
- dirty: _this.form.dirty
238
- })
239
- ]);
240
- });
241
- this.getStateStream(this.path + ".disabled").subscribe(function (disabled) {
242
- if (_this.form.disabled === disabled || typeof disabled !== 'boolean') {
243
- return;
244
- }
245
- if (disabled) {
246
- _this.form.disable();
247
- }
248
- else {
249
- _this.form.enable();
250
- }
251
- _this._cd.markForCheck();
252
- });
253
- this._formGroupDirective
254
- .valueChanges.pipe(operators.distinctUntilChanged(function (a, b) { return JSON.stringify(a) === JSON.stringify(b); }), this.debounceChange())
255
- .subscribe(function () {
256
- _this.updateFormStateWithRawValue();
257
- });
258
- this._formGroupDirective
259
- .statusChanges.pipe(operators.distinctUntilChanged(), this.debounceChange())
260
- .subscribe(function (status) {
261
- _this._store.dispatch(new UpdateFormStatus({
262
- status: status,
263
- path: _this.path
264
- }));
265
- });
266
- };
267
- FormDirective.prototype.updateFormStateWithRawValue = function (withFormStatus) {
268
- var _this = this;
269
- if (this._updating)
270
- return;
271
- var value = this._formGroupDirective.control.getRawValue();
272
- var actions = [
273
- new UpdateFormValue({
274
- path: this.path,
275
- value: value
276
- }),
277
- new UpdateFormDirty({
278
- path: this.path,
279
- dirty: this._formGroupDirective.dirty
280
- }),
281
- new UpdateFormErrors({
282
- path: this.path,
283
- errors: this._formGroupDirective.errors
284
- })
285
- ];
286
- if (withFormStatus) {
287
- actions.push(new UpdateFormStatus({
288
- path: this.path,
289
- status: this._formGroupDirective.status
290
- }));
291
- }
292
- this._updating = true;
293
- this._store.dispatch(actions).subscribe({
294
- error: function () { return (_this._updating = false); },
295
- complete: function () { return (_this._updating = false); }
296
- });
297
- };
298
- FormDirective.prototype.ngOnDestroy = function () {
299
- this._destroy$.next();
300
- if (this.clearDestroy) {
301
- this._store.dispatch(new UpdateForm({
302
- path: this.path,
303
- value: null,
304
- dirty: null,
305
- status: null,
306
- errors: null
307
- }));
308
- }
309
- };
310
- FormDirective.prototype.debounceChange = function () {
311
- var _this = this;
312
- var skipDebounceTime = this._formGroupDirective.control.updateOn !== 'change' || this._debounce < 0;
313
- return skipDebounceTime
314
- ? function (change) { return change.pipe(operators.takeUntil(_this._destroy$)); }
315
- : function (change) { return change.pipe(operators.debounceTime(_this._debounce), operators.takeUntil(_this._destroy$)); };
316
- };
317
- Object.defineProperty(FormDirective.prototype, "form", {
318
- get: function () {
319
- return this._formGroupDirective.form;
320
- },
321
- enumerable: false,
322
- configurable: true
323
- });
324
- FormDirective.prototype.getStateStream = function (path) {
325
- return this._store.select(function (state) { return i1.getValue(state, path); }).pipe(operators.takeUntil(this._destroy$));
326
- };
327
- return FormDirective;
328
- }());
329
- /** @nocollapse */ FormDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: FormDirective, deps: [{ token: i1__namespace.Actions }, { token: i1__namespace.Store }, { token: i2__namespace.FormGroupDirective }, { token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Directive });
330
- /** @nocollapse */ FormDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: FormDirective, selector: "[ngxsForm]", inputs: { path: ["ngxsForm", "path"], debounce: ["ngxsFormDebounce", "debounce"], clearDestroy: ["ngxsFormClearOnDestroy", "clearDestroy"] }, ngImport: i0__namespace });
331
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: FormDirective, decorators: [{
332
- type: i0.Directive,
333
- args: [{ selector: '[ngxsForm]' }]
334
- }], ctorParameters: function () { return [{ type: i1__namespace.Actions }, { type: i1__namespace.Store }, { type: i2__namespace.FormGroupDirective }, { type: i0__namespace.ChangeDetectorRef }]; }, propDecorators: { path: [{
335
- type: i0.Input,
336
- args: ['ngxsForm']
337
- }], debounce: [{
338
- type: i0.Input,
339
- args: ['ngxsFormDebounce']
340
- }], clearDestroy: [{
341
- type: i0.Input,
342
- args: ['ngxsFormClearOnDestroy']
343
- }] } });
344
-
345
- var NgxsFormPluginModule = /** @class */ (function () {
346
- function NgxsFormPluginModule() {
347
- }
348
- NgxsFormPluginModule.forRoot = function () {
349
- return {
350
- ngModule: NgxsFormPluginModule,
351
- providers: [
352
- {
353
- provide: i1.NGXS_PLUGINS,
354
- useClass: NgxsFormPlugin,
355
- multi: true
356
- }
357
- ]
358
- };
359
- };
360
- return NgxsFormPluginModule;
361
- }());
362
- /** @nocollapse */ NgxsFormPluginModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: NgxsFormPluginModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
363
- /** @nocollapse */ NgxsFormPluginModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: NgxsFormPluginModule, declarations: [FormDirective], imports: [i2.ReactiveFormsModule], exports: [FormDirective] });
364
- /** @nocollapse */ NgxsFormPluginModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: NgxsFormPluginModule, imports: [[i2.ReactiveFormsModule]] });
365
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0__namespace, type: NgxsFormPluginModule, decorators: [{
366
- type: i0.NgModule,
367
- args: [{
368
- imports: [i2.ReactiveFormsModule],
369
- declarations: [FormDirective],
370
- exports: [FormDirective]
371
- }]
372
- }] });
373
-
374
- /**
375
- * The public api for consumers of @ngxs/form-plugin
376
- */
377
-
378
- /**
379
- * Generated bundle index. Do not edit.
380
- */
381
-
382
- exports.NgxsFormPlugin = NgxsFormPlugin;
383
- exports.NgxsFormPluginModule = NgxsFormPluginModule;
384
- exports.ResetForm = ResetForm;
385
- exports.SetFormDirty = SetFormDirty;
386
- exports.SetFormDisabled = SetFormDisabled;
387
- exports.SetFormEnabled = SetFormEnabled;
388
- exports.SetFormPristine = SetFormPristine;
389
- exports.UpdateForm = UpdateForm;
390
- exports.UpdateFormDirty = UpdateFormDirty;
391
- exports.UpdateFormErrors = UpdateFormErrors;
392
- exports.UpdateFormStatus = UpdateFormStatus;
393
- exports.UpdateFormValue = UpdateFormValue;
394
- exports["ɵFormDirective"] = FormDirective;
395
-
396
- Object.defineProperty(exports, '__esModule', { value: true });
397
-
398
- }));
399
- //# sourceMappingURL=ngxs-form-plugin.umd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngxs-form-plugin.umd.js","sources":["../../../packages/form-plugin/src/actions.ts","../../../packages/form-plugin/src/form.plugin.ts","../../../packages/form-plugin/src/directive.ts","../../../packages/form-plugin/src/form.module.ts","../../../packages/form-plugin/index.ts","../../../packages/form-plugin/ngxs-form-plugin.ts"],"sourcesContent":["export class UpdateFormStatus {\n static readonly type = '[Forms] Update Form Status';\n\n constructor(\n public payload: {\n status: string | null;\n path: string;\n }\n ) {}\n}\n\nexport class UpdateFormValue {\n static readonly type = '[Forms] Update Form Value';\n\n constructor(public payload: { value: any; path: string; propertyPath?: string }) {}\n}\n\nexport class UpdateForm {\n static readonly type = '[Forms] Update Form';\n\n constructor(\n public payload: {\n value: any;\n errors: { [k: string]: string } | null;\n dirty: boolean | null;\n status: string | null;\n path: string;\n }\n ) {}\n}\n\nexport class UpdateFormDirty {\n static readonly type = '[Forms] Update Form Dirty';\n\n constructor(public payload: { dirty: boolean | null; path: string }) {}\n}\n\nexport class SetFormDirty {\n static readonly type = '[Forms] Set Form Dirty';\n\n constructor(public payload: string) {}\n}\n\nexport class SetFormPristine {\n static readonly type = '[Forms] Set Form Pristine';\n\n constructor(public payload: string) {}\n}\n\nexport class UpdateFormErrors {\n static readonly type = '[Forms] Update Form Errors';\n\n constructor(public payload: { errors: { [k: string]: string } | null; path: string }) {}\n}\n\nexport class SetFormDisabled {\n static readonly type = '[Forms] Set Form Disabled';\n\n constructor(public payload: string) {}\n}\n\nexport class SetFormEnabled {\n static readonly type = '[Forms] Set Form Enabled';\n\n constructor(public payload: string) {}\n}\n\nexport class ResetForm {\n static readonly type = '[Forms] Reset Form';\n\n constructor(public payload: { path: string; value?: any }) {}\n}\n","import { Injectable } from '@angular/core';\nimport {\n getActionTypeFromInstance,\n getValue,\n NgxsNextPluginFn,\n NgxsPlugin,\n setValue\n} from '@ngxs/store';\nimport {\n ResetForm,\n SetFormDirty,\n SetFormDisabled,\n SetFormEnabled,\n SetFormPristine,\n UpdateForm,\n UpdateFormDirty,\n UpdateFormErrors,\n UpdateFormStatus,\n UpdateFormValue\n} from './actions';\n\n@Injectable()\nexport class NgxsFormPlugin implements NgxsPlugin {\n handle(state: any, event: any, next: NgxsNextPluginFn) {\n const type = getActionTypeFromInstance(event);\n\n let nextState = state;\n\n if (type === UpdateFormValue.type || type === UpdateForm.type || type === ResetForm.type) {\n const { value } = event.payload;\n const payloadValue = Array.isArray(value)\n ? value.slice()\n : isObjectLike(value)\n ? { ...value }\n : value;\n const path = this.joinPathWithPropertyPath(event);\n nextState = setValue(nextState, path, payloadValue);\n }\n\n if (type === ResetForm.type) {\n const model = getValue(nextState, `${event.payload.path}.model`);\n nextState = setValue(nextState, `${event.payload.path}`, { model: model });\n }\n\n if (type === UpdateFormStatus.type || type === UpdateForm.type) {\n nextState = setValue(nextState, `${event.payload.path}.status`, event.payload.status);\n }\n\n if (type === UpdateFormErrors.type || type === UpdateForm.type) {\n nextState = setValue(nextState, `${event.payload.path}.errors`, {\n ...event.payload.errors\n });\n }\n\n if (type === UpdateFormDirty.type || type === UpdateForm.type) {\n nextState = setValue(nextState, `${event.payload.path}.dirty`, event.payload.dirty);\n }\n\n if (type === SetFormDirty.type) {\n nextState = setValue(nextState, `${event.payload}.dirty`, true);\n }\n\n if (type === SetFormPristine.type) {\n nextState = setValue(nextState, `${event.payload}.dirty`, false);\n }\n\n if (type === SetFormDisabled.type) {\n nextState = setValue(nextState, `${event.payload}.disabled`, true);\n }\n\n if (type === SetFormEnabled.type) {\n nextState = setValue(nextState, `${event.payload}.disabled`, false);\n }\n\n return next(nextState, event);\n }\n\n private joinPathWithPropertyPath({ payload }: UpdateFormValue): string {\n let path = `${payload.path}.model`;\n\n if (payload.propertyPath) {\n path += `.${payload.propertyPath}`;\n }\n\n return path;\n }\n}\n\nfunction isObjectLike(target: unknown): target is object {\n return target !== null && typeof target === 'object';\n}\n","import { ChangeDetectorRef, Directive, Input, OnDestroy, OnInit } from '@angular/core';\nimport { FormGroup, FormGroupDirective } from '@angular/forms';\nimport { Actions, getValue, ofActionDispatched, Store } from '@ngxs/store';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';\nimport {\n ResetForm,\n UpdateForm,\n UpdateFormDirty,\n UpdateFormErrors,\n UpdateFormStatus,\n UpdateFormValue\n} from './actions';\n\n@Directive({ selector: '[ngxsForm]' })\nexport class FormDirective implements OnInit, OnDestroy {\n @Input('ngxsForm')\n path: string = null!;\n\n @Input('ngxsFormDebounce')\n set debounce(debounce: string | number) {\n this._debounce = Number(debounce);\n }\n get debounce() {\n return this._debounce;\n }\n private _debounce = 100;\n\n @Input('ngxsFormClearOnDestroy')\n set clearDestroy(val: boolean) {\n this._clearDestroy = val != null && `${val}` !== 'false';\n }\n get clearDestroy(): boolean {\n return this._clearDestroy;\n }\n private _clearDestroy = false;\n\n private _updating = false;\n\n private readonly _destroy$ = new Subject<void>();\n\n constructor(\n private _actions$: Actions,\n private _store: Store,\n private _formGroupDirective: FormGroupDirective,\n private _cd: ChangeDetectorRef\n ) {}\n\n ngOnInit() {\n this._actions$\n .pipe(\n ofActionDispatched(ResetForm),\n filter((action: ResetForm) => action.payload.path === this.path),\n takeUntil(this._destroy$)\n )\n .subscribe(({ payload: { value } }: ResetForm) => {\n this.form.reset(value);\n this.updateFormStateWithRawValue(true);\n this._cd.markForCheck();\n });\n\n this.getStateStream(`${this.path}.model`).subscribe(model => {\n if (this._updating || !model) {\n return;\n }\n\n this.form.patchValue(model);\n this._cd.markForCheck();\n });\n\n this.getStateStream(`${this.path}.dirty`).subscribe(dirty => {\n if (this.form.dirty === dirty || typeof dirty !== 'boolean') {\n return;\n }\n\n if (dirty) {\n this.form.markAsDirty();\n } else {\n this.form.markAsPristine();\n }\n\n this._cd.markForCheck();\n });\n\n // On first state change, sync form model, status and dirty with state\n this._store\n .selectOnce(state => getValue(state, this.path))\n .subscribe(() => {\n this._store.dispatch([\n new UpdateFormValue({\n path: this.path,\n value: this.form.getRawValue()\n }),\n new UpdateFormStatus({\n path: this.path,\n status: this.form.status\n }),\n new UpdateFormDirty({\n path: this.path,\n dirty: this.form.dirty\n })\n ]);\n });\n\n this.getStateStream(`${this.path}.disabled`).subscribe(disabled => {\n if (this.form.disabled === disabled || typeof disabled !== 'boolean') {\n return;\n }\n\n if (disabled) {\n this.form.disable();\n } else {\n this.form.enable();\n }\n\n this._cd.markForCheck();\n });\n\n this._formGroupDirective\n .valueChanges!.pipe(\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n this.debounceChange()\n )\n .subscribe(() => {\n this.updateFormStateWithRawValue();\n });\n\n this._formGroupDirective\n .statusChanges!.pipe(distinctUntilChanged(), this.debounceChange())\n .subscribe((status: string) => {\n this._store.dispatch(\n new UpdateFormStatus({\n status,\n path: this.path\n })\n );\n });\n }\n\n updateFormStateWithRawValue(withFormStatus?: boolean) {\n if (this._updating) return;\n\n const value = this._formGroupDirective.control.getRawValue();\n\n const actions: any[] = [\n new UpdateFormValue({\n path: this.path,\n value\n }),\n new UpdateFormDirty({\n path: this.path,\n dirty: this._formGroupDirective.dirty\n }),\n new UpdateFormErrors({\n path: this.path,\n errors: this._formGroupDirective.errors\n })\n ];\n\n if (withFormStatus) {\n actions.push(\n new UpdateFormStatus({\n path: this.path,\n status: this._formGroupDirective.status\n })\n );\n }\n\n this._updating = true;\n this._store.dispatch(actions).subscribe({\n error: () => (this._updating = false),\n complete: () => (this._updating = false)\n });\n }\n\n ngOnDestroy() {\n this._destroy$.next();\n\n if (this.clearDestroy) {\n this._store.dispatch(\n new UpdateForm({\n path: this.path,\n value: null,\n dirty: null,\n status: null,\n errors: null\n })\n );\n }\n }\n\n private debounceChange() {\n const skipDebounceTime =\n this._formGroupDirective.control.updateOn !== 'change' || this._debounce < 0;\n\n return skipDebounceTime\n ? (change: Observable<any>) => change.pipe(takeUntil(this._destroy$))\n : (change: Observable<any>) =>\n change.pipe(debounceTime(this._debounce), takeUntil(this._destroy$));\n }\n\n private get form(): FormGroup {\n return this._formGroupDirective.form;\n }\n\n private getStateStream(path: string) {\n return this._store.select(state => getValue(state, path)).pipe(takeUntil(this._destroy$));\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { NGXS_PLUGINS } from '@ngxs/store';\nimport { NgxsFormPlugin } from './form.plugin';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormDirective } from './directive';\n\n@NgModule({\n imports: [ReactiveFormsModule],\n declarations: [FormDirective],\n exports: [FormDirective]\n})\nexport class NgxsFormPluginModule {\n static forRoot(): ModuleWithProviders<NgxsFormPluginModule> {\n return {\n ngModule: NgxsFormPluginModule,\n providers: [\n {\n provide: NGXS_PLUGINS,\n useClass: NgxsFormPlugin,\n multi: true\n }\n ]\n };\n }\n}\n","/**\n * The public api for consumers of @ngxs/form-plugin\n */\nexport * from './src/public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["getActionTypeFromInstance","setValue","getValue","i0","Injectable","Subject","ofActionDispatched","filter","takeUntil","distinctUntilChanged","debounceTime","i1","i2","Directive","Input","NGXS_PLUGINS","ReactiveFormsModule","NgModule"],"mappings":"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"}
@@ -1,176 +0,0 @@
1
- import { ChangeDetectorRef, Directive, Input } from '@angular/core';
2
- import { FormGroupDirective } from '@angular/forms';
3
- import { Actions, getValue, ofActionDispatched, Store } from '@ngxs/store';
4
- import { Subject } from 'rxjs';
5
- import { debounceTime, distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';
6
- import { ResetForm, UpdateForm, UpdateFormDirty, UpdateFormErrors, UpdateFormStatus, UpdateFormValue } from './actions';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@ngxs/store";
9
- import * as i2 from "@angular/forms";
10
- export class FormDirective {
11
- constructor(_actions$, _store, _formGroupDirective, _cd) {
12
- this._actions$ = _actions$;
13
- this._store = _store;
14
- this._formGroupDirective = _formGroupDirective;
15
- this._cd = _cd;
16
- this.path = null;
17
- this._debounce = 100;
18
- this._clearDestroy = false;
19
- this._updating = false;
20
- this._destroy$ = new Subject();
21
- }
22
- set debounce(debounce) {
23
- this._debounce = Number(debounce);
24
- }
25
- get debounce() {
26
- return this._debounce;
27
- }
28
- set clearDestroy(val) {
29
- this._clearDestroy = val != null && `${val}` !== 'false';
30
- }
31
- get clearDestroy() {
32
- return this._clearDestroy;
33
- }
34
- ngOnInit() {
35
- this._actions$
36
- .pipe(ofActionDispatched(ResetForm), filter((action) => action.payload.path === this.path), takeUntil(this._destroy$))
37
- .subscribe(({ payload: { value } }) => {
38
- this.form.reset(value);
39
- this.updateFormStateWithRawValue(true);
40
- this._cd.markForCheck();
41
- });
42
- this.getStateStream(`${this.path}.model`).subscribe(model => {
43
- if (this._updating || !model) {
44
- return;
45
- }
46
- this.form.patchValue(model);
47
- this._cd.markForCheck();
48
- });
49
- this.getStateStream(`${this.path}.dirty`).subscribe(dirty => {
50
- if (this.form.dirty === dirty || typeof dirty !== 'boolean') {
51
- return;
52
- }
53
- if (dirty) {
54
- this.form.markAsDirty();
55
- }
56
- else {
57
- this.form.markAsPristine();
58
- }
59
- this._cd.markForCheck();
60
- });
61
- // On first state change, sync form model, status and dirty with state
62
- this._store
63
- .selectOnce(state => getValue(state, this.path))
64
- .subscribe(() => {
65
- this._store.dispatch([
66
- new UpdateFormValue({
67
- path: this.path,
68
- value: this.form.getRawValue()
69
- }),
70
- new UpdateFormStatus({
71
- path: this.path,
72
- status: this.form.status
73
- }),
74
- new UpdateFormDirty({
75
- path: this.path,
76
- dirty: this.form.dirty
77
- })
78
- ]);
79
- });
80
- this.getStateStream(`${this.path}.disabled`).subscribe(disabled => {
81
- if (this.form.disabled === disabled || typeof disabled !== 'boolean') {
82
- return;
83
- }
84
- if (disabled) {
85
- this.form.disable();
86
- }
87
- else {
88
- this.form.enable();
89
- }
90
- this._cd.markForCheck();
91
- });
92
- this._formGroupDirective
93
- .valueChanges.pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), this.debounceChange())
94
- .subscribe(() => {
95
- this.updateFormStateWithRawValue();
96
- });
97
- this._formGroupDirective
98
- .statusChanges.pipe(distinctUntilChanged(), this.debounceChange())
99
- .subscribe((status) => {
100
- this._store.dispatch(new UpdateFormStatus({
101
- status,
102
- path: this.path
103
- }));
104
- });
105
- }
106
- updateFormStateWithRawValue(withFormStatus) {
107
- if (this._updating)
108
- return;
109
- const value = this._formGroupDirective.control.getRawValue();
110
- const actions = [
111
- new UpdateFormValue({
112
- path: this.path,
113
- value
114
- }),
115
- new UpdateFormDirty({
116
- path: this.path,
117
- dirty: this._formGroupDirective.dirty
118
- }),
119
- new UpdateFormErrors({
120
- path: this.path,
121
- errors: this._formGroupDirective.errors
122
- })
123
- ];
124
- if (withFormStatus) {
125
- actions.push(new UpdateFormStatus({
126
- path: this.path,
127
- status: this._formGroupDirective.status
128
- }));
129
- }
130
- this._updating = true;
131
- this._store.dispatch(actions).subscribe({
132
- error: () => (this._updating = false),
133
- complete: () => (this._updating = false)
134
- });
135
- }
136
- ngOnDestroy() {
137
- this._destroy$.next();
138
- if (this.clearDestroy) {
139
- this._store.dispatch(new UpdateForm({
140
- path: this.path,
141
- value: null,
142
- dirty: null,
143
- status: null,
144
- errors: null
145
- }));
146
- }
147
- }
148
- debounceChange() {
149
- const skipDebounceTime = this._formGroupDirective.control.updateOn !== 'change' || this._debounce < 0;
150
- return skipDebounceTime
151
- ? (change) => change.pipe(takeUntil(this._destroy$))
152
- : (change) => change.pipe(debounceTime(this._debounce), takeUntil(this._destroy$));
153
- }
154
- get form() {
155
- return this._formGroupDirective.form;
156
- }
157
- getStateStream(path) {
158
- return this._store.select(state => getValue(state, path)).pipe(takeUntil(this._destroy$));
159
- }
160
- }
161
- /** @nocollapse */ FormDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FormDirective, deps: [{ token: i1.Actions }, { token: i1.Store }, { token: i2.FormGroupDirective }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
162
- /** @nocollapse */ FormDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: FormDirective, selector: "[ngxsForm]", inputs: { path: ["ngxsForm", "path"], debounce: ["ngxsFormDebounce", "debounce"], clearDestroy: ["ngxsFormClearOnDestroy", "clearDestroy"] }, ngImport: i0 });
163
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FormDirective, decorators: [{
164
- type: Directive,
165
- args: [{ selector: '[ngxsForm]' }]
166
- }], ctorParameters: function () { return [{ type: i1.Actions }, { type: i1.Store }, { type: i2.FormGroupDirective }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { path: [{
167
- type: Input,
168
- args: ['ngxsForm']
169
- }], debounce: [{
170
- type: Input,
171
- args: ['ngxsFormDebounce']
172
- }], clearDestroy: [{
173
- type: Input,
174
- args: ['ngxsFormClearOnDestroy']
175
- }] } });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZm9ybS1wbHVnaW4vc3JjL2RpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFhLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNoQixNQUFNLFdBQVcsQ0FBQzs7OztBQUduQixNQUFNLE9BQU8sYUFBYTtJQTBCeEIsWUFDVSxTQUFrQixFQUNsQixNQUFhLEVBQ2IsbUJBQXVDLEVBQ3ZDLEdBQXNCO1FBSHRCLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFDdkMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE1QmhDLFNBQUksR0FBVyxJQUFLLENBQUM7UUFTYixjQUFTLEdBQUcsR0FBRyxDQUFDO1FBU2hCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRXRCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFVCxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQU85QyxDQUFDO0lBM0JKLElBQ0ksUUFBUSxDQUFDLFFBQXlCO1FB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Q0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDOzs4SEFoTVUsYUFBYTtrSEFBYixhQUFhOzRGQUFiLGFBQWE7a0JBRHpCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO21MQUduQyxJQUFJO3NCQURILEtBQUs7dUJBQUMsVUFBVTtnQkFJYixRQUFRO3NCQURYLEtBQUs7dUJBQUMsa0JBQWtCO2dCQVVyQixZQUFZO3NCQURmLEtBQUs7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGlvbnMsIGdldFZhbHVlLCBvZkFjdGlvbkRpc3BhdGNoZWQsIFN0b3JlIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBSZXNldEZvcm0sXG4gIFVwZGF0ZUZvcm0sXG4gIFVwZGF0ZUZvcm1EaXJ0eSxcbiAgVXBkYXRlRm9ybUVycm9ycyxcbiAgVXBkYXRlRm9ybVN0YXR1cyxcbiAgVXBkYXRlRm9ybVZhbHVlXG59IGZyb20gJy4vYWN0aW9ucyc7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuZ3hzRm9ybV0nIH0pXG5leHBvcnQgY2xhc3MgRm9ybURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCduZ3hzRm9ybScpXG4gIHBhdGg6IHN0cmluZyA9IG51bGwhO1xuXG4gIEBJbnB1dCgnbmd4c0Zvcm1EZWJvdW5jZScpXG4gIHNldCBkZWJvdW5jZShkZWJvdW5jZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5fZGVib3VuY2UgPSBOdW1iZXIoZGVib3VuY2UpO1xuICB9XG4gIGdldCBkZWJvdW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVib3VuY2U7XG4gIH1cbiAgcHJpdmF0ZSBfZGVib3VuY2UgPSAxMDA7XG5cbiAgQElucHV0KCduZ3hzRm9ybUNsZWFyT25EZXN0cm95JylcbiAgc2V0IGNsZWFyRGVzdHJveSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jbGVhckRlc3Ryb3kgPSB2YWwgIT0gbnVsbCAmJiBgJHt2YWx9YCAhPT0gJ2ZhbHNlJztcbiAgfVxuICBnZXQgY2xlYXJEZXN0cm95KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jbGVhckRlc3Ryb3k7XG4gIH1cbiAgcHJpdmF0ZSBfY2xlYXJEZXN0cm95ID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfdXBkYXRpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfYWN0aW9ucyQ6IEFjdGlvbnMsXG4gICAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgX2Zvcm1Hcm91cERpcmVjdGl2ZTogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fYWN0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICBvZkFjdGlvbkRpc3BhdGNoZWQoUmVzZXRGb3JtKSxcbiAgICAgICAgZmlsdGVyKChhY3Rpb246IFJlc2V0Rm9ybSkgPT4gYWN0aW9uLnBheWxvYWQucGF0aCA9PT0gdGhpcy5wYXRoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoeyBwYXlsb2FkOiB7IHZhbHVlIH0gfTogUmVzZXRGb3JtKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybS5yZXNldCh2YWx1ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlV2l0aFJhd1ZhbHVlKHRydWUpO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5nZXRTdGF0ZVN0cmVhbShgJHt0aGlzLnBhdGh9Lm1vZGVsYCkuc3Vic2NyaWJlKG1vZGVsID0+IHtcbiAgICAgIGlmICh0aGlzLl91cGRhdGluZyB8fCAhbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShtb2RlbCk7XG4gICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZ2V0U3RhdGVTdHJlYW0oYCR7dGhpcy5wYXRofS5kaXJ0eWApLnN1YnNjcmliZShkaXJ0eSA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtLmRpcnR5ID09PSBkaXJ0eSB8fCB0eXBlb2YgZGlydHkgIT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICB0aGlzLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIE9uIGZpcnN0IHN0YXRlIGNoYW5nZSwgc3luYyBmb3JtIG1vZGVsLCBzdGF0dXMgYW5kIGRpcnR5IHdpdGggc3RhdGVcbiAgICB0aGlzLl9zdG9yZVxuICAgICAgLnNlbGVjdE9uY2Uoc3RhdGUgPT4gZ2V0VmFsdWUoc3RhdGUsIHRoaXMucGF0aCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goW1xuICAgICAgICAgIG5ldyBVcGRhdGVGb3JtVmFsdWUoe1xuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IFVwZGF0ZUZvcm1TdGF0dXMoe1xuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLmZvcm0uc3RhdHVzXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IFVwZGF0ZUZvcm1EaXJ0eSh7XG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBkaXJ0eTogdGhpcy5mb3JtLmRpcnR5XG4gICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZ2V0U3RhdGVTdHJlYW0oYCR7dGhpcy5wYXRofS5kaXNhYmxlZGApLnN1YnNjcmliZShkaXNhYmxlZCA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtLmRpc2FibGVkID09PSBkaXNhYmxlZCB8fCB0eXBlb2YgZGlzYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmZvcm0uZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtLmVuYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZVxuICAgICAgLnZhbHVlQ2hhbmdlcyEucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKSksXG4gICAgICAgIHRoaXMuZGVib3VuY2VDaGFuZ2UoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlV2l0aFJhd1ZhbHVlKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZVxuICAgICAgLnN0YXR1c0NoYW5nZXMhLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGhpcy5kZWJvdW5jZUNoYW5nZSgpKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgbmV3IFVwZGF0ZUZvcm1TdGF0dXMoe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRm9ybVN0YXRlV2l0aFJhd1ZhbHVlKHdpdGhGb3JtU3RhdHVzPzogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl91cGRhdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9mb3JtR3JvdXBEaXJlY3RpdmUuY29udHJvbC5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgY29uc3QgYWN0aW9uczogYW55W10gPSBbXG4gICAgICBuZXcgVXBkYXRlRm9ybVZhbHVlKHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSksXG4gICAgICBuZXcgVXBkYXRlRm9ybURpcnR5KHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICBkaXJ0eTogdGhpcy5fZm9ybUdyb3VwRGlyZWN0aXZlLmRpcnR5XG4gICAgICB9KSxcbiAgICAgIG5ldyBVcGRhdGVGb3JtRXJyb3JzKHtcbiAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICBlcnJvcnM6IHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZS5lcnJvcnNcbiAgICAgIH0pXG4gICAgXTtcblxuICAgIGlmICh3aXRoRm9ybVN0YXR1cykge1xuICAgICAgYWN0aW9ucy5wdXNoKFxuICAgICAgICBuZXcgVXBkYXRlRm9ybVN0YXR1cyh7XG4gICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgIHN0YXR1czogdGhpcy5fZm9ybUdyb3VwRGlyZWN0aXZlLnN0YXR1c1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGluZyA9IHRydWU7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goYWN0aW9ucykuc3Vic2NyaWJlKHtcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5fdXBkYXRpbmcgPSBmYWxzZSksXG4gICAgICBjb21wbGV0ZTogKCkgPT4gKHRoaXMuX3VwZGF0aW5nID0gZmFsc2UpXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG5cbiAgICBpZiAodGhpcy5jbGVhckRlc3Ryb3kpIHtcbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKFxuICAgICAgICBuZXcgVXBkYXRlRm9ybSh7XG4gICAgICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgIGRpcnR5OiBudWxsLFxuICAgICAgICAgIHN0YXR1czogbnVsbCxcbiAgICAgICAgICBlcnJvcnM6IG51bGxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWJvdW5jZUNoYW5nZSgpIHtcbiAgICBjb25zdCBza2lwRGVib3VuY2VUaW1lID1cbiAgICAgIHRoaXMuX2Zvcm1Hcm91cERpcmVjdGl2ZS5jb250cm9sLnVwZGF0ZU9uICE9PSAnY2hhbmdlJyB8fCB0aGlzLl9kZWJvdW5jZSA8IDA7XG5cbiAgICByZXR1cm4gc2tpcERlYm91bmNlVGltZVxuICAgICAgPyAoY2hhbmdlOiBPYnNlcnZhYmxlPGFueT4pID0+IGNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICA6IChjaGFuZ2U6IE9ic2VydmFibGU8YW55PikgPT5cbiAgICAgICAgICBjaGFuZ2UucGlwZShkZWJvdW5jZVRpbWUodGhpcy5fZGVib3VuY2UpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGZvcm0oKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwRGlyZWN0aXZlLmZvcm07XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXRlU3RyZWFtKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5zZWxlY3Qoc3RhdGUgPT4gZ2V0VmFsdWUoc3RhdGUsIHBhdGgpKS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG59XG4iXX0=