@memberjunction/ng-deep-diff 2.66.0 → 2.68.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/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # @memberjunction/ng-deep-diff
2
+
3
+ Angular component for visualizing deep object differences using the non-visual functionality from the @memberjunction/global package.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @memberjunction/ng-deep-diff
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Import the Module
14
+
15
+ ```typescript
16
+ import { DeepDiffModule } from '@memberjunction/ng-deep-diff';
17
+
18
+ @NgModule({
19
+ imports: [
20
+ DeepDiffModule,
21
+ // ... other imports
22
+ ]
23
+ })
24
+ export class YourModule { }
25
+ ```
26
+
27
+ ### Basic Component Usage
28
+
29
+ ```html
30
+ <mj-deep-diff
31
+ [oldValue]="originalData"
32
+ [newValue]="modifiedData"
33
+ [title]="'Data Comparison'"
34
+ [showSummary]="true"
35
+ [showUnchanged]="false">
36
+ </mj-deep-diff>
37
+ ```
38
+
39
+ ### Dialog Usage
40
+
41
+ ```html
42
+ <mj-deep-diff-dialog
43
+ [(visible)]="showDiffDialog"
44
+ [oldValue]="originalData"
45
+ [newValue]="modifiedData"
46
+ [title]="'Compare Changes'"
47
+ [width]="'90%'"
48
+ [height]="'80vh'">
49
+ </mj-deep-diff-dialog>
50
+ ```
51
+
52
+ ## Component Properties
53
+
54
+ ### DeepDiffComponent
55
+
56
+ | Property | Type | Default | Description |
57
+ |----------|------|---------|-------------|
58
+ | `oldValue` | `any` | - | The original value to compare |
59
+ | `newValue` | `any` | - | The new value to compare against |
60
+ | `title` | `string` | `'Deep Diff Analysis'` | Title displayed in the header |
61
+ | `showSummary` | `boolean` | `true` | Whether to show summary statistics |
62
+ | `showUnchanged` | `boolean` | `false` | Whether to show unchanged properties |
63
+ | `expandAll` | `boolean` | `false` | Whether to expand all nodes by default |
64
+ | `maxDepth` | `number` | `10` | Maximum depth to traverse in nested objects |
65
+ | `maxStringLength` | `number` | `100` | Maximum string length before truncation |
66
+ | `truncateValues` | `boolean` | `true` | Whether to truncate long values |
67
+ | `treatNullAsUndefined` | `boolean` | `false` | Whether to treat null values as equivalent to undefined |
68
+
69
+ ### DeepDiffDialogComponent
70
+
71
+ All properties from DeepDiffComponent, plus:
72
+
73
+ | Property | Type | Default | Description |
74
+ |----------|------|---------|-------------|
75
+ | `visible` | `boolean` | `false` | Controls dialog visibility |
76
+ | `width` | `string` | `'80%'` | Dialog width |
77
+ | `height` | `string` | `'80vh'` | Dialog height |
78
+
79
+ ## Features
80
+
81
+ - **Hierarchical Display**: Nested objects and arrays are displayed in an expandable tree structure
82
+ - **Change Type Filtering**: Filter by added, removed, modified, or unchanged items
83
+ - **Text Search**: Search through paths and descriptions
84
+ - **Copy Functionality**: Copy paths and values to clipboard
85
+ - **Export**: Export diff results as JSON
86
+ - **Responsive Design**: Works on desktop and mobile devices
87
+ - **Performance**: Handles large objects with configurable depth limits
88
+ - **Null Handling**: Optional treatment of null as undefined for API compatibility
89
+
90
+ ## Examples
91
+
92
+ ### Basic Comparison
93
+
94
+ ```typescript
95
+ export class MyComponent {
96
+ originalData = {
97
+ name: 'John Doe',
98
+ age: 30,
99
+ email: 'john@example.com'
100
+ };
101
+
102
+ modifiedData = {
103
+ name: 'John Doe',
104
+ age: 31,
105
+ email: 'john.doe@example.com',
106
+ phone: '+1234567890'
107
+ };
108
+ }
109
+ ```
110
+
111
+ ```html
112
+ <mj-deep-diff
113
+ [oldValue]="originalData"
114
+ [newValue]="modifiedData">
115
+ </mj-deep-diff>
116
+ ```
117
+
118
+ ### API Response Comparison with Null Handling
119
+
120
+ ```typescript
121
+ export class ApiComponent {
122
+ // API responses often use null and undefined interchangeably
123
+ apiResponse1 = {
124
+ id: 123,
125
+ name: null,
126
+ description: 'Product',
127
+ price: 99.99
128
+ };
129
+
130
+ apiResponse2 = {
131
+ id: 123,
132
+ name: 'Updated Product',
133
+ description: null,
134
+ price: 89.99
135
+ };
136
+ }
137
+ ```
138
+
139
+ ```html
140
+ <mj-deep-diff
141
+ [oldValue]="apiResponse1"
142
+ [newValue]="apiResponse2"
143
+ [treatNullAsUndefined]="true"
144
+ [showSummary]="true">
145
+ </mj-deep-diff>
146
+ ```
147
+
148
+ ### Dialog with Custom Configuration
149
+
150
+ ```typescript
151
+ export class ConfigComponent {
152
+ showComparison = false;
153
+
154
+ compareVersions() {
155
+ this.showComparison = true;
156
+ }
157
+ }
158
+ ```
159
+
160
+ ```html
161
+ <button (click)="compareVersions()">Compare Versions</button>
162
+
163
+ <mj-deep-diff-dialog
164
+ [(visible)]="showComparison"
165
+ [oldValue]="version1"
166
+ [newValue]="version2"
167
+ [title]="'Version Comparison'"
168
+ [expandAll]="true"
169
+ [maxDepth]="5"
170
+ [width]="'95%'"
171
+ [height]="'90vh'">
172
+ </mj-deep-diff-dialog>
173
+ ```
174
+
175
+ ## Styling
176
+
177
+ The component uses CSS classes that can be customized:
178
+
179
+ - `.diff-added` - Added items (green)
180
+ - `.diff-removed` - Removed items (red)
181
+ - `.diff-modified` - Modified items (blue)
182
+ - `.diff-unchanged` - Unchanged items (gray)
183
+
184
+ ## Dependencies
185
+
186
+ - `@memberjunction/global` - Provides the core DeepDiffer functionality
187
+ - `@angular/common`
188
+ - `@angular/core`
189
+
190
+ ## License
191
+
192
+ See the main MemberJunction repository for license information.
@@ -12,6 +12,7 @@ export declare class DeepDiffDialogComponent {
12
12
  expandAll: boolean;
13
13
  maxDepth: number;
14
14
  maxStringLength: number;
15
+ treatNullAsUndefined: boolean;
15
16
  visible: boolean;
16
17
  width: string;
17
18
  height: string;
@@ -23,6 +24,6 @@ export declare class DeepDiffDialogComponent {
23
24
  closeDialog(): void;
24
25
  toggleMaximize(): void;
25
26
  static ɵfac: i0.ɵɵFactoryDeclaration<DeepDiffDialogComponent, never>;
26
- static ɵcmp: i0.ɵɵComponentDeclaration<DeepDiffDialogComponent, "mj-deep-diff-dialog", never, { "oldValue": { "alias": "oldValue"; "required": false; }; "newValue": { "alias": "newValue"; "required": false; }; "title": { "alias": "title"; "required": false; }; "showSummary": { "alias": "showSummary"; "required": false; }; "showUnchanged": { "alias": "showUnchanged"; "required": false; }; "expandAll": { "alias": "expandAll"; "required": false; }; "maxDepth": { "alias": "maxDepth"; "required": false; }; "maxStringLength": { "alias": "maxStringLength"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, { "visibleChange": "visibleChange"; "close": "close"; }, never, never, false, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<DeepDiffDialogComponent, "mj-deep-diff-dialog", never, { "oldValue": { "alias": "oldValue"; "required": false; }; "newValue": { "alias": "newValue"; "required": false; }; "title": { "alias": "title"; "required": false; }; "showSummary": { "alias": "showSummary"; "required": false; }; "showUnchanged": { "alias": "showUnchanged"; "required": false; }; "expandAll": { "alias": "expandAll"; "required": false; }; "maxDepth": { "alias": "maxDepth"; "required": false; }; "maxStringLength": { "alias": "maxStringLength"; "required": false; }; "treatNullAsUndefined": { "alias": "treatNullAsUndefined"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, { "visibleChange": "visibleChange"; "close": "close"; }, never, never, false, never>;
27
28
  }
28
29
  //# sourceMappingURL=deep-diff-dialog.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deep-diff-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/deep-diff-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;;AAEvE;;GAEG;AACH,qBAKa,uBAAuB;IACzB,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,MAAM,CAAwB;IACrC,WAAW,EAAE,OAAO,CAAQ;IAC5B,aAAa,EAAE,OAAO,CAAS;IAC/B,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,MAAM,CAAM;IACtB,eAAe,EAAE,MAAM,CAAO;IAC9B,OAAO,EAAE,OAAO,CAAS;IACzB,KAAK,EAAE,MAAM,CAAS;IACtB,MAAM,EAAE,MAAM,CAAU;IAEvB,aAAa,wBAA+B;IAC5C,KAAK,qBAA4B;IAEpC,WAAW,EAAE,OAAO,CAAS;IAEpC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,WAAW,IAAI,IAAI;IAMnB,cAAc,IAAI,IAAI;yCAhCX,uBAAuB;2CAAvB,uBAAuB;CAmCnC"}
1
+ {"version":3,"file":"deep-diff-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/deep-diff-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;;AAEvE;;GAEG;AACH,qBAKa,uBAAuB;IACzB,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,MAAM,CAAwB;IACrC,WAAW,EAAE,OAAO,CAAQ;IAC5B,aAAa,EAAE,OAAO,CAAS;IAC/B,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,MAAM,CAAM;IACtB,eAAe,EAAE,MAAM,CAAO;IAC9B,oBAAoB,EAAE,OAAO,CAAS;IACtC,OAAO,EAAE,OAAO,CAAS;IACzB,KAAK,EAAE,MAAM,CAAS;IACtB,MAAM,EAAE,MAAM,CAAU;IAEvB,aAAa,wBAA+B;IAC5C,KAAK,qBAA4B;IAEpC,WAAW,EAAE,OAAO,CAAS;IAEpC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,WAAW,IAAI,IAAI;IAMnB,cAAc,IAAI,IAAI;yCAjCX,uBAAuB;2CAAvB,uBAAuB;CAoCnC"}
@@ -33,7 +33,7 @@ function DeepDiffDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
33
33
  i0.ɵɵadvance();
34
34
  i0.ɵɵclassProp("fa-window-maximize", !ctx_r1.isMaximized)("fa-window-restore", ctx_r1.isMaximized);
35
35
  i0.ɵɵadvance(4);
36
- i0.ɵɵproperty("oldValue", ctx_r1.oldValue)("newValue", ctx_r1.newValue)("title", "")("showSummary", ctx_r1.showSummary)("showUnchanged", ctx_r1.showUnchanged)("expandAll", ctx_r1.expandAll)("maxDepth", ctx_r1.maxDepth)("maxStringLength", ctx_r1.maxStringLength);
36
+ i0.ɵɵproperty("oldValue", ctx_r1.oldValue)("newValue", ctx_r1.newValue)("title", "")("showSummary", ctx_r1.showSummary)("showUnchanged", ctx_r1.showUnchanged)("expandAll", ctx_r1.expandAll)("maxDepth", ctx_r1.maxDepth)("maxStringLength", ctx_r1.maxStringLength)("treatNullAsUndefined", ctx_r1.treatNullAsUndefined);
37
37
  } }
38
38
  /**
39
39
  * Dialog wrapper component for the deep diff viewer
@@ -47,6 +47,7 @@ export class DeepDiffDialogComponent {
47
47
  expandAll = false;
48
48
  maxDepth = 10;
49
49
  maxStringLength = 100;
50
+ treatNullAsUndefined = false;
50
51
  visible = false;
51
52
  width = '80%';
52
53
  height = '80vh';
@@ -68,15 +69,15 @@ export class DeepDiffDialogComponent {
68
69
  this.isMaximized = !this.isMaximized;
69
70
  }
70
71
  static ɵfac = function DeepDiffDialogComponent_Factory(t) { return new (t || DeepDiffDialogComponent)(); };
71
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DeepDiffDialogComponent, selectors: [["mj-deep-diff-dialog"]], inputs: { oldValue: "oldValue", newValue: "newValue", title: "title", showSummary: "showSummary", showUnchanged: "showUnchanged", expandAll: "expandAll", maxDepth: "maxDepth", maxStringLength: "maxStringLength", visible: "visible", width: "width", height: "height" }, outputs: { visibleChange: "visibleChange", close: "close" }, decls: 1, vars: 1, consts: [[1, "dialog-overlay"], [1, "dialog-overlay", 3, "click"], [1, "dialog-container", 3, "click"], [1, "dialog-header"], [1, "dialog-title"], [1, "fa-solid", "fa-code-branch"], [1, "dialog-actions"], [1, "dialog-btn", 3, "click", "title"], [1, "fa-solid"], ["title", "Close", 1, "dialog-btn", "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-content"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength"]], template: function DeepDiffDialogComponent_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵtemplate(0, DeepDiffDialogComponent_Conditional_0_Template, 13, 18, "div", 0);
72
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DeepDiffDialogComponent, selectors: [["mj-deep-diff-dialog"]], inputs: { oldValue: "oldValue", newValue: "newValue", title: "title", showSummary: "showSummary", showUnchanged: "showUnchanged", expandAll: "expandAll", maxDepth: "maxDepth", maxStringLength: "maxStringLength", treatNullAsUndefined: "treatNullAsUndefined", visible: "visible", width: "width", height: "height" }, outputs: { visibleChange: "visibleChange", close: "close" }, decls: 1, vars: 1, consts: [[1, "dialog-overlay"], [1, "dialog-overlay", 3, "click"], [1, "dialog-container", 3, "click"], [1, "dialog-header"], [1, "dialog-title"], [1, "fa-solid", "fa-code-branch"], [1, "dialog-actions"], [1, "dialog-btn", 3, "click", "title"], [1, "fa-solid"], ["title", "Close", 1, "dialog-btn", "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-content"], [3, "oldValue", "newValue", "title", "showSummary", "showUnchanged", "expandAll", "maxDepth", "maxStringLength", "treatNullAsUndefined"]], template: function DeepDiffDialogComponent_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵtemplate(0, DeepDiffDialogComponent_Conditional_0_Template, 13, 19, "div", 0);
73
74
  } if (rf & 2) {
74
75
  i0.ɵɵconditional(ctx.visible ? 0 : -1);
75
76
  } }, dependencies: [i1.DeepDiffComponent], styles: ["\n\n.dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n.dialog-container[_ngcontent-%COMP%] {\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n display: flex;\n flex-direction: column;\n max-width: 95vw;\n max-height: 95vh;\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideIn 0.3s ease-out;\n transition: all 0.3s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from {\n transform: translateY(-20px) scale(0.95);\n opacity: 0;\n }\n to {\n transform: translateY(0) scale(1);\n opacity: 1;\n }\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n flex-shrink: 0;\n}\n\n.dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3498db;\n}\n\n.dialog-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.dialog-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 14px;\n}\n\n.dialog-btn[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.dialog-btn.close-btn[_ngcontent-%COMP%]:hover {\n background: #dc3545;\n border-color: #dc3545;\n color: white;\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n background: #f8f9fa;\n}\n\n.dialog-content[_ngcontent-%COMP%] mj-deep-diff[_ngcontent-%COMP%] {\n height: 100%;\n display: block;\n}\n\n\n\n@media (max-width: 768px) {\n .dialog-container[_ngcontent-%COMP%] {\n width: 95vw !important;\n height: 95vh !important;\n margin: 2.5vh 2.5vw;\n }\n \n .dialog-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n \n .dialog-title[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n \n .dialog-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 12px;\n }\n}"] });
76
77
  }
77
78
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DeepDiffDialogComponent, [{
78
79
  type: Component,
79
- args: [{ selector: 'mj-deep-diff-dialog', template: "@if (visible) {\n <div class=\"dialog-overlay\" (click)=\"closeDialog()\">\n <div \n class=\"dialog-container\" \n [style.width]=\"dialogWidth\" \n [style.height]=\"dialogHeight\"\n (click)=\"$event.stopPropagation()\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ title }}\n </h2>\n <div class=\"dialog-actions\">\n <button class=\"dialog-btn\" (click)=\"toggleMaximize()\" [title]=\"isMaximized ? 'Restore' : 'Maximize'\">\n <i class=\"fa-solid\" [class.fa-window-maximize]=\"!isMaximized\" [class.fa-window-restore]=\"isMaximized\"></i>\n </button>\n <button class=\"dialog-btn close-btn\" (click)=\"closeDialog()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n \n <!-- Dialog Content -->\n <div class=\"dialog-content\">\n <mj-deep-diff\n [oldValue]=\"oldValue\"\n [newValue]=\"newValue\"\n [title]=\"''\"\n [showSummary]=\"showSummary\"\n [showUnchanged]=\"showUnchanged\"\n [expandAll]=\"expandAll\"\n [maxDepth]=\"maxDepth\"\n [maxStringLength]=\"maxStringLength\">\n </mj-deep-diff>\n </div>\n </div>\n </div>\n}", styles: ["/* Dialog Overlay */\n.dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Dialog Container */\n.dialog-container {\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n display: flex;\n flex-direction: column;\n max-width: 95vw;\n max-height: 95vh;\n overflow: hidden;\n animation: slideIn 0.3s ease-out;\n transition: all 0.3s ease;\n}\n\n@keyframes slideIn {\n from {\n transform: translateY(-20px) scale(0.95);\n opacity: 0;\n }\n to {\n transform: translateY(0) scale(1);\n opacity: 1;\n }\n}\n\n/* Dialog Header */\n.dialog-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n flex-shrink: 0;\n}\n\n.dialog-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.dialog-title i {\n color: #3498db;\n}\n\n.dialog-actions {\n display: flex;\n gap: 8px;\n}\n\n.dialog-btn {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 14px;\n}\n\n.dialog-btn:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.dialog-btn.close-btn:hover {\n background: #dc3545;\n border-color: #dc3545;\n color: white;\n}\n\n/* Dialog Content */\n.dialog-content {\n flex: 1;\n overflow: hidden;\n background: #f8f9fa;\n}\n\n.dialog-content mj-deep-diff {\n height: 100%;\n display: block;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .dialog-container {\n width: 95vw !important;\n height: 95vh !important;\n margin: 2.5vh 2.5vw;\n }\n \n .dialog-header {\n padding: 16px;\n }\n \n .dialog-title {\n font-size: 18px;\n }\n \n .dialog-btn {\n width: 32px;\n height: 32px;\n font-size: 12px;\n }\n}"] }]
80
+ args: [{ selector: 'mj-deep-diff-dialog', template: "@if (visible) {\n <div class=\"dialog-overlay\" (click)=\"closeDialog()\">\n <div \n class=\"dialog-container\" \n [style.width]=\"dialogWidth\" \n [style.height]=\"dialogHeight\"\n (click)=\"$event.stopPropagation()\">\n \n <!-- Dialog Header -->\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ title }}\n </h2>\n <div class=\"dialog-actions\">\n <button class=\"dialog-btn\" (click)=\"toggleMaximize()\" [title]=\"isMaximized ? 'Restore' : 'Maximize'\">\n <i class=\"fa-solid\" [class.fa-window-maximize]=\"!isMaximized\" [class.fa-window-restore]=\"isMaximized\"></i>\n </button>\n <button class=\"dialog-btn close-btn\" (click)=\"closeDialog()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n \n <!-- Dialog Content -->\n <div class=\"dialog-content\">\n <mj-deep-diff\n [oldValue]=\"oldValue\"\n [newValue]=\"newValue\"\n [title]=\"''\"\n [showSummary]=\"showSummary\"\n [showUnchanged]=\"showUnchanged\"\n [expandAll]=\"expandAll\"\n [maxDepth]=\"maxDepth\"\n [maxStringLength]=\"maxStringLength\"\n [treatNullAsUndefined]=\"treatNullAsUndefined\">\n </mj-deep-diff>\n </div>\n </div>\n </div>\n}", styles: ["/* Dialog Overlay */\n.dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Dialog Container */\n.dialog-container {\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n display: flex;\n flex-direction: column;\n max-width: 95vw;\n max-height: 95vh;\n overflow: hidden;\n animation: slideIn 0.3s ease-out;\n transition: all 0.3s ease;\n}\n\n@keyframes slideIn {\n from {\n transform: translateY(-20px) scale(0.95);\n opacity: 0;\n }\n to {\n transform: translateY(0) scale(1);\n opacity: 1;\n }\n}\n\n/* Dialog Header */\n.dialog-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n flex-shrink: 0;\n}\n\n.dialog-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.dialog-title i {\n color: #3498db;\n}\n\n.dialog-actions {\n display: flex;\n gap: 8px;\n}\n\n.dialog-btn {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 14px;\n}\n\n.dialog-btn:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.dialog-btn.close-btn:hover {\n background: #dc3545;\n border-color: #dc3545;\n color: white;\n}\n\n/* Dialog Content */\n.dialog-content {\n flex: 1;\n overflow: hidden;\n background: #f8f9fa;\n}\n\n.dialog-content mj-deep-diff {\n height: 100%;\n display: block;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .dialog-container {\n width: 95vw !important;\n height: 95vh !important;\n margin: 2.5vh 2.5vw;\n }\n \n .dialog-header {\n padding: 16px;\n }\n \n .dialog-title {\n font-size: 18px;\n }\n \n .dialog-btn {\n width: 32px;\n height: 32px;\n font-size: 12px;\n }\n}"] }]
80
81
  }], null, { oldValue: [{
81
82
  type: Input
82
83
  }], newValue: [{
@@ -93,6 +94,8 @@ export class DeepDiffDialogComponent {
93
94
  type: Input
94
95
  }], maxStringLength: [{
95
96
  type: Input
97
+ }], treatNullAsUndefined: [{
98
+ type: Input
96
99
  }], visible: [{
97
100
  type: Input
98
101
  }], width: [{
@@ -1 +1 @@
1
- {"version":3,"file":"deep-diff-dialog.component.js","sourceRoot":"","sources":["../../src/lib/deep-diff-dialog.component.ts","../../src/lib/deep-diff-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;;ICCrE,8BAAoD;IAAxB,wLAAS,oBAAa,KAAC;IACjD,8BAIqC;IAAnC,2JAAS,wBAAwB,KAAC;IAIhC,AADF,8BAA2B,YACA;IACvB,uBAAuC;IACvC,YACF;IAAA,iBAAK;IAEH,AADF,8BAA4B,gBAC2E;IAA1E,2LAAS,uBAAgB,KAAC;IACnD,uBAA0G;IAC5G,iBAAS;IACT,iCAA2E;IAAtC,2LAAS,oBAAa,KAAC;IAC1D,yBAAiC;IAGvC,AADE,AADE,iBAAS,EACL,EACF;IAGN,gCAA4B;IAC1B,oCASe;IAGrB,AADE,AADE,iBAAM,EACF,EACF;;;IAlCF,cAA2B;IAC3B,AADA,2CAA2B,+BACE;IAOzB,eACF;IADE,6CACF;IAEwD,eAA8C;IAA9C,mEAA8C;IAC9E,cAAyC;IAAC,AAA1C,yDAAyC,yCAAwC;IAWvG,eAAqB;IAOrB,AADA,AADA,AADA,AADA,AADA,AADA,AADA,0CAAqB,6BACA,aACT,mCACe,uCACI,+BACR,6BACF,2CACc;;ADhC7C;;GAEG;AAMH,MAAM,OAAO,uBAAuB;IACzB,QAAQ,CAAM;IACd,QAAQ,CAAM;IACd,KAAK,GAAW,oBAAoB,CAAC;IACrC,WAAW,GAAY,IAAI,CAAC;IAC5B,aAAa,GAAY,KAAK,CAAC;IAC/B,SAAS,GAAY,KAAK,CAAC;IAC3B,QAAQ,GAAW,EAAE,CAAC;IACtB,eAAe,GAAW,GAAG,CAAC;IAC9B,OAAO,GAAY,KAAK,CAAC;IACzB,KAAK,GAAW,KAAK,CAAC;IACtB,MAAM,GAAW,MAAM,CAAC;IAEvB,aAAa,GAAG,IAAI,YAAY,EAAW,CAAC;IAC5C,KAAK,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEpC,WAAW,GAAY,KAAK,CAAC;IAEpC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAChD,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,WAAW;QACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACvC,CAAC;iFAlCU,uBAAuB;6DAAvB,uBAAuB;YCVpC,kFAAe;;YAAf,sCAuCC;;;iFD7BY,uBAAuB;cALnC,SAAS;2BACE,qBAAqB;gBAKtB,QAAQ;kBAAhB,KAAK;YACG,QAAQ;kBAAhB,KAAK;YACG,KAAK;kBAAb,KAAK;YACG,WAAW;kBAAnB,KAAK;YACG,aAAa;kBAArB,KAAK;YACG,SAAS;kBAAjB,KAAK;YACG,QAAQ;kBAAhB,KAAK;YACG,eAAe;kBAAvB,KAAK;YACG,OAAO;kBAAf,KAAK;YACG,KAAK;kBAAb,KAAK;YACG,MAAM;kBAAd,KAAK;YAEI,aAAa;kBAAtB,MAAM;YACG,KAAK;kBAAd,MAAM;;kFAdI,uBAAuB"}
1
+ {"version":3,"file":"deep-diff-dialog.component.js","sourceRoot":"","sources":["../../src/lib/deep-diff-dialog.component.ts","../../src/lib/deep-diff-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;;ICCrE,8BAAoD;IAAxB,wLAAS,oBAAa,KAAC;IACjD,8BAIqC;IAAnC,2JAAS,wBAAwB,KAAC;IAIhC,AADF,8BAA2B,YACA;IACvB,uBAAuC;IACvC,YACF;IAAA,iBAAK;IAEH,AADF,8BAA4B,gBAC2E;IAA1E,2LAAS,uBAAgB,KAAC;IACnD,uBAA0G;IAC5G,iBAAS;IACT,iCAA2E;IAAtC,2LAAS,oBAAa,KAAC;IAC1D,yBAAiC;IAGvC,AADE,AADE,iBAAS,EACL,EACF;IAGN,gCAA4B;IAC1B,oCAUe;IAGrB,AADE,AADE,iBAAM,EACF,EACF;;;IAnCF,cAA2B;IAC3B,AADA,2CAA2B,+BACE;IAOzB,eACF;IADE,6CACF;IAEwD,eAA8C;IAA9C,mEAA8C;IAC9E,cAAyC;IAAC,AAA1C,yDAAyC,yCAAwC;IAWvG,eAAqB;IAQrB,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,0CAAqB,6BACA,aACT,mCACe,uCACI,+BACR,6BACF,2CACc,qDACU;;ADjCvD;;GAEG;AAMH,MAAM,OAAO,uBAAuB;IACzB,QAAQ,CAAM;IACd,QAAQ,CAAM;IACd,KAAK,GAAW,oBAAoB,CAAC;IACrC,WAAW,GAAY,IAAI,CAAC;IAC5B,aAAa,GAAY,KAAK,CAAC;IAC/B,SAAS,GAAY,KAAK,CAAC;IAC3B,QAAQ,GAAW,EAAE,CAAC;IACtB,eAAe,GAAW,GAAG,CAAC;IAC9B,oBAAoB,GAAY,KAAK,CAAC;IACtC,OAAO,GAAY,KAAK,CAAC;IACzB,KAAK,GAAW,KAAK,CAAC;IACtB,MAAM,GAAW,MAAM,CAAC;IAEvB,aAAa,GAAG,IAAI,YAAY,EAAW,CAAC;IAC5C,KAAK,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEpC,WAAW,GAAY,KAAK,CAAC;IAEpC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAChD,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,WAAW;QACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACvC,CAAC;iFAnCU,uBAAuB;6DAAvB,uBAAuB;YCVpC,kFAAe;;YAAf,sCAwCC;;;iFD9BY,uBAAuB;cALnC,SAAS;2BACE,qBAAqB;gBAKtB,QAAQ;kBAAhB,KAAK;YACG,QAAQ;kBAAhB,KAAK;YACG,KAAK;kBAAb,KAAK;YACG,WAAW;kBAAnB,KAAK;YACG,aAAa;kBAArB,KAAK;YACG,SAAS;kBAAjB,KAAK;YACG,QAAQ;kBAAhB,KAAK;YACG,eAAe;kBAAvB,KAAK;YACG,oBAAoB;kBAA5B,KAAK;YACG,OAAO;kBAAf,KAAK;YACG,KAAK;kBAAb,KAAK;YACG,MAAM;kBAAd,KAAK;YAEI,aAAa;kBAAtB,MAAM;YACG,KAAK;kBAAd,MAAM;;kFAfI,uBAAuB"}
@@ -1,4 +1,4 @@
1
- import { OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
1
+ import { OnInit, ChangeDetectorRef } from '@angular/core';
2
2
  import { DeepDiffResult, DiffChangeType, DiffChange } from '@memberjunction/global';
3
3
  import * as i0 from "@angular/core";
4
4
  export interface DeepDiffItem extends DiffChange {
@@ -7,24 +7,40 @@ export interface DeepDiffItem extends DiffChange {
7
7
  children: DeepDiffItem[];
8
8
  parentPath: string;
9
9
  }
10
- export declare class DeepDiffComponent implements OnInit, OnChanges {
10
+ export declare class DeepDiffComponent implements OnInit {
11
11
  private cdr;
12
- oldValue: any;
13
- newValue: any;
12
+ private _oldValue;
13
+ private _newValue;
14
+ private _showUnchanged;
15
+ private _maxDepth;
16
+ private _maxStringLength;
17
+ private _treatNullAsUndefined;
18
+ get oldValue(): any;
19
+ set oldValue(value: any);
20
+ get newValue(): any;
21
+ set newValue(value: any);
22
+ get showUnchanged(): boolean;
23
+ set showUnchanged(value: boolean);
24
+ get maxDepth(): number;
25
+ set maxDepth(value: number);
26
+ get maxStringLength(): number;
27
+ set maxStringLength(value: number);
28
+ get treatNullAsUndefined(): boolean;
29
+ set treatNullAsUndefined(value: boolean);
14
30
  title: string;
15
31
  showSummary: boolean;
16
- showUnchanged: boolean;
17
32
  expandAll: boolean;
18
- maxDepth: number;
19
- maxStringLength: number;
33
+ truncateValues: boolean;
20
34
  diffResult: DeepDiffResult | null;
21
35
  diffItems: DeepDiffItem[];
22
36
  filter: string;
23
37
  filterType: 'all' | 'added' | 'removed' | 'modified' | 'unchanged';
38
+ expandedValuesMap: {
39
+ [key: string]: boolean;
40
+ };
24
41
  private differ;
25
42
  constructor(cdr: ChangeDetectorRef);
26
43
  ngOnInit(): void;
27
- ngOnChanges(changes: SimpleChanges): void;
28
44
  private updateDifferConfig;
29
45
  private generateDiff;
30
46
  private buildHierarchicalItems;
@@ -34,10 +50,15 @@ export declare class DeepDiffComponent implements OnInit, OnChanges {
34
50
  get filteredItems(): DeepDiffItem[];
35
51
  getIcon(type: DiffChangeType): string;
36
52
  getTypeClass(type: DiffChangeType): string;
37
- formatValue(value: any): string;
53
+ formatValue(value: any, path: string): string;
54
+ isValueTruncated(value: any, path: string): boolean;
55
+ toggleValueExpansion(path: string, event: Event): void;
56
+ private getObjectSize;
38
57
  copyToClipboard(text: string): void;
58
+ isExpanded(path: string): boolean;
59
+ copyValueToClipboard(value: any, event: Event): void;
39
60
  exportDiff(): void;
40
61
  static ɵfac: i0.ɵɵFactoryDeclaration<DeepDiffComponent, never>;
41
- static ɵcmp: i0.ɵɵComponentDeclaration<DeepDiffComponent, "mj-deep-diff", never, { "oldValue": { "alias": "oldValue"; "required": false; }; "newValue": { "alias": "newValue"; "required": false; }; "title": { "alias": "title"; "required": false; }; "showSummary": { "alias": "showSummary"; "required": false; }; "showUnchanged": { "alias": "showUnchanged"; "required": false; }; "expandAll": { "alias": "expandAll"; "required": false; }; "maxDepth": { "alias": "maxDepth"; "required": false; }; "maxStringLength": { "alias": "maxStringLength"; "required": false; }; }, {}, never, never, false, never>;
62
+ static ɵcmp: i0.ɵɵComponentDeclaration<DeepDiffComponent, "mj-deep-diff", never, { "oldValue": { "alias": "oldValue"; "required": false; }; "newValue": { "alias": "newValue"; "required": false; }; "showUnchanged": { "alias": "showUnchanged"; "required": false; }; "maxDepth": { "alias": "maxDepth"; "required": false; }; "maxStringLength": { "alias": "maxStringLength"; "required": false; }; "treatNullAsUndefined": { "alias": "treatNullAsUndefined"; "required": false; }; "title": { "alias": "title"; "required": false; }; "showSummary": { "alias": "showSummary"; "required": false; }; "expandAll": { "alias": "expandAll"; "required": false; }; "truncateValues": { "alias": "truncateValues"; "required": false; }; }, {}, never, never, false, never>;
42
63
  }
43
64
  //# sourceMappingURL=deep-diff.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deep-diff.component.d.ts","sourceRoot":"","sources":["../../src/lib/deep-diff.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAc,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;;AAEhG,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAKa,iBAAkB,YAAW,MAAM,EAAE,SAAS;IAiB7C,OAAO,CAAC,GAAG;IAhBd,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,MAAM,CAAwB;IACrC,WAAW,EAAE,OAAO,CAAQ;IAC5B,aAAa,EAAE,OAAO,CAAS;IAC/B,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,MAAM,CAAM;IACtB,eAAe,EAAE,MAAM,CAAO;IAEvC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAQ;IACzC,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,MAAM,EAAE,MAAM,CAAM;IACpB,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAS;IAE3E,OAAO,CAAC,MAAM,CAAa;gBAEP,GAAG,EAAE,iBAAiB;IAQ1C,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAQzC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,sBAAsB;IAqC9B,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKpC,cAAc,IAAI,IAAI;IAatB,gBAAgB,IAAI,IAAI;IAaxB,IAAI,aAAa,IAAI,YAAY,EAAE,CAiClC;IAED,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAUrC,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAU1C,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAmB/B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMnC,UAAU,IAAI,IAAI;yCAhNP,iBAAiB;2CAAjB,iBAAiB;CA4N7B"}
1
+ {"version":3,"file":"deep-diff.component.d.ts","sourceRoot":"","sources":["../../src/lib/deep-diff.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AACrG,OAAO,EAAc,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;;AAEhG,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAMa,iBAAkB,YAAW,MAAM;IA+ElC,OAAO,CAAC,GAAG;IA9EvB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,qBAAqB,CAAkB;IAE/C,IACI,QAAQ,IAAI,GAAG,CAElB;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAGtB;IAED,IACI,QAAQ,IAAI,GAAG,CAElB;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAGtB;IAED,IACI,aAAa,IAAI,OAAO,CAE3B;IACD,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,EAI/B;IAED,IACI,QAAQ,IAAI,MAAM,CAErB;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAIzB;IAED,IACI,eAAe,IAAI,MAAM,CAE5B;IACD,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,EAIhC;IAED,IACI,oBAAoB,IAAI,OAAO,CAElC;IACD,IAAI,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAItC;IAEQ,KAAK,EAAE,MAAM,CAAwB;IACrC,WAAW,EAAE,OAAO,CAAQ;IAC5B,SAAS,EAAE,OAAO,CAAS;IAC3B,cAAc,EAAE,OAAO,CAAQ;IAExC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAQ;IACzC,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,MAAM,EAAE,MAAM,CAAM;IACpB,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAS;IAC3E,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAM;IAEnD,OAAO,CAAC,MAAM,CAAa;gBAEP,GAAG,EAAE,iBAAiB;IAS1C,QAAQ,IAAI,IAAI;IAKhB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,sBAAsB;IAqC9B,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKpC,cAAc,IAAI,IAAI;IAatB,gBAAgB,IAAI,IAAI;IAaxB,IAAI,aAAa,IAAI,YAAY,EAAE,CAiClC;IAED,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAUrC,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAU1C,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IA+B7C,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAqBnD,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAatD,OAAO,CAAC,aAAa;IAOrB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMnC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAuBpD,UAAU,IAAI,IAAI;yCAzVP,iBAAiB;2CAAjB,iBAAiB;CAqW7B"}
@@ -1,4 +1,4 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
2
  import { DeepDiffer, DiffChangeType } from '@memberjunction/global';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/common";
@@ -101,52 +101,139 @@ function DeepDiffComponent_ng_template_34_Conditional_2_Template(rf, ctx) { if (
101
101
  function DeepDiffComponent_ng_template_34_Conditional_3_Template(rf, ctx) { if (rf & 1) {
102
102
  i0.ɵɵelement(0, "span", 42);
103
103
  } }
104
+ function DeepDiffComponent_ng_template_34_Conditional_11_Conditional_8_Template(rf, ctx) { if (rf & 1) {
105
+ const _r8 = i0.ɵɵgetCurrentView();
106
+ i0.ɵɵelementStart(0, "button", 57);
107
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_11_Conditional_8_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const item_r6 = i0.ɵɵnextContext(2).item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleValueExpansion(item_r6.path + "_old", $event)); });
108
+ i0.ɵɵelement(1, "i", 58);
109
+ i0.ɵɵelementEnd();
110
+ } if (rf & 2) {
111
+ const item_r6 = i0.ɵɵnextContext(2).item;
112
+ const ctx_r1 = i0.ɵɵnextContext();
113
+ i0.ɵɵpropertyInterpolate("title", ctx_r1.isExpanded(item_r6.path + "_old") ? "Collapse" : "Expand");
114
+ i0.ɵɵadvance();
115
+ i0.ɵɵproperty("ngClass", ctx_r1.isExpanded(item_r6.path + "_old") ? "fa-compress-alt" : "fa-expand-alt");
116
+ } }
117
+ function DeepDiffComponent_ng_template_34_Conditional_11_Conditional_16_Template(rf, ctx) { if (rf & 1) {
118
+ const _r9 = i0.ɵɵgetCurrentView();
119
+ i0.ɵɵelementStart(0, "button", 57);
120
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_11_Conditional_16_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r9); const item_r6 = i0.ɵɵnextContext(2).item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleValueExpansion(item_r6.path + "_new", $event)); });
121
+ i0.ɵɵelement(1, "i", 58);
122
+ i0.ɵɵelementEnd();
123
+ } if (rf & 2) {
124
+ const item_r6 = i0.ɵɵnextContext(2).item;
125
+ const ctx_r1 = i0.ɵɵnextContext();
126
+ i0.ɵɵpropertyInterpolate("title", ctx_r1.isExpanded(item_r6.path + "_new") ? "Collapse" : "Expand");
127
+ i0.ɵɵadvance();
128
+ i0.ɵɵproperty("ngClass", ctx_r1.isExpanded(item_r6.path + "_new") ? "fa-compress-alt" : "fa-expand-alt");
129
+ } }
104
130
  function DeepDiffComponent_ng_template_34_Conditional_11_Template(rf, ctx) { if (rf & 1) {
131
+ const _r7 = i0.ɵɵgetCurrentView();
105
132
  i0.ɵɵelementStart(0, "div", 48)(1, "div", 51)(2, "span", 52);
106
133
  i0.ɵɵtext(3, "Old:");
107
134
  i0.ɵɵelementEnd();
108
135
  i0.ɵɵelementStart(4, "code", 53);
109
136
  i0.ɵɵtext(5);
110
- i0.ɵɵelementEnd()();
111
- i0.ɵɵelementStart(6, "div", 54)(7, "span", 52);
112
- i0.ɵɵtext(8, "New:");
113
137
  i0.ɵɵelementEnd();
114
- i0.ɵɵelementStart(9, "code", 53);
115
- i0.ɵɵtext(10);
116
- i0.ɵɵelementEnd()()();
138
+ i0.ɵɵelementStart(6, "button", 54);
139
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_11_Template_button_click_6_listener($event) { i0.ɵɵrestoreView(_r7); const item_r6 = i0.ɵɵnextContext().item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.copyValueToClipboard(item_r6.oldValue, $event)); });
140
+ i0.ɵɵelement(7, "i", 47);
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵtemplate(8, DeepDiffComponent_ng_template_34_Conditional_11_Conditional_8_Template, 2, 2, "button", 55);
143
+ i0.ɵɵelementEnd();
144
+ i0.ɵɵelementStart(9, "div", 56)(10, "span", 52);
145
+ i0.ɵɵtext(11, "New:");
146
+ i0.ɵɵelementEnd();
147
+ i0.ɵɵelementStart(12, "code", 53);
148
+ i0.ɵɵtext(13);
149
+ i0.ɵɵelementEnd();
150
+ i0.ɵɵelementStart(14, "button", 54);
151
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_11_Template_button_click_14_listener($event) { i0.ɵɵrestoreView(_r7); const item_r6 = i0.ɵɵnextContext().item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.copyValueToClipboard(item_r6.newValue, $event)); });
152
+ i0.ɵɵelement(15, "i", 47);
153
+ i0.ɵɵelementEnd();
154
+ i0.ɵɵtemplate(16, DeepDiffComponent_ng_template_34_Conditional_11_Conditional_16_Template, 2, 2, "button", 55);
155
+ i0.ɵɵelementEnd()();
117
156
  } if (rf & 2) {
118
157
  const item_r6 = i0.ɵɵnextContext().item;
119
158
  const ctx_r1 = i0.ɵɵnextContext();
120
159
  i0.ɵɵadvance(5);
121
- i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.oldValue));
160
+ i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.oldValue, item_r6.path + "_old"));
161
+ i0.ɵɵadvance(3);
162
+ i0.ɵɵconditional(ctx_r1.isValueTruncated(item_r6.oldValue, item_r6.path + "_old") || ctx_r1.isExpanded(item_r6.path + "_old") ? 8 : -1);
122
163
  i0.ɵɵadvance(5);
123
- i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.newValue));
164
+ i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.newValue, item_r6.path + "_new"));
165
+ i0.ɵɵadvance(3);
166
+ i0.ɵɵconditional(ctx_r1.isValueTruncated(item_r6.newValue, item_r6.path + "_new") || ctx_r1.isExpanded(item_r6.path + "_new") ? 16 : -1);
167
+ } }
168
+ function DeepDiffComponent_ng_template_34_Conditional_12_Conditional_8_Template(rf, ctx) { if (rf & 1) {
169
+ const _r11 = i0.ɵɵgetCurrentView();
170
+ i0.ɵɵelementStart(0, "button", 57);
171
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_12_Conditional_8_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r11); const item_r6 = i0.ɵɵnextContext(2).item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleValueExpansion(item_r6.path, $event)); });
172
+ i0.ɵɵelement(1, "i", 58);
173
+ i0.ɵɵelementEnd();
174
+ } if (rf & 2) {
175
+ const item_r6 = i0.ɵɵnextContext(2).item;
176
+ const ctx_r1 = i0.ɵɵnextContext();
177
+ i0.ɵɵpropertyInterpolate("title", ctx_r1.isExpanded(item_r6.path) ? "Collapse" : "Expand");
178
+ i0.ɵɵadvance();
179
+ i0.ɵɵproperty("ngClass", ctx_r1.isExpanded(item_r6.path) ? "fa-compress-alt" : "fa-expand-alt");
124
180
  } }
125
181
  function DeepDiffComponent_ng_template_34_Conditional_12_Template(rf, ctx) { if (rf & 1) {
126
- i0.ɵɵelementStart(0, "div", 48)(1, "div", 54)(2, "span", 52);
182
+ const _r10 = i0.ɵɵgetCurrentView();
183
+ i0.ɵɵelementStart(0, "div", 48)(1, "div", 56)(2, "span", 52);
127
184
  i0.ɵɵtext(3, "Value:");
128
185
  i0.ɵɵelementEnd();
129
186
  i0.ɵɵelementStart(4, "code", 53);
130
187
  i0.ɵɵtext(5);
131
- i0.ɵɵelementEnd()()();
188
+ i0.ɵɵelementEnd();
189
+ i0.ɵɵelementStart(6, "button", 54);
190
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_12_Template_button_click_6_listener($event) { i0.ɵɵrestoreView(_r10); const item_r6 = i0.ɵɵnextContext().item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.copyValueToClipboard(item_r6.newValue, $event)); });
191
+ i0.ɵɵelement(7, "i", 47);
192
+ i0.ɵɵelementEnd();
193
+ i0.ɵɵtemplate(8, DeepDiffComponent_ng_template_34_Conditional_12_Conditional_8_Template, 2, 2, "button", 55);
194
+ i0.ɵɵelementEnd()();
132
195
  } if (rf & 2) {
133
196
  const item_r6 = i0.ɵɵnextContext().item;
134
197
  const ctx_r1 = i0.ɵɵnextContext();
135
198
  i0.ɵɵadvance(5);
136
- i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.newValue));
199
+ i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.newValue, item_r6.path));
200
+ i0.ɵɵadvance(3);
201
+ i0.ɵɵconditional(ctx_r1.isValueTruncated(item_r6.newValue, item_r6.path) || ctx_r1.isExpanded(item_r6.path) ? 8 : -1);
202
+ } }
203
+ function DeepDiffComponent_ng_template_34_Conditional_13_Conditional_8_Template(rf, ctx) { if (rf & 1) {
204
+ const _r13 = i0.ɵɵgetCurrentView();
205
+ i0.ɵɵelementStart(0, "button", 57);
206
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_13_Conditional_8_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const item_r6 = i0.ɵɵnextContext(2).item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleValueExpansion(item_r6.path, $event)); });
207
+ i0.ɵɵelement(1, "i", 58);
208
+ i0.ɵɵelementEnd();
209
+ } if (rf & 2) {
210
+ const item_r6 = i0.ɵɵnextContext(2).item;
211
+ const ctx_r1 = i0.ɵɵnextContext();
212
+ i0.ɵɵpropertyInterpolate("title", ctx_r1.isExpanded(item_r6.path) ? "Collapse" : "Expand");
213
+ i0.ɵɵadvance();
214
+ i0.ɵɵproperty("ngClass", ctx_r1.isExpanded(item_r6.path) ? "fa-compress-alt" : "fa-expand-alt");
137
215
  } }
138
216
  function DeepDiffComponent_ng_template_34_Conditional_13_Template(rf, ctx) { if (rf & 1) {
217
+ const _r12 = i0.ɵɵgetCurrentView();
139
218
  i0.ɵɵelementStart(0, "div", 48)(1, "div", 51)(2, "span", 52);
140
219
  i0.ɵɵtext(3, "Value:");
141
220
  i0.ɵɵelementEnd();
142
221
  i0.ɵɵelementStart(4, "code", 53);
143
222
  i0.ɵɵtext(5);
144
- i0.ɵɵelementEnd()()();
223
+ i0.ɵɵelementEnd();
224
+ i0.ɵɵelementStart(6, "button", 54);
225
+ i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Conditional_13_Template_button_click_6_listener($event) { i0.ɵɵrestoreView(_r12); const item_r6 = i0.ɵɵnextContext().item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.copyValueToClipboard(item_r6.oldValue, $event)); });
226
+ i0.ɵɵelement(7, "i", 47);
227
+ i0.ɵɵelementEnd();
228
+ i0.ɵɵtemplate(8, DeepDiffComponent_ng_template_34_Conditional_13_Conditional_8_Template, 2, 2, "button", 55);
229
+ i0.ɵɵelementEnd()();
145
230
  } if (rf & 2) {
146
231
  const item_r6 = i0.ɵɵnextContext().item;
147
232
  const ctx_r1 = i0.ɵɵnextContext();
148
233
  i0.ɵɵadvance(5);
149
- i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.oldValue));
234
+ i0.ɵɵtextInterpolate(ctx_r1.formatValue(item_r6.oldValue, item_r6.path));
235
+ i0.ɵɵadvance(3);
236
+ i0.ɵɵconditional(ctx_r1.isValueTruncated(item_r6.oldValue, item_r6.path) || ctx_r1.isExpanded(item_r6.path) ? 8 : -1);
150
237
  } }
151
238
  function DeepDiffComponent_ng_template_34_Conditional_14_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
152
239
  i0.ɵɵelementContainer(0);
@@ -154,11 +241,11 @@ function DeepDiffComponent_ng_template_34_Conditional_14_For_2_ng_container_0_Te
154
241
  function DeepDiffComponent_ng_template_34_Conditional_14_For_2_Template(rf, ctx) { if (rf & 1) {
155
242
  i0.ɵɵtemplate(0, DeepDiffComponent_ng_template_34_Conditional_14_For_2_ng_container_0_Template, 1, 0, "ng-container", 38);
156
243
  } if (rf & 2) {
157
- const child_r7 = ctx.$implicit;
158
- const level_r8 = i0.ɵɵnextContext(2).level;
244
+ const child_r14 = ctx.$implicit;
245
+ const level_r15 = i0.ɵɵnextContext(2).level;
159
246
  i0.ɵɵnextContext();
160
247
  const diffItem_r4 = i0.ɵɵreference(35);
161
- i0.ɵɵproperty("ngTemplateOutlet", diffItem_r4)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c1, child_r7, level_r8 + 1));
248
+ i0.ɵɵproperty("ngTemplateOutlet", diffItem_r4)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c1, child_r14, level_r15 + 1));
162
249
  } }
163
250
  function DeepDiffComponent_ng_template_34_Conditional_14_Template(rf, ctx) { if (rf & 1) {
164
251
  i0.ɵɵelementStart(0, "div", 49);
@@ -185,14 +272,14 @@ function DeepDiffComponent_ng_template_34_Template(rf, ctx) { if (rf & 1) {
185
272
  i0.ɵɵlistener("click", function DeepDiffComponent_ng_template_34_Template_button_click_9_listener($event) { const item_r6 = i0.ɵɵrestoreView(_r5).item; const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.copyToClipboard(item_r6.path); return i0.ɵɵresetView($event.stopPropagation()); });
186
273
  i0.ɵɵelement(10, "i", 47);
187
274
  i0.ɵɵelementEnd()();
188
- i0.ɵɵtemplate(11, DeepDiffComponent_ng_template_34_Conditional_11_Template, 11, 2, "div", 48)(12, DeepDiffComponent_ng_template_34_Conditional_12_Template, 6, 1, "div", 48)(13, DeepDiffComponent_ng_template_34_Conditional_13_Template, 6, 1, "div", 48)(14, DeepDiffComponent_ng_template_34_Conditional_14_Template, 3, 0, "div", 49);
275
+ i0.ɵɵtemplate(11, DeepDiffComponent_ng_template_34_Conditional_11_Template, 17, 4, "div", 48)(12, DeepDiffComponent_ng_template_34_Conditional_12_Template, 9, 2, "div", 48)(13, DeepDiffComponent_ng_template_34_Conditional_13_Template, 9, 2, "div", 48)(14, DeepDiffComponent_ng_template_34_Conditional_14_Template, 3, 0, "div", 49);
189
276
  i0.ɵɵelementEnd();
190
277
  } if (rf & 2) {
191
278
  const item_r6 = ctx.item;
192
- const level_r8 = ctx.level;
279
+ const level_r15 = ctx.level;
193
280
  const ctx_r1 = i0.ɵɵnextContext();
194
281
  i0.ɵɵclassMap(ctx_r1.getTypeClass(item_r6.type));
195
- i0.ɵɵstyleProp("padding-left", level_r8 * 24, "px");
282
+ i0.ɵɵstyleProp("padding-left", level_r15 * 24, "px");
196
283
  i0.ɵɵadvance(2);
197
284
  i0.ɵɵconditional(item_r6.children.length > 0 ? 2 : 3);
198
285
  i0.ɵɵadvance(2);
@@ -208,42 +295,86 @@ function DeepDiffComponent_ng_template_34_Template(rf, ctx) { if (rf & 1) {
208
295
  } }
209
296
  export class DeepDiffComponent {
210
297
  cdr;
211
- oldValue;
212
- newValue;
298
+ _oldValue;
299
+ _newValue;
300
+ _showUnchanged = false;
301
+ _maxDepth = 10;
302
+ _maxStringLength = 100;
303
+ _treatNullAsUndefined = false;
304
+ get oldValue() {
305
+ return this._oldValue;
306
+ }
307
+ set oldValue(value) {
308
+ this._oldValue = value;
309
+ this.generateDiff();
310
+ }
311
+ get newValue() {
312
+ return this._newValue;
313
+ }
314
+ set newValue(value) {
315
+ this._newValue = value;
316
+ this.generateDiff();
317
+ }
318
+ get showUnchanged() {
319
+ return this._showUnchanged;
320
+ }
321
+ set showUnchanged(value) {
322
+ this._showUnchanged = value;
323
+ this.updateDifferConfig();
324
+ this.generateDiff();
325
+ }
326
+ get maxDepth() {
327
+ return this._maxDepth;
328
+ }
329
+ set maxDepth(value) {
330
+ this._maxDepth = value;
331
+ this.updateDifferConfig();
332
+ this.generateDiff();
333
+ }
334
+ get maxStringLength() {
335
+ return this._maxStringLength;
336
+ }
337
+ set maxStringLength(value) {
338
+ this._maxStringLength = value;
339
+ this.updateDifferConfig();
340
+ this.generateDiff();
341
+ }
342
+ get treatNullAsUndefined() {
343
+ return this._treatNullAsUndefined;
344
+ }
345
+ set treatNullAsUndefined(value) {
346
+ this._treatNullAsUndefined = value;
347
+ this.updateDifferConfig();
348
+ this.generateDiff();
349
+ }
213
350
  title = 'Deep Diff Analysis';
214
351
  showSummary = true;
215
- showUnchanged = false;
216
352
  expandAll = false;
217
- maxDepth = 10;
218
- maxStringLength = 100;
353
+ truncateValues = true;
219
354
  diffResult = null;
220
355
  diffItems = [];
221
356
  filter = '';
222
357
  filterType = 'all';
358
+ expandedValuesMap = {};
223
359
  differ;
224
360
  constructor(cdr) {
225
361
  this.cdr = cdr;
226
362
  this.differ = new DeepDiffer({
227
363
  includeUnchanged: false,
228
364
  maxDepth: this.maxDepth,
229
- maxStringLength: this.maxStringLength
365
+ maxStringLength: this.maxStringLength,
366
+ treatNullAsUndefined: this.treatNullAsUndefined
230
367
  });
231
368
  }
232
369
  ngOnInit() {
233
370
  this.generateDiff();
234
371
  }
235
- ngOnChanges(changes) {
236
- if (changes['oldValue'] || changes['newValue'] || changes['showUnchanged'] ||
237
- changes['maxDepth'] || changes['maxStringLength']) {
238
- this.updateDifferConfig();
239
- this.generateDiff();
240
- }
241
- }
242
372
  updateDifferConfig() {
243
373
  this.differ.updateConfig({
244
374
  includeUnchanged: this.showUnchanged,
245
375
  maxDepth: this.maxDepth,
246
- maxStringLength: this.maxStringLength
376
+ maxStringLength: this.maxStringLength,
377
+ treatNullAsUndefined: this.treatNullAsUndefined
247
378
  });
248
379
  }
249
380
  generateDiff() {
@@ -366,20 +497,28 @@ export class DeepDiffComponent {
366
497
  default: return '';
367
498
  }
368
499
  }
369
- formatValue(value) {
500
+ formatValue(value, path) {
370
501
  if (value === undefined)
371
502
  return 'undefined';
372
503
  if (value === null)
373
504
  return 'null';
505
+ const isExpanded = !!this.expandedValuesMap[path];
506
+ const shouldTruncate = this.truncateValues && !isExpanded;
374
507
  if (typeof value === 'string') {
375
- return value.length > this.maxStringLength ?
376
- `"${value.substring(0, this.maxStringLength)}..."` :
377
- `"${value}"`;
508
+ if (shouldTruncate && value.length > this.maxStringLength) {
509
+ return `"${value.substring(0, this.maxStringLength)}..."`;
510
+ }
511
+ return `"${value}"`;
378
512
  }
379
513
  if (typeof value === 'object') {
380
514
  try {
381
515
  const json = JSON.stringify(value, null, 2);
382
- return json.length > 200 ? json.substring(0, 200) + '...' : json;
516
+ if (shouldTruncate && json.length > 200) {
517
+ // Show a preview for objects
518
+ const preview = JSON.stringify(value).substring(0, 50);
519
+ return `${preview}... (${this.getObjectSize(value)} properties)`;
520
+ }
521
+ return json;
383
522
  }
384
523
  catch {
385
524
  return String(value);
@@ -387,11 +526,72 @@ export class DeepDiffComponent {
387
526
  }
388
527
  return String(value);
389
528
  }
529
+ isValueTruncated(value, path) {
530
+ if (!this.truncateValues || this.expandedValuesMap[path]) {
531
+ return false;
532
+ }
533
+ if (typeof value === 'string') {
534
+ return value.length > this.maxStringLength;
535
+ }
536
+ if (typeof value === 'object' && value !== null) {
537
+ try {
538
+ const json = JSON.stringify(value, null, 2);
539
+ return json.length > 200;
540
+ }
541
+ catch {
542
+ return false;
543
+ }
544
+ }
545
+ return false;
546
+ }
547
+ toggleValueExpansion(path, event) {
548
+ event.stopPropagation();
549
+ // Create a new object to trigger change detection
550
+ this.expandedValuesMap = {
551
+ ...this.expandedValuesMap,
552
+ [path]: !this.expandedValuesMap[path]
553
+ };
554
+ // Force change detection
555
+ this.cdr.markForCheck();
556
+ }
557
+ getObjectSize(obj) {
558
+ if (Array.isArray(obj)) {
559
+ return obj.length;
560
+ }
561
+ return Object.keys(obj).length;
562
+ }
390
563
  copyToClipboard(text) {
391
564
  navigator.clipboard.writeText(text).then(() => {
392
565
  // Could add a toast notification here
393
566
  });
394
567
  }
568
+ isExpanded(path) {
569
+ return !!this.expandedValuesMap[path];
570
+ }
571
+ copyValueToClipboard(value, event) {
572
+ event.stopPropagation();
573
+ let textToCopy;
574
+ if (value === undefined) {
575
+ textToCopy = 'undefined';
576
+ }
577
+ else if (value === null) {
578
+ textToCopy = 'null';
579
+ }
580
+ else if (typeof value === 'object') {
581
+ try {
582
+ textToCopy = JSON.stringify(value, null, 2);
583
+ }
584
+ catch {
585
+ textToCopy = String(value);
586
+ }
587
+ }
588
+ else {
589
+ textToCopy = String(value);
590
+ }
591
+ navigator.clipboard.writeText(textToCopy).then(() => {
592
+ // Could add a toast notification here
593
+ });
594
+ }
395
595
  exportDiff() {
396
596
  if (!this.diffResult)
397
597
  return;
@@ -404,7 +604,7 @@ export class DeepDiffComponent {
404
604
  URL.revokeObjectURL(url);
405
605
  }
406
606
  static ɵfac = function DeepDiffComponent_Factory(t) { return new (t || DeepDiffComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
407
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DeepDiffComponent, selectors: [["mj-deep-diff"]], inputs: { oldValue: "oldValue", newValue: "newValue", title: "title", showSummary: "showSummary", showUnchanged: "showUnchanged", expandAll: "expandAll", maxDepth: "maxDepth", maxStringLength: "maxStringLength" }, features: [i0.ɵɵNgOnChangesFeature], decls: 36, vars: 13, consts: [["diffItem", ""], [1, "deep-diff-container"], [1, "diff-header"], [1, "header-content"], [1, "diff-title"], [1, "fa-solid", "fa-code-branch"], [1, "header-actions"], ["title", "Expand All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-expand"], ["title", "Collapse All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-compress"], ["title", "Export Diff", 1, "btn-icon", 3, "click", "disabled"], [1, "fa-solid", "fa-download"], [1, "diff-summary"], [1, "diff-filters"], [1, "filter-search"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Filter by path or description...", 1, "filter-input", 3, "ngModelChange", "ngModel"], [1, "filter-types"], [1, "filter-btn", 3, "click"], [1, "filter-btn", "added", 3, "click"], [1, "fa-solid", "fa-plus-circle"], [1, "filter-btn", "removed", 3, "click"], [1, "fa-solid", "fa-minus-circle"], [1, "filter-btn", "modified", 3, "click"], [1, "fa-solid", "fa-edit"], [1, "diff-content"], [1, "empty-state"], [1, "diff-tree"], [1, "summary-item", "added"], [1, "count"], [1, "label"], [1, "summary-item", "removed"], [1, "summary-item", "modified"], [1, "summary-item", "unchanged"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-code-compare", "fa-3x"], [1, "fa-solid", "fa-filter", "fa-3x"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "diff-item"], [1, "item-header", 3, "click"], [1, "fa-solid", "fa-chevron-right", "expand-icon", 3, "expanded"], [1, "expand-spacer"], [1, "fa-solid", "type-icon", 3, "ngClass"], [1, "item-path"], [1, "item-description"], ["title", "Copy path", 1, "btn-copy", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "value-details"], [1, "item-children"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "value-row", "old"], [1, "value-label"], [1, "value-content"], [1, "value-row", "new"]], template: function DeepDiffComponent_Template(rf, ctx) { if (rf & 1) {
607
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DeepDiffComponent, selectors: [["mj-deep-diff"]], inputs: { oldValue: "oldValue", newValue: "newValue", showUnchanged: "showUnchanged", maxDepth: "maxDepth", maxStringLength: "maxStringLength", treatNullAsUndefined: "treatNullAsUndefined", title: "title", showSummary: "showSummary", expandAll: "expandAll", truncateValues: "truncateValues" }, decls: 36, vars: 13, consts: [["diffItem", ""], [1, "deep-diff-container"], [1, "diff-header"], [1, "header-content"], [1, "diff-title"], [1, "fa-solid", "fa-code-branch"], [1, "header-actions"], ["title", "Expand All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-expand"], ["title", "Collapse All", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-compress"], ["title", "Export Diff", 1, "btn-icon", 3, "click", "disabled"], [1, "fa-solid", "fa-download"], [1, "diff-summary"], [1, "diff-filters"], [1, "filter-search"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Filter by path or description...", 1, "filter-input", 3, "ngModelChange", "ngModel"], [1, "filter-types"], [1, "filter-btn", 3, "click"], [1, "filter-btn", "added", 3, "click"], [1, "fa-solid", "fa-plus-circle"], [1, "filter-btn", "removed", 3, "click"], [1, "fa-solid", "fa-minus-circle"], [1, "filter-btn", "modified", 3, "click"], [1, "fa-solid", "fa-edit"], [1, "diff-content"], [1, "empty-state"], [1, "diff-tree"], [1, "summary-item", "added"], [1, "count"], [1, "label"], [1, "summary-item", "removed"], [1, "summary-item", "modified"], [1, "summary-item", "unchanged"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-code-compare", "fa-3x"], [1, "fa-solid", "fa-filter", "fa-3x"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "diff-item"], [1, "item-header", 3, "click"], [1, "fa-solid", "fa-chevron-right", "expand-icon", 3, "expanded"], [1, "expand-spacer"], [1, "fa-solid", "type-icon", 3, "ngClass"], [1, "item-path"], [1, "item-description"], ["title", "Copy path", 1, "btn-copy", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "value-details"], [1, "item-children"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "value-row", "old"], [1, "value-label"], [1, "value-content"], ["title", "Copy value", 1, "btn-copy", 3, "click"], [1, "btn-expand-value", 3, "title"], [1, "value-row", "new"], [1, "btn-expand-value", 3, "click", "title"], [1, "fa-solid", 3, "ngClass"]], template: function DeepDiffComponent_Template(rf, ctx) { if (rf & 1) {
408
608
  const _r1 = i0.ɵɵgetCurrentView();
409
609
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "h2", 4);
410
610
  i0.ɵɵelement(4, "i", 5);
@@ -471,27 +671,31 @@ export class DeepDiffComponent {
471
671
  i0.ɵɵclassProp("active", ctx.filterType === "modified");
472
672
  i0.ɵɵadvance(4);
473
673
  i0.ɵɵconditional(!ctx.diffResult ? 31 : ctx.filteredItems.length === 0 ? 32 : 33);
474
- } }, dependencies: [i1.NgClass, i1.NgTemplateOutlet, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel], styles: ["\n\n.deep-diff-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f8f9fa;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n}\n\n\n\n.diff-header[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n padding: 20px;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.diff-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.diff-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3498db;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 14px;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.btn-icon[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.diff-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: white;\n border-radius: 20px;\n font-size: 14px;\n border: 1px solid #e9ecef;\n transition: all 0.2s ease;\n}\n\n.summary-item[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.summary-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 13px;\n}\n\n.summary-item.added[_ngcontent-%COMP%] {\n border-color: #d4edda;\n background: #f4fdf6;\n}\n\n.summary-item.added[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.added[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.summary-item.removed[_ngcontent-%COMP%] {\n border-color: #f8d7da;\n background: #fef5f6;\n}\n\n.summary-item.removed[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.removed[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.summary-item.modified[_ngcontent-%COMP%] {\n border-color: #cce5ff;\n background: #f0f7ff;\n}\n\n.summary-item.modified[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.modified[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #007bff;\n}\n\n.summary-item.unchanged[_ngcontent-%COMP%] {\n border-color: #e2e3e5;\n background: #f8f9fa;\n}\n\n.summary-item.unchanged[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.unchanged[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n\n\n.diff-filters[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.filter-search[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 250px;\n position: relative;\n}\n\n.filter-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #6c757d;\n font-size: 14px;\n}\n\n.filter-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px 8px 36px;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #3498db;\n box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);\n}\n\n.filter-types[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.filter-btn[_ngcontent-%COMP%] {\n padding: 6px 14px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.filter-btn[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n}\n\n.filter-btn.active[_ngcontent-%COMP%] {\n background: #3498db;\n color: white;\n border-color: #3498db;\n}\n\n.filter-btn.added.active[_ngcontent-%COMP%] {\n background: #28a745;\n border-color: #28a745;\n}\n\n.filter-btn.removed.active[_ngcontent-%COMP%] {\n background: #dc3545;\n border-color: #dc3545;\n}\n\n.filter-btn.modified.active[_ngcontent-%COMP%] {\n background: #007bff;\n border-color: #007bff;\n}\n\n\n\n.diff-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n background: white;\n padding: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n color: #6c757d;\n gap: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.2;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n}\n\n\n\n.diff-tree[_ngcontent-%COMP%] {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 13px;\n}\n\n.diff-item[_ngcontent-%COMP%] {\n margin-bottom: 2px;\n transition: all 0.2s ease;\n}\n\n.item-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.item-header[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #6c757d;\n transition: transform 0.2s ease;\n width: 12px;\n flex-shrink: 0;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.expand-spacer[_ngcontent-%COMP%] {\n width: 12px;\n flex-shrink: 0;\n}\n\n.type-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.item-path[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #2c3e50;\n margin-right: 8px;\n word-break: break-word;\n}\n\n.item-description[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 12px;\n flex: 1;\n}\n\n.btn-copy[_ngcontent-%COMP%] {\n opacity: 0;\n background: none;\n border: none;\n color: #6c757d;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n font-size: 12px;\n}\n\n.item-header[_ngcontent-%COMP%]:hover .btn-copy[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.btn-copy[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n color: #495057;\n}\n\n\n\n.diff-item.added[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.diff-item.removed[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.diff-item.modified[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #007bff;\n}\n\n.diff-item.unchanged[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n\n\n.value-details[_ngcontent-%COMP%] {\n margin: 8px 0 0 44px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border: 1px solid #e9ecef;\n}\n\n.value-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-bottom: 8px;\n align-items: flex-start;\n}\n\n.value-row[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.value-label[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #495057;\n min-width: 40px;\n font-size: 12px;\n padding-top: 2px;\n}\n\n.value-content[_ngcontent-%COMP%] {\n flex: 1;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 12px;\n line-height: 1.5;\n color: #2c3e50;\n background: white;\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid #dee2e6;\n word-break: break-word;\n white-space: pre-wrap;\n}\n\n.value-row.old[_ngcontent-%COMP%] .value-content[_ngcontent-%COMP%] {\n background: #fef5f6;\n border-color: #f8d7da;\n color: #721c24;\n}\n\n.value-row.new[_ngcontent-%COMP%] .value-content[_ngcontent-%COMP%] {\n background: #f4fdf6;\n border-color: #d4edda;\n color: #155724;\n}\n\n\n\n.item-children[_ngcontent-%COMP%] {\n margin-top: 2px;\n position: relative;\n}\n\n.item-children[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 6px;\n top: 0;\n bottom: 0;\n width: 1px;\n background: #e9ecef;\n}\n\n\n\n@media (max-width: 768px) {\n .diff-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n\n .diff-filters[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-search[_ngcontent-%COMP%] {\n min-width: 100%;\n }\n\n .filter-types[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .value-details[_ngcontent-%COMP%] {\n margin-left: 20px;\n }\n}"] });
674
+ } }, dependencies: [i1.NgClass, i1.NgTemplateOutlet, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel], styles: ["\n\n.deep-diff-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f8f9fa;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n}\n\n\n\n.diff-header[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n padding: 20px;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.diff-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.diff-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3498db;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 14px;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.btn-icon[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.diff-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: white;\n border-radius: 20px;\n font-size: 14px;\n border: 1px solid #e9ecef;\n transition: all 0.2s ease;\n}\n\n.summary-item[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.summary-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 13px;\n}\n\n.summary-item.added[_ngcontent-%COMP%] {\n border-color: #d4edda;\n background: #f4fdf6;\n}\n\n.summary-item.added[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.added[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.summary-item.removed[_ngcontent-%COMP%] {\n border-color: #f8d7da;\n background: #fef5f6;\n}\n\n.summary-item.removed[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.removed[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.summary-item.modified[_ngcontent-%COMP%] {\n border-color: #cce5ff;\n background: #f0f7ff;\n}\n\n.summary-item.modified[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.modified[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #007bff;\n}\n\n.summary-item.unchanged[_ngcontent-%COMP%] {\n border-color: #e2e3e5;\n background: #f8f9fa;\n}\n\n.summary-item.unchanged[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.summary-item.unchanged[_ngcontent-%COMP%] .count[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n\n\n.diff-filters[_ngcontent-%COMP%] {\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.filter-search[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 250px;\n position: relative;\n}\n\n.filter-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #6c757d;\n font-size: 14px;\n}\n\n.filter-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px 8px 36px;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #3498db;\n box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);\n}\n\n.filter-types[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.filter-btn[_ngcontent-%COMP%] {\n padding: 6px 14px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.filter-btn[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n}\n\n.filter-btn.active[_ngcontent-%COMP%] {\n background: #3498db;\n color: white;\n border-color: #3498db;\n}\n\n.filter-btn.added.active[_ngcontent-%COMP%] {\n background: #28a745;\n border-color: #28a745;\n}\n\n.filter-btn.removed.active[_ngcontent-%COMP%] {\n background: #dc3545;\n border-color: #dc3545;\n}\n\n.filter-btn.modified.active[_ngcontent-%COMP%] {\n background: #007bff;\n border-color: #007bff;\n}\n\n\n\n.diff-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n background: white;\n padding: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n color: #6c757d;\n gap: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n opacity: 0.2;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n}\n\n\n\n.diff-tree[_ngcontent-%COMP%] {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 13px;\n}\n\n.diff-item[_ngcontent-%COMP%] {\n margin-bottom: 2px;\n transition: all 0.2s ease;\n}\n\n.item-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.item-header[_ngcontent-%COMP%]:hover {\n background: #f8f9fa;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #6c757d;\n transition: transform 0.2s ease;\n width: 12px;\n flex-shrink: 0;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.expand-spacer[_ngcontent-%COMP%] {\n width: 12px;\n flex-shrink: 0;\n}\n\n.type-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.item-path[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #2c3e50;\n margin-right: 8px;\n word-break: break-word;\n}\n\n.item-description[_ngcontent-%COMP%] {\n color: #6c757d;\n font-size: 12px;\n flex: 1;\n}\n\n.btn-copy[_ngcontent-%COMP%] {\n opacity: 0;\n background: none;\n border: none;\n color: #6c757d;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n font-size: 12px;\n}\n\n.item-header[_ngcontent-%COMP%]:hover .btn-copy[_ngcontent-%COMP%], \n.value-row[_ngcontent-%COMP%]:hover .btn-copy[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.btn-copy[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n color: #495057;\n}\n\n\n\n.value-row[_ngcontent-%COMP%] .btn-copy[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n\n\n.diff-item.added[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.diff-item.removed[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n.diff-item.modified[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #007bff;\n}\n\n.diff-item.unchanged[_ngcontent-%COMP%] .type-icon[_ngcontent-%COMP%] {\n color: #6c757d;\n}\n\n\n\n.value-details[_ngcontent-%COMP%] {\n margin: 8px 0 0 44px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border: 1px solid #e9ecef;\n}\n\n.value-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-bottom: 8px;\n align-items: flex-start;\n position: relative;\n}\n\n.value-row[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.value-label[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #495057;\n min-width: 40px;\n font-size: 12px;\n padding-top: 2px;\n}\n\n.value-content[_ngcontent-%COMP%] {\n flex: 1;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 12px;\n line-height: 1.5;\n color: #2c3e50;\n background: white;\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid #dee2e6;\n word-break: break-word;\n white-space: pre-wrap;\n}\n\n.value-row.old[_ngcontent-%COMP%] .value-content[_ngcontent-%COMP%] {\n background: #fef5f6;\n border-color: #f8d7da;\n color: #721c24;\n}\n\n.value-row.new[_ngcontent-%COMP%] .value-content[_ngcontent-%COMP%] {\n background: #f4fdf6;\n border-color: #d4edda;\n color: #155724;\n}\n\n\n\n.btn-expand-value[_ngcontent-%COMP%] {\n background: none;\n border: 1px solid #dee2e6;\n color: #6c757d;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n font-size: 11px;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.btn-expand-value[_ngcontent-%COMP%]:hover {\n background: #e9ecef;\n color: #495057;\n border-color: #adb5bd;\n}\n\n.btn-expand-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.item-children[_ngcontent-%COMP%] {\n margin-top: 2px;\n position: relative;\n}\n\n.item-children[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 6px;\n top: 0;\n bottom: 0;\n width: 1px;\n background: #e9ecef;\n}\n\n\n\n@media (max-width: 768px) {\n .diff-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .header-content[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n\n .diff-filters[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-search[_ngcontent-%COMP%] {\n min-width: 100%;\n }\n\n .filter-types[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .value-details[_ngcontent-%COMP%] {\n margin-left: 20px;\n }\n}"], changeDetection: 0 });
475
675
  }
476
676
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DeepDiffComponent, [{
477
677
  type: Component,
478
- args: [{ selector: 'mj-deep-diff', template: "<div class=\"deep-diff-container\">\n <!-- Header -->\n <div class=\"diff-header\">\n <div class=\"header-content\">\n <h2 class=\"diff-title\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ title }}\n </h2>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"expandAllItems()\" title=\"Expand All\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"collapseAllItems()\" title=\"Collapse All\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"exportDiff()\" title=\"Export Diff\" [disabled]=\"!diffResult\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n </div>\n </div>\n\n <!-- Summary -->\n @if (showSummary && diffResult) {\n <div class=\"diff-summary\">\n <div class=\"summary-item added\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span class=\"count\">{{ diffResult.summary.added }}</span>\n <span class=\"label\">Added</span>\n </div>\n <div class=\"summary-item removed\">\n <i class=\"fa-solid fa-minus-circle\"></i>\n <span class=\"count\">{{ diffResult.summary.removed }}</span>\n <span class=\"label\">Removed</span>\n </div>\n <div class=\"summary-item modified\">\n <i class=\"fa-solid fa-edit\"></i>\n <span class=\"count\">{{ diffResult.summary.modified }}</span>\n <span class=\"label\">Modified</span>\n </div>\n @if (showUnchanged) {\n <div class=\"summary-item unchanged\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span class=\"count\">{{ diffResult.summary.unchanged }}</span>\n <span class=\"label\">Unchanged</span>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Filters -->\n <div class=\"diff-filters\">\n <div class=\"filter-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input \n type=\"text\" \n [(ngModel)]=\"filter\" \n placeholder=\"Filter by path or description...\"\n class=\"filter-input\">\n </div>\n <div class=\"filter-types\">\n <button \n class=\"filter-btn\"\n [class.active]=\"filterType === 'all'\"\n (click)=\"filterType = 'all'\">\n All Changes\n </button>\n <button \n class=\"filter-btn added\"\n [class.active]=\"filterType === 'added'\"\n (click)=\"filterType = 'added'\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n Added\n </button>\n <button \n class=\"filter-btn removed\"\n [class.active]=\"filterType === 'removed'\"\n (click)=\"filterType = 'removed'\">\n <i class=\"fa-solid fa-minus-circle\"></i>\n Removed\n </button>\n <button \n class=\"filter-btn modified\"\n [class.active]=\"filterType === 'modified'\"\n (click)=\"filterType = 'modified'\">\n <i class=\"fa-solid fa-edit\"></i>\n Modified\n </button>\n </div>\n </div>\n\n <!-- Diff Content -->\n <div class=\"diff-content\">\n @if (!diffResult) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-compare fa-3x\"></i>\n <p>No data to compare</p>\n </div>\n } @else if (filteredItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-filter fa-3x\"></i>\n <p>No changes match your filter criteria</p>\n </div>\n } @else {\n <div class=\"diff-tree\">\n @for (item of filteredItems; track item.path) {\n <ng-container *ngTemplateOutlet=\"diffItem; context: { item: item, level: 0 }\"></ng-container>\n }\n </div>\n }\n </div>\n</div>\n\n<!-- Recursive Template for Diff Items -->\n<ng-template #diffItem let-item=\"item\" let-level=\"level\">\n <div class=\"diff-item\" [class]=\"getTypeClass(item.type)\" [style.padding-left.px]=\"level * 24\">\n <div class=\"item-header\" (click)=\"toggleItem(item)\">\n @if (item.children.length > 0) {\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"item.isExpanded\"></i>\n } @else {\n <span class=\"expand-spacer\"></span>\n }\n \n <i class=\"fa-solid type-icon\" [ngClass]=\"getIcon(item.type)\"></i>\n \n <span class=\"item-path\">{{ item.path }}</span>\n \n <span class=\"item-description\">{{ item.description }}</span>\n \n <button class=\"btn-copy\" (click)=\"copyToClipboard(item.path); $event.stopPropagation()\" title=\"Copy path\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n\n <!-- Value Details -->\n @if (item.type === 'modified') {\n <div class=\"value-details\">\n <div class=\"value-row old\">\n <span class=\"value-label\">Old:</span>\n <code class=\"value-content\">{{ formatValue(item.oldValue) }}</code>\n </div>\n <div class=\"value-row new\">\n <span class=\"value-label\">New:</span>\n <code class=\"value-content\">{{ formatValue(item.newValue) }}</code>\n </div>\n </div>\n } @else if (item.type === 'added') {\n <div class=\"value-details\">\n <div class=\"value-row new\">\n <span class=\"value-label\">Value:</span>\n <code class=\"value-content\">{{ formatValue(item.newValue) }}</code>\n </div>\n </div>\n } @else if (item.type === 'removed') {\n <div class=\"value-details\">\n <div class=\"value-row old\">\n <span class=\"value-label\">Value:</span>\n <code class=\"value-content\">{{ formatValue(item.oldValue) }}</code>\n </div>\n </div>\n }\n\n <!-- Children -->\n @if (item.isExpanded && item.children.length > 0) {\n <div class=\"item-children\">\n @for (child of item.children; track child.path) {\n <ng-container *ngTemplateOutlet=\"diffItem; context: { item: child, level: level + 1 }\"></ng-container>\n }\n </div>\n }\n </div>\n</ng-template>", styles: ["/* Deep Diff Component Styles */\n.deep-diff-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f8f9fa;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n}\n\n/* Header */\n.diff-header {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n padding: 20px;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.diff-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.diff-title i {\n color: #3498db;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 14px;\n}\n\n.btn-icon:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.btn-icon:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Summary */\n.diff-summary {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.summary-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: white;\n border-radius: 20px;\n font-size: 14px;\n border: 1px solid #e9ecef;\n transition: all 0.2s ease;\n}\n\n.summary-item:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.summary-item i {\n font-size: 16px;\n}\n\n.summary-item .count {\n font-weight: 600;\n font-size: 16px;\n}\n\n.summary-item .label {\n color: #6c757d;\n font-size: 13px;\n}\n\n.summary-item.added {\n border-color: #d4edda;\n background: #f4fdf6;\n}\n\n.summary-item.added i,\n.summary-item.added .count {\n color: #28a745;\n}\n\n.summary-item.removed {\n border-color: #f8d7da;\n background: #fef5f6;\n}\n\n.summary-item.removed i,\n.summary-item.removed .count {\n color: #dc3545;\n}\n\n.summary-item.modified {\n border-color: #cce5ff;\n background: #f0f7ff;\n}\n\n.summary-item.modified i,\n.summary-item.modified .count {\n color: #007bff;\n}\n\n.summary-item.unchanged {\n border-color: #e2e3e5;\n background: #f8f9fa;\n}\n\n.summary-item.unchanged i,\n.summary-item.unchanged .count {\n color: #6c757d;\n}\n\n/* Filters */\n.diff-filters {\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.filter-search {\n flex: 1;\n min-width: 250px;\n position: relative;\n}\n\n.filter-search i {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #6c757d;\n font-size: 14px;\n}\n\n.filter-input {\n width: 100%;\n padding: 8px 12px 8px 36px;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.filter-input:focus {\n outline: none;\n border-color: #3498db;\n box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);\n}\n\n.filter-types {\n display: flex;\n gap: 8px;\n}\n\n.filter-btn {\n padding: 6px 14px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.filter-btn:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n}\n\n.filter-btn.active {\n background: #3498db;\n color: white;\n border-color: #3498db;\n}\n\n.filter-btn.added.active {\n background: #28a745;\n border-color: #28a745;\n}\n\n.filter-btn.removed.active {\n background: #dc3545;\n border-color: #dc3545;\n}\n\n.filter-btn.modified.active {\n background: #007bff;\n border-color: #007bff;\n}\n\n/* Content Area */\n.diff-content {\n flex: 1;\n overflow-y: auto;\n background: white;\n padding: 16px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n color: #6c757d;\n gap: 16px;\n}\n\n.empty-state i {\n opacity: 0.2;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 16px;\n}\n\n/* Diff Tree */\n.diff-tree {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 13px;\n}\n\n.diff-item {\n margin-bottom: 2px;\n transition: all 0.2s ease;\n}\n\n.item-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.item-header:hover {\n background: #f8f9fa;\n}\n\n.expand-icon {\n font-size: 10px;\n color: #6c757d;\n transition: transform 0.2s ease;\n width: 12px;\n flex-shrink: 0;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.expand-spacer {\n width: 12px;\n flex-shrink: 0;\n}\n\n.type-icon {\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.item-path {\n font-weight: 600;\n color: #2c3e50;\n margin-right: 8px;\n word-break: break-word;\n}\n\n.item-description {\n color: #6c757d;\n font-size: 12px;\n flex: 1;\n}\n\n.btn-copy {\n opacity: 0;\n background: none;\n border: none;\n color: #6c757d;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n font-size: 12px;\n}\n\n.item-header:hover .btn-copy {\n opacity: 1;\n}\n\n.btn-copy:hover {\n background: #e9ecef;\n color: #495057;\n}\n\n/* Type-specific styling */\n.diff-item.added .type-icon {\n color: #28a745;\n}\n\n.diff-item.removed .type-icon {\n color: #dc3545;\n}\n\n.diff-item.modified .type-icon {\n color: #007bff;\n}\n\n.diff-item.unchanged .type-icon {\n color: #6c757d;\n}\n\n/* Value Details */\n.value-details {\n margin: 8px 0 0 44px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border: 1px solid #e9ecef;\n}\n\n.value-row {\n display: flex;\n gap: 12px;\n margin-bottom: 8px;\n align-items: flex-start;\n}\n\n.value-row:last-child {\n margin-bottom: 0;\n}\n\n.value-label {\n font-weight: 600;\n color: #495057;\n min-width: 40px;\n font-size: 12px;\n padding-top: 2px;\n}\n\n.value-content {\n flex: 1;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 12px;\n line-height: 1.5;\n color: #2c3e50;\n background: white;\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid #dee2e6;\n word-break: break-word;\n white-space: pre-wrap;\n}\n\n.value-row.old .value-content {\n background: #fef5f6;\n border-color: #f8d7da;\n color: #721c24;\n}\n\n.value-row.new .value-content {\n background: #f4fdf6;\n border-color: #d4edda;\n color: #155724;\n}\n\n/* Children */\n.item-children {\n margin-top: 2px;\n position: relative;\n}\n\n.item-children::before {\n content: '';\n position: absolute;\n left: 6px;\n top: 0;\n bottom: 0;\n width: 1px;\n background: #e9ecef;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .diff-header {\n padding: 16px;\n }\n\n .header-content {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n\n .diff-filters {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-search {\n min-width: 100%;\n }\n\n .filter-types {\n flex-wrap: wrap;\n }\n\n .value-details {\n margin-left: 20px;\n }\n}"] }]
678
+ args: [{ selector: 'mj-deep-diff', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"deep-diff-container\">\n <!-- Header -->\n <div class=\"diff-header\">\n <div class=\"header-content\">\n <h2 class=\"diff-title\">\n <i class=\"fa-solid fa-code-branch\"></i>\n {{ title }}\n </h2>\n <div class=\"header-actions\">\n <button class=\"btn-icon\" (click)=\"expandAllItems()\" title=\"Expand All\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"collapseAllItems()\" title=\"Collapse All\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"exportDiff()\" title=\"Export Diff\" [disabled]=\"!diffResult\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n </div>\n </div>\n\n <!-- Summary -->\n @if (showSummary && diffResult) {\n <div class=\"diff-summary\">\n <div class=\"summary-item added\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n <span class=\"count\">{{ diffResult.summary.added }}</span>\n <span class=\"label\">Added</span>\n </div>\n <div class=\"summary-item removed\">\n <i class=\"fa-solid fa-minus-circle\"></i>\n <span class=\"count\">{{ diffResult.summary.removed }}</span>\n <span class=\"label\">Removed</span>\n </div>\n <div class=\"summary-item modified\">\n <i class=\"fa-solid fa-edit\"></i>\n <span class=\"count\">{{ diffResult.summary.modified }}</span>\n <span class=\"label\">Modified</span>\n </div>\n @if (showUnchanged) {\n <div class=\"summary-item unchanged\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span class=\"count\">{{ diffResult.summary.unchanged }}</span>\n <span class=\"label\">Unchanged</span>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Filters -->\n <div class=\"diff-filters\">\n <div class=\"filter-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input \n type=\"text\" \n [(ngModel)]=\"filter\" \n placeholder=\"Filter by path or description...\"\n class=\"filter-input\">\n </div>\n <div class=\"filter-types\">\n <button \n class=\"filter-btn\"\n [class.active]=\"filterType === 'all'\"\n (click)=\"filterType = 'all'\">\n All Changes\n </button>\n <button \n class=\"filter-btn added\"\n [class.active]=\"filterType === 'added'\"\n (click)=\"filterType = 'added'\">\n <i class=\"fa-solid fa-plus-circle\"></i>\n Added\n </button>\n <button \n class=\"filter-btn removed\"\n [class.active]=\"filterType === 'removed'\"\n (click)=\"filterType = 'removed'\">\n <i class=\"fa-solid fa-minus-circle\"></i>\n Removed\n </button>\n <button \n class=\"filter-btn modified\"\n [class.active]=\"filterType === 'modified'\"\n (click)=\"filterType = 'modified'\">\n <i class=\"fa-solid fa-edit\"></i>\n Modified\n </button>\n </div>\n </div>\n\n <!-- Diff Content -->\n <div class=\"diff-content\">\n @if (!diffResult) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-compare fa-3x\"></i>\n <p>No data to compare</p>\n </div>\n } @else if (filteredItems.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-filter fa-3x\"></i>\n <p>No changes match your filter criteria</p>\n </div>\n } @else {\n <div class=\"diff-tree\">\n @for (item of filteredItems; track item.path) {\n <ng-container *ngTemplateOutlet=\"diffItem; context: { item: item, level: 0 }\"></ng-container>\n }\n </div>\n }\n </div>\n</div>\n\n<!-- Recursive Template for Diff Items -->\n<ng-template #diffItem let-item=\"item\" let-level=\"level\">\n <div class=\"diff-item\" [class]=\"getTypeClass(item.type)\" [style.padding-left.px]=\"level * 24\">\n <div class=\"item-header\" (click)=\"toggleItem(item)\">\n @if (item.children.length > 0) {\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"item.isExpanded\"></i>\n } @else {\n <span class=\"expand-spacer\"></span>\n }\n \n <i class=\"fa-solid type-icon\" [ngClass]=\"getIcon(item.type)\"></i>\n \n <span class=\"item-path\">{{ item.path }}</span>\n \n <span class=\"item-description\">{{ item.description }}</span>\n \n <button class=\"btn-copy\" (click)=\"copyToClipboard(item.path); $event.stopPropagation()\" title=\"Copy path\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n\n <!-- Value Details -->\n @if (item.type === 'modified') {\n <div class=\"value-details\">\n <div class=\"value-row old\">\n <span class=\"value-label\">Old:</span>\n <code class=\"value-content\">{{ formatValue(item.oldValue, item.path + '_old') }}</code>\n <button class=\"btn-copy\" (click)=\"copyValueToClipboard(item.oldValue, $event)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n @if (isValueTruncated(item.oldValue, item.path + '_old') || isExpanded(item.path + '_old')) {\n <button class=\"btn-expand-value\" \n (click)=\"toggleValueExpansion(item.path + '_old', $event)\" \n title=\"{{ isExpanded(item.path + '_old') ? 'Collapse' : 'Expand' }}\">\n <i class=\"fa-solid\" \n [ngClass]=\"isExpanded(item.path + '_old') ? 'fa-compress-alt' : 'fa-expand-alt'\"></i>\n </button>\n }\n </div>\n <div class=\"value-row new\">\n <span class=\"value-label\">New:</span>\n <code class=\"value-content\">{{ formatValue(item.newValue, item.path + '_new') }}</code>\n <button class=\"btn-copy\" (click)=\"copyValueToClipboard(item.newValue, $event)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n @if (isValueTruncated(item.newValue, item.path + '_new') || isExpanded(item.path + '_new')) {\n <button class=\"btn-expand-value\" \n (click)=\"toggleValueExpansion(item.path + '_new', $event)\"\n title=\"{{ isExpanded(item.path + '_new') ? 'Collapse' : 'Expand' }}\">\n <i class=\"fa-solid\" \n [ngClass]=\"isExpanded(item.path + '_new') ? 'fa-compress-alt' : 'fa-expand-alt'\"></i>\n </button>\n }\n </div>\n </div>\n } @else if (item.type === 'added') {\n <div class=\"value-details\">\n <div class=\"value-row new\">\n <span class=\"value-label\">Value:</span>\n <code class=\"value-content\">{{ formatValue(item.newValue, item.path) }}</code>\n <button class=\"btn-copy\" (click)=\"copyValueToClipboard(item.newValue, $event)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n @if (isValueTruncated(item.newValue, item.path) || isExpanded(item.path)) {\n <button class=\"btn-expand-value\" \n (click)=\"toggleValueExpansion(item.path, $event)\"\n title=\"{{ isExpanded(item.path) ? 'Collapse' : 'Expand' }}\">\n <i class=\"fa-solid\" \n [ngClass]=\"isExpanded(item.path) ? 'fa-compress-alt' : 'fa-expand-alt'\"></i>\n </button>\n }\n </div>\n </div>\n } @else if (item.type === 'removed') {\n <div class=\"value-details\">\n <div class=\"value-row old\">\n <span class=\"value-label\">Value:</span>\n <code class=\"value-content\">{{ formatValue(item.oldValue, item.path) }}</code>\n <button class=\"btn-copy\" (click)=\"copyValueToClipboard(item.oldValue, $event)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n @if (isValueTruncated(item.oldValue, item.path) || isExpanded(item.path)) {\n <button class=\"btn-expand-value\" \n (click)=\"toggleValueExpansion(item.path, $event)\"\n title=\"{{ isExpanded(item.path) ? 'Collapse' : 'Expand' }}\">\n <i class=\"fa-solid\" \n [ngClass]=\"isExpanded(item.path) ? 'fa-compress-alt' : 'fa-expand-alt'\"></i>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Children -->\n @if (item.isExpanded && item.children.length > 0) {\n <div class=\"item-children\">\n @for (child of item.children; track child.path) {\n <ng-container *ngTemplateOutlet=\"diffItem; context: { item: child, level: level + 1 }\"></ng-container>\n }\n </div>\n }\n </div>\n</ng-template>", styles: ["/* Deep Diff Component Styles */\n.deep-diff-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #f8f9fa;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n}\n\n/* Header */\n.diff-header {\n background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);\n padding: 20px;\n border-bottom: 1px solid #e0e6ed;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\n\n.header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n\n.diff-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #2c3e50;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.diff-title i {\n color: #3498db;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n font-size: 14px;\n}\n\n.btn-icon:hover:not(:disabled) {\n background: #f8f9fa;\n border-color: #adb5bd;\n color: #495057;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.btn-icon:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Summary */\n.diff-summary {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n}\n\n.summary-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: white;\n border-radius: 20px;\n font-size: 14px;\n border: 1px solid #e9ecef;\n transition: all 0.2s ease;\n}\n\n.summary-item:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.summary-item i {\n font-size: 16px;\n}\n\n.summary-item .count {\n font-weight: 600;\n font-size: 16px;\n}\n\n.summary-item .label {\n color: #6c757d;\n font-size: 13px;\n}\n\n.summary-item.added {\n border-color: #d4edda;\n background: #f4fdf6;\n}\n\n.summary-item.added i,\n.summary-item.added .count {\n color: #28a745;\n}\n\n.summary-item.removed {\n border-color: #f8d7da;\n background: #fef5f6;\n}\n\n.summary-item.removed i,\n.summary-item.removed .count {\n color: #dc3545;\n}\n\n.summary-item.modified {\n border-color: #cce5ff;\n background: #f0f7ff;\n}\n\n.summary-item.modified i,\n.summary-item.modified .count {\n color: #007bff;\n}\n\n.summary-item.unchanged {\n border-color: #e2e3e5;\n background: #f8f9fa;\n}\n\n.summary-item.unchanged i,\n.summary-item.unchanged .count {\n color: #6c757d;\n}\n\n/* Filters */\n.diff-filters {\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e9ecef;\n display: flex;\n gap: 16px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.filter-search {\n flex: 1;\n min-width: 250px;\n position: relative;\n}\n\n.filter-search i {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #6c757d;\n font-size: 14px;\n}\n\n.filter-input {\n width: 100%;\n padding: 8px 12px 8px 36px;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.filter-input:focus {\n outline: none;\n border-color: #3498db;\n box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);\n}\n\n.filter-types {\n display: flex;\n gap: 8px;\n}\n\n.filter-btn {\n padding: 6px 14px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #495057;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.filter-btn:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n}\n\n.filter-btn.active {\n background: #3498db;\n color: white;\n border-color: #3498db;\n}\n\n.filter-btn.added.active {\n background: #28a745;\n border-color: #28a745;\n}\n\n.filter-btn.removed.active {\n background: #dc3545;\n border-color: #dc3545;\n}\n\n.filter-btn.modified.active {\n background: #007bff;\n border-color: #007bff;\n}\n\n/* Content Area */\n.diff-content {\n flex: 1;\n overflow-y: auto;\n background: white;\n padding: 16px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 300px;\n color: #6c757d;\n gap: 16px;\n}\n\n.empty-state i {\n opacity: 0.2;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 16px;\n}\n\n/* Diff Tree */\n.diff-tree {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 13px;\n}\n\n.diff-item {\n margin-bottom: 2px;\n transition: all 0.2s ease;\n}\n\n.item-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.item-header:hover {\n background: #f8f9fa;\n}\n\n.expand-icon {\n font-size: 10px;\n color: #6c757d;\n transition: transform 0.2s ease;\n width: 12px;\n flex-shrink: 0;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.expand-spacer {\n width: 12px;\n flex-shrink: 0;\n}\n\n.type-icon {\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.item-path {\n font-weight: 600;\n color: #2c3e50;\n margin-right: 8px;\n word-break: break-word;\n}\n\n.item-description {\n color: #6c757d;\n font-size: 12px;\n flex: 1;\n}\n\n.btn-copy {\n opacity: 0;\n background: none;\n border: none;\n color: #6c757d;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n font-size: 12px;\n}\n\n.item-header:hover .btn-copy,\n.value-row:hover .btn-copy {\n opacity: 1;\n}\n\n.btn-copy:hover {\n background: #e9ecef;\n color: #495057;\n}\n\n/* Value row copy button */\n.value-row .btn-copy {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n/* Type-specific styling */\n.diff-item.added .type-icon {\n color: #28a745;\n}\n\n.diff-item.removed .type-icon {\n color: #dc3545;\n}\n\n.diff-item.modified .type-icon {\n color: #007bff;\n}\n\n.diff-item.unchanged .type-icon {\n color: #6c757d;\n}\n\n/* Value Details */\n.value-details {\n margin: 8px 0 0 44px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border: 1px solid #e9ecef;\n}\n\n.value-row {\n display: flex;\n gap: 12px;\n margin-bottom: 8px;\n align-items: flex-start;\n position: relative;\n}\n\n.value-row:last-child {\n margin-bottom: 0;\n}\n\n.value-label {\n font-weight: 600;\n color: #495057;\n min-width: 40px;\n font-size: 12px;\n padding-top: 2px;\n}\n\n.value-content {\n flex: 1;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: 12px;\n line-height: 1.5;\n color: #2c3e50;\n background: white;\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid #dee2e6;\n word-break: break-word;\n white-space: pre-wrap;\n}\n\n.value-row.old .value-content {\n background: #fef5f6;\n border-color: #f8d7da;\n color: #721c24;\n}\n\n.value-row.new .value-content {\n background: #f4fdf6;\n border-color: #d4edda;\n color: #155724;\n}\n\n/* Expand/Collapse Value Button */\n.btn-expand-value {\n background: none;\n border: 1px solid #dee2e6;\n color: #6c757d;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s ease;\n font-size: 11px;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.btn-expand-value:hover {\n background: #e9ecef;\n color: #495057;\n border-color: #adb5bd;\n}\n\n.btn-expand-value i {\n font-size: 10px;\n}\n\n/* Children */\n.item-children {\n margin-top: 2px;\n position: relative;\n}\n\n.item-children::before {\n content: '';\n position: absolute;\n left: 6px;\n top: 0;\n bottom: 0;\n width: 1px;\n background: #e9ecef;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .diff-header {\n padding: 16px;\n }\n\n .header-content {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n\n .diff-filters {\n flex-direction: column;\n align-items: stretch;\n }\n\n .filter-search {\n min-width: 100%;\n }\n\n .filter-types {\n flex-wrap: wrap;\n }\n\n .value-details {\n margin-left: 20px;\n }\n}"] }]
479
679
  }], () => [{ type: i0.ChangeDetectorRef }], { oldValue: [{
480
680
  type: Input
481
681
  }], newValue: [{
482
682
  type: Input
683
+ }], showUnchanged: [{
684
+ type: Input
685
+ }], maxDepth: [{
686
+ type: Input
687
+ }], maxStringLength: [{
688
+ type: Input
689
+ }], treatNullAsUndefined: [{
690
+ type: Input
483
691
  }], title: [{
484
692
  type: Input
485
693
  }], showSummary: [{
486
694
  type: Input
487
- }], showUnchanged: [{
488
- type: Input
489
695
  }], expandAll: [{
490
696
  type: Input
491
- }], maxDepth: [{
492
- type: Input
493
- }], maxStringLength: [{
697
+ }], truncateValues: [{
494
698
  type: Input
495
699
  }] }); })();
496
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DeepDiffComponent, { className: "DeepDiffComponent", filePath: "src/lib/deep-diff.component.ts", lineNumber: 16 }); })();
700
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DeepDiffComponent, { className: "DeepDiffComponent", filePath: "src/lib/deep-diff.component.ts", lineNumber: 17 }); })();
497
701
  //# sourceMappingURL=deep-diff.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deep-diff.component.js","sourceRoot":"","sources":["../../src/lib/deep-diff.component.ts","../../src/lib/deep-diff.component.html"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deep-diff.component.js","sourceRoot":"","sources":["../../src/lib/deep-diff.component.ts","../../src/lib/deep-diff.component.html"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-deep-diff",
3
- "version": "2.66.0",
3
+ "version": "2.68.0",
4
4
  "description": "MemberJunction: Generic Angular component to display the differences between two objects, using the non-visual functionality from the @memberjunction/global package",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -23,8 +23,8 @@
23
23
  "@angular/core": "18.0.2"
24
24
  },
25
25
  "dependencies": {
26
- "@memberjunction/core": "2.66.0",
27
- "@memberjunction/global": "2.66.0",
26
+ "@memberjunction/core": "2.68.0",
27
+ "@memberjunction/global": "2.68.0",
28
28
  "tslib": "^2.3.0"
29
29
  },
30
30
  "sideEffects": false