@expeed/ngx-data-mapper 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@expeed/ngx-data-mapper",
3
+ "version": "1.0.0",
4
+ "description": "Visual data mapping components for Angular - drag-and-drop field mapping with transformations, schema editor with JSON Schema export",
5
+ "keywords": [
6
+ "angular",
7
+ "data-mapper",
8
+ "field-mapping",
9
+ "schema-editor",
10
+ "json-schema",
11
+ "drag-drop",
12
+ "visual-mapping",
13
+ "etl",
14
+ "data-transformation"
15
+ ],
16
+ "license": "Apache-2.0",
17
+ "author": "Expeed Software",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/Expeed-Software/angular-data-mapper.git"
21
+ },
22
+ "homepage": "https://github.com/Expeed-Software/angular-data-mapper#readme",
23
+ "bugs": {
24
+ "url": "https://github.com/Expeed-Software/angular-data-mapper/issues"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "peerDependencies": {
30
+ "@angular/common": "^21.0.0",
31
+ "@angular/core": "^21.0.0",
32
+ "@angular/forms": "^21.0.0",
33
+ "@angular/cdk": "^21.0.0",
34
+ "@angular/material": "^21.0.0"
35
+ },
36
+ "dependencies": {
37
+ "tslib": "^2.3.0"
38
+ },
39
+ "sideEffects": false,
40
+ "module": "fesm2022/expeed-ngx-data-mapper.mjs",
41
+ "typings": "types/expeed-ngx-data-mapper.d.ts",
42
+ "exports": {
43
+ "./package.json": {
44
+ "default": "./package.json"
45
+ },
46
+ ".": {
47
+ "types": "./types/expeed-ngx-data-mapper.d.ts",
48
+ "default": "./fesm2022/expeed-ngx-data-mapper.mjs"
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,604 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { AfterViewInit, OnDestroy, EventEmitter, ElementRef, QueryList, OnInit, OnChanges, SimpleChanges } from '@angular/core';
3
+
4
+ interface SchemaField {
5
+ id: string;
6
+ name: string;
7
+ type: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'date';
8
+ path: string;
9
+ children?: SchemaField[];
10
+ expanded?: boolean;
11
+ description?: string;
12
+ isArrayItem?: boolean;
13
+ parentArrayPath?: string;
14
+ }
15
+ interface JsonSchema {
16
+ name: string;
17
+ fields: SchemaField[];
18
+ }
19
+ type TransformationType = 'direct' | 'concat' | 'substring' | 'replace' | 'uppercase' | 'lowercase' | 'dateFormat' | 'extractYear' | 'extractMonth' | 'extractDay' | 'extractHour' | 'extractMinute' | 'extractSecond' | 'numberFormat' | 'template' | 'custom';
20
+ interface TransformationConfig {
21
+ type: TransformationType;
22
+ separator?: string;
23
+ template?: string;
24
+ startIndex?: number;
25
+ endIndex?: number;
26
+ searchValue?: string;
27
+ replaceValue?: string;
28
+ inputFormat?: string;
29
+ outputFormat?: string;
30
+ decimalPlaces?: number;
31
+ prefix?: string;
32
+ suffix?: string;
33
+ expression?: string;
34
+ }
35
+ interface FieldMapping {
36
+ id: string;
37
+ sourceFields: SchemaField[];
38
+ targetField: SchemaField;
39
+ transformation: TransformationConfig;
40
+ isArrayMapping?: boolean;
41
+ arrayMappingId?: string;
42
+ isArrayToObjectMapping?: boolean;
43
+ arrayToObjectMappingId?: string;
44
+ }
45
+ type FilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'isEmpty' | 'isNotEmpty' | 'isTrue' | 'isFalse';
46
+ interface FilterCondition {
47
+ id: string;
48
+ type: 'condition';
49
+ field: string;
50
+ fieldName: string;
51
+ operator: FilterOperator;
52
+ value: string | number | boolean;
53
+ valueType: 'string' | 'number' | 'boolean';
54
+ }
55
+ interface FilterGroup {
56
+ id: string;
57
+ type: 'group';
58
+ logic: 'and' | 'or';
59
+ children: FilterItem[];
60
+ }
61
+ type FilterItem = FilterCondition | FilterGroup;
62
+ interface ArrayFilterConfig {
63
+ enabled: boolean;
64
+ root: FilterGroup;
65
+ }
66
+ interface ArrayMapping {
67
+ id: string;
68
+ sourceArray: SchemaField;
69
+ targetArray: SchemaField;
70
+ itemMappings: FieldMapping[];
71
+ filter?: ArrayFilterConfig;
72
+ }
73
+ type ArraySelectionMode = 'first' | 'last' | 'condition';
74
+ interface ArraySelectorConfig {
75
+ mode: ArraySelectionMode;
76
+ condition?: FilterGroup;
77
+ }
78
+ interface ArrayToObjectMapping {
79
+ id: string;
80
+ sourceArray: SchemaField;
81
+ targetObject: SchemaField;
82
+ selector: ArraySelectorConfig;
83
+ itemMappings: FieldMapping[];
84
+ }
85
+ interface ConnectionPoint {
86
+ fieldId: string;
87
+ side: 'source' | 'target';
88
+ x: number;
89
+ y: number;
90
+ }
91
+ interface Connection {
92
+ id: string;
93
+ mappingId: string;
94
+ sourcePoints: ConnectionPoint[];
95
+ targetPoint: ConnectionPoint;
96
+ transformation: TransformationConfig;
97
+ }
98
+ interface DragState {
99
+ isDragging: boolean;
100
+ sourceField: SchemaField | null;
101
+ startPoint: {
102
+ x: number;
103
+ y: number;
104
+ } | null;
105
+ currentPoint: {
106
+ x: number;
107
+ y: number;
108
+ } | null;
109
+ }
110
+ interface DefaultValue {
111
+ id: string;
112
+ targetField: SchemaField;
113
+ value: string | number | boolean | Date | null;
114
+ valueType: 'string' | 'number' | 'boolean' | 'date';
115
+ }
116
+
117
+ declare class MappingService {
118
+ private mappings;
119
+ private arrayMappings;
120
+ private arrayToObjectMappings;
121
+ private defaultValues;
122
+ private selectedMappingId;
123
+ private dragState;
124
+ readonly allMappings: _angular_core.Signal<FieldMapping[]>;
125
+ readonly allArrayMappings: _angular_core.Signal<ArrayMapping[]>;
126
+ readonly allArrayToObjectMappings: _angular_core.Signal<ArrayToObjectMapping[]>;
127
+ readonly allDefaultValues: _angular_core.Signal<DefaultValue[]>;
128
+ readonly selectedMapping: _angular_core.Signal<FieldMapping | null>;
129
+ readonly currentDragState: _angular_core.Signal<DragState>;
130
+ private generateId;
131
+ startDrag(field: SchemaField, startPoint: {
132
+ x: number;
133
+ y: number;
134
+ }): void;
135
+ updateDragPosition(currentPoint: {
136
+ x: number;
137
+ y: number;
138
+ }): void;
139
+ endDrag(): void;
140
+ createMapping(sourceFields: SchemaField[], targetField: SchemaField, transformation?: TransformationConfig): FieldMapping;
141
+ private createArrayMapping;
142
+ private createArrayToObjectMapping;
143
+ private findOrCreateArrayContext;
144
+ private findOrCreateArrayToObjectContext;
145
+ getArrayMapping(id: string): ArrayMapping | undefined;
146
+ getArrayMappingForField(field: SchemaField): ArrayMapping | undefined;
147
+ removeArrayMapping(arrayMappingId: string): void;
148
+ updateArrayFilter(arrayMappingId: string, filter: ArrayFilterConfig | undefined): void;
149
+ getArrayToObjectMapping(id: string): ArrayToObjectMapping | undefined;
150
+ updateArrayToObjectSelector(mappingId: string, selector: ArraySelectorConfig): void;
151
+ removeArrayToObjectMapping(mappingId: string): void;
152
+ updateMapping(mappingId: string, updates: Partial<FieldMapping>): void;
153
+ updateTransformation(mappingId: string, transformation: TransformationConfig): void;
154
+ removeMapping(mappingId: string): void;
155
+ removeSourceFromMapping(mappingId: string, sourceFieldId: string): void;
156
+ selectMapping(mappingId: string | null): void;
157
+ getMappingForTarget(targetFieldId: string): FieldMapping | undefined;
158
+ getMappingsForSource(sourceFieldId: string): FieldMapping[];
159
+ clearAllMappings(): void;
160
+ setDefaultValue(targetField: SchemaField, value: string | number | boolean | Date | null): DefaultValue;
161
+ getDefaultValue(targetFieldId: string): DefaultValue | undefined;
162
+ removeDefaultValue(targetFieldId: string): void;
163
+ hasDefaultValue(targetFieldId: string): boolean;
164
+ private getValueType;
165
+ exportMappings(): string;
166
+ importMappings(json: string): void;
167
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MappingService, never>;
168
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MappingService>;
169
+ }
170
+
171
+ declare class TransformationService {
172
+ applyTransformation(sourceValues: Record<string, unknown>, sourceFields: SchemaField[], config: TransformationConfig): string;
173
+ private getValueByPath;
174
+ private applyTemplate;
175
+ private formatDate;
176
+ private extractDatePart;
177
+ private formatNumber;
178
+ private applyCustomExpression;
179
+ getTransformationLabel(type: TransformationType): string;
180
+ getAvailableTransformations(): {
181
+ type: TransformationType;
182
+ label: string;
183
+ category?: string;
184
+ }[];
185
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TransformationService, never>;
186
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TransformationService>;
187
+ }
188
+
189
+ interface Point {
190
+ x: number;
191
+ y: number;
192
+ }
193
+ interface ConnectionPath {
194
+ id: string;
195
+ mappingId: string;
196
+ path: string;
197
+ sourcePoints: Point[];
198
+ targetPoint: Point;
199
+ midPoint: Point;
200
+ isSelected: boolean;
201
+ hasTransformation: boolean;
202
+ }
203
+ declare class SvgConnectorService {
204
+ createBezierPath(start: Point, end: Point): string;
205
+ createMultiSourcePath(sources: Point[], target: Point): {
206
+ paths: string[];
207
+ mergePoint: Point;
208
+ };
209
+ getMidPoint(start: Point, end: Point): Point;
210
+ getMultiSourceMidPoint(sources: Point[], target: Point): Point;
211
+ calculateConnectionPoint(rect: DOMRect, side: 'source' | 'target', containerRect: DOMRect): Point;
212
+ isPointNearPath(point: Point, pathStart: Point, pathEnd: Point, threshold?: number): boolean;
213
+ createDragPath(start: Point, end: Point): string;
214
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SvgConnectorService, never>;
215
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SvgConnectorService>;
216
+ }
217
+
218
+ interface JsonSchemaDefinition {
219
+ type?: string;
220
+ format?: string;
221
+ properties?: Record<string, JsonSchemaDefinition>;
222
+ items?: JsonSchemaDefinition;
223
+ $ref?: string;
224
+ description?: string;
225
+ enum?: string[];
226
+ required?: string[];
227
+ additionalProperties?: boolean | JsonSchemaDefinition;
228
+ }
229
+ interface SchemaDocument {
230
+ $ref?: string;
231
+ $defs?: Record<string, JsonSchemaDefinition>;
232
+ definitions?: Record<string, JsonSchemaDefinition>;
233
+ exclude?: string[];
234
+ include?: string[];
235
+ properties?: Record<string, JsonSchemaDefinition>;
236
+ type?: string;
237
+ title?: string;
238
+ description?: string;
239
+ }
240
+ interface ModelRegistry {
241
+ [modelName: string]: JsonSchemaDefinition;
242
+ }
243
+ declare class SchemaParserService {
244
+ private modelRegistry;
245
+ private idCounter;
246
+ registerModels(models: ModelRegistry): void;
247
+ clearRegistry(): void;
248
+ parseSchema(schemaJson: string | SchemaDocument, schemaName?: string): JsonSchema;
249
+ private resolveRef;
250
+ private buildFields;
251
+ private buildField;
252
+ private mapType;
253
+ private applyExclude;
254
+ private applyInclude;
255
+ private hasIncludedChild;
256
+ createSchemaFromRef(modelRef: string, options?: {
257
+ exclude?: string[];
258
+ include?: string[];
259
+ title?: string;
260
+ }): SchemaDocument;
261
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SchemaParserService, never>;
262
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SchemaParserService>;
263
+ }
264
+
265
+ interface FieldPositionEvent {
266
+ field: SchemaField;
267
+ element: HTMLElement;
268
+ rect: DOMRect;
269
+ }
270
+ declare class SchemaTreeComponent implements AfterViewInit, OnDestroy {
271
+ schema: {
272
+ name: string;
273
+ fields: SchemaField[];
274
+ };
275
+ side: 'source' | 'target';
276
+ mappings: FieldMapping[];
277
+ defaultValues: DefaultValue[];
278
+ fieldDragStart: EventEmitter<FieldPositionEvent>;
279
+ fieldDragEnd: EventEmitter<void>;
280
+ fieldDrop: EventEmitter<FieldPositionEvent>;
281
+ fieldPositionsChanged: EventEmitter<Map<string, DOMRect>>;
282
+ fieldDefaultValueClick: EventEmitter<FieldPositionEvent>;
283
+ schemaFieldsContainer: ElementRef<HTMLDivElement>;
284
+ fieldItems: QueryList<ElementRef>;
285
+ private mappingService;
286
+ private resizeObserver;
287
+ private scrollHandler;
288
+ ngAfterViewInit(): void;
289
+ ngOnDestroy(): void;
290
+ onScroll(): void;
291
+ emitFieldPositions(): void;
292
+ toggleExpand(field: SchemaField, event: Event): void;
293
+ onDragStart(event: MouseEvent, field: SchemaField): void;
294
+ onDragOver(event: DragEvent): void;
295
+ onDrop(event: MouseEvent, field: SchemaField): void;
296
+ getTypeIcon(type: string): string;
297
+ isFieldMapped(field: SchemaField): boolean;
298
+ getFieldMappingCount(field: SchemaField): number;
299
+ hasDefaultValue(field: SchemaField): boolean;
300
+ getDefaultValueDisplay(field: SchemaField): string;
301
+ onFieldClick(event: MouseEvent, field: SchemaField): void;
302
+ trackByFieldId(index: number, field: SchemaField): string;
303
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SchemaTreeComponent, never>;
304
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SchemaTreeComponent, "schema-tree", never, { "schema": { "alias": "schema"; "required": false; }; "side": { "alias": "side"; "required": false; }; "mappings": { "alias": "mappings"; "required": false; }; "defaultValues": { "alias": "defaultValues"; "required": false; }; }, { "fieldDragStart": "fieldDragStart"; "fieldDragEnd": "fieldDragEnd"; "fieldDrop": "fieldDrop"; "fieldPositionsChanged": "fieldPositionsChanged"; "fieldDefaultValueClick": "fieldDefaultValueClick"; }, never, never, true, never>;
305
+ }
306
+
307
+ interface VisualConnection {
308
+ id: string;
309
+ mappingId: string;
310
+ paths: string[];
311
+ midPoint: Point;
312
+ targetPoint: Point;
313
+ hasTransformation: boolean;
314
+ isSelected: boolean;
315
+ isArrayMapping: boolean;
316
+ isArrayToObjectMapping: boolean;
317
+ hasFilter: boolean;
318
+ }
319
+ declare class DataMapperComponent implements AfterViewInit, OnDestroy {
320
+ sourceSchema: JsonSchema;
321
+ targetSchema: JsonSchema;
322
+ sampleData: Record<string, unknown>;
323
+ mappingsChange: EventEmitter<FieldMapping[]>;
324
+ svgContainer: ElementRef<HTMLDivElement>;
325
+ svgElement: ElementRef<SVGSVGElement>;
326
+ private mappingService;
327
+ private svgConnectorService;
328
+ private transformationService;
329
+ private sourcePositions;
330
+ private targetPositions;
331
+ connections: _angular_core.WritableSignal<VisualConnection[]>;
332
+ dragPath: _angular_core.WritableSignal<string | null>;
333
+ selectedMappingId: _angular_core.WritableSignal<string | null>;
334
+ popoverPosition: _angular_core.WritableSignal<{
335
+ x: number;
336
+ y: number;
337
+ } | null>;
338
+ showArrayFilterModal: _angular_core.WritableSignal<boolean>;
339
+ selectedArrayMapping: _angular_core.WritableSignal<ArrayMapping | null>;
340
+ showArraySelectorModal: _angular_core.WritableSignal<boolean>;
341
+ selectedArrayToObjectMapping: _angular_core.WritableSignal<ArrayToObjectMapping | null>;
342
+ showDefaultValuePopover: _angular_core.WritableSignal<boolean>;
343
+ selectedDefaultValueField: _angular_core.WritableSignal<SchemaField | null>;
344
+ defaultValuePopoverPosition: _angular_core.WritableSignal<{
345
+ x: number;
346
+ y: number;
347
+ } | null>;
348
+ readonly mappings: _angular_core.Signal<FieldMapping[]>;
349
+ readonly arrayMappings: _angular_core.Signal<ArrayMapping[]>;
350
+ readonly defaultValues: _angular_core.Signal<DefaultValue[]>;
351
+ readonly selectedMapping: _angular_core.Signal<FieldMapping | null>;
352
+ readonly showPopover: _angular_core.Signal<boolean>;
353
+ private isDragging;
354
+ private dragSourceField;
355
+ private dragStartPoint;
356
+ private resizeObserver;
357
+ ngAfterViewInit(): void;
358
+ ngOnDestroy(): void;
359
+ private setupResizeObserver;
360
+ onSourcePositionsChanged(positions: Map<string, DOMRect>): void;
361
+ onTargetPositionsChanged(positions: Map<string, DOMRect>): void;
362
+ onFieldDragStart(event: FieldPositionEvent): void;
363
+ onMouseMove(event: MouseEvent): void;
364
+ onMouseUp(event: MouseEvent): void;
365
+ onFieldDrop(event: FieldPositionEvent): void;
366
+ onConnectionClick(connection: VisualConnection, event: MouseEvent): void;
367
+ onTransformationNodeClick(connection: VisualConnection, event: MouseEvent): void;
368
+ onArrayFilterSave(filter: ArrayFilterConfig | undefined): void;
369
+ closeArrayFilterModal(): void;
370
+ onArraySelectorSave(selector: ArraySelectorConfig): void;
371
+ closeArraySelectorModal(): void;
372
+ onDefaultValueClick(event: FieldPositionEvent): void;
373
+ onDefaultValueSave(value: string | number | boolean | Date | null): void;
374
+ onDefaultValueDelete(): void;
375
+ closeDefaultValuePopover(): void;
376
+ getExistingDefaultValue(fieldId: string): DefaultValue | undefined;
377
+ onPopoverSave(config: TransformationConfig): void;
378
+ onPopoverDelete(): void;
379
+ closePopover(): void;
380
+ private updateConnections;
381
+ getTransformationIcon(mappingId: string): string;
382
+ clearAllMappings(): void;
383
+ exportMappings(): string;
384
+ importMappings(json: string): void;
385
+ trackByConnectionId(index: number, connection: VisualConnection): string;
386
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataMapperComponent, never>;
387
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataMapperComponent, "data-mapper", never, { "sourceSchema": { "alias": "sourceSchema"; "required": false; }; "targetSchema": { "alias": "targetSchema"; "required": false; }; "sampleData": { "alias": "sampleData"; "required": false; }; }, { "mappingsChange": "mappingsChange"; }, never, never, true, never>;
388
+ }
389
+
390
+ interface EditorField {
391
+ id: string;
392
+ name: string;
393
+ type: 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array';
394
+ description?: string;
395
+ required?: boolean;
396
+ allowedValues?: string[];
397
+ children?: EditorField[];
398
+ expanded?: boolean;
399
+ isEditing?: boolean;
400
+ isEditingValues?: boolean;
401
+ }
402
+ interface SchemaDefinition {
403
+ name: string;
404
+ fields: EditorField[];
405
+ }
406
+ declare class SchemaEditorComponent {
407
+ set schema(value: SchemaDefinition | null);
408
+ schemaChange: EventEmitter<SchemaDefinition>;
409
+ save: EventEmitter<SchemaDefinition>;
410
+ schemaName: _angular_core.WritableSignal<string>;
411
+ fields: _angular_core.WritableSignal<EditorField[]>;
412
+ fieldTypes: Array<{
413
+ value: string;
414
+ label: string;
415
+ icon: string;
416
+ }>;
417
+ private generateId;
418
+ private cloneFields;
419
+ getTypeIcon(type: string): string;
420
+ addField(): void;
421
+ addChildField(parent: EditorField): void;
422
+ deleteField(field: EditorField, parentList: EditorField[]): void;
423
+ duplicateField(field: EditorField, parentList: EditorField[]): void;
424
+ toggleExpand(field: EditorField): void;
425
+ startEdit(field: EditorField): void;
426
+ stopEdit(field: EditorField): void;
427
+ onFieldNameChange(field: EditorField, event: Event): void;
428
+ onFieldTypeChange(field: EditorField, type: string): void;
429
+ toggleRequired(field: EditorField): void;
430
+ onDescriptionChange(field: EditorField, description: string): void;
431
+ toggleValuesEditor(field: EditorField): void;
432
+ addAllowedValue(field: EditorField, input: HTMLInputElement): void;
433
+ removeAllowedValue(field: EditorField, index: number): void;
434
+ onAllowedValueKeydown(event: KeyboardEvent, field: EditorField, input: HTMLInputElement): void;
435
+ onFieldNameKeydown(event: KeyboardEvent, field: EditorField): void;
436
+ moveFieldUp(field: EditorField, parentList: EditorField[]): void;
437
+ moveFieldDown(field: EditorField, parentList: EditorField[]): void;
438
+ canIndent(field: EditorField, parentList: EditorField[]): boolean;
439
+ indentField(field: EditorField, parentList: EditorField[]): void;
440
+ outdentField(field: EditorField, parentList: EditorField[], level: number): void;
441
+ private findParentOfList;
442
+ private findParentList;
443
+ onSchemaNameChange(name: string, input?: HTMLInputElement): void;
444
+ private emitChange;
445
+ onSave(): void;
446
+ toJson(): string;
447
+ toJsonSchema(): object;
448
+ private fieldToJsonSchema;
449
+ private stripEditingState;
450
+ trackByFieldId(index: number, field: EditorField): string;
451
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SchemaEditorComponent, never>;
452
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SchemaEditorComponent, "schema-editor", never, { "schema": { "alias": "schema"; "required": false; }; }, { "schemaChange": "schemaChange"; "save": "save"; }, never, never, true, never>;
453
+ }
454
+
455
+ declare class TransformationPopoverComponent implements OnInit, OnChanges {
456
+ mapping: FieldMapping;
457
+ position: {
458
+ x: number;
459
+ y: number;
460
+ };
461
+ sampleData: Record<string, unknown>;
462
+ save: EventEmitter<TransformationConfig>;
463
+ delete: EventEmitter<void>;
464
+ close: EventEmitter<void>;
465
+ private transformationService;
466
+ transformationType: TransformationType;
467
+ config: TransformationConfig;
468
+ preview: string;
469
+ availableTransformations: {
470
+ type: TransformationType;
471
+ label: string;
472
+ category?: string;
473
+ }[];
474
+ ngOnInit(): void;
475
+ ngOnChanges(changes: SimpleChanges): void;
476
+ private initFromMapping;
477
+ onTypeChange(): void;
478
+ private getDefaultTemplate;
479
+ updatePreview(): void;
480
+ onConfigChange(): void;
481
+ onSave(): void;
482
+ onDelete(): void;
483
+ onClose(): void;
484
+ getSourceFieldNames(): string;
485
+ getPopoverStyle(): Record<string, string>;
486
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TransformationPopoverComponent, never>;
487
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TransformationPopoverComponent, "transformation-popover", never, { "mapping": { "alias": "mapping"; "required": false; }; "position": { "alias": "position"; "required": false; }; "sampleData": { "alias": "sampleData"; "required": false; }; }, { "save": "save"; "delete": "delete"; "close": "close"; }, never, never, true, never>;
488
+ }
489
+
490
+ interface OperatorOption$1 {
491
+ value: FilterOperator;
492
+ label: string;
493
+ needsValue: boolean;
494
+ }
495
+ declare class ArrayFilterModalComponent implements OnInit {
496
+ arrayMapping: ArrayMapping;
497
+ save: EventEmitter<ArrayFilterConfig | undefined>;
498
+ close: EventEmitter<void>;
499
+ filterEnabled: _angular_core.WritableSignal<boolean>;
500
+ rootGroup: _angular_core.WritableSignal<FilterGroup>;
501
+ availableFields: _angular_core.Signal<{
502
+ path: string;
503
+ name: string;
504
+ type: string;
505
+ }[]>;
506
+ stringOperators: OperatorOption$1[];
507
+ numberOperators: OperatorOption$1[];
508
+ booleanOperators: OperatorOption$1[];
509
+ ngOnInit(): void;
510
+ private createEmptyGroup;
511
+ private generateId;
512
+ private cloneGroup;
513
+ private collectFields;
514
+ getOperatorsForField(fieldPath: string): OperatorOption$1[];
515
+ getFieldType(fieldPath: string): string;
516
+ operatorNeedsValue(operator: FilterOperator): boolean;
517
+ isCondition(item: FilterItem): item is FilterCondition;
518
+ isGroup(item: FilterItem): item is FilterGroup;
519
+ addCondition(group: FilterGroup): void;
520
+ addGroup(parentGroup: FilterGroup): void;
521
+ removeItem(parentGroup: FilterGroup, itemId: string): void;
522
+ onFieldChange(condition: FilterCondition, fieldPath: string): void;
523
+ onOperatorChange(condition: FilterCondition, operator: FilterOperator): void;
524
+ onValueChange(condition: FilterCondition, value: string | boolean): void;
525
+ onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void;
526
+ private triggerUpdate;
527
+ hasConditions(group: FilterGroup): boolean;
528
+ countConditions(group: FilterGroup): number;
529
+ onSave(): void;
530
+ onClose(): void;
531
+ onBackdropClick(event: MouseEvent): void;
532
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ArrayFilterModalComponent, never>;
533
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ArrayFilterModalComponent, "array-filter-modal", never, { "arrayMapping": { "alias": "arrayMapping"; "required": true; }; }, { "save": "save"; "close": "close"; }, never, never, true, never>;
534
+ }
535
+
536
+ interface OperatorOption {
537
+ value: FilterOperator;
538
+ label: string;
539
+ needsValue: boolean;
540
+ }
541
+ declare class ArraySelectorModalComponent implements OnInit {
542
+ mapping: ArrayToObjectMapping;
543
+ save: EventEmitter<ArraySelectorConfig>;
544
+ close: EventEmitter<void>;
545
+ selectionMode: _angular_core.WritableSignal<ArraySelectionMode>;
546
+ conditionGroup: _angular_core.WritableSignal<FilterGroup>;
547
+ availableFields: _angular_core.Signal<{
548
+ path: string;
549
+ name: string;
550
+ type: string;
551
+ }[]>;
552
+ stringOperators: OperatorOption[];
553
+ numberOperators: OperatorOption[];
554
+ booleanOperators: OperatorOption[];
555
+ ngOnInit(): void;
556
+ private createEmptyGroup;
557
+ private generateId;
558
+ private cloneGroup;
559
+ private collectFields;
560
+ getOperatorsForField(fieldPath: string): OperatorOption[];
561
+ operatorNeedsValue(operator: FilterOperator): boolean;
562
+ isCondition(item: FilterItem): item is FilterCondition;
563
+ isGroup(item: FilterItem): item is FilterGroup;
564
+ addCondition(group: FilterGroup): void;
565
+ addGroup(parentGroup: FilterGroup): void;
566
+ removeItem(parentGroup: FilterGroup, itemId: string): void;
567
+ onFieldChange(condition: FilterCondition, fieldPath: string): void;
568
+ onOperatorChange(condition: FilterCondition, operator: FilterOperator): void;
569
+ onValueChange(condition: FilterCondition, value: string | boolean): void;
570
+ onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void;
571
+ private triggerUpdate;
572
+ onSave(): void;
573
+ onClose(): void;
574
+ onBackdropClick(event: MouseEvent): void;
575
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ArraySelectorModalComponent, never>;
576
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ArraySelectorModalComponent, "array-selector-modal", never, { "mapping": { "alias": "mapping"; "required": true; }; }, { "save": "save"; "close": "close"; }, never, never, true, never>;
577
+ }
578
+
579
+ declare class DefaultValuePopoverComponent implements OnInit {
580
+ field: SchemaField;
581
+ existingValue?: DefaultValue;
582
+ position: {
583
+ x: number;
584
+ y: number;
585
+ };
586
+ save: EventEmitter<string | number | boolean | Date | null>;
587
+ delete: EventEmitter<void>;
588
+ close: EventEmitter<void>;
589
+ stringValue: string;
590
+ numberValue: number | null;
591
+ booleanValue: boolean;
592
+ dateValue: Date | null;
593
+ ngOnInit(): void;
594
+ get fieldType(): string;
595
+ onSave(): void;
596
+ onDelete(): void;
597
+ onClose(): void;
598
+ onBackdropClick(event: MouseEvent): void;
599
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DefaultValuePopoverComponent, never>;
600
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DefaultValuePopoverComponent, "default-value-popover", never, { "field": { "alias": "field"; "required": false; }; "existingValue": { "alias": "existingValue"; "required": false; }; "position": { "alias": "position"; "required": false; }; }, { "save": "save"; "delete": "delete"; "close": "close"; }, never, never, true, never>;
601
+ }
602
+
603
+ export { ArrayFilterModalComponent, ArraySelectorModalComponent, DataMapperComponent, DefaultValuePopoverComponent, MappingService, SchemaEditorComponent, SchemaParserService, SchemaTreeComponent, SvgConnectorService, TransformationPopoverComponent, TransformationService };
604
+ export type { ArrayFilterConfig, ArrayMapping, ArraySelectionMode, ArraySelectorConfig, ArrayToObjectMapping, Connection, ConnectionPath, ConnectionPoint, DefaultValue, DragState, EditorField, FieldMapping, FieldPositionEvent, FilterCondition, FilterGroup, FilterItem, FilterOperator, JsonSchema, JsonSchemaDefinition, ModelRegistry, Point, SchemaDefinition, SchemaDocument, SchemaField, TransformationConfig, TransformationType };