@elle96/ng-json-schema-manager 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Output, Input, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
2
+ import { Injectable, EventEmitter, Output, Input, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
3
  import * as i4 from '@angular/forms';
4
4
  import { FormGroup, FormArray, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
5
  import Ajv from 'ajv';
@@ -671,6 +671,12 @@ class JsonSchemaNodeComponent {
671
671
  get controlAsArray() { return this.control; }
672
672
  get arrayControls() { return this.controlAsArray.controls; }
673
673
  get objectKeys() { return Object.keys(this.controlAsGroup.controls); }
674
+ get simpleKeys() {
675
+ return this.objectKeys.filter(k => this.isSimpleChild(k));
676
+ }
677
+ get complexKeys() {
678
+ return this.objectKeys.filter(k => !this.isSimpleChild(k));
679
+ }
674
680
  get canAddProperty() {
675
681
  if (!this.allowAdditionalProperties)
676
682
  return false;
@@ -979,11 +985,37 @@ class JsonSchemaNodeComponent {
979
985
  [ngClass]="badgeClass(badge)">{{ badge }}</span>
980
986
  </div>
981
987
 
982
- <!-- griglia 2 col: i figli semplici occupano 1 col, i complessi 2 col -->
988
+ <!-- campi semplici (string/number/bool/enum) → griglia 2 colonne -->
983
989
  <div class="grid grid-cols-1 sm:grid-cols-2 gap-4" [formGroup]="controlAsGroup">
984
- <ng-container *ngFor="let key of objectKeys">
985
- <div class="flex flex-col gap-1"
986
- [class.sm:col-span-2]="!isSimpleChild(key)">
990
+ <ng-container *ngFor="let key of simpleKeys">
991
+ <div class="flex flex-col gap-1">
992
+ <div *ngIf="isDynamicKey(key)"
993
+ class="flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1">
994
+ <span class="font-mono text-xs text-slate-500 dark:text-slate-400">{{ key }}</span>
995
+ <button type="button"
996
+ class="rounded px-1.5 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors"
997
+ (click)="removeDynamicKey(key)">Remove</button>
998
+ </div>
999
+ <jsm-schema-node
1000
+ [schema]="schemaForKey(key)"
1001
+ [control]="childControl(key)"
1002
+ [parent]="controlAsGroup"
1003
+ [controlKey]="key"
1004
+ [path]="pathForChild(key)"
1005
+ [errorsMap]="errorsMap"
1006
+ [label]="key"
1007
+ [required]="isRequired(key)"
1008
+ [allowAdditionalProperties]="allowAdditionalProperties"
1009
+ (controlReplaced)="controlReplaced.emit($event)">
1010
+ </jsm-schema-node>
1011
+ </div>
1012
+ </ng-container>
1013
+ </div>
1014
+
1015
+ <!-- campi complessi (object/array/combinator) → colonna piena -->
1016
+ <div class="space-y-4 mt-4" *ngIf="complexKeys.length > 0" [formGroup]="controlAsGroup">
1017
+ <ng-container *ngFor="let key of complexKeys">
1018
+ <div class="flex flex-col gap-1">
987
1019
  <div *ngIf="isDynamicKey(key)"
988
1020
  class="flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1">
989
1021
  <span class="font-mono text-xs text-slate-500 dark:text-slate-400">{{ key }}</span>
@@ -1170,14 +1202,9 @@ class JsonSchemaNodeComponent {
1170
1202
 
1171
1203
  <!-- checkbox come toggle switch -->
1172
1204
  <label *ngSwitchCase="'checkbox'" class="inline-flex cursor-pointer items-center gap-2.5">
1173
- <span class="relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors"
1174
- [class.bg-indigo-600]="controlAsFormControl.value"
1175
- [class.bg-slate-300]="!controlAsFormControl.value"
1176
- [class.dark:bg-slate-600]="!controlAsFormControl.value">
1205
+ <span class="jsm-toggle-track" [class.jsm-toggle-on]="controlAsFormControl.value">
1177
1206
  <input type="checkbox" class="sr-only" [formControl]="controlAsFormControl" />
1178
- <span class="inline-block h-4 w-4 transform rounded-full bg-white shadow transition-transform"
1179
- [class.translate-x-4]="controlAsFormControl.value"
1180
- [class.translate-x-0.5]="!controlAsFormControl.value"></span>
1207
+ <span class="jsm-toggle-thumb"></span>
1181
1208
  </span>
1182
1209
  <span class="text-sm font-medium text-slate-700 dark:text-slate-300">
1183
1210
  {{ schema.title || label }}<span *ngIf="required" class="ml-0.5 text-red-500">*</span>
@@ -1209,15 +1236,11 @@ class JsonSchemaNodeComponent {
1209
1236
  </div>
1210
1237
 
1211
1238
  </ng-container>
1212
- `, isInline: true, dependencies: [{ kind: "component", type: JsonSchemaNodeComponent, selector: "jsm-schema-node", inputs: ["schema", "control", "label", "required", "path", "errorsMap", "parent", "controlKey", "allowAdditionalProperties"], outputs: ["controlReplaced"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1239
+ `, isInline: true, styles: [".jsm-toggle-track{position:relative;display:inline-flex;align-items:center;width:2.25rem;height:1.25rem;border-radius:9999px;flex-shrink:0;transition:background-color .2s;background-color:#cbd5e1}.jsm-toggle-track.jsm-toggle-on{background-color:#4f46e5}.dark .jsm-toggle-track:not(.jsm-toggle-on){background-color:#475569}.jsm-toggle-thumb{display:inline-block;width:1rem;height:1rem;border-radius:9999px;background:#fff;box-shadow:0 1px 3px #0003;transform:translate(.125rem);transition:transform .2s}.jsm-toggle-track.jsm-toggle-on .jsm-toggle-thumb{transform:translate(1.125rem)}\n"], dependencies: [{ kind: "component", type: JsonSchemaNodeComponent, selector: "jsm-schema-node", inputs: ["schema", "control", "label", "required", "path", "errorsMap", "parent", "controlKey", "allowAdditionalProperties"], outputs: ["controlReplaced"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1213
1240
  }
1214
1241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: JsonSchemaNodeComponent, decorators: [{
1215
1242
  type: Component,
1216
- args: [{
1217
- selector: 'jsm-schema-node',
1218
- standalone: true,
1219
- imports: [CommonModule, FormsModule, ReactiveFormsModule],
1220
- template: `
1243
+ args: [{ selector: 'jsm-schema-node', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule], encapsulation: ViewEncapsulation.None, template: `
1221
1244
  <ng-container [ngSwitch]="nodeKind">
1222
1245
 
1223
1246
  <!-- ═══════════════════════════════════════════════════════════
@@ -1331,11 +1354,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1331
1354
  [ngClass]="badgeClass(badge)">{{ badge }}</span>
1332
1355
  </div>
1333
1356
 
1334
- <!-- griglia 2 col: i figli semplici occupano 1 col, i complessi 2 col -->
1357
+ <!-- campi semplici (string/number/bool/enum) → griglia 2 colonne -->
1335
1358
  <div class="grid grid-cols-1 sm:grid-cols-2 gap-4" [formGroup]="controlAsGroup">
1336
- <ng-container *ngFor="let key of objectKeys">
1337
- <div class="flex flex-col gap-1"
1338
- [class.sm:col-span-2]="!isSimpleChild(key)">
1359
+ <ng-container *ngFor="let key of simpleKeys">
1360
+ <div class="flex flex-col gap-1">
1361
+ <div *ngIf="isDynamicKey(key)"
1362
+ class="flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1">
1363
+ <span class="font-mono text-xs text-slate-500 dark:text-slate-400">{{ key }}</span>
1364
+ <button type="button"
1365
+ class="rounded px-1.5 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors"
1366
+ (click)="removeDynamicKey(key)">Remove</button>
1367
+ </div>
1368
+ <jsm-schema-node
1369
+ [schema]="schemaForKey(key)"
1370
+ [control]="childControl(key)"
1371
+ [parent]="controlAsGroup"
1372
+ [controlKey]="key"
1373
+ [path]="pathForChild(key)"
1374
+ [errorsMap]="errorsMap"
1375
+ [label]="key"
1376
+ [required]="isRequired(key)"
1377
+ [allowAdditionalProperties]="allowAdditionalProperties"
1378
+ (controlReplaced)="controlReplaced.emit($event)">
1379
+ </jsm-schema-node>
1380
+ </div>
1381
+ </ng-container>
1382
+ </div>
1383
+
1384
+ <!-- campi complessi (object/array/combinator) → colonna piena -->
1385
+ <div class="space-y-4 mt-4" *ngIf="complexKeys.length > 0" [formGroup]="controlAsGroup">
1386
+ <ng-container *ngFor="let key of complexKeys">
1387
+ <div class="flex flex-col gap-1">
1339
1388
  <div *ngIf="isDynamicKey(key)"
1340
1389
  class="flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1">
1341
1390
  <span class="font-mono text-xs text-slate-500 dark:text-slate-400">{{ key }}</span>
@@ -1522,14 +1571,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1522
1571
 
1523
1572
  <!-- checkbox come toggle switch -->
1524
1573
  <label *ngSwitchCase="'checkbox'" class="inline-flex cursor-pointer items-center gap-2.5">
1525
- <span class="relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors"
1526
- [class.bg-indigo-600]="controlAsFormControl.value"
1527
- [class.bg-slate-300]="!controlAsFormControl.value"
1528
- [class.dark:bg-slate-600]="!controlAsFormControl.value">
1574
+ <span class="jsm-toggle-track" [class.jsm-toggle-on]="controlAsFormControl.value">
1529
1575
  <input type="checkbox" class="sr-only" [formControl]="controlAsFormControl" />
1530
- <span class="inline-block h-4 w-4 transform rounded-full bg-white shadow transition-transform"
1531
- [class.translate-x-4]="controlAsFormControl.value"
1532
- [class.translate-x-0.5]="!controlAsFormControl.value"></span>
1576
+ <span class="jsm-toggle-thumb"></span>
1533
1577
  </span>
1534
1578
  <span class="text-sm font-medium text-slate-700 dark:text-slate-300">
1535
1579
  {{ schema.title || label }}<span *ngIf="required" class="ml-0.5 text-red-500">*</span>
@@ -1561,9 +1605,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1561
1605
  </div>
1562
1606
 
1563
1607
  </ng-container>
1564
- `,
1565
- changeDetection: ChangeDetectionStrategy.OnPush,
1566
- }]
1608
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".jsm-toggle-track{position:relative;display:inline-flex;align-items:center;width:2.25rem;height:1.25rem;border-radius:9999px;flex-shrink:0;transition:background-color .2s;background-color:#cbd5e1}.jsm-toggle-track.jsm-toggle-on{background-color:#4f46e5}.dark .jsm-toggle-track:not(.jsm-toggle-on){background-color:#475569}.jsm-toggle-thumb{display:inline-block;width:1rem;height:1rem;border-radius:9999px;background:#fff;box-shadow:0 1px 3px #0003;transform:translate(.125rem);transition:transform .2s}.jsm-toggle-track.jsm-toggle-on .jsm-toggle-thumb{transform:translate(1.125rem)}\n"] }]
1567
1609
  }], ctorParameters: () => [{ type: JsonSchemaFormService }, { type: JsonSchemaValidationService }], propDecorators: { schema: [{
1568
1610
  type: Input,
1569
1611
  args: [{ required: true }]
@@ -1682,6 +1724,7 @@ class JsonSchemaFormComponent {
1682
1724
  }
1683
1725
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: JsonSchemaFormComponent, deps: [{ token: JsonSchemaFormService }, { token: JsonSchemaResolverService }, { token: JsonSchemaValidationService }], target: i0.ɵɵFactoryTarget.Component });
1684
1726
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: JsonSchemaFormComponent, isStandalone: true, selector: "jsm-json-schema-form", inputs: { schema: "schema", value: "value", data: "data", allowAdditionalProperties: "allowAdditionalProperties" }, outputs: { formReady: "formReady", valueChange: "valueChange", schemaReady: "schemaReady", schemaErrors: "schemaErrors" }, usesOnChanges: true, ngImport: i0, template: `
1727
+ <div class="jsm-root">
1685
1728
  <form class="w-full space-y-5">
1686
1729
  <div *ngIf="resolvedSchema?.title || resolvedSchema?.description" class="space-y-0.5">
1687
1730
  <h2 class="text-lg font-bold tracking-tight text-slate-900 dark:text-white">{{ resolvedSchema?.title || 'Form' }}</h2>
@@ -1734,15 +1777,13 @@ class JsonSchemaFormComponent {
1734
1777
  ></jsm-schema-node>
1735
1778
  </div>
1736
1779
  </form>
1737
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: JsonSchemaNodeComponent, selector: "jsm-schema-node", inputs: ["schema", "control", "label", "required", "path", "errorsMap", "parent", "controlKey", "allowAdditionalProperties"], outputs: ["controlReplaced"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1780
+ </div>
1781
+ `, isInline: true, styles: [".jsm-root *,.jsm-root *:before,.jsm-root *:after{box-sizing:border-box}.jsm-root input,.jsm-root textarea,.jsm-root select,.jsm-root button{font-family:inherit;font-size:inherit;line-height:inherit}.jsm-root input[type=number]::-webkit-inner-spin-button,.jsm-root input[type=number]::-webkit-outer-spin-button{opacity:1}.jsm-root input:not([type=checkbox]):not([type=radio]):not(.sr-only),.jsm-root textarea,.jsm-root select{border-width:1.5px!important;border-style:solid!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: JsonSchemaNodeComponent, selector: "jsm-schema-node", inputs: ["schema", "control", "label", "required", "path", "errorsMap", "parent", "controlKey", "allowAdditionalProperties"], outputs: ["controlReplaced"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1738
1782
  }
1739
1783
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: JsonSchemaFormComponent, decorators: [{
1740
1784
  type: Component,
1741
- args: [{
1742
- selector: 'jsm-json-schema-form',
1743
- standalone: true,
1744
- imports: [CommonModule, ReactiveFormsModule, JsonSchemaNodeComponent],
1745
- template: `
1785
+ args: [{ selector: 'jsm-json-schema-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, JsonSchemaNodeComponent], encapsulation: ViewEncapsulation.None, template: `
1786
+ <div class="jsm-root">
1746
1787
  <form class="w-full space-y-5">
1747
1788
  <div *ngIf="resolvedSchema?.title || resolvedSchema?.description" class="space-y-0.5">
1748
1789
  <h2 class="text-lg font-bold tracking-tight text-slate-900 dark:text-white">{{ resolvedSchema?.title || 'Form' }}</h2>
@@ -1795,9 +1836,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1795
1836
  ></jsm-schema-node>
1796
1837
  </div>
1797
1838
  </form>
1798
- `,
1799
- changeDetection: ChangeDetectionStrategy.OnPush,
1800
- }]
1839
+ </div>
1840
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".jsm-root *,.jsm-root *:before,.jsm-root *:after{box-sizing:border-box}.jsm-root input,.jsm-root textarea,.jsm-root select,.jsm-root button{font-family:inherit;font-size:inherit;line-height:inherit}.jsm-root input[type=number]::-webkit-inner-spin-button,.jsm-root input[type=number]::-webkit-outer-spin-button{opacity:1}.jsm-root input:not([type=checkbox]):not([type=radio]):not(.sr-only),.jsm-root textarea,.jsm-root select{border-width:1.5px!important;border-style:solid!important}\n"] }]
1801
1841
  }], ctorParameters: () => [{ type: JsonSchemaFormService }, { type: JsonSchemaResolverService }, { type: JsonSchemaValidationService }], propDecorators: { schema: [{
1802
1842
  type: Input,
1803
1843
  args: [{ required: true }]
@@ -1 +1 @@
1
- {"version":3,"file":"elle96-ng-json-schema-manager.mjs","sources":["../../../projects/ng-json-schema-form/src/lib/json-schema-form.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-resolver.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-validation.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-node.component.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.component.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.module.ts","../../../projects/ng-json-schema-form/src/elle96-ng-json-schema-manager.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormArray,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaFormService {\r\n buildControl(schema: JsonSchema, value?: unknown, required = false): AbstractControl {\r\n const effectiveSchema = this.applyCombinators(schema);\r\n const resolvedType = this.resolveType(effectiveSchema);\r\n\r\n if (resolvedType === 'object') {\r\n const group: Record<string, AbstractControl> = {};\r\n const properties = effectiveSchema.properties ?? {};\r\n const requiredFields = new Set(effectiveSchema.required ?? []);\r\n const valueObject = this.isRecord(value) ? value : {};\r\n\r\n for (const [key, propertySchema] of Object.entries(properties)) {\r\n const childValue = valueObject[key];\r\n group[key] = this.buildControl(propertySchema, childValue, requiredFields.has(key));\r\n }\r\n\r\n // Include dynamic keys from value (patternProperties/additionalProperties).\r\n for (const key of Object.keys(valueObject)) {\r\n if (group[key]) {\r\n continue;\r\n }\r\n const dynamicSchema = this.resolveDynamicSchema(effectiveSchema, key);\r\n group[key] = this.buildControl(dynamicSchema ?? {}, valueObject[key], false);\r\n }\r\n\r\n const control = new FormGroup(group, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n if (resolvedType === 'array') {\r\n const controls: AbstractControl[] = [];\r\n const initialItems = Array.isArray(value) ? value : [];\r\n const minItems = effectiveSchema.minItems ?? 0;\r\n const prefixItems = effectiveSchema.prefixItems ?? [];\r\n const tupleLength = Math.max(prefixItems.length, minItems, initialItems.length);\r\n\r\n for (let i = 0; i < tupleLength; i += 1) {\r\n const itemSchema = (prefixItems[i] ?? effectiveSchema.items) as JsonSchema | boolean | undefined;\r\n if (itemSchema === false) {\r\n continue;\r\n }\r\n const itemValue = initialItems[i];\r\n controls.push(this.buildControl((itemSchema as JsonSchema) ?? {}, itemValue, false));\r\n }\r\n\r\n const control = new FormArray(controls, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n const initialValue = this.resolveInitialValue(effectiveSchema, value);\r\n const control = new FormControl(initialValue, {\r\n validators: this.buildValidators(effectiveSchema, required, resolvedType),\r\n nonNullable: false,\r\n });\r\n\r\n if (effectiveSchema.readOnly || effectiveSchema.const !== undefined) {\r\n control.disable({ emitEvent: false });\r\n }\r\n\r\n return control;\r\n }\r\n\r\n resolveType(schema: JsonSchema): JsonSchema['type'] | 'enum' {\r\n if (schema.enum) {\r\n return 'enum';\r\n }\r\n\r\n if (schema.oneOf?.length) {\r\n return this.resolveType(schema.oneOf[0]);\r\n }\r\n if (schema.anyOf?.length) {\r\n return this.resolveType(schema.anyOf[0]);\r\n }\r\n if (schema.allOf?.length) {\r\n return this.resolveType(schema.allOf[0]);\r\n }\r\n\r\n if (schema.type) {\r\n if (Array.isArray(schema.type)) {\r\n const preferred = schema.type.find((item) => item !== 'null');\r\n return preferred ?? schema.type[0];\r\n }\r\n\r\n return schema.type;\r\n }\r\n\r\n if (schema.properties || schema.patternProperties || schema.additionalProperties) {\r\n return 'object';\r\n }\r\n\r\n if (schema.items || schema.prefixItems) {\r\n return 'array';\r\n }\r\n\r\n return 'string';\r\n }\r\n\r\n private applyCombinators(schema: JsonSchema): JsonSchema {\r\n let effective = schema;\r\n if (schema.allOf?.length) {\r\n effective = this.mergeSchemas([schema, ...schema.allOf]);\r\n }\r\n if (schema.oneOf?.length) {\r\n effective = schema.oneOf[0];\r\n }\r\n if (schema.anyOf?.length) {\r\n effective = schema.anyOf[0];\r\n }\r\n return effective;\r\n }\r\n\r\n resolveDynamicSchema(schema: JsonSchema, key: string): JsonSchema | undefined {\r\n const patternSchemas = schema.patternProperties ?? {};\r\n for (const [pattern, patternSchema] of Object.entries(patternSchemas)) {\r\n try {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n return patternSchema;\r\n }\r\n } catch {\r\n // ignore invalid regex\r\n }\r\n }\r\n\r\n if (schema.additionalProperties === true || schema.additionalProperties === undefined) {\r\n return {};\r\n }\r\n\r\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\r\n return schema.additionalProperties;\r\n }\r\n\r\n if (schema.unevaluatedProperties && typeof schema.unevaluatedProperties === 'object') {\r\n return schema.unevaluatedProperties;\r\n }\r\n if (schema.unevaluatedProperties === true) {\r\n return {};\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private resolveInitialValue(schema: JsonSchema, value?: unknown): unknown {\r\n if (value !== undefined) {\r\n return value;\r\n }\r\n\r\n if (schema.const !== undefined) {\r\n return schema.const;\r\n }\r\n\r\n if (schema.default !== undefined) {\r\n return schema.default;\r\n }\r\n\r\n if (schema.enum && schema.enum.length > 0) {\r\n return schema.enum[0];\r\n }\r\n\r\n if (schema.type === 'boolean') {\r\n return false;\r\n }\r\n\r\n if (schema.type === 'array') {\r\n return [];\r\n }\r\n\r\n if (schema.type === 'object') {\r\n return {};\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private buildValidators(\r\n schema: JsonSchema,\r\n required: boolean,\r\n resolvedType?: JsonSchema['type'] | 'enum'\r\n ): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (required) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (schema.minLength !== undefined) {\r\n validators.push(Validators.minLength(schema.minLength));\r\n }\r\n\r\n if (schema.maxLength !== undefined) {\r\n validators.push(Validators.maxLength(schema.maxLength));\r\n }\r\n\r\n if (schema.minimum !== undefined) {\r\n validators.push(Validators.min(schema.minimum));\r\n }\r\n\r\n if (schema.maximum !== undefined) {\r\n validators.push(Validators.max(schema.maximum));\r\n }\r\n\r\n if (schema.exclusiveMinimum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) > schema.exclusiveMinimum!\r\n ? null\r\n : { exclusiveMinimum: true }\r\n );\r\n }\r\n\r\n if (schema.exclusiveMaximum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) < schema.exclusiveMaximum!\r\n ? null\r\n : { exclusiveMaximum: true }\r\n );\r\n }\r\n\r\n if (schema.multipleOf !== undefined) {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n const numericValue = Number(control.value);\r\n return numericValue % schema.multipleOf! === 0 ? null : { multipleOf: true };\r\n });\r\n }\r\n\r\n if (schema.pattern) {\r\n validators.push(Validators.pattern(schema.pattern));\r\n }\r\n\r\n if (schema.format === 'email') {\r\n validators.push(Validators.email);\r\n }\r\n\r\n if (schema.minItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length < schema.minItems!\r\n ? { minItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.maxItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length > schema.maxItems!\r\n ? { maxItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.uniqueItems) {\r\n validators.push((control) => {\r\n if (!Array.isArray(control.value)) {\r\n return null;\r\n }\r\n const unique = new Set(control.value.map((item) => JSON.stringify(item)));\r\n return unique.size === control.value.length ? null : { uniqueItems: true };\r\n });\r\n }\r\n\r\n if (schema.minProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length < schema.minProperties!\r\n ? { minProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (schema.maxProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length > schema.maxProperties!\r\n ? { maxProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (resolvedType === 'integer') {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n\r\n const numericValue = Number(control.value);\r\n return Number.isInteger(numericValue) ? null : { integer: true };\r\n });\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n private isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === 'object' && !Array.isArray(value);\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, schema) => {\r\n const merged: JsonSchema = {\r\n ...acc,\r\n ...schema,\r\n properties: { ...(acc.properties ?? {}), ...(schema.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(schema.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(schema.required ?? [])])),\r\n };\r\n return merged;\r\n }, {} as JsonSchema);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaResolverService {\r\n async resolve(schema: JsonSchema, baseUri?: string): Promise<JsonSchema> {\r\n const rootBase = baseUri ?? schema.$id ?? '';\r\n const localCache = new Map<string, JsonSchema>();\r\n const externalCache = new Map<string, JsonSchema>();\r\n return this.resolveRefs(schema, schema, rootBase, localCache, externalCache);\r\n }\r\n\r\n private async resolveRefs(\r\n current: JsonSchema,\r\n root: JsonSchema,\r\n baseUri: string,\r\n localCache: Map<string, JsonSchema>,\r\n externalCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema> {\r\n if (!current || typeof current !== 'object') {\r\n return current;\r\n }\r\n\r\n if (current.$ref) {\r\n const ref = current.$ref;\r\n if (ref.startsWith('#/')) {\r\n if (localCache.has(ref)) {\r\n return localCache.get(ref)!;\r\n }\r\n const resolved = this.resolvePointer(root, ref);\r\n if (resolved) {\r\n localCache.set(ref, resolved);\r\n return this.resolveRefs(resolved, root, baseUri, localCache, externalCache);\r\n }\r\n } else {\r\n const resolved = await this.resolveExternalRef(ref, baseUri, externalCache, localCache);\r\n if (resolved) {\r\n return resolved;\r\n }\r\n }\r\n }\r\n\r\n const next: JsonSchema = { ...current };\r\n\r\n if (next.properties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.properties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.properties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.patternProperties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.patternProperties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.patternProperties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.items && typeof next.items === 'object') {\r\n next.items = await this.resolveRefs(next.items as JsonSchema, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.prefixItems) {\r\n next.prefixItems = await Promise.all(\r\n next.prefixItems.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.additionalProperties && typeof next.additionalProperties === 'object') {\r\n next.additionalProperties = await this.resolveRefs(\r\n next.additionalProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.additionalItems && typeof next.additionalItems === 'object') {\r\n next.additionalItems = await this.resolveRefs(\r\n next.additionalItems,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedProperties && typeof next.unevaluatedProperties === 'object') {\r\n next.unevaluatedProperties = await this.resolveRefs(\r\n next.unevaluatedProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedItems && typeof next.unevaluatedItems === 'object') {\r\n next.unevaluatedItems = await this.resolveRefs(next.unevaluatedItems, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.contains) {\r\n next.contains = await this.resolveRefs(next.contains, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.oneOf) {\r\n next.oneOf = await Promise.all(\r\n next.oneOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.anyOf) {\r\n next.anyOf = await Promise.all(\r\n next.anyOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.allOf) {\r\n next.allOf = await Promise.all(\r\n next.allOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.not) {\r\n next.not = await this.resolveRefs(next.not, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.if) {\r\n next.if = await this.resolveRefs(next.if, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.then) {\r\n next.then = await this.resolveRefs(next.then, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.else) {\r\n next.else = await this.resolveRefs(next.else, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.dependencies) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependencies).map(async ([key, value]) => {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return [key, await this.resolveRefs(value as JsonSchema, root, baseUri, localCache, externalCache)];\r\n }\r\n return [key, value];\r\n })\r\n );\r\n next.dependencies = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.dependentSchemas) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependentSchemas).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.dependentSchemas = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.$defs) {\r\n const entries = await Promise.all(\r\n Object.entries(next.$defs).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.$defs = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.definitions) {\r\n const entries = await Promise.all(\r\n Object.entries(next.definitions).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.definitions = Object.fromEntries(entries);\r\n }\r\n\r\n return next;\r\n }\r\n\r\n private async resolveExternalRef(\r\n ref: string,\r\n baseUri: string,\r\n externalCache: Map<string, JsonSchema>,\r\n localCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema | null> {\r\n try {\r\n const url = new URL(ref, baseUri || window.location.href).toString();\r\n if (externalCache.has(url)) {\r\n return externalCache.get(url)!;\r\n }\r\n\r\n const { schema, fragment } = await this.fetchSchema(url);\r\n if (!schema) {\r\n return null;\r\n }\r\n\r\n const target = fragment ? this.resolvePointer(schema, fragment) : schema;\r\n if (!target) {\r\n return null;\r\n }\r\n\r\n const resolved = await this.resolveRefs(target, schema, schema.$id ?? url, localCache, externalCache);\r\n externalCache.set(url, resolved);\r\n return resolved;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async fetchSchema(url: string): Promise<{ schema: JsonSchema | null; fragment: string | null }> {\r\n const [base, hash] = url.split('#');\r\n const fragment = hash ? `#/${hash.replace(/^\\//, '')}` : null;\r\n const response = await fetch(base, { headers: { Accept: 'application/json' } });\r\n if (!response.ok) {\r\n return { schema: null, fragment: null };\r\n }\r\n const schema = (await response.json()) as JsonSchema;\r\n return { schema, fragment };\r\n }\r\n\r\n private resolvePointer(root: JsonSchema, ref: string): JsonSchema | null {\r\n const pointer = ref.replace(/^#\\//, '');\r\n const parts = pointer.split('/').map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n let current: any = root;\r\n for (const part of parts) {\r\n if (current && typeof current === 'object' && part in current) {\r\n current = current[part];\r\n } else {\r\n return null;\r\n }\r\n }\r\n return current as JsonSchema;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport Ajv, { ErrorObject } from 'ajv';\r\nimport Ajv2019 from 'ajv/dist/2019';\r\nimport Ajv2020 from 'ajv/dist/2020';\r\nimport addFormats from 'ajv-formats';\r\nimport AjvDraft04 from 'ajv-draft-04';\r\nimport { JsonSchema, SchemaError } from './types';\r\n\r\nexport type JsonSchemaDraft = 'draft4' | 'draft6' | 'draft7' | 'draft2019' | 'draft2020';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaValidationService {\r\n private readonly ajvCache = new Map<JsonSchemaDraft, Ajv>();\r\n\r\n validate(schema: JsonSchema, value: unknown): ErrorObject[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n const validate = ajv.compile(schema as object);\r\n const valid = validate(value);\r\n if (valid) {\r\n return [];\r\n }\r\n return validate.errors ?? [];\r\n }\r\n\r\n /**\r\n * Validates the schema itself against its JSON Schema meta-schema.\r\n * Returns a list of SchemaError describing what is wrong in the schema definition.\r\n */\r\n validateSchema(schema: JsonSchema): SchemaError[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n\r\n try {\r\n const valid = ajv.validateSchema(schema as object);\r\n if (valid) return [];\r\n return (ajv.errors ?? []).map((e) => ({\r\n path: e.instancePath || '/',\r\n message: e.message ?? e.keyword,\r\n keyword: e.keyword,\r\n }));\r\n } catch (e) {\r\n // ajv.validateSchema throws when the schema is so broken it cannot be compiled.\r\n // The error message contains comma-separated individual violations — split them.\r\n const raw = e instanceof Error ? e.message : String(e);\r\n // Strip the \"schema is invalid: \" prefix if present\r\n const body = raw.replace(/^schema is invalid:\\s*/i, '');\r\n // Each violation looks like \"data/some/path must ...\" — extract path and message\r\n return body.split(', ').map((msg) => {\r\n const trimmed = msg.trim();\r\n const match = trimmed.match(/^(data[^\\s]*)\\s+(.+)$/);\r\n return match\r\n ? { path: match[1].replace(/^data/, '') || '/', message: match[2], keyword: 'schema' }\r\n : { path: '/', message: trimmed, keyword: 'schema' };\r\n });\r\n }\r\n }\r\n\r\n detectDraft(schema: JsonSchema): JsonSchemaDraft {\r\n const schemaId = schema.$schema ?? '';\r\n if (schemaId.includes('draft-04')) {\r\n return 'draft4';\r\n }\r\n if (schemaId.includes('draft-06')) {\r\n return 'draft6';\r\n }\r\n if (schemaId.includes('draft-07')) {\r\n return 'draft7';\r\n }\r\n if (schemaId.includes('2019-09')) {\r\n return 'draft2019';\r\n }\r\n if (schemaId.includes('2020-12')) {\r\n return 'draft2020';\r\n }\r\n\r\n if (schema.$defs) {\r\n return 'draft2020';\r\n }\r\n if (schema.definitions) {\r\n return 'draft7';\r\n }\r\n\r\n return 'draft2020';\r\n }\r\n\r\n private getAjv(draft: JsonSchemaDraft): Ajv {\r\n if (this.ajvCache.has(draft)) {\r\n return this.ajvCache.get(draft)!;\r\n }\r\n\r\n let ajv: Ajv;\r\n switch (draft) {\r\n case 'draft4':\r\n ajv = new AjvDraft04({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2019':\r\n ajv = new Ajv2019({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft6':\r\n case 'draft7':\r\n ajv = new Ajv({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2020':\r\n default:\r\n ajv = new Ajv2020({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n }\r\n\r\n addFormats(ajv);\r\n this.ajvCache.set(draft, ajv);\r\n return ajv;\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormArray, FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonSchema, JsonSchemaType } from './types';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\n\r\n@Component({\r\n selector: 'jsm-schema-node',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\r\n template: `\r\n <ng-container [ngSwitch]=\"nodeKind\">\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n oneOf — tab bar: ogni opzione è una tab, nessuna icona\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'oneOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-blue-100 dark:bg-blue-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-blue-700 dark:text-blue-400\">oneOf</span>\r\n </div>\r\n <div class=\"flex overflow-x-auto border-b border-slate-200 dark:border-slate-700\">\r\n <button\r\n *ngFor=\"let option of schema.oneOf; let i = index\"\r\n type=\"button\"\r\n class=\"px-4 py-2.5 text-xs font-medium whitespace-nowrap border-b-2 transition-colors\"\r\n [class.border-indigo-500]=\"selectedOneOf === i\"\r\n [class.text-indigo-600]=\"selectedOneOf === i\"\r\n [class.dark:text-indigo-400]=\"selectedOneOf === i\"\r\n [class.font-semibold]=\"selectedOneOf === i\"\r\n [class.border-transparent]=\"selectedOneOf !== i\"\r\n [class.text-slate-500]=\"selectedOneOf !== i\"\r\n [class.dark:text-slate-400]=\"selectedOneOf !== i\"\r\n (click)=\"selectedOneOf = i; onOneOfChange()\"\r\n >{{ option.title || ('Option ' + (i + 1)) }}</button>\r\n </div>\r\n <div class=\"p-4\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n anyOf — pill toggle, nessuna icona\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'anyOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-violet-100 dark:bg-violet-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-violet-700 dark:text-violet-400\">anyOf</span>\r\n </div>\r\n <div class=\"flex flex-wrap gap-2 px-4 py-3 border-b border-slate-200 dark:border-slate-700\">\r\n <label\r\n *ngFor=\"let option of schema.anyOf; let i = index\"\r\n class=\"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium cursor-pointer transition-colors select-none\"\r\n [class.border-indigo-400]=\"selectedAnyOf.has(i)\"\r\n [class.bg-indigo-50]=\"selectedAnyOf.has(i)\"\r\n [class.dark:bg-indigo-900/30]=\"selectedAnyOf.has(i)\"\r\n [class.text-indigo-700]=\"selectedAnyOf.has(i)\"\r\n [class.dark:text-indigo-400]=\"selectedAnyOf.has(i)\"\r\n [class.border-slate-200]=\"!selectedAnyOf.has(i)\"\r\n [class.dark:border-slate-600]=\"!selectedAnyOf.has(i)\"\r\n [class.text-slate-600]=\"!selectedAnyOf.has(i)\"\r\n [class.dark:text-slate-400]=\"!selectedAnyOf.has(i)\"\r\n >\r\n <input type=\"checkbox\" class=\"h-3.5 w-3.5 accent-indigo-600\" [checked]=\"selectedAnyOf.has(i)\" (change)=\"toggleAnyOf(i)\" />\r\n {{ option.title || ('Option ' + (i + 1)) }}\r\n </label>\r\n </div>\r\n <div class=\"p-4\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n allOf — sezioni in colonna con bordo sinistro\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'allOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-teal-100 dark:bg-teal-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-teal-700 dark:text-teal-400\">allOf</span>\r\n </div>\r\n <div class=\"p-4 space-y-4\">\r\n <div *ngFor=\"let subSchema of mergedAllOf; let i = index\" class=\"border-l-2 border-indigo-200 dark:border-indigo-700 pl-4\">\r\n <jsm-schema-node [schema]=\"subSchema\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"subSchema.title || ('Section ' + (i + 1))\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n object — fieldset con griglia SOLO per campi primitivi.\r\n Logica layout:\r\n - I figli vengono classificati come \"semplici\" (primitive/enum/bool)\r\n o \"complessi\" (object/array/oneOf/anyOf/allOf).\r\n - I semplici vanno in griglia 2 colonne (sm:grid-cols-2).\r\n - I complessi vanno sempre in colonna piena (col-span-2).\r\n ═══════════════════════════════════════════════════════════ -->\r\n <fieldset *ngSwitchCase=\"'object'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm p-4 transition-shadow focus-within:border-indigo-300 dark:focus-within:border-indigo-600 focus-within:ring-2 focus-within:ring-indigo-100 dark:focus-within:ring-indigo-900/40\">\r\n <legend class=\"px-2 text-sm font-bold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</legend>\r\n\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mb-3 mt-1\">{{ schema.description }}</p>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5 mb-3\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <!-- griglia 2 col: i figli semplici occupano 1 col, i complessi 2 col -->\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\" [formGroup]=\"controlAsGroup\">\r\n <ng-container *ngFor=\"let key of objectKeys\">\r\n <div class=\"flex flex-col gap-1\"\r\n [class.sm:col-span-2]=\"!isSimpleChild(key)\">\r\n <div *ngIf=\"isDynamicKey(key)\"\r\n class=\"flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1\">\r\n <span class=\"font-mono text-xs text-slate-500 dark:text-slate-400\">{{ key }}</span>\r\n <button type=\"button\"\r\n class=\"rounded px-1.5 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors\"\r\n (click)=\"removeDynamicKey(key)\">Remove</button>\r\n </div>\r\n <jsm-schema-node\r\n [schema]=\"schemaForKey(key)\"\r\n [control]=\"childControl(key)\"\r\n [parent]=\"controlAsGroup\"\r\n [controlKey]=\"key\"\r\n [path]=\"pathForChild(key)\"\r\n [errorsMap]=\"errorsMap\"\r\n [label]=\"key\"\r\n [required]=\"isRequired(key)\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\">\r\n </jsm-schema-node>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- add dynamic property -->\r\n <div *ngIf=\"canAddProperty\" class=\"mt-4 rounded-lg border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/40 p-3 space-y-2\">\r\n <p class=\"text-[10px] font-bold uppercase tracking-widest text-slate-400 dark:text-slate-500\">Add property</p>\r\n <div class=\"flex gap-2\">\r\n <input\r\n class=\"flex-1 rounded-lg border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-1.5 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 dark:focus:ring-indigo-900/40\"\r\n [(ngModel)]=\"newPropertyKey\" placeholder=\"propertyName\" />\r\n <button type=\"button\"\r\n class=\"rounded-lg bg-indigo-600 px-3 py-1.5 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-700 active:scale-95\"\r\n (click)=\"addDynamicProperty()\">Add</button>\r\n </div>\r\n <p *ngIf=\"propertyError\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <!-- icona errore: unico caso in cui ha senso, segnala un problema -->\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ propertyError }}\r\n </p>\r\n </div>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"mt-3 space-y-1\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </fieldset>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n array — sempre in colonna piena, items in colonna\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'array'\" class=\"space-y-3\">\r\n <div class=\"flex items-start justify-between gap-2\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <!-- icona + nel bottone: indica l'azione \"aggiungi\", non decorativa -->\r\n <button type=\"button\"\r\n class=\"shrink-0 flex items-center gap-1 rounded-lg bg-indigo-600 px-3 py-1.5 text-xs font-semibold text-white shadow-sm transition hover:bg-indigo-700 active:scale-95 disabled:opacity-40 disabled:cursor-not-allowed\"\r\n (click)=\"addArrayItem()\" [disabled]=\"!canAddArrayItem\">\r\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n Add item\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"effectiveSchema.contains\" class=\"rounded-md bg-indigo-50 dark:bg-indigo-900/30 px-3 py-1.5 text-xs text-indigo-700 dark:text-indigo-400\">\r\n Must contain matching item(s)\r\n <span *ngIf=\"effectiveSchema.minContains\"> · min {{ effectiveSchema.minContains }}</span>\r\n <span *ngIf=\"effectiveSchema.maxContains\"> · max {{ effectiveSchema.maxContains }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <div class=\"space-y-2\" *ngIf=\"arrayControls.length > 0; else emptyArray\">\r\n <div *ngFor=\"let item of arrayControls; let i = index\"\r\n class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 p-3 shadow-sm transition focus-within:border-indigo-300 dark:focus-within:border-indigo-600 focus-within:ring-2 focus-within:ring-indigo-100 dark:focus-within:ring-indigo-900/40\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"inline-flex h-5 w-5 items-center justify-center rounded-full bg-indigo-100 dark:bg-indigo-900/50 text-[11px] font-bold text-indigo-600 dark:text-indigo-400\">{{ i + 1 }}</span>\r\n <button type=\"button\"\r\n class=\"rounded-md border border-red-200 dark:border-red-800 px-2 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 transition hover:bg-red-50 dark:hover:bg-red-900/20\"\r\n (click)=\"removeArrayItem(i)\">Remove</button>\r\n </div>\r\n <jsm-schema-node [schema]=\"schemaForIndex(i)\" [control]=\"item\" [parent]=\"controlAsArray\"\r\n [controlKey]=\"i\" [path]=\"pathForChild(i)\" [errorsMap]=\"errorsMap\" [label]=\"label + ' item'\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <ng-template #emptyArray>\r\n <div class=\"flex flex-col items-center gap-2 rounded-xl border border-dashed border-slate-200 dark:border-slate-700 py-8 text-slate-400 dark:text-slate-500 text-xs\">\r\n No items yet — click \"Add item\" to start.\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"space-y-1\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n primitive — sempre in colonna, nessuna icona decorativa.\r\n Icona errore solo nei messaggi di validazione.\r\n Icona chevron nel select: funzionale (indica dropdown).\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchDefault class=\"space-y-1.5\">\r\n <ng-container *ngIf=\"inputKind !== 'checkbox'\">\r\n <label class=\"block text-[13px] font-semibold text-slate-700 dark:text-slate-300\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </label>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 -mt-0.5\">{{ schema.description }}</p>\r\n </ng-container>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <ng-container [ngSwitch]=\"inputKind\">\r\n\r\n <input *ngSwitchCase=\"'text'\"\r\n class=\"w-full rounded-lg border bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-2 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:ring-2\"\r\n [class.border-slate-300]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:border-slate-600]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:border-indigo-400]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:ring-indigo-100]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:focus:ring-indigo-900/40]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:border-red-400]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:ring-red-100]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.type]=\"inputType\"\r\n [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\"\r\n />\r\n\r\n <textarea *ngSwitchCase=\"'textarea'\" rows=\"4\"\r\n class=\"w-full resize-y rounded-lg border bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-2 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:ring-2\"\r\n [class.border-slate-300]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:border-slate-600]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:border-indigo-400]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:ring-indigo-100]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:focus:ring-indigo-900/40]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:border-red-400]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:ring-red-100]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\"\r\n ></textarea>\r\n\r\n <!-- select: il chevron SVG è funzionale, indica che è un dropdown -->\r\n <div *ngSwitchCase=\"'select'\" class=\"relative\">\r\n <select\r\n class=\"w-full appearance-none rounded-lg border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 px-3 py-2 pr-8 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 dark:focus:ring-indigo-900/40\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [formControl]=\"controlAsFormControl\">\r\n <option *ngFor=\"let option of effectiveSchema.enum\" [ngValue]=\"option\">{{ option }}</option>\r\n </select>\r\n <svg class=\"pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 dark:text-slate-500\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n\r\n <!-- checkbox come toggle switch -->\r\n <label *ngSwitchCase=\"'checkbox'\" class=\"inline-flex cursor-pointer items-center gap-2.5\">\r\n <span class=\"relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors\"\r\n [class.bg-indigo-600]=\"controlAsFormControl.value\"\r\n [class.bg-slate-300]=\"!controlAsFormControl.value\"\r\n [class.dark:bg-slate-600]=\"!controlAsFormControl.value\">\r\n <input type=\"checkbox\" class=\"sr-only\" [formControl]=\"controlAsFormControl\" />\r\n <span class=\"inline-block h-4 w-4 transform rounded-full bg-white shadow transition-transform\"\r\n [class.translate-x-4]=\"controlAsFormControl.value\"\r\n [class.translate-x-0.5]=\"!controlAsFormControl.value\"></span>\r\n </span>\r\n <span class=\"text-sm font-medium text-slate-700 dark:text-slate-300\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </span>\r\n </label>\r\n\r\n </ng-container>\r\n\r\n <p *ngIf=\"inputKind === 'checkbox' && schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400\">{{ schema.description }}</p>\r\n\r\n <p *ngIf=\"effectiveSchema.examples?.length\" class=\"text-[11px] text-slate-400 dark:text-slate-500\">\r\n e.g. {{ effectiveSchema.examples?.[0] }}\r\n </p>\r\n\r\n <p *ngIf=\"effectiveSchema.contentMediaType\" class=\"text-[11px] text-slate-400 dark:text-slate-500\">\r\n {{ effectiveSchema.contentMediaType }}<span *ngIf=\"effectiveSchema.contentEncoding\"> ({{ effectiveSchema.contentEncoding }})</span>\r\n </p>\r\n\r\n <!-- icona errore: funzionale, segnala un problema di validazione -->\r\n <div *ngIf=\"errorsForPath.length && controlAsFormControl.dirty\" class=\"space-y-1 pt-0.5\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\r\n <path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaNodeComponent implements OnInit {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input({ required: true }) control!: AbstractControl;\r\n @Input() label = '';\r\n @Input() required = false;\r\n @Input() path = '';\r\n @Input() errorsMap = new Map<string, string[]>();\r\n @Input() parent?: FormGroup | FormArray;\r\n @Input() controlKey?: string | number;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() controlReplaced = new EventEmitter<AbstractControl>();\r\n\r\n selectedOneOf = 0;\r\n selectedAnyOf = new Set<number>();\r\n newPropertyKey = '';\r\n propertyError = '';\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly validation: JsonSchemaValidationService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.schema.anyOf?.length) {\r\n this.selectedAnyOf.add(0);\r\n }\r\n }\r\n\r\n /**\r\n * Determina se un figlio di un object è \"semplice\" (primitive/enum/bool),\r\n * quindi può stare in griglia 2-col, oppure \"complesso\" (object/array/combinator)\r\n * che deve occupare la larghezza piena.\r\n */\r\n isSimpleChild(key: string): boolean {\r\n const childSchema = this.schemaForKey(key);\r\n if (childSchema.oneOf?.length || childSchema.anyOf?.length || childSchema.allOf?.length) return false;\r\n const t = this.schemaService.resolveType(childSchema);\r\n return t !== 'object' && t !== 'array';\r\n }\r\n\r\n badgeClass(badge: string): Record<string, boolean> {\r\n return {\r\n 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400': badge === 'Deprecated',\r\n 'bg-slate-100 text-slate-600 dark:bg-slate-700 dark:text-slate-400': badge === 'Read-only' || badge === 'Nullable',\r\n 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400': badge === 'Write-only',\r\n 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400': badge === 'Not constraint',\r\n };\r\n }\r\n\r\n get nodeKind(): 'oneOf' | 'anyOf' | 'allOf' | 'object' | 'array' | 'primitive' {\r\n if (this.schema.oneOf?.length) return 'oneOf';\r\n if (this.schema.anyOf?.length) return 'anyOf';\r\n if (this.schema.allOf?.length) return 'allOf';\r\n const resolved = this.resolvedType;\r\n if (resolved === 'object') return 'object';\r\n if (resolved === 'array') return 'array';\r\n return 'primitive';\r\n }\r\n\r\n get resolvedType(): JsonSchema['type'] | 'enum' {\r\n return this.schemaService.resolveType(this.effectiveSchema) ?? 'string';\r\n }\r\n\r\n get inputKind(): 'text' | 'textarea' | 'select' | 'checkbox' {\r\n if (this.effectiveSchema.enum) return 'select';\r\n if (this.resolvedType === 'boolean') return 'checkbox';\r\n if (this.effectiveSchema.format === 'textarea' || (this.effectiveSchema.maxLength ?? 0) > 200) return 'textarea';\r\n return 'text';\r\n }\r\n\r\n get inputType(): string {\r\n if (this.effectiveSchema.format === 'email') return 'email';\r\n if (this.effectiveSchema.format === 'date') return 'date';\r\n if (this.effectiveSchema.format === 'time') return 'time';\r\n if (this.effectiveSchema.format === 'date-time') return 'datetime-local';\r\n if (this.resolvedType === 'number' || this.resolvedType === 'integer') return 'number';\r\n if (this.effectiveSchema.format === 'password') return 'password';\r\n return 'text';\r\n }\r\n\r\n get controlAsGroup(): FormGroup { return this.control as FormGroup; }\r\n get controlAsFormControl(): FormControl { return this.control as FormControl; }\r\n get controlAsArray(): FormArray { return this.control as FormArray; }\r\n get arrayControls(): AbstractControl[] { return this.controlAsArray.controls; }\r\n get objectKeys(): string[] { return Object.keys(this.controlAsGroup.controls); }\r\n\r\n get canAddProperty(): boolean {\r\n if (!this.allowAdditionalProperties) return false;\r\n return this.effectiveSchema.additionalProperties !== false || !!this.effectiveSchema.patternProperties;\r\n }\r\n\r\n get errorsForPath(): string[] { return this.errorsMap.get(this.path) ?? []; }\r\n\r\n get metaBadges(): string[] {\r\n const badges: string[] = [];\r\n if (this.effectiveSchema.deprecated) badges.push('Deprecated');\r\n if (this.effectiveSchema.readOnly) badges.push('Read-only');\r\n if (this.effectiveSchema.writeOnly) badges.push('Write-only');\r\n if (this.effectiveSchema.nullable) badges.push('Nullable');\r\n if (this.effectiveSchema.not) badges.push('Not constraint');\r\n return badges;\r\n }\r\n\r\n get activeVariant(): JsonSchema | null {\r\n if (this.schema.oneOf?.length) return this.schema.oneOf[this.selectedOneOf] ?? null;\r\n if (this.schema.anyOf?.length) {\r\n const selections = Array.from(this.selectedAnyOf).map((i) => this.schema.anyOf![i]);\r\n return selections.length ? this.mergeSchemas(selections) : this.schema.anyOf[0] ?? null;\r\n }\r\n if (this.schema.allOf?.length) return this.mergeSchemas([this.schema, ...this.schema.allOf]);\r\n return this.effectiveSchema;\r\n }\r\n\r\n get mergedAllOf(): JsonSchema[] {\r\n return this.schema.allOf?.length ? [this.schema, ...this.schema.allOf] : [this.schema];\r\n }\r\n\r\n isRequired(key: string): boolean { return this.effectiveSchema.required?.includes(key) ?? false; }\r\n\r\n schemaForKey(key: string): JsonSchema {\r\n return (\r\n this.effectiveSchema.properties?.[key] ??\r\n this.schemaService.resolveDynamicSchema(this.effectiveSchema, key) ??\r\n {}\r\n );\r\n }\r\n\r\n isDynamicKey(key: string): boolean { return !this.effectiveSchema.properties?.[key]; }\r\n\r\n pathForChild(key: string | number): string {\r\n return this.path === '' ? `/${key}` : `${this.path}/${key}`;\r\n }\r\n\r\n addDynamicProperty(): void {\r\n this.propertyError = '';\r\n const key = this.newPropertyKey.trim();\r\n if (!key) { this.propertyError = 'Property name is required.'; return; }\r\n if (this.effectiveSchema.propertyNames) {\r\n const nameErrors = this.validation.validate(this.effectiveSchema.propertyNames, key);\r\n if (nameErrors.length) { this.propertyError = 'Property name does not match schema constraints.'; return; }\r\n }\r\n if (this.controlAsGroup.contains(key)) { this.propertyError = 'Property already exists.'; return; }\r\n const schemaForKey = this.schemaService.resolveDynamicSchema(this.effectiveSchema, key);\r\n if (!schemaForKey) { this.propertyError = 'This property is not allowed by the schema.'; return; }\r\n const control = this.schemaService.buildControl(schemaForKey, undefined, false);\r\n this.controlAsGroup.addControl(key, control);\r\n this.newPropertyKey = '';\r\n }\r\n\r\n removeDynamicKey(key: string): void { this.controlAsGroup.removeControl(key); }\r\n\r\n schemaForIndex(index: number): JsonSchema {\r\n const prefixItems = this.effectiveSchema.prefixItems ?? [];\r\n if (prefixItems[index]) return prefixItems[index];\r\n if (this.effectiveSchema.items && this.effectiveSchema.items !== true) return this.effectiveSchema.items as JsonSchema;\r\n if (this.effectiveSchema.additionalItems && this.effectiveSchema.additionalItems !== true) return this.effectiveSchema.additionalItems as JsonSchema;\r\n if (this.effectiveSchema.unevaluatedItems && this.effectiveSchema.unevaluatedItems !== true) return this.effectiveSchema.unevaluatedItems as JsonSchema;\r\n return {};\r\n }\r\n\r\n get canAddArrayItem(): boolean {\r\n return !(\r\n this.effectiveSchema.items === false ||\r\n this.effectiveSchema.additionalItems === false ||\r\n this.effectiveSchema.unevaluatedItems === false\r\n );\r\n }\r\n\r\n addArrayItem(): void {\r\n if (!this.canAddArrayItem) return;\r\n const formArray = this.controlAsArray;\r\n const index = formArray.length;\r\n formArray.push(this.schemaService.buildControl(this.schemaForIndex(index), undefined, false));\r\n formArray.markAsDirty();\r\n }\r\n\r\n removeArrayItem(index: number): void {\r\n this.controlAsArray.removeAt(index);\r\n this.controlAsArray.markAsDirty();\r\n }\r\n\r\n onOneOfChange(): void {\r\n if (!this.activeVariant) return;\r\n this.replaceControl(this.schemaService.buildControl(this.activeVariant, this.control.value, this.required));\r\n }\r\n\r\n toggleAnyOf(index: number): void {\r\n if (this.selectedAnyOf.has(index)) this.selectedAnyOf.delete(index);\r\n else this.selectedAnyOf.add(index);\r\n const variant = this.activeVariant;\r\n if (variant) this.replaceControl(this.schemaService.buildControl(variant, this.control.value, this.required));\r\n }\r\n\r\n private replaceControl(control: AbstractControl): void {\r\n if (this.parent) {\r\n if (this.parent instanceof FormGroup && typeof this.controlKey === 'string') this.parent.setControl(this.controlKey, control);\r\n if (this.parent instanceof FormArray && typeof this.controlKey === 'number') this.parent.setControl(this.controlKey, control);\r\n this.control = control;\r\n return;\r\n }\r\n this.control = control;\r\n this.controlReplaced.emit(control);\r\n }\r\n\r\n childControl(key: string): AbstractControl { return this.controlAsGroup.get(key) as AbstractControl; }\r\n\r\n get effectiveSchema(): JsonSchema {\r\n let schema = this.schema;\r\n if (schema.allOf?.length) schema = this.mergeSchemas([schema, ...schema.allOf]);\r\n schema = this.applyConditional(schema);\r\n schema = this.applyDependencies(schema);\r\n return schema;\r\n }\r\n\r\n private applyConditional(schema: JsonSchema): JsonSchema {\r\n if (!schema.if) return schema;\r\n const errors = this.validation.validate(schema.if, this.control.value);\r\n const branch = errors.length === 0 ? schema.then : schema.else;\r\n if (!branch) return schema;\r\n return this.mergeSchemas([schema, branch]);\r\n }\r\n\r\n private applyDependencies(schema: JsonSchema): JsonSchema {\r\n const value = this.control.value;\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return schema;\r\n let merged = { ...schema } as JsonSchema;\r\n const valueKeys = Object.keys(value as Record<string, unknown>);\r\n if (schema.dependentRequired) {\r\n for (const key of valueKeys) {\r\n const required = schema.dependentRequired[key];\r\n if (required?.length) merged = this.mergeSchemas([merged, { required }]);\r\n }\r\n }\r\n if (schema.dependentSchemas) {\r\n for (const key of valueKeys) {\r\n const depSchema = schema.dependentSchemas[key];\r\n if (depSchema) merged = this.mergeSchemas([merged, depSchema]);\r\n }\r\n }\r\n if (schema.dependencies) {\r\n for (const key of valueKeys) {\r\n const dep = schema.dependencies[key];\r\n if (Array.isArray(dep)) merged = this.mergeSchemas([merged, { required: dep }]);\r\n else if (dep) merged = this.mergeSchemas([merged, dep]);\r\n }\r\n }\r\n return merged;\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, schema) => {\r\n const merged: JsonSchema = {\r\n ...acc,\r\n ...schema,\r\n properties: { ...(acc.properties ?? {}), ...(schema.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(schema.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(schema.required ?? [])])),\r\n };\r\n if (acc.type && schema.type) {\r\n const accTypes = Array.isArray(acc.type) ? acc.type : [acc.type];\r\n const schemaTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\r\n merged.type = Array.from(new Set([...accTypes, ...schemaTypes])) as JsonSchemaType[];\r\n }\r\n return merged;\r\n }, {} as JsonSchema);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchema, SchemaError } from './types';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\nimport { JsonSchemaResolverService } from './json-schema-resolver.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\n\r\n@Component({\r\n selector: 'jsm-json-schema-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, JsonSchemaNodeComponent],\r\n template: `\r\n <form class=\"w-full space-y-5\">\r\n <div *ngIf=\"resolvedSchema?.title || resolvedSchema?.description\" class=\"space-y-0.5\">\r\n <h2 class=\"text-lg font-bold tracking-tight text-slate-900 dark:text-white\">{{ resolvedSchema?.title || 'Form' }}</h2>\r\n <p *ngIf=\"resolvedSchema?.description\" class=\"text-sm text-slate-500 dark:text-slate-400\">{{ resolvedSchema?.description }}</p>\r\n </div>\r\n\r\n <div *ngIf=\"loading\" class=\"flex items-center gap-2 py-6 text-sm text-slate-500 dark:text-slate-400\" aria-live=\"polite\">\r\n <svg class=\"h-4 w-4 animate-spin text-indigo-500 dark:text-indigo-400\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"/>\r\n </svg>\r\n Resolving schema&hellip;\r\n </div>\r\n\r\n <!-- schema structural errors panel -->\r\n <div *ngIf=\"schemaErrorList.length > 0 && !loading\"\r\n class=\"rounded-xl border border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-900/20 p-4 space-y-3\"\r\n role=\"alert\">\r\n <div class=\"flex items-center gap-2\">\r\n <svg class=\"w-4 h-4 shrink-0 text-amber-600 dark:text-amber-400\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 2L1.5 13.5h13L8 2z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\r\n <path d=\"M8 6v3.5M8 11.5v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <span class=\"text-sm font-semibold text-amber-800 dark:text-amber-300\">\r\n Schema errors ({{ schemaErrorList.length }})\r\n </span>\r\n </div>\r\n <p class=\"text-xs text-amber-700 dark:text-amber-400\">\r\n The schema has structural issues. Fix them to get a valid form.\r\n </p>\r\n <div class=\"space-y-2\">\r\n <div *ngFor=\"let err of schemaErrorList\"\r\n class=\"rounded-lg border border-amber-200 dark:border-amber-800 bg-white dark:bg-slate-900 px-3 py-2 space-y-0.5\">\r\n <p class=\"font-mono text-[11px] font-semibold text-amber-700 dark:text-amber-400\">{{ err.path }}</p>\r\n <p class=\"text-xs text-slate-700 dark:text-slate-300\">{{ err.message }}</p>\r\n <p class=\"text-[10px] uppercase tracking-wide text-slate-400 dark:text-slate-500\">keyword: {{ err.keyword }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"form && resolvedSchema && !loading\" class=\"space-y-5\" [formGroup]=\"form\">\r\n <jsm-schema-node\r\n [schema]=\"resolvedSchema\"\r\n [control]=\"rootControl\"\r\n [path]=\"''\"\r\n [errorsMap]=\"errorsMap\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n label=\"Root\"\r\n (controlReplaced)=\"onRootReplaced($event)\"\r\n ></jsm-schema-node>\r\n </div>\r\n </form>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaFormComponent implements OnChanges, OnDestroy {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input() value?: unknown;\r\n @Input() data?: unknown;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() formReady = new EventEmitter<FormGroup>();\r\n @Output() valueChange = new EventEmitter<unknown>();\r\n @Output() schemaReady = new EventEmitter<JsonSchema>();\r\n @Output() schemaErrors = new EventEmitter<SchemaError[]>();\r\n\r\n form!: FormGroup;\r\n rootControl!: AbstractControl;\r\n resolvedSchema?: JsonSchema;\r\n errorsMap = new Map<string, string[]>();\r\n schemaErrorList: SchemaError[] = [];\r\n loading = false;\r\n\r\n private valueSub?: Subscription;\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly resolver: JsonSchemaResolverService,\r\n private readonly validation: JsonSchemaValidationService\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] || changes['value'] || changes['data']) {\r\n void this.buildForm();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.valueSub?.unsubscribe();\r\n }\r\n\r\n private async buildForm(): Promise<void> {\r\n this.valueSub?.unsubscribe();\r\n this.loading = true;\r\n this.resolvedSchema = await this.resolver.resolve(this.schema, this.schema?.$id);\r\n\r\n // Validate the schema itself and emit any structural errors\r\n const schemaErrs = this.validation.validateSchema(this.resolvedSchema);\r\n this.schemaErrorList = schemaErrs;\r\n this.schemaErrors.emit(schemaErrs);\r\n\r\n this.schemaReady.emit(this.resolvedSchema);\r\n\r\n // If the schema has structural errors, stop here — don't try to build the form\r\n if (schemaErrs.length > 0) {\r\n this.form = undefined!;\r\n this.loading = false;\r\n return;\r\n }\r\n const initialData = this.value !== undefined ? this.value : this.data;\r\n this.rootControl = this.schemaService.buildControl(this.resolvedSchema, initialData);\r\n this.form = this.rootControl instanceof FormGroup ? this.rootControl : new FormGroup({ value: this.rootControl });\r\n this.formReady.emit(this.form);\r\n this.loading = false;\r\n\r\n this.attachValueSub();\r\n }\r\n\r\n private updateErrors(): void {\r\n if (!this.resolvedSchema) {\r\n this.errorsMap = new Map();\r\n return;\r\n }\r\n\r\n const errors = this.validation.validate(this.resolvedSchema, this.rootControl.value);\r\n const map = new Map<string, string[]>();\r\n\r\n for (const error of errors) {\r\n const path = error.instancePath ?? '';\r\n const messages = map.get(path) ?? [];\r\n messages.push(error.message ?? error.keyword);\r\n map.set(path, messages);\r\n }\r\n\r\n this.errorsMap = map;\r\n }\r\n\r\n onRootReplaced(control: AbstractControl): void {\r\n this.rootControl = control;\r\n if (control instanceof FormGroup) {\r\n this.form = control;\r\n } else {\r\n if (!(this.form instanceof FormGroup) || !this.form.contains('value')) {\r\n this.form = new FormGroup({ value: control });\r\n } else {\r\n this.form.setControl('value', control);\r\n }\r\n }\r\n this.attachValueSub();\r\n }\r\n\r\n private attachValueSub(): void {\r\n this.valueSub?.unsubscribe();\r\n this.updateErrors();\r\n this.valueSub = this.form.valueChanges.subscribe(() => {\r\n this.updateErrors();\r\n this.valueChange.emit(this.rootControl.value);\r\n });\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { JsonSchemaFormComponent } from './json-schema-form.component';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\n\r\n@NgModule({\r\n imports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n exports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n})\r\nexport class JsonSchemaFormModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.JsonSchemaFormService","i2.JsonSchemaValidationService","i2.JsonSchemaResolverService","i3.JsonSchemaValidationService","i4","i5"],"mappings":";;;;;;;;;;;;MAca,qBAAqB,CAAA;AAChC,IAAA,YAAY,CAAC,MAAkB,EAAE,KAAe,EAAE,QAAQ,GAAG,KAAK,EAAA;QAChE,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;AAEtD,QAAA,IAAI,YAAY,KAAK,QAAQ,EAAE;YAC7B,MAAM,KAAK,GAAoC,EAAE;AACjD,YAAA,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,IAAI,EAAE;YACnD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC9D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AAErD,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC9D,gBAAA,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;AACnC,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrF;;YAGA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC1C,gBAAA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;oBACd;gBACF;gBACA,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,GAAG,CAAC;AACrE,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;YAC9E;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE;gBACnC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC;AAC5D,aAAA,CAAC;AACF,YAAA,IAAI,eAAe,CAAC,QAAQ,EAAE;gBAC5B,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACvC;AACA,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,IAAI,YAAY,KAAK,OAAO,EAAE;YAC5B,MAAM,QAAQ,GAAsB,EAAE;AACtC,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACtD,YAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,IAAI,CAAC;AAC9C,YAAA,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,IAAI,EAAE;AACrD,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC;AAE/E,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE;AACvC,gBAAA,MAAM,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAqC;AAChG,gBAAA,IAAI,UAAU,KAAK,KAAK,EAAE;oBACxB;gBACF;AACA,gBAAA,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;AACjC,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAE,UAAyB,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACtF;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE;gBACtC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC;AAC5D,aAAA,CAAC;AACF,YAAA,IAAI,eAAe,CAAC,QAAQ,EAAE;gBAC5B,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACvC;AACA,YAAA,OAAO,OAAO;QAChB;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,KAAK,CAAC;AACrE,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE;YAC5C,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,EAAE,YAAY,CAAC;AACzE,YAAA,WAAW,EAAE,KAAK;AACnB,SAAA,CAAC;QAEF,IAAI,eAAe,CAAC,QAAQ,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE;YACnE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACvC;AAEA,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,WAAW,CAAC,MAAkB,EAAA;AAC5B,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;YACf,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC9B,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,MAAM,CAAC;gBAC7D,OAAO,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC;YAEA,OAAO,MAAM,CAAC,IAAI;QACpB;AAEA,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,oBAAoB,EAAE;AAChF,YAAA,OAAO,QAAQ;QACjB;QAEA,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE;AACtC,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEQ,IAAA,gBAAgB,CAAC,MAAkB,EAAA;QACzC,IAAI,SAAS,GAAG,MAAM;AACtB,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AACxB,YAAA,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1D;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AACxB,YAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B;AACA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AACxB,YAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B;AACA,QAAA,OAAO,SAAS;IAClB;IAEA,oBAAoB,CAAC,MAAkB,EAAE,GAAW,EAAA;AAClD,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE;AACrD,QAAA,KAAK,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;AACrE,YAAA,IAAI;AACF,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC;AACjC,gBAAA,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACnB,oBAAA,OAAO,aAAa;gBACtB;YACF;AAAE,YAAA,MAAM;;YAER;QACF;AAEA,QAAA,IAAI,MAAM,CAAC,oBAAoB,KAAK,IAAI,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE;AACrF,YAAA,OAAO,EAAE;QACX;QAEA,IAAI,MAAM,CAAC,oBAAoB,IAAI,OAAO,MAAM,CAAC,oBAAoB,KAAK,QAAQ,EAAE;YAClF,OAAO,MAAM,CAAC,oBAAoB;QACpC;QAEA,IAAI,MAAM,CAAC,qBAAqB,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,QAAQ,EAAE;YACpF,OAAO,MAAM,CAAC,qBAAqB;QACrC;AACA,QAAA,IAAI,MAAM,CAAC,qBAAqB,KAAK,IAAI,EAAE;AACzC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,SAAS;IAClB;IAEQ,mBAAmB,CAAC,MAAkB,EAAE,KAAe,EAAA;AAC7D,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;YAC9B,OAAO,MAAM,CAAC,KAAK;QACrB;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;YAChC,OAAO,MAAM,CAAC,OAAO;QACvB;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACvB;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;AAC3B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,eAAe,CACrB,MAAkB,EAClB,QAAiB,EACjB,YAA0C,EAAA;QAE1C,MAAM,UAAU,GAAkB,EAAE;QAEpC,IAAI,QAAQ,EAAE;AACZ,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC;AAEA,QAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;AAClC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzD;AAEA,QAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;AAClC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzD;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;AAChC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE;AAChC,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD;AAEA,QAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACzC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK;AACzE,kBAAE;kBACA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;AAC/B,sBAAE;AACF,sBAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CACjC;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACzC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK;AACzE,kBAAE;kBACA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;AAC/B,sBAAE;AACF,sBAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CACjC;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;AACnC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE;AACjF,oBAAA,OAAO,IAAI;gBACb;gBACA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AAC1C,gBAAA,OAAO,YAAY,GAAG,MAAM,CAAC,UAAW,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE;AAC9E,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD;AAEA,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE;AAC7B,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACnC;AAEA,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE;YACjC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AAC5D,kBAAE,EAAE,QAAQ,EAAE,IAAI;kBAChB,IAAI,CACT;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE;YACjC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KACtB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AAC5D,kBAAE,EAAE,QAAQ,EAAE,IAAI;kBAChB,IAAI,CACT;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;gBAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACjC,oBAAA,OAAO,IAAI;gBACb;gBACA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzE,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE;AAC5E,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE;AACtC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;AACvD,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;AAChD,sBAAE,EAAE,aAAa,EAAE,IAAI;sBACrB,IAAI;AACV,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE;AACtC,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;AACvD,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;AAChD,sBAAE,EAAE,aAAa,EAAE,IAAI;sBACrB,IAAI;AACV,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9B,YAAA,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAC1B,gBAAA,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE;AACjF,oBAAA,OAAO,IAAI;gBACb;gBAEA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AAC1C,gBAAA,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;AAClE,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,OAAO,UAAU;IACnB;AAEQ,IAAA,QAAQ,CAAC,KAAc,EAAA;AAC7B,QAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACtE;AAEQ,IAAA,YAAY,CAAC,OAAqB,EAAA;QACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,KAAI;AACpC,YAAA,MAAM,MAAM,GAAe;AACzB,gBAAA,GAAG,GAAG;AACN,gBAAA,GAAG,MAAM;AACT,gBAAA,UAAU,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;AACvE,gBAAA,iBAAiB,EAAE,EAAE,IAAI,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE;AAC5F,gBAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;aACrF;AACD,YAAA,OAAO,MAAM;QACf,CAAC,EAAE,EAAgB,CAAC;IACtB;wGAtUW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;4FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCPY,yBAAyB,CAAA;AACpC,IAAA,MAAM,OAAO,CAAC,MAAkB,EAAE,OAAgB,EAAA;QAChD,MAAM,QAAQ,GAAG,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,EAAE;AAC5C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB;AAChD,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsB;AACnD,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;IAC9E;IAEQ,MAAM,WAAW,CACvB,OAAmB,EACnB,IAAgB,EAChB,OAAe,EACf,UAAmC,EACnC,aAAsC,EAAA;QAEtC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC3C,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,IAAI,OAAO,CAAC,IAAI,EAAE;AAChB,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI;AACxB,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACxB,gBAAA,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACvB,oBAAA,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE;gBAC7B;gBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC/C,IAAI,QAAQ,EAAE;AACZ,oBAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC7B,oBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;gBAC7E;YACF;iBAAO;AACL,gBAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC;gBACvF,IAAI,QAAQ,EAAE;AACZ,oBAAA,OAAO,QAAQ;gBACjB;YACF;QACF;AAEA,QAAA,MAAM,IAAI,GAAe,EAAE,GAAG,OAAO,EAAE;AAEvC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBAC1D,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QAC/C;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBACjE,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACtD;QAEA,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;YAChD,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACzG;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CACjG;QACH;QAEA,IAAI,IAAI,CAAC,oBAAoB,IAAI,OAAO,IAAI,CAAC,oBAAoB,KAAK,QAAQ,EAAE;YAC9E,IAAI,CAAC,oBAAoB,GAAG,MAAM,IAAI,CAAC,WAAW,CAChD,IAAI,CAAC,oBAAoB,EACzB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,aAAa,CACd;QACH;QAEA,IAAI,IAAI,CAAC,eAAe,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;YACpE,IAAI,CAAC,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAC3C,IAAI,CAAC,eAAe,EACpB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,aAAa,CACd;QACH;QAEA,IAAI,IAAI,CAAC,qBAAqB,IAAI,OAAO,IAAI,CAAC,qBAAqB,KAAK,QAAQ,EAAE;YAChF,IAAI,CAAC,qBAAqB,GAAG,MAAM,IAAI,CAAC,WAAW,CACjD,IAAI,CAAC,qBAAqB,EAC1B,IAAI,EACJ,OAAO,EACP,UAAU,EACV,aAAa,CACd;QACH;QAEA,IAAI,IAAI,CAAC,gBAAgB,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;YACtE,IAAI,CAAC,gBAAgB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACjH;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACjG;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAC3F;QACH;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAC3F;QACH;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAC3F;QACH;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACvF;AAEA,QAAA,IAAI,IAAI,CAAC,EAAE,EAAE;YACX,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACrF;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACzF;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACzF;AAEA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC3D,gBAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/D,oBAAA,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,KAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;gBACrG;AACA,gBAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YACrB,CAAC,CAAC,CACH;YACD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACjD;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBAChE,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACrD;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBACrD,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QAC1C;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;gBAC3D,GAAG;AACH,gBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;AACxE,aAAA,CAAC,CACH;YACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QAChD;AAEA,QAAA,OAAO,IAAI;IACb;IAEQ,MAAM,kBAAkB,CAC9B,GAAW,EACX,OAAe,EACf,aAAsC,EACtC,UAAmC,EAAA;AAEnC,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AACpE,YAAA,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAC1B,gBAAA,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAE;YAChC;AAEA,YAAA,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACxD,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,IAAI;YACb;AAEA,YAAA,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM;YACxE,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC;AACrG,YAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AAChC,YAAA,OAAO,QAAQ;QACjB;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,MAAM,WAAW,CAAC,GAAW,EAAA;AACnC,QAAA,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAE,GAAG,IAAI;AAC7D,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC;AAC/E,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzC;QACA,MAAM,MAAM,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe;AACpD,QAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC7B;IAEQ,cAAc,CAAC,IAAgB,EAAE,GAAW,EAAA;QAClD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACvC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5F,IAAI,OAAO,GAAQ,IAAI;AACvB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,IAAI,IAAI,OAAO,EAAE;AAC7D,gBAAA,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YACzB;iBAAO;AACL,gBAAA,OAAO,IAAI;YACb;QACF;AACA,QAAA,OAAO,OAAqB;IAC9B;wGAhPW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cAFxB,MAAM,EAAA,CAAA;;4FAEP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAHrC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCQY,2BAA2B,CAAA;AACrB,IAAA,QAAQ,GAAG,IAAI,GAAG,EAAwB;IAE3D,QAAQ,CAAC,MAAkB,EAAE,KAAc,EAAA;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAgB,CAAC;AAC9C,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,IAAI,KAAK,EAAE;AACT,YAAA,OAAO,EAAE;QACX;AACA,QAAA,OAAO,QAAQ,CAAC,MAAM,IAAI,EAAE;IAC9B;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,MAAkB,EAAA;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAE9B,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,MAAgB,CAAC;AAClD,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;AACpC,gBAAA,IAAI,EAAE,CAAC,CAAC,YAAY,IAAI,GAAG;AAC3B,gBAAA,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;gBAC/B,OAAO,EAAE,CAAC,CAAC,OAAO;AACnB,aAAA,CAAC,CAAC;QACL;QAAE,OAAO,CAAC,EAAE;;;AAGV,YAAA,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;;YAEtD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;;AAEvD,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAClC,gBAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE;gBAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC;AACpD,gBAAA,OAAO;AACL,sBAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ;AACpF,sBAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;AACxD,YAAA,CAAC,CAAC;QACJ;IACF;AAEA,IAAA,WAAW,CAAC,MAAkB,EAAA;AAC5B,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE;AACrC,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAChC,YAAA,OAAO,WAAW;QACpB;AACA,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAChC,YAAA,OAAO,WAAW;QACpB;AAEA,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,OAAO,WAAW;QACpB;AACA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,OAAO,WAAW;IACpB;AAEQ,IAAA,MAAM,CAAC,KAAsB,EAAA;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE;QAClC;AAEA,QAAA,IAAI,GAAQ;QACZ,QAAQ,KAAK;AACX,YAAA,KAAK,QAAQ;gBACX,GAAG,GAAG,IAAI,UAAU,CAAC;AACnB,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;gBACF;AACF,YAAA,KAAK,WAAW;gBACd,GAAG,GAAG,IAAI,OAAO,CAAC;AAChB,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;gBACF;AACF,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,QAAQ;gBACX,GAAG,GAAG,IAAI,GAAG,CAAC;AACZ,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;gBACF;AACF,YAAA,KAAK,WAAW;AAChB,YAAA;gBACE,GAAG,GAAG,IAAI,OAAO,CAAC;AAChB,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;;QAGN,UAAU,CAAC,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;AAC7B,QAAA,OAAO,GAAG;IACZ;wGApHW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA;;4FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCiWY,uBAAuB,CAAA;AAmBf,IAAA,aAAA;AACA,IAAA,UAAA;AAnBQ,IAAA,MAAM;AACN,IAAA,OAAO;IACzB,KAAK,GAAG,EAAE;IACV,QAAQ,GAAG,KAAK;IAChB,IAAI,GAAG,EAAE;AACT,IAAA,SAAS,GAAG,IAAI,GAAG,EAAoB;AACvC,IAAA,MAAM;AACN,IAAA,UAAU;IACV,yBAAyB,GAAG,KAAK;AAEhC,IAAA,eAAe,GAAG,IAAI,YAAY,EAAmB;IAE/D,aAAa,GAAG,CAAC;AACjB,IAAA,aAAa,GAAG,IAAI,GAAG,EAAU;IACjC,cAAc,GAAG,EAAE;IACnB,aAAa,GAAG,EAAE;IAElB,WAAA,CACmB,aAAoC,EACpC,UAAuC,EAAA;QADvC,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,UAAU,GAAV,UAAU;IAC1B;IAEH,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B;IACF;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,KAAK;QACrG,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC;AACrD,QAAA,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO;IACxC;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,OAAO;YACL,sEAAsE,EAAE,KAAK,KAAK,YAAY;AAC9F,YAAA,mEAAmE,EAAK,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,UAAU;YACrH,kEAAkE,EAAM,KAAK,KAAK,YAAY;YAC9F,8DAA8D,EAAU,KAAK,KAAK,gBAAgB;SACnG;IACH;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,OAAO;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY;QAClC,IAAI,QAAQ,KAAK,QAAQ;AAAE,YAAA,OAAO,QAAQ;QAC1C,IAAI,QAAQ,KAAK,OAAO;AAAE,YAAA,OAAO,OAAO;AACxC,QAAA,OAAO,WAAW;IACpB;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,QAAQ;IACzE;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI;AAAE,YAAA,OAAO,QAAQ;AAC9C,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AAAE,YAAA,OAAO,UAAU;AACtD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI,CAAC,IAAI,GAAG;AAAE,YAAA,OAAO,UAAU;AAChH,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,OAAO;AAAE,YAAA,OAAO,OAAO;AAC3D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,MAAM;AACzD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,MAAM;AACzD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,gBAAgB;QACxE,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AAAE,YAAA,OAAO,QAAQ;AACtF,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,UAAU;AAAE,YAAA,OAAO,UAAU;AACjE,QAAA,OAAO,MAAM;IACf;IAEA,IAAI,cAAc,KAAgB,OAAO,IAAI,CAAC,OAAoB,CAAC,CAAC;IACpE,IAAI,oBAAoB,KAAkB,OAAO,IAAI,CAAC,OAAsB,CAAC,CAAC;IAC9E,IAAI,cAAc,KAAgB,OAAO,IAAI,CAAC,OAAoB,CAAC,CAAC;IACpE,IAAI,aAAa,GAAA,EAAwB,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC9E,IAAA,IAAI,UAAU,GAAA,EAAe,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE/E,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,yBAAyB;AAAE,YAAA,OAAO,KAAK;AACjD,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,iBAAiB;IACxG;AAEA,IAAA,IAAI,aAAa,GAAA,EAAe,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAE5E,IAAA,IAAI,UAAU,GAAA;QACZ,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC9D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC7D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;AAC1D,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3D,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI;QACnF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;YAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC;YACnF,OAAO,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QACzF;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,eAAe;IAC7B;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IACxF;AAEA,IAAA,UAAU,CAAC,GAAW,EAAA,EAAa,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;AAEjG,IAAA,YAAY,CAAC,GAAW,EAAA;QACtB,QACE,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,GAAG,CAAC;YACtC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;AAClE,YAAA,EAAE;IAEN;AAEA,IAAA,YAAY,CAAC,GAAW,EAAA,EAAa,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC;AAErF,IAAA,YAAY,CAAC,GAAoB,EAAA;QAC/B,OAAO,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE;IAC7D;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;QACtC,IAAI,CAAC,GAAG,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,4BAA4B;YAAE;QAAQ;AACvE,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE;AACtC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC;AACpF,YAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AAAE,gBAAA,IAAI,CAAC,aAAa,GAAG,kDAAkD;gBAAE;YAAQ;QAC5G;QACA,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,0BAA0B;YAAE;QAAQ;AAClG,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;QACvF,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,6CAA6C;YAAE;QAAQ;AACjG,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC;QAC/E,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;AAC5C,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;IAC1B;AAEA,IAAA,gBAAgB,CAAC,GAAW,EAAA,EAAU,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9E,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,IAAI,EAAE;QAC1D,IAAI,WAAW,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,WAAW,CAAC,KAAK,CAAC;AACjD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAmB;AACtH,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,eAAe,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,eAA6B;AACpJ,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,gBAA8B;AACvJ,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,EACL,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,KAAK;AACpC,YAAA,IAAI,CAAC,eAAe,CAAC,eAAe,KAAK,KAAK;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,KAAK,KAAK,CAChD;IACH;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;AAC3B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc;AACrC,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM;QAC9B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7F,SAAS,CAAC,WAAW,EAAE;IACzB;AAEA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;IACnC;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;QACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7G;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;AAClC,QAAA,IAAI,OAAO;YAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/G;AAEQ,IAAA,cAAc,CAAC,OAAwB,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,IAAI,CAAC,MAAM,YAAY,SAAS,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YAC7H,IAAI,IAAI,CAAC,MAAM,YAAY,SAAS,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;AAC7H,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO;YACtB;QACF;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,YAAY,CAAC,GAAW,EAAA,EAAqB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAoB,CAAC,CAAC;AAErG,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;AACxB,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/E,QAAA,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACtC,QAAA,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;AACvC,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,gBAAgB,CAAC,MAAkB,EAAA;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE;AAAE,YAAA,OAAO,MAAM;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACtE,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AAC9D,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,MAAM;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;AAEQ,IAAA,iBAAiB,CAAC,MAAkB,EAAA;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;AAChC,QAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;AAC9E,QAAA,IAAI,MAAM,GAAG,EAAE,GAAG,MAAM,EAAgB;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC;AAC/D,QAAA,IAAI,MAAM,CAAC,iBAAiB,EAAE;AAC5B,YAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;gBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBAC9C,IAAI,QAAQ,EAAE,MAAM;AAAE,oBAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E;QACF;AACA,QAAA,IAAI,MAAM,CAAC,gBAAgB,EAAE;AAC3B,YAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;gBAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC9C,gBAAA,IAAI,SAAS;oBAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAChE;QACF;AACA,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,YAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;gBAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;AACpC,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAAE,oBAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1E,qBAAA,IAAI,GAAG;oBAAE,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzD;QACF;AACA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,YAAY,CAAC,OAAqB,EAAA;QACxC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,KAAI;AACpC,YAAA,MAAM,MAAM,GAAe;AACzB,gBAAA,GAAG,GAAG;AACN,gBAAA,GAAG,MAAM;AACT,gBAAA,UAAU,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;AACvE,gBAAA,iBAAiB,EAAE,EAAE,IAAI,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE;AAC5F,gBAAA,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;aACrF;YACD,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;gBAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAChE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5E,gBAAA,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC,CAAqB;YACtF;AACA,YAAA,OAAO,MAAM;QACf,CAAC,EAAE,EAAgB,CAAC;IACtB;wGA1QW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,2BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3VxB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwVT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGU,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,QAAA,EAAA,YAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5VxB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,s1CAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA4V7C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA/VnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,CAAC;AACzD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwVT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;;sBAEE,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;;MCzSU,uBAAuB,CAAA;AAqBf,IAAA,aAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AAtBQ,IAAA,MAAM;AACxB,IAAA,KAAK;AACL,IAAA,IAAI;IACJ,yBAAyB,GAAG,KAAK;AAEhC,IAAA,SAAS,GAAG,IAAI,YAAY,EAAa;AACzC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAW;AACzC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAc;AAC5C,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAE1D,IAAA,IAAI;AACJ,IAAA,WAAW;AACX,IAAA,cAAc;AACd,IAAA,SAAS,GAAG,IAAI,GAAG,EAAoB;IACvC,eAAe,GAAkB,EAAE;IACnC,OAAO,GAAG,KAAK;AAEP,IAAA,QAAQ;AAEhB,IAAA,WAAA,CACmB,aAAoC,EACpC,QAAmC,EACnC,UAAuC,EAAA;QAFvC,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,UAAU,GAAV,UAAU;IAC1B;AAEH,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;AAC5D,YAAA,KAAK,IAAI,CAAC,SAAS,EAAE;QACvB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;IAC9B;AAEQ,IAAA,MAAM,SAAS,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;;AAGhF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;AACtE,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAElC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;;AAG1C,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,GAAG,SAAU;AACtB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB;QACF;AACA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI;AACrE,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC;AACpF,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,YAAY,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QAEpB,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE;YAC1B;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACpF,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB;AAEvC,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE;YACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;YACpC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AAC7C,YAAA,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QACzB;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;IACtB;AAEA,IAAA,cAAc,CAAC,OAAwB,EAAA;AACrC,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO;AAC1B,QAAA,IAAI,OAAO,YAAY,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,IAAI,GAAG,OAAO;QACrB;aAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,YAAY,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACrE,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC/C;iBAAO;gBACL,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;YACxC;QACF;QACA,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;QAC5B,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;YACpD,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC/C,QAAA,CAAC,CAAC;IACJ;wGAvGW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAE,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,2BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxDxB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAtDS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,QAAA,EAAA,YAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAyDzD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA5DnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,CAAC;AACrE,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;;sBAEE,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;;MChFU,oBAAoB,CAAA;wGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAHrB,uBAAuB,EAAE,uBAAuB,CAAA,EAAA,OAAA,EAAA,CAChD,uBAAuB,EAAE,uBAAuB,CAAA,EAAA,CAAA;yGAE/C,oBAAoB,EAAA,OAAA,EAAA,CAHrB,uBAAuB,EAAE,uBAAuB,CAAA,EAAA,CAAA;;4FAG/C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;AAC3D,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;AAC5D,iBAAA;;;ACPD;;AAEG;;;;"}
1
+ {"version":3,"file":"elle96-ng-json-schema-manager.mjs","sources":["../../../projects/ng-json-schema-form/src/lib/json-schema-form.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-resolver.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-validation.service.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-node.component.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.component.ts","../../../projects/ng-json-schema-form/src/lib/json-schema-form.module.ts","../../../projects/ng-json-schema-form/src/elle96-ng-json-schema-manager.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n FormArray,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaFormService {\r\n buildControl(schema: JsonSchema, value?: unknown, required = false): AbstractControl {\r\n const effectiveSchema = this.applyCombinators(schema);\r\n const resolvedType = this.resolveType(effectiveSchema);\r\n\r\n if (resolvedType === 'object') {\r\n const group: Record<string, AbstractControl> = {};\r\n const properties = effectiveSchema.properties ?? {};\r\n const requiredFields = new Set(effectiveSchema.required ?? []);\r\n const valueObject = this.isRecord(value) ? value : {};\r\n\r\n for (const [key, propertySchema] of Object.entries(properties)) {\r\n const childValue = valueObject[key];\r\n group[key] = this.buildControl(propertySchema, childValue, requiredFields.has(key));\r\n }\r\n\r\n // Include dynamic keys from value (patternProperties/additionalProperties).\r\n for (const key of Object.keys(valueObject)) {\r\n if (group[key]) {\r\n continue;\r\n }\r\n const dynamicSchema = this.resolveDynamicSchema(effectiveSchema, key);\r\n group[key] = this.buildControl(dynamicSchema ?? {}, valueObject[key], false);\r\n }\r\n\r\n const control = new FormGroup(group, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n if (resolvedType === 'array') {\r\n const controls: AbstractControl[] = [];\r\n const initialItems = Array.isArray(value) ? value : [];\r\n const minItems = effectiveSchema.minItems ?? 0;\r\n const prefixItems = effectiveSchema.prefixItems ?? [];\r\n const tupleLength = Math.max(prefixItems.length, minItems, initialItems.length);\r\n\r\n for (let i = 0; i < tupleLength; i += 1) {\r\n const itemSchema = (prefixItems[i] ?? effectiveSchema.items) as JsonSchema | boolean | undefined;\r\n if (itemSchema === false) {\r\n continue;\r\n }\r\n const itemValue = initialItems[i];\r\n controls.push(this.buildControl((itemSchema as JsonSchema) ?? {}, itemValue, false));\r\n }\r\n\r\n const control = new FormArray(controls, {\r\n validators: this.buildValidators(effectiveSchema, required),\r\n });\r\n if (effectiveSchema.readOnly) {\r\n control.disable({ emitEvent: false });\r\n }\r\n return control;\r\n }\r\n\r\n const initialValue = this.resolveInitialValue(effectiveSchema, value);\r\n const control = new FormControl(initialValue, {\r\n validators: this.buildValidators(effectiveSchema, required, resolvedType),\r\n nonNullable: false,\r\n });\r\n\r\n if (effectiveSchema.readOnly || effectiveSchema.const !== undefined) {\r\n control.disable({ emitEvent: false });\r\n }\r\n\r\n return control;\r\n }\r\n\r\n resolveType(schema: JsonSchema): JsonSchema['type'] | 'enum' {\r\n if (schema.enum) {\r\n return 'enum';\r\n }\r\n\r\n if (schema.oneOf?.length) {\r\n return this.resolveType(schema.oneOf[0]);\r\n }\r\n if (schema.anyOf?.length) {\r\n return this.resolveType(schema.anyOf[0]);\r\n }\r\n if (schema.allOf?.length) {\r\n return this.resolveType(schema.allOf[0]);\r\n }\r\n\r\n if (schema.type) {\r\n if (Array.isArray(schema.type)) {\r\n const preferred = schema.type.find((item) => item !== 'null');\r\n return preferred ?? schema.type[0];\r\n }\r\n\r\n return schema.type;\r\n }\r\n\r\n if (schema.properties || schema.patternProperties || schema.additionalProperties) {\r\n return 'object';\r\n }\r\n\r\n if (schema.items || schema.prefixItems) {\r\n return 'array';\r\n }\r\n\r\n return 'string';\r\n }\r\n\r\n private applyCombinators(schema: JsonSchema): JsonSchema {\r\n let effective = schema;\r\n if (schema.allOf?.length) {\r\n effective = this.mergeSchemas([schema, ...schema.allOf]);\r\n }\r\n if (schema.oneOf?.length) {\r\n effective = schema.oneOf[0];\r\n }\r\n if (schema.anyOf?.length) {\r\n effective = schema.anyOf[0];\r\n }\r\n return effective;\r\n }\r\n\r\n resolveDynamicSchema(schema: JsonSchema, key: string): JsonSchema | undefined {\r\n const patternSchemas = schema.patternProperties ?? {};\r\n for (const [pattern, patternSchema] of Object.entries(patternSchemas)) {\r\n try {\r\n const regex = new RegExp(pattern);\r\n if (regex.test(key)) {\r\n return patternSchema;\r\n }\r\n } catch {\r\n // ignore invalid regex\r\n }\r\n }\r\n\r\n if (schema.additionalProperties === true || schema.additionalProperties === undefined) {\r\n return {};\r\n }\r\n\r\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\r\n return schema.additionalProperties;\r\n }\r\n\r\n if (schema.unevaluatedProperties && typeof schema.unevaluatedProperties === 'object') {\r\n return schema.unevaluatedProperties;\r\n }\r\n if (schema.unevaluatedProperties === true) {\r\n return {};\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private resolveInitialValue(schema: JsonSchema, value?: unknown): unknown {\r\n if (value !== undefined) {\r\n return value;\r\n }\r\n\r\n if (schema.const !== undefined) {\r\n return schema.const;\r\n }\r\n\r\n if (schema.default !== undefined) {\r\n return schema.default;\r\n }\r\n\r\n if (schema.enum && schema.enum.length > 0) {\r\n return schema.enum[0];\r\n }\r\n\r\n if (schema.type === 'boolean') {\r\n return false;\r\n }\r\n\r\n if (schema.type === 'array') {\r\n return [];\r\n }\r\n\r\n if (schema.type === 'object') {\r\n return {};\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private buildValidators(\r\n schema: JsonSchema,\r\n required: boolean,\r\n resolvedType?: JsonSchema['type'] | 'enum'\r\n ): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n if (required) {\r\n validators.push(Validators.required);\r\n }\r\n\r\n if (schema.minLength !== undefined) {\r\n validators.push(Validators.minLength(schema.minLength));\r\n }\r\n\r\n if (schema.maxLength !== undefined) {\r\n validators.push(Validators.maxLength(schema.maxLength));\r\n }\r\n\r\n if (schema.minimum !== undefined) {\r\n validators.push(Validators.min(schema.minimum));\r\n }\r\n\r\n if (schema.maximum !== undefined) {\r\n validators.push(Validators.max(schema.maximum));\r\n }\r\n\r\n if (schema.exclusiveMinimum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) > schema.exclusiveMinimum!\r\n ? null\r\n : { exclusiveMinimum: true }\r\n );\r\n }\r\n\r\n if (schema.exclusiveMaximum !== undefined) {\r\n validators.push((control) =>\r\n control.value === null || control.value === undefined || control.value === ''\r\n ? null\r\n : Number(control.value) < schema.exclusiveMaximum!\r\n ? null\r\n : { exclusiveMaximum: true }\r\n );\r\n }\r\n\r\n if (schema.multipleOf !== undefined) {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n const numericValue = Number(control.value);\r\n return numericValue % schema.multipleOf! === 0 ? null : { multipleOf: true };\r\n });\r\n }\r\n\r\n if (schema.pattern) {\r\n validators.push(Validators.pattern(schema.pattern));\r\n }\r\n\r\n if (schema.format === 'email') {\r\n validators.push(Validators.email);\r\n }\r\n\r\n if (schema.minItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length < schema.minItems!\r\n ? { minItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.maxItems !== undefined) {\r\n validators.push((control) =>\r\n Array.isArray(control.value) && control.value.length > schema.maxItems!\r\n ? { maxItems: true }\r\n : null\r\n );\r\n }\r\n\r\n if (schema.uniqueItems) {\r\n validators.push((control) => {\r\n if (!Array.isArray(control.value)) {\r\n return null;\r\n }\r\n const unique = new Set(control.value.map((item) => JSON.stringify(item)));\r\n return unique.size === control.value.length ? null : { uniqueItems: true };\r\n });\r\n }\r\n\r\n if (schema.minProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length < schema.minProperties!\r\n ? { minProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (schema.maxProperties !== undefined) {\r\n validators.push((control) => {\r\n if (!control.value || typeof control.value !== 'object') {\r\n return null;\r\n }\r\n return Object.keys(control.value).length > schema.maxProperties!\r\n ? { maxProperties: true }\r\n : null;\r\n });\r\n }\r\n\r\n if (resolvedType === 'integer') {\r\n validators.push((control) => {\r\n if (control.value === null || control.value === undefined || control.value === '') {\r\n return null;\r\n }\r\n\r\n const numericValue = Number(control.value);\r\n return Number.isInteger(numericValue) ? null : { integer: true };\r\n });\r\n }\r\n\r\n return validators;\r\n }\r\n\r\n private isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === 'object' && !Array.isArray(value);\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, schema) => {\r\n const merged: JsonSchema = {\r\n ...acc,\r\n ...schema,\r\n properties: { ...(acc.properties ?? {}), ...(schema.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(schema.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(schema.required ?? [])])),\r\n };\r\n return merged;\r\n }, {} as JsonSchema);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { JsonSchema } from './types';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaResolverService {\r\n async resolve(schema: JsonSchema, baseUri?: string): Promise<JsonSchema> {\r\n const rootBase = baseUri ?? schema.$id ?? '';\r\n const localCache = new Map<string, JsonSchema>();\r\n const externalCache = new Map<string, JsonSchema>();\r\n return this.resolveRefs(schema, schema, rootBase, localCache, externalCache);\r\n }\r\n\r\n private async resolveRefs(\r\n current: JsonSchema,\r\n root: JsonSchema,\r\n baseUri: string,\r\n localCache: Map<string, JsonSchema>,\r\n externalCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema> {\r\n if (!current || typeof current !== 'object') {\r\n return current;\r\n }\r\n\r\n if (current.$ref) {\r\n const ref = current.$ref;\r\n if (ref.startsWith('#/')) {\r\n if (localCache.has(ref)) {\r\n return localCache.get(ref)!;\r\n }\r\n const resolved = this.resolvePointer(root, ref);\r\n if (resolved) {\r\n localCache.set(ref, resolved);\r\n return this.resolveRefs(resolved, root, baseUri, localCache, externalCache);\r\n }\r\n } else {\r\n const resolved = await this.resolveExternalRef(ref, baseUri, externalCache, localCache);\r\n if (resolved) {\r\n return resolved;\r\n }\r\n }\r\n }\r\n\r\n const next: JsonSchema = { ...current };\r\n\r\n if (next.properties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.properties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.properties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.patternProperties) {\r\n const entries = await Promise.all(\r\n Object.entries(next.patternProperties).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.patternProperties = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.items && typeof next.items === 'object') {\r\n next.items = await this.resolveRefs(next.items as JsonSchema, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.prefixItems) {\r\n next.prefixItems = await Promise.all(\r\n next.prefixItems.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.additionalProperties && typeof next.additionalProperties === 'object') {\r\n next.additionalProperties = await this.resolveRefs(\r\n next.additionalProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.additionalItems && typeof next.additionalItems === 'object') {\r\n next.additionalItems = await this.resolveRefs(\r\n next.additionalItems,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedProperties && typeof next.unevaluatedProperties === 'object') {\r\n next.unevaluatedProperties = await this.resolveRefs(\r\n next.unevaluatedProperties,\r\n root,\r\n baseUri,\r\n localCache,\r\n externalCache\r\n );\r\n }\r\n\r\n if (next.unevaluatedItems && typeof next.unevaluatedItems === 'object') {\r\n next.unevaluatedItems = await this.resolveRefs(next.unevaluatedItems, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.contains) {\r\n next.contains = await this.resolveRefs(next.contains, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.oneOf) {\r\n next.oneOf = await Promise.all(\r\n next.oneOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.anyOf) {\r\n next.anyOf = await Promise.all(\r\n next.anyOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.allOf) {\r\n next.allOf = await Promise.all(\r\n next.allOf.map((item) => this.resolveRefs(item, root, baseUri, localCache, externalCache))\r\n );\r\n }\r\n\r\n if (next.not) {\r\n next.not = await this.resolveRefs(next.not, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.if) {\r\n next.if = await this.resolveRefs(next.if, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.then) {\r\n next.then = await this.resolveRefs(next.then, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.else) {\r\n next.else = await this.resolveRefs(next.else, root, baseUri, localCache, externalCache);\r\n }\r\n\r\n if (next.dependencies) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependencies).map(async ([key, value]) => {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return [key, await this.resolveRefs(value as JsonSchema, root, baseUri, localCache, externalCache)];\r\n }\r\n return [key, value];\r\n })\r\n );\r\n next.dependencies = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.dependentSchemas) {\r\n const entries = await Promise.all(\r\n Object.entries(next.dependentSchemas).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.dependentSchemas = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.$defs) {\r\n const entries = await Promise.all(\r\n Object.entries(next.$defs).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.$defs = Object.fromEntries(entries);\r\n }\r\n\r\n if (next.definitions) {\r\n const entries = await Promise.all(\r\n Object.entries(next.definitions).map(async ([key, value]) => [\r\n key,\r\n await this.resolveRefs(value, root, baseUri, localCache, externalCache),\r\n ])\r\n );\r\n next.definitions = Object.fromEntries(entries);\r\n }\r\n\r\n return next;\r\n }\r\n\r\n private async resolveExternalRef(\r\n ref: string,\r\n baseUri: string,\r\n externalCache: Map<string, JsonSchema>,\r\n localCache: Map<string, JsonSchema>\r\n ): Promise<JsonSchema | null> {\r\n try {\r\n const url = new URL(ref, baseUri || window.location.href).toString();\r\n if (externalCache.has(url)) {\r\n return externalCache.get(url)!;\r\n }\r\n\r\n const { schema, fragment } = await this.fetchSchema(url);\r\n if (!schema) {\r\n return null;\r\n }\r\n\r\n const target = fragment ? this.resolvePointer(schema, fragment) : schema;\r\n if (!target) {\r\n return null;\r\n }\r\n\r\n const resolved = await this.resolveRefs(target, schema, schema.$id ?? url, localCache, externalCache);\r\n externalCache.set(url, resolved);\r\n return resolved;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private async fetchSchema(url: string): Promise<{ schema: JsonSchema | null; fragment: string | null }> {\r\n const [base, hash] = url.split('#');\r\n const fragment = hash ? `#/${hash.replace(/^\\//, '')}` : null;\r\n const response = await fetch(base, { headers: { Accept: 'application/json' } });\r\n if (!response.ok) {\r\n return { schema: null, fragment: null };\r\n }\r\n const schema = (await response.json()) as JsonSchema;\r\n return { schema, fragment };\r\n }\r\n\r\n private resolvePointer(root: JsonSchema, ref: string): JsonSchema | null {\r\n const pointer = ref.replace(/^#\\//, '');\r\n const parts = pointer.split('/').map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n let current: any = root;\r\n for (const part of parts) {\r\n if (current && typeof current === 'object' && part in current) {\r\n current = current[part];\r\n } else {\r\n return null;\r\n }\r\n }\r\n return current as JsonSchema;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport Ajv, { ErrorObject } from 'ajv';\r\nimport Ajv2019 from 'ajv/dist/2019';\r\nimport Ajv2020 from 'ajv/dist/2020';\r\nimport addFormats from 'ajv-formats';\r\nimport AjvDraft04 from 'ajv-draft-04';\r\nimport { JsonSchema, SchemaError } from './types';\r\n\r\nexport type JsonSchemaDraft = 'draft4' | 'draft6' | 'draft7' | 'draft2019' | 'draft2020';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JsonSchemaValidationService {\r\n private readonly ajvCache = new Map<JsonSchemaDraft, Ajv>();\r\n\r\n validate(schema: JsonSchema, value: unknown): ErrorObject[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n const validate = ajv.compile(schema as object);\r\n const valid = validate(value);\r\n if (valid) {\r\n return [];\r\n }\r\n return validate.errors ?? [];\r\n }\r\n\r\n /**\r\n * Validates the schema itself against its JSON Schema meta-schema.\r\n * Returns a list of SchemaError describing what is wrong in the schema definition.\r\n */\r\n validateSchema(schema: JsonSchema): SchemaError[] {\r\n const draft = this.detectDraft(schema);\r\n const ajv = this.getAjv(draft);\r\n\r\n try {\r\n const valid = ajv.validateSchema(schema as object);\r\n if (valid) return [];\r\n return (ajv.errors ?? []).map((e) => ({\r\n path: e.instancePath || '/',\r\n message: e.message ?? e.keyword,\r\n keyword: e.keyword,\r\n }));\r\n } catch (e) {\r\n // ajv.validateSchema throws when the schema is so broken it cannot be compiled.\r\n // The error message contains comma-separated individual violations — split them.\r\n const raw = e instanceof Error ? e.message : String(e);\r\n // Strip the \"schema is invalid: \" prefix if present\r\n const body = raw.replace(/^schema is invalid:\\s*/i, '');\r\n // Each violation looks like \"data/some/path must ...\" — extract path and message\r\n return body.split(', ').map((msg) => {\r\n const trimmed = msg.trim();\r\n const match = trimmed.match(/^(data[^\\s]*)\\s+(.+)$/);\r\n return match\r\n ? { path: match[1].replace(/^data/, '') || '/', message: match[2], keyword: 'schema' }\r\n : { path: '/', message: trimmed, keyword: 'schema' };\r\n });\r\n }\r\n }\r\n\r\n detectDraft(schema: JsonSchema): JsonSchemaDraft {\r\n const schemaId = schema.$schema ?? '';\r\n if (schemaId.includes('draft-04')) {\r\n return 'draft4';\r\n }\r\n if (schemaId.includes('draft-06')) {\r\n return 'draft6';\r\n }\r\n if (schemaId.includes('draft-07')) {\r\n return 'draft7';\r\n }\r\n if (schemaId.includes('2019-09')) {\r\n return 'draft2019';\r\n }\r\n if (schemaId.includes('2020-12')) {\r\n return 'draft2020';\r\n }\r\n\r\n if (schema.$defs) {\r\n return 'draft2020';\r\n }\r\n if (schema.definitions) {\r\n return 'draft7';\r\n }\r\n\r\n return 'draft2020';\r\n }\r\n\r\n private getAjv(draft: JsonSchemaDraft): Ajv {\r\n if (this.ajvCache.has(draft)) {\r\n return this.ajvCache.get(draft)!;\r\n }\r\n\r\n let ajv: Ajv;\r\n switch (draft) {\r\n case 'draft4':\r\n ajv = new AjvDraft04({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2019':\r\n ajv = new Ajv2019({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft6':\r\n case 'draft7':\r\n ajv = new Ajv({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n break;\r\n case 'draft2020':\r\n default:\r\n ajv = new Ajv2020({\r\n strict: false,\r\n allErrors: true,\r\n allowUnionTypes: true,\r\n });\r\n }\r\n\r\n addFormats(ajv);\r\n this.ajvCache.set(draft, ajv);\r\n return ajv;\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormArray, FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonSchema, JsonSchemaType } from './types';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\n\r\n@Component({\r\n selector: 'jsm-schema-node',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\r\n encapsulation: ViewEncapsulation.None,\r\n styles: [`\r\n .jsm-toggle-track {\r\n position: relative; display: inline-flex; align-items: center;\r\n width: 2.25rem; height: 1.25rem; border-radius: 9999px;\r\n flex-shrink: 0; transition: background-color 0.2s;\r\n background-color: #cbd5e1;\r\n }\r\n .jsm-toggle-track.jsm-toggle-on { background-color: #4f46e5; }\r\n .dark .jsm-toggle-track:not(.jsm-toggle-on) { background-color: #475569; }\r\n .jsm-toggle-thumb {\r\n display: inline-block; width: 1rem; height: 1rem;\r\n border-radius: 9999px; background: #fff;\r\n box-shadow: 0 1px 3px rgba(0,0,0,0.2);\r\n transform: translateX(0.125rem);\r\n transition: transform 0.2s;\r\n }\r\n .jsm-toggle-track.jsm-toggle-on .jsm-toggle-thumb { transform: translateX(1.125rem); }\r\n `],\r\n template: `\r\n <ng-container [ngSwitch]=\"nodeKind\">\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n oneOf — tab bar: ogni opzione è una tab, nessuna icona\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'oneOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-blue-100 dark:bg-blue-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-blue-700 dark:text-blue-400\">oneOf</span>\r\n </div>\r\n <div class=\"flex overflow-x-auto border-b border-slate-200 dark:border-slate-700\">\r\n <button\r\n *ngFor=\"let option of schema.oneOf; let i = index\"\r\n type=\"button\"\r\n class=\"px-4 py-2.5 text-xs font-medium whitespace-nowrap border-b-2 transition-colors\"\r\n [class.border-indigo-500]=\"selectedOneOf === i\"\r\n [class.text-indigo-600]=\"selectedOneOf === i\"\r\n [class.dark:text-indigo-400]=\"selectedOneOf === i\"\r\n [class.font-semibold]=\"selectedOneOf === i\"\r\n [class.border-transparent]=\"selectedOneOf !== i\"\r\n [class.text-slate-500]=\"selectedOneOf !== i\"\r\n [class.dark:text-slate-400]=\"selectedOneOf !== i\"\r\n (click)=\"selectedOneOf = i; onOneOfChange()\"\r\n >{{ option.title || ('Option ' + (i + 1)) }}</button>\r\n </div>\r\n <div class=\"p-4\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n anyOf — pill toggle, nessuna icona\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'anyOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-violet-100 dark:bg-violet-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-violet-700 dark:text-violet-400\">anyOf</span>\r\n </div>\r\n <div class=\"flex flex-wrap gap-2 px-4 py-3 border-b border-slate-200 dark:border-slate-700\">\r\n <label\r\n *ngFor=\"let option of schema.anyOf; let i = index\"\r\n class=\"inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium cursor-pointer transition-colors select-none\"\r\n [class.border-indigo-400]=\"selectedAnyOf.has(i)\"\r\n [class.bg-indigo-50]=\"selectedAnyOf.has(i)\"\r\n [class.dark:bg-indigo-900/30]=\"selectedAnyOf.has(i)\"\r\n [class.text-indigo-700]=\"selectedAnyOf.has(i)\"\r\n [class.dark:text-indigo-400]=\"selectedAnyOf.has(i)\"\r\n [class.border-slate-200]=\"!selectedAnyOf.has(i)\"\r\n [class.dark:border-slate-600]=\"!selectedAnyOf.has(i)\"\r\n [class.text-slate-600]=\"!selectedAnyOf.has(i)\"\r\n [class.dark:text-slate-400]=\"!selectedAnyOf.has(i)\"\r\n >\r\n <input type=\"checkbox\" class=\"h-3.5 w-3.5 accent-indigo-600\" [checked]=\"selectedAnyOf.has(i)\" (change)=\"toggleAnyOf(i)\" />\r\n {{ option.title || ('Option ' + (i + 1)) }}\r\n </label>\r\n </div>\r\n <div class=\"p-4\" *ngIf=\"activeVariant\">\r\n <jsm-schema-node [schema]=\"activeVariant\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"label\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n allOf — sezioni in colonna con bordo sinistro\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'allOf'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm overflow-hidden\">\r\n <div class=\"flex items-start justify-between px-4 py-3 bg-slate-50 dark:bg-slate-800/60 border-b border-slate-200 dark:border-slate-700\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <span class=\"ml-3 shrink-0 rounded-full bg-teal-100 dark:bg-teal-900/40 px-2 py-0.5 text-[10px] font-bold uppercase tracking-wide text-teal-700 dark:text-teal-400\">allOf</span>\r\n </div>\r\n <div class=\"p-4 space-y-4\">\r\n <div *ngFor=\"let subSchema of mergedAllOf; let i = index\" class=\"border-l-2 border-indigo-200 dark:border-indigo-700 pl-4\">\r\n <jsm-schema-node [schema]=\"subSchema\" [control]=\"control\" [parent]=\"parent\" [controlKey]=\"controlKey\"\r\n [path]=\"path\" [errorsMap]=\"errorsMap\" [label]=\"subSchema.title || ('Section ' + (i + 1))\" [required]=\"required\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n object — fieldset con griglia SOLO per campi primitivi.\r\n Logica layout:\r\n - I figli vengono classificati come \"semplici\" (primitive/enum/bool)\r\n o \"complessi\" (object/array/oneOf/anyOf/allOf).\r\n - I semplici vanno in griglia 2 colonne (sm:grid-cols-2).\r\n - I complessi vanno sempre in colonna piena (col-span-2).\r\n ═══════════════════════════════════════════════════════════ -->\r\n <fieldset *ngSwitchCase=\"'object'\" class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 shadow-sm p-4 transition-shadow focus-within:border-indigo-300 dark:focus-within:border-indigo-600 focus-within:ring-2 focus-within:ring-indigo-100 dark:focus-within:ring-indigo-900/40\">\r\n <legend class=\"px-2 text-sm font-bold text-slate-800 dark:text-slate-200\">{{ schema.title || label }}</legend>\r\n\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 mb-3 mt-1\">{{ schema.description }}</p>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5 mb-3\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <!-- campi semplici (string/number/bool/enum) → griglia 2 colonne -->\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\" [formGroup]=\"controlAsGroup\">\r\n <ng-container *ngFor=\"let key of simpleKeys\">\r\n <div class=\"flex flex-col gap-1\">\r\n <div *ngIf=\"isDynamicKey(key)\"\r\n class=\"flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1\">\r\n <span class=\"font-mono text-xs text-slate-500 dark:text-slate-400\">{{ key }}</span>\r\n <button type=\"button\"\r\n class=\"rounded px-1.5 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors\"\r\n (click)=\"removeDynamicKey(key)\">Remove</button>\r\n </div>\r\n <jsm-schema-node\r\n [schema]=\"schemaForKey(key)\"\r\n [control]=\"childControl(key)\"\r\n [parent]=\"controlAsGroup\"\r\n [controlKey]=\"key\"\r\n [path]=\"pathForChild(key)\"\r\n [errorsMap]=\"errorsMap\"\r\n [label]=\"key\"\r\n [required]=\"isRequired(key)\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\">\r\n </jsm-schema-node>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- campi complessi (object/array/combinator) → colonna piena -->\r\n <div class=\"space-y-4 mt-4\" *ngIf=\"complexKeys.length > 0\" [formGroup]=\"controlAsGroup\">\r\n <ng-container *ngFor=\"let key of complexKeys\">\r\n <div class=\"flex flex-col gap-1\">\r\n <div *ngIf=\"isDynamicKey(key)\"\r\n class=\"flex items-center justify-between rounded-md border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/50 px-2 py-1 mb-1\">\r\n <span class=\"font-mono text-xs text-slate-500 dark:text-slate-400\">{{ key }}</span>\r\n <button type=\"button\"\r\n class=\"rounded px-1.5 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors\"\r\n (click)=\"removeDynamicKey(key)\">Remove</button>\r\n </div>\r\n <jsm-schema-node\r\n [schema]=\"schemaForKey(key)\"\r\n [control]=\"childControl(key)\"\r\n [parent]=\"controlAsGroup\"\r\n [controlKey]=\"key\"\r\n [path]=\"pathForChild(key)\"\r\n [errorsMap]=\"errorsMap\"\r\n [label]=\"key\"\r\n [required]=\"isRequired(key)\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\">\r\n </jsm-schema-node>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- add dynamic property -->\r\n <div *ngIf=\"canAddProperty\" class=\"mt-4 rounded-lg border border-dashed border-slate-300 dark:border-slate-600 bg-slate-50 dark:bg-slate-800/40 p-3 space-y-2\">\r\n <p class=\"text-[10px] font-bold uppercase tracking-widest text-slate-400 dark:text-slate-500\">Add property</p>\r\n <div class=\"flex gap-2\">\r\n <input\r\n class=\"flex-1 rounded-lg border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-1.5 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 dark:focus:ring-indigo-900/40\"\r\n [(ngModel)]=\"newPropertyKey\" placeholder=\"propertyName\" />\r\n <button type=\"button\"\r\n class=\"rounded-lg bg-indigo-600 px-3 py-1.5 text-sm font-semibold text-white shadow-sm transition hover:bg-indigo-700 active:scale-95\"\r\n (click)=\"addDynamicProperty()\">Add</button>\r\n </div>\r\n <p *ngIf=\"propertyError\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <!-- icona errore: unico caso in cui ha senso, segnala un problema -->\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ propertyError }}\r\n </p>\r\n </div>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"mt-3 space-y-1\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </fieldset>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n array — sempre in colonna piena, items in colonna\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchCase=\"'array'\" class=\"space-y-3\">\r\n <div class=\"flex items-start justify-between gap-2\">\r\n <div>\r\n <p class=\"text-sm font-semibold text-slate-800\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </p>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 mt-0.5\">{{ schema.description }}</p>\r\n </div>\r\n <!-- icona + nel bottone: indica l'azione \"aggiungi\", non decorativa -->\r\n <button type=\"button\"\r\n class=\"shrink-0 flex items-center gap-1 rounded-lg bg-indigo-600 px-3 py-1.5 text-xs font-semibold text-white shadow-sm transition hover:bg-indigo-700 active:scale-95 disabled:opacity-40 disabled:cursor-not-allowed\"\r\n (click)=\"addArrayItem()\" [disabled]=\"!canAddArrayItem\">\r\n <svg class=\"w-3.5 h-3.5\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n Add item\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"effectiveSchema.contains\" class=\"rounded-md bg-indigo-50 dark:bg-indigo-900/30 px-3 py-1.5 text-xs text-indigo-700 dark:text-indigo-400\">\r\n Must contain matching item(s)\r\n <span *ngIf=\"effectiveSchema.minContains\"> · min {{ effectiveSchema.minContains }}</span>\r\n <span *ngIf=\"effectiveSchema.maxContains\"> · max {{ effectiveSchema.maxContains }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <div class=\"space-y-2\" *ngIf=\"arrayControls.length > 0; else emptyArray\">\r\n <div *ngFor=\"let item of arrayControls; let i = index\"\r\n class=\"rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 p-3 shadow-sm transition focus-within:border-indigo-300 dark:focus-within:border-indigo-600 focus-within:ring-2 focus-within:ring-indigo-100 dark:focus-within:ring-indigo-900/40\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <span class=\"inline-flex h-5 w-5 items-center justify-center rounded-full bg-indigo-100 dark:bg-indigo-900/50 text-[11px] font-bold text-indigo-600 dark:text-indigo-400\">{{ i + 1 }}</span>\r\n <button type=\"button\"\r\n class=\"rounded-md border border-red-200 dark:border-red-800 px-2 py-0.5 text-xs font-semibold text-red-600 dark:text-red-400 transition hover:bg-red-50 dark:hover:bg-red-900/20\"\r\n (click)=\"removeArrayItem(i)\">Remove</button>\r\n </div>\r\n <jsm-schema-node [schema]=\"schemaForIndex(i)\" [control]=\"item\" [parent]=\"controlAsArray\"\r\n [controlKey]=\"i\" [path]=\"pathForChild(i)\" [errorsMap]=\"errorsMap\" [label]=\"label + ' item'\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n (controlReplaced)=\"controlReplaced.emit($event)\"></jsm-schema-node>\r\n </div>\r\n </div>\r\n\r\n <ng-template #emptyArray>\r\n <div class=\"flex flex-col items-center gap-2 rounded-xl border border-dashed border-slate-200 dark:border-slate-700 py-8 text-slate-400 dark:text-slate-500 text-xs\">\r\n No items yet — click \"Add item\" to start.\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"errorsForPath.length\" class=\"space-y-1\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ═══════════════════════════════════════════════════════════\r\n primitive — sempre in colonna, nessuna icona decorativa.\r\n Icona errore solo nei messaggi di validazione.\r\n Icona chevron nel select: funzionale (indica dropdown).\r\n ═══════════════════════════════════════════════════════════ -->\r\n <div *ngSwitchDefault class=\"space-y-1.5\">\r\n <ng-container *ngIf=\"inputKind !== 'checkbox'\">\r\n <label class=\"block text-[13px] font-semibold text-slate-700 dark:text-slate-300\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </label>\r\n <p *ngIf=\"schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400 -mt-0.5\">{{ schema.description }}</p>\r\n </ng-container>\r\n\r\n <div *ngIf=\"metaBadges.length\" class=\"flex flex-wrap gap-1.5\">\r\n <span *ngFor=\"let badge of metaBadges\"\r\n class=\"rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide\"\r\n [ngClass]=\"badgeClass(badge)\">{{ badge }}</span>\r\n </div>\r\n\r\n <ng-container [ngSwitch]=\"inputKind\">\r\n\r\n <input *ngSwitchCase=\"'text'\"\r\n class=\"w-full rounded-lg border bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-2 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:ring-2\"\r\n [class.border-slate-300]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:border-slate-600]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:border-indigo-400]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:ring-indigo-100]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:focus:ring-indigo-900/40]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:border-red-400]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:ring-red-100]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.type]=\"inputType\"\r\n [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\"\r\n />\r\n\r\n <textarea *ngSwitchCase=\"'textarea'\" rows=\"4\"\r\n class=\"w-full resize-y rounded-lg border bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 placeholder:text-slate-400 dark:placeholder:text-slate-500 px-3 py-2 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:ring-2\"\r\n [class.border-slate-300]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:border-slate-600]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:border-indigo-400]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.focus:ring-indigo-100]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.dark:focus:ring-indigo-900/40]=\"!(errorsForPath.length && controlAsFormControl.dirty)\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:border-red-400]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.focus:ring-red-100]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [attr.placeholder]=\"schema.title || label\"\r\n [formControl]=\"controlAsFormControl\"\r\n ></textarea>\r\n\r\n <!-- select: il chevron SVG è funzionale, indica che è un dropdown -->\r\n <div *ngSwitchCase=\"'select'\" class=\"relative\">\r\n <select\r\n class=\"w-full appearance-none rounded-lg border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 px-3 py-2 pr-8 text-sm shadow-sm outline-none transition hover:border-slate-400 dark:hover:border-slate-500 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 dark:focus:ring-indigo-900/40\"\r\n [class.border-red-300]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:border-red-700]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.bg-red-50]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [class.dark:bg-red-900/20]=\"errorsForPath.length && controlAsFormControl.dirty\"\r\n [formControl]=\"controlAsFormControl\">\r\n <option *ngFor=\"let option of effectiveSchema.enum\" [ngValue]=\"option\">{{ option }}</option>\r\n </select>\r\n <svg class=\"pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400 dark:text-slate-500\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n\r\n <!-- checkbox come toggle switch -->\r\n <label *ngSwitchCase=\"'checkbox'\" class=\"inline-flex cursor-pointer items-center gap-2.5\">\r\n <span class=\"jsm-toggle-track\" [class.jsm-toggle-on]=\"controlAsFormControl.value\">\r\n <input type=\"checkbox\" class=\"sr-only\" [formControl]=\"controlAsFormControl\" />\r\n <span class=\"jsm-toggle-thumb\"></span>\r\n </span>\r\n <span class=\"text-sm font-medium text-slate-700 dark:text-slate-300\">\r\n {{ schema.title || label }}<span *ngIf=\"required\" class=\"ml-0.5 text-red-500\">*</span>\r\n </span>\r\n </label>\r\n\r\n </ng-container>\r\n\r\n <p *ngIf=\"inputKind === 'checkbox' && schema.description\" class=\"text-xs text-slate-500 dark:text-slate-400\">{{ schema.description }}</p>\r\n\r\n <p *ngIf=\"effectiveSchema.examples?.length\" class=\"text-[11px] text-slate-400 dark:text-slate-500\">\r\n e.g. {{ effectiveSchema.examples?.[0] }}\r\n </p>\r\n\r\n <p *ngIf=\"effectiveSchema.contentMediaType\" class=\"text-[11px] text-slate-400 dark:text-slate-500\">\r\n {{ effectiveSchema.contentMediaType }}<span *ngIf=\"effectiveSchema.contentEncoding\"> ({{ effectiveSchema.contentEncoding }})</span>\r\n </p>\r\n\r\n <!-- icona errore: funzionale, segnala un problema di validazione -->\r\n <div *ngIf=\"errorsForPath.length && controlAsFormControl.dirty\" class=\"space-y-1 pt-0.5\">\r\n <p *ngFor=\"let error of errorsForPath\" class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\">\r\n <svg class=\"w-3.5 h-3.5 shrink-0\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\r\n <path d=\"M8 5v3.5M8 11v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n {{ error }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaNodeComponent implements OnInit {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input({ required: true }) control!: AbstractControl;\r\n @Input() label = '';\r\n @Input() required = false;\r\n @Input() path = '';\r\n @Input() errorsMap = new Map<string, string[]>();\r\n @Input() parent?: FormGroup | FormArray;\r\n @Input() controlKey?: string | number;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() controlReplaced = new EventEmitter<AbstractControl>();\r\n\r\n selectedOneOf = 0;\r\n selectedAnyOf = new Set<number>();\r\n newPropertyKey = '';\r\n propertyError = '';\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly validation: JsonSchemaValidationService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.schema.anyOf?.length) {\r\n this.selectedAnyOf.add(0);\r\n }\r\n }\r\n\r\n /**\r\n * Determina se un figlio di un object è \"semplice\" (primitive/enum/bool),\r\n * quindi può stare in griglia 2-col, oppure \"complesso\" (object/array/combinator)\r\n * che deve occupare la larghezza piena.\r\n */\r\n isSimpleChild(key: string): boolean {\r\n const childSchema = this.schemaForKey(key);\r\n if (childSchema.oneOf?.length || childSchema.anyOf?.length || childSchema.allOf?.length) return false;\r\n const t = this.schemaService.resolveType(childSchema);\r\n return t !== 'object' && t !== 'array';\r\n }\r\n\r\n badgeClass(badge: string): Record<string, boolean> {\r\n return {\r\n 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400': badge === 'Deprecated',\r\n 'bg-slate-100 text-slate-600 dark:bg-slate-700 dark:text-slate-400': badge === 'Read-only' || badge === 'Nullable',\r\n 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400': badge === 'Write-only',\r\n 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400': badge === 'Not constraint',\r\n };\r\n }\r\n\r\n get nodeKind(): 'oneOf' | 'anyOf' | 'allOf' | 'object' | 'array' | 'primitive' {\r\n if (this.schema.oneOf?.length) return 'oneOf';\r\n if (this.schema.anyOf?.length) return 'anyOf';\r\n if (this.schema.allOf?.length) return 'allOf';\r\n const resolved = this.resolvedType;\r\n if (resolved === 'object') return 'object';\r\n if (resolved === 'array') return 'array';\r\n return 'primitive';\r\n }\r\n\r\n get resolvedType(): JsonSchema['type'] | 'enum' {\r\n return this.schemaService.resolveType(this.effectiveSchema) ?? 'string';\r\n }\r\n\r\n get inputKind(): 'text' | 'textarea' | 'select' | 'checkbox' {\r\n if (this.effectiveSchema.enum) return 'select';\r\n if (this.resolvedType === 'boolean') return 'checkbox';\r\n if (this.effectiveSchema.format === 'textarea' || (this.effectiveSchema.maxLength ?? 0) > 200) return 'textarea';\r\n return 'text';\r\n }\r\n\r\n get inputType(): string {\r\n if (this.effectiveSchema.format === 'email') return 'email';\r\n if (this.effectiveSchema.format === 'date') return 'date';\r\n if (this.effectiveSchema.format === 'time') return 'time';\r\n if (this.effectiveSchema.format === 'date-time') return 'datetime-local';\r\n if (this.resolvedType === 'number' || this.resolvedType === 'integer') return 'number';\r\n if (this.effectiveSchema.format === 'password') return 'password';\r\n return 'text';\r\n }\r\n\r\n get controlAsGroup(): FormGroup { return this.control as FormGroup; }\r\n get controlAsFormControl(): FormControl { return this.control as FormControl; }\r\n get controlAsArray(): FormArray { return this.control as FormArray; }\r\n get arrayControls(): AbstractControl[] { return this.controlAsArray.controls; }\r\n get objectKeys(): string[] { return Object.keys(this.controlAsGroup.controls); }\r\n\r\n get simpleKeys(): string[] {\r\n return this.objectKeys.filter(k => this.isSimpleChild(k));\r\n }\r\n\r\n get complexKeys(): string[] {\r\n return this.objectKeys.filter(k => !this.isSimpleChild(k));\r\n }\r\n\r\n get canAddProperty(): boolean {\r\n if (!this.allowAdditionalProperties) return false;\r\n return this.effectiveSchema.additionalProperties !== false || !!this.effectiveSchema.patternProperties;\r\n }\r\n\r\n get errorsForPath(): string[] { return this.errorsMap.get(this.path) ?? []; }\r\n\r\n get metaBadges(): string[] {\r\n const badges: string[] = [];\r\n if (this.effectiveSchema.deprecated) badges.push('Deprecated');\r\n if (this.effectiveSchema.readOnly) badges.push('Read-only');\r\n if (this.effectiveSchema.writeOnly) badges.push('Write-only');\r\n if (this.effectiveSchema.nullable) badges.push('Nullable');\r\n if (this.effectiveSchema.not) badges.push('Not constraint');\r\n return badges;\r\n }\r\n\r\n get activeVariant(): JsonSchema | null {\r\n if (this.schema.oneOf?.length) return this.schema.oneOf[this.selectedOneOf] ?? null;\r\n if (this.schema.anyOf?.length) {\r\n const selections = Array.from(this.selectedAnyOf).map((i) => this.schema.anyOf![i]);\r\n return selections.length ? this.mergeSchemas(selections) : this.schema.anyOf[0] ?? null;\r\n }\r\n if (this.schema.allOf?.length) return this.mergeSchemas([this.schema, ...this.schema.allOf]);\r\n return this.effectiveSchema;\r\n }\r\n\r\n get mergedAllOf(): JsonSchema[] {\r\n return this.schema.allOf?.length ? [this.schema, ...this.schema.allOf] : [this.schema];\r\n }\r\n\r\n isRequired(key: string): boolean { return this.effectiveSchema.required?.includes(key) ?? false; }\r\n\r\n schemaForKey(key: string): JsonSchema {\r\n return (\r\n this.effectiveSchema.properties?.[key] ??\r\n this.schemaService.resolveDynamicSchema(this.effectiveSchema, key) ??\r\n {}\r\n );\r\n }\r\n\r\n isDynamicKey(key: string): boolean { return !this.effectiveSchema.properties?.[key]; }\r\n\r\n pathForChild(key: string | number): string {\r\n return this.path === '' ? `/${key}` : `${this.path}/${key}`;\r\n }\r\n\r\n addDynamicProperty(): void {\r\n this.propertyError = '';\r\n const key = this.newPropertyKey.trim();\r\n if (!key) { this.propertyError = 'Property name is required.'; return; }\r\n if (this.effectiveSchema.propertyNames) {\r\n const nameErrors = this.validation.validate(this.effectiveSchema.propertyNames, key);\r\n if (nameErrors.length) { this.propertyError = 'Property name does not match schema constraints.'; return; }\r\n }\r\n if (this.controlAsGroup.contains(key)) { this.propertyError = 'Property already exists.'; return; }\r\n const schemaForKey = this.schemaService.resolveDynamicSchema(this.effectiveSchema, key);\r\n if (!schemaForKey) { this.propertyError = 'This property is not allowed by the schema.'; return; }\r\n const control = this.schemaService.buildControl(schemaForKey, undefined, false);\r\n this.controlAsGroup.addControl(key, control);\r\n this.newPropertyKey = '';\r\n }\r\n\r\n removeDynamicKey(key: string): void { this.controlAsGroup.removeControl(key); }\r\n\r\n schemaForIndex(index: number): JsonSchema {\r\n const prefixItems = this.effectiveSchema.prefixItems ?? [];\r\n if (prefixItems[index]) return prefixItems[index];\r\n if (this.effectiveSchema.items && this.effectiveSchema.items !== true) return this.effectiveSchema.items as JsonSchema;\r\n if (this.effectiveSchema.additionalItems && this.effectiveSchema.additionalItems !== true) return this.effectiveSchema.additionalItems as JsonSchema;\r\n if (this.effectiveSchema.unevaluatedItems && this.effectiveSchema.unevaluatedItems !== true) return this.effectiveSchema.unevaluatedItems as JsonSchema;\r\n return {};\r\n }\r\n\r\n get canAddArrayItem(): boolean {\r\n return !(\r\n this.effectiveSchema.items === false ||\r\n this.effectiveSchema.additionalItems === false ||\r\n this.effectiveSchema.unevaluatedItems === false\r\n );\r\n }\r\n\r\n addArrayItem(): void {\r\n if (!this.canAddArrayItem) return;\r\n const formArray = this.controlAsArray;\r\n const index = formArray.length;\r\n formArray.push(this.schemaService.buildControl(this.schemaForIndex(index), undefined, false));\r\n formArray.markAsDirty();\r\n }\r\n\r\n removeArrayItem(index: number): void {\r\n this.controlAsArray.removeAt(index);\r\n this.controlAsArray.markAsDirty();\r\n }\r\n\r\n onOneOfChange(): void {\r\n if (!this.activeVariant) return;\r\n this.replaceControl(this.schemaService.buildControl(this.activeVariant, this.control.value, this.required));\r\n }\r\n\r\n toggleAnyOf(index: number): void {\r\n if (this.selectedAnyOf.has(index)) this.selectedAnyOf.delete(index);\r\n else this.selectedAnyOf.add(index);\r\n const variant = this.activeVariant;\r\n if (variant) this.replaceControl(this.schemaService.buildControl(variant, this.control.value, this.required));\r\n }\r\n\r\n private replaceControl(control: AbstractControl): void {\r\n if (this.parent) {\r\n if (this.parent instanceof FormGroup && typeof this.controlKey === 'string') this.parent.setControl(this.controlKey, control);\r\n if (this.parent instanceof FormArray && typeof this.controlKey === 'number') this.parent.setControl(this.controlKey, control);\r\n this.control = control;\r\n return;\r\n }\r\n this.control = control;\r\n this.controlReplaced.emit(control);\r\n }\r\n\r\n childControl(key: string): AbstractControl { return this.controlAsGroup.get(key) as AbstractControl; }\r\n\r\n get effectiveSchema(): JsonSchema {\r\n let schema = this.schema;\r\n if (schema.allOf?.length) schema = this.mergeSchemas([schema, ...schema.allOf]);\r\n schema = this.applyConditional(schema);\r\n schema = this.applyDependencies(schema);\r\n return schema;\r\n }\r\n\r\n private applyConditional(schema: JsonSchema): JsonSchema {\r\n if (!schema.if) return schema;\r\n const errors = this.validation.validate(schema.if, this.control.value);\r\n const branch = errors.length === 0 ? schema.then : schema.else;\r\n if (!branch) return schema;\r\n return this.mergeSchemas([schema, branch]);\r\n }\r\n\r\n private applyDependencies(schema: JsonSchema): JsonSchema {\r\n const value = this.control.value;\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return schema;\r\n let merged = { ...schema } as JsonSchema;\r\n const valueKeys = Object.keys(value as Record<string, unknown>);\r\n if (schema.dependentRequired) {\r\n for (const key of valueKeys) {\r\n const required = schema.dependentRequired[key];\r\n if (required?.length) merged = this.mergeSchemas([merged, { required }]);\r\n }\r\n }\r\n if (schema.dependentSchemas) {\r\n for (const key of valueKeys) {\r\n const depSchema = schema.dependentSchemas[key];\r\n if (depSchema) merged = this.mergeSchemas([merged, depSchema]);\r\n }\r\n }\r\n if (schema.dependencies) {\r\n for (const key of valueKeys) {\r\n const dep = schema.dependencies[key];\r\n if (Array.isArray(dep)) merged = this.mergeSchemas([merged, { required: dep }]);\r\n else if (dep) merged = this.mergeSchemas([merged, dep]);\r\n }\r\n }\r\n return merged;\r\n }\r\n\r\n private mergeSchemas(schemas: JsonSchema[]): JsonSchema {\r\n return schemas.reduce((acc, schema) => {\r\n const merged: JsonSchema = {\r\n ...acc,\r\n ...schema,\r\n properties: { ...(acc.properties ?? {}), ...(schema.properties ?? {}) },\r\n patternProperties: { ...(acc.patternProperties ?? {}), ...(schema.patternProperties ?? {}) },\r\n required: Array.from(new Set([...(acc.required ?? []), ...(schema.required ?? [])])),\r\n };\r\n if (acc.type && schema.type) {\r\n const accTypes = Array.isArray(acc.type) ? acc.type : [acc.type];\r\n const schemaTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\r\n merged.type = Array.from(new Set([...accTypes, ...schemaTypes])) as JsonSchemaType[];\r\n }\r\n return merged;\r\n }, {} as JsonSchema);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AbstractControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { JsonSchemaFormService } from './json-schema-form.service';\r\nimport { JsonSchema, SchemaError } from './types';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\nimport { JsonSchemaResolverService } from './json-schema-resolver.service';\r\nimport { JsonSchemaValidationService } from './json-schema-validation.service';\r\n\r\n@Component({\r\n selector: 'jsm-json-schema-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, JsonSchemaNodeComponent],\r\n encapsulation: ViewEncapsulation.None,\r\n styles: [`\r\n .jsm-root *, .jsm-root *::before, .jsm-root *::after { box-sizing: border-box; }\r\n .jsm-root input, .jsm-root textarea, .jsm-root select, .jsm-root button {\r\n font-family: inherit;\r\n font-size: inherit;\r\n line-height: inherit;\r\n }\r\n .jsm-root input[type=\"number\"]::-webkit-inner-spin-button,\r\n .jsm-root input[type=\"number\"]::-webkit-outer-spin-button { opacity: 1; }\r\n /* Force border visibility against host resets */\r\n .jsm-root input:not([type=\"checkbox\"]):not([type=\"radio\"]):not(.sr-only),\r\n .jsm-root textarea,\r\n .jsm-root select {\r\n border-width: 1.5px !important;\r\n border-style: solid !important;\r\n }\r\n `],\r\n template: `\r\n <div class=\"jsm-root\">\r\n <form class=\"w-full space-y-5\">\r\n <div *ngIf=\"resolvedSchema?.title || resolvedSchema?.description\" class=\"space-y-0.5\">\r\n <h2 class=\"text-lg font-bold tracking-tight text-slate-900 dark:text-white\">{{ resolvedSchema?.title || 'Form' }}</h2>\r\n <p *ngIf=\"resolvedSchema?.description\" class=\"text-sm text-slate-500 dark:text-slate-400\">{{ resolvedSchema?.description }}</p>\r\n </div>\r\n\r\n <div *ngIf=\"loading\" class=\"flex items-center gap-2 py-6 text-sm text-slate-500 dark:text-slate-400\" aria-live=\"polite\">\r\n <svg class=\"h-4 w-4 animate-spin text-indigo-500 dark:text-indigo-400\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\r\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"/>\r\n </svg>\r\n Resolving schema&hellip;\r\n </div>\r\n\r\n <!-- schema structural errors panel -->\r\n <div *ngIf=\"schemaErrorList.length > 0 && !loading\"\r\n class=\"rounded-xl border border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-900/20 p-4 space-y-3\"\r\n role=\"alert\">\r\n <div class=\"flex items-center gap-2\">\r\n <svg class=\"w-4 h-4 shrink-0 text-amber-600 dark:text-amber-400\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 2L1.5 13.5h13L8 2z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\r\n <path d=\"M8 6v3.5M8 11.5v.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <span class=\"text-sm font-semibold text-amber-800 dark:text-amber-300\">\r\n Schema errors ({{ schemaErrorList.length }})\r\n </span>\r\n </div>\r\n <p class=\"text-xs text-amber-700 dark:text-amber-400\">\r\n The schema has structural issues. Fix them to get a valid form.\r\n </p>\r\n <div class=\"space-y-2\">\r\n <div *ngFor=\"let err of schemaErrorList\"\r\n class=\"rounded-lg border border-amber-200 dark:border-amber-800 bg-white dark:bg-slate-900 px-3 py-2 space-y-0.5\">\r\n <p class=\"font-mono text-[11px] font-semibold text-amber-700 dark:text-amber-400\">{{ err.path }}</p>\r\n <p class=\"text-xs text-slate-700 dark:text-slate-300\">{{ err.message }}</p>\r\n <p class=\"text-[10px] uppercase tracking-wide text-slate-400 dark:text-slate-500\">keyword: {{ err.keyword }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"form && resolvedSchema && !loading\" class=\"space-y-5\" [formGroup]=\"form\">\r\n <jsm-schema-node\r\n [schema]=\"resolvedSchema\"\r\n [control]=\"rootControl\"\r\n [path]=\"''\"\r\n [errorsMap]=\"errorsMap\"\r\n [allowAdditionalProperties]=\"allowAdditionalProperties\"\r\n label=\"Root\"\r\n (controlReplaced)=\"onRootReplaced($event)\"\r\n ></jsm-schema-node>\r\n </div>\r\n </form>\r\n </div>\r\n `,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class JsonSchemaFormComponent implements OnChanges, OnDestroy {\r\n @Input({ required: true }) schema!: JsonSchema;\r\n @Input() value?: unknown;\r\n @Input() data?: unknown;\r\n @Input() allowAdditionalProperties = false;\r\n\r\n @Output() formReady = new EventEmitter<FormGroup>();\r\n @Output() valueChange = new EventEmitter<unknown>();\r\n @Output() schemaReady = new EventEmitter<JsonSchema>();\r\n @Output() schemaErrors = new EventEmitter<SchemaError[]>();\r\n\r\n form!: FormGroup;\r\n rootControl!: AbstractControl;\r\n resolvedSchema?: JsonSchema;\r\n errorsMap = new Map<string, string[]>();\r\n schemaErrorList: SchemaError[] = [];\r\n loading = false;\r\n\r\n private valueSub?: Subscription;\r\n\r\n constructor(\r\n private readonly schemaService: JsonSchemaFormService,\r\n private readonly resolver: JsonSchemaResolverService,\r\n private readonly validation: JsonSchemaValidationService\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] || changes['value'] || changes['data']) {\r\n void this.buildForm();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.valueSub?.unsubscribe();\r\n }\r\n\r\n private async buildForm(): Promise<void> {\r\n this.valueSub?.unsubscribe();\r\n this.loading = true;\r\n this.resolvedSchema = await this.resolver.resolve(this.schema, this.schema?.$id);\r\n\r\n // Validate the schema itself and emit any structural errors\r\n const schemaErrs = this.validation.validateSchema(this.resolvedSchema);\r\n this.schemaErrorList = schemaErrs;\r\n this.schemaErrors.emit(schemaErrs);\r\n\r\n this.schemaReady.emit(this.resolvedSchema);\r\n\r\n // If the schema has structural errors, stop here — don't try to build the form\r\n if (schemaErrs.length > 0) {\r\n this.form = undefined!;\r\n this.loading = false;\r\n return;\r\n }\r\n const initialData = this.value !== undefined ? this.value : this.data;\r\n this.rootControl = this.schemaService.buildControl(this.resolvedSchema, initialData);\r\n this.form = this.rootControl instanceof FormGroup ? this.rootControl : new FormGroup({ value: this.rootControl });\r\n this.formReady.emit(this.form);\r\n this.loading = false;\r\n\r\n this.attachValueSub();\r\n }\r\n\r\n private updateErrors(): void {\r\n if (!this.resolvedSchema) {\r\n this.errorsMap = new Map();\r\n return;\r\n }\r\n\r\n const errors = this.validation.validate(this.resolvedSchema, this.rootControl.value);\r\n const map = new Map<string, string[]>();\r\n\r\n for (const error of errors) {\r\n const path = error.instancePath ?? '';\r\n const messages = map.get(path) ?? [];\r\n messages.push(error.message ?? error.keyword);\r\n map.set(path, messages);\r\n }\r\n\r\n this.errorsMap = map;\r\n }\r\n\r\n onRootReplaced(control: AbstractControl): void {\r\n this.rootControl = control;\r\n if (control instanceof FormGroup) {\r\n this.form = control;\r\n } else {\r\n if (!(this.form instanceof FormGroup) || !this.form.contains('value')) {\r\n this.form = new FormGroup({ value: control });\r\n } else {\r\n this.form.setControl('value', control);\r\n }\r\n }\r\n this.attachValueSub();\r\n }\r\n\r\n private attachValueSub(): void {\r\n this.valueSub?.unsubscribe();\r\n this.updateErrors();\r\n this.valueSub = this.form.valueChanges.subscribe(() => {\r\n this.updateErrors();\r\n this.valueChange.emit(this.rootControl.value);\r\n });\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { JsonSchemaFormComponent } from './json-schema-form.component';\r\nimport { JsonSchemaNodeComponent } from './json-schema-node.component';\r\n\r\n@NgModule({\r\n imports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n exports: [JsonSchemaFormComponent, JsonSchemaNodeComponent],\r\n})\r\nexport class JsonSchemaFormModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.JsonSchemaFormService","i2.JsonSchemaValidationService","i2.JsonSchemaResolverService","i3.JsonSchemaValidationService","i4","i5"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -188,6 +188,8 @@ declare class JsonSchemaNodeComponent implements OnInit {
188
188
  get controlAsArray(): FormArray;
189
189
  get arrayControls(): AbstractControl[];
190
190
  get objectKeys(): string[];
191
+ get simpleKeys(): string[];
192
+ get complexKeys(): string[];
191
193
  get canAddProperty(): boolean;
192
194
  get errorsForPath(): string[];
193
195
  get metaBadges(): string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elle96/ng-json-schema-manager",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Angular JSON Schema form renderer with Tailwind styling, external $ref support, and reactive forms.",
5
5
  "homepage": "https://luigiellebalotta.github.io/json-schema-manager/",
6
6
  "repository": {