@memberjunction/ng-entity-relationship-diagram 4.1.0 → 4.3.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entity-to-erd-adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-to-erd-adapter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/entity-to-erd-adapter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,252 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { entityFieldToERDField, entityInfoToERDNode, entitiesToERDNodes, getOriginalEntityFromERDNode, findEntityByNodeId, buildERDDataFromEntities } from '../lib/utils/entity-to-erd-adapter';
3
+ // Minimal mock of EntityFieldInfo for testing
4
+ function createMockField(overrides = {}) {
5
+ return {
6
+ ID: 'field-1',
7
+ Name: 'TestField',
8
+ Type: 'nvarchar',
9
+ IsPrimaryKey: false,
10
+ Description: 'A test field',
11
+ AllowsNull: true,
12
+ DefaultValue: null,
13
+ Length: 100,
14
+ Precision: 0,
15
+ Scale: 0,
16
+ IsVirtual: false,
17
+ AutoIncrement: false,
18
+ RelatedEntityID: null,
19
+ RelatedEntity: null,
20
+ RelatedEntityFieldName: null,
21
+ EntityFieldValues: [],
22
+ ...overrides
23
+ };
24
+ }
25
+ function createMockEntity(overrides = {}) {
26
+ return {
27
+ ID: 'entity-1',
28
+ Name: 'TestEntity',
29
+ SchemaName: 'dbo',
30
+ Description: 'A test entity',
31
+ Status: 'Active',
32
+ BaseTable: 'TestTable',
33
+ Fields: [],
34
+ RelatedEntities: [],
35
+ ...overrides
36
+ };
37
+ }
38
+ describe('entityFieldToERDField', () => {
39
+ it('should convert basic field properties', () => {
40
+ const field = createMockField();
41
+ const erdField = entityFieldToERDField(field);
42
+ expect(erdField.id).toBe('field-1');
43
+ expect(erdField.name).toBe('TestField');
44
+ expect(erdField.type).toBe('nvarchar');
45
+ expect(erdField.isPrimaryKey).toBe(false);
46
+ expect(erdField.description).toBe('A test field');
47
+ expect(erdField.allowsNull).toBe(true);
48
+ expect(erdField.length).toBe(100);
49
+ expect(erdField.isVirtual).toBe(false);
50
+ expect(erdField.autoIncrement).toBe(false);
51
+ });
52
+ it('should set related entity info for foreign keys', () => {
53
+ const field = createMockField({
54
+ RelatedEntityID: 'rel-entity-1',
55
+ RelatedEntity: 'ParentEntity',
56
+ RelatedEntityFieldName: 'ID'
57
+ });
58
+ const erdField = entityFieldToERDField(field);
59
+ expect(erdField.relatedNodeId).toBe('rel-entity-1');
60
+ expect(erdField.relatedNodeName).toBe('ParentEntity');
61
+ expect(erdField.relatedFieldName).toBe('ID');
62
+ });
63
+ it('should not set related info for non-FK fields', () => {
64
+ const field = createMockField({ RelatedEntityID: null });
65
+ const erdField = entityFieldToERDField(field);
66
+ expect(erdField.relatedNodeId).toBeUndefined();
67
+ expect(erdField.relatedNodeName).toBeUndefined();
68
+ });
69
+ it('should convert EntityFieldValues to possibleValues', () => {
70
+ const field = createMockField({
71
+ EntityFieldValues: [
72
+ { ID: 'v1', Value: 'Active', Code: 'A', Description: 'Active status', Sequence: 1 },
73
+ { ID: 'v2', Value: 'Inactive', Code: 'I', Description: 'Inactive status', Sequence: 2 }
74
+ ]
75
+ });
76
+ const erdField = entityFieldToERDField(field);
77
+ expect(erdField.possibleValues).toHaveLength(2);
78
+ expect(erdField.possibleValues[0].value).toBe('Active');
79
+ expect(erdField.possibleValues[0].code).toBe('A');
80
+ expect(erdField.possibleValues[1].sequence).toBe(2);
81
+ });
82
+ });
83
+ describe('entityInfoToERDNode', () => {
84
+ it('should convert entity to ERD node', () => {
85
+ const entity = createMockEntity({
86
+ Fields: [createMockField()]
87
+ });
88
+ const node = entityInfoToERDNode(entity);
89
+ expect(node.id).toBe('entity-1');
90
+ expect(node.name).toBe('TestEntity');
91
+ expect(node.schemaName).toBe('dbo');
92
+ expect(node.description).toBe('A test entity');
93
+ expect(node.status).toBe('Active');
94
+ expect(node.baseTable).toBe('TestTable');
95
+ expect(node.fields).toHaveLength(1);
96
+ expect(node.customData).toBeDefined();
97
+ expect(node.customData['originalEntity']).toBe(entity);
98
+ });
99
+ it('should convert all fields', () => {
100
+ const entity = createMockEntity({
101
+ Fields: [
102
+ createMockField({ ID: 'f1', Name: 'ID', IsPrimaryKey: true }),
103
+ createMockField({ ID: 'f2', Name: 'Name' }),
104
+ createMockField({ ID: 'f3', Name: 'Status' })
105
+ ]
106
+ });
107
+ const node = entityInfoToERDNode(entity);
108
+ expect(node.fields).toHaveLength(3);
109
+ expect(node.fields[0].isPrimaryKey).toBe(true);
110
+ });
111
+ });
112
+ describe('entitiesToERDNodes', () => {
113
+ it('should convert an array of entities', () => {
114
+ const entities = [
115
+ createMockEntity({ ID: 'e1', Name: 'Entity1' }),
116
+ createMockEntity({ ID: 'e2', Name: 'Entity2' })
117
+ ];
118
+ const nodes = entitiesToERDNodes(entities);
119
+ expect(nodes).toHaveLength(2);
120
+ expect(nodes[0].name).toBe('Entity1');
121
+ expect(nodes[1].name).toBe('Entity2');
122
+ });
123
+ it('should return empty array for empty input', () => {
124
+ expect(entitiesToERDNodes([])).toEqual([]);
125
+ });
126
+ });
127
+ describe('getOriginalEntityFromERDNode', () => {
128
+ it('should extract entity from customData', () => {
129
+ const entity = createMockEntity();
130
+ const node = entityInfoToERDNode(entity);
131
+ const extracted = getOriginalEntityFromERDNode(node);
132
+ expect(extracted).toBe(entity);
133
+ });
134
+ it('should return null when no customData', () => {
135
+ const node = {
136
+ id: '1',
137
+ name: 'Test',
138
+ fields: []
139
+ };
140
+ expect(getOriginalEntityFromERDNode(node)).toBeNull();
141
+ });
142
+ it('should return null when customData has no originalEntity', () => {
143
+ const node = {
144
+ id: '1',
145
+ name: 'Test',
146
+ fields: [],
147
+ customData: { other: 'data' }
148
+ };
149
+ expect(getOriginalEntityFromERDNode(node)).toBeNull();
150
+ });
151
+ });
152
+ describe('findEntityByNodeId', () => {
153
+ it('should find entity by ID', () => {
154
+ const entities = [
155
+ createMockEntity({ ID: 'e1' }),
156
+ createMockEntity({ ID: 'e2' })
157
+ ];
158
+ const found = findEntityByNodeId('e2', entities);
159
+ expect(found).toBe(entities[1]);
160
+ });
161
+ it('should return undefined when not found', () => {
162
+ const entities = [createMockEntity({ ID: 'e1' })];
163
+ expect(findEntityByNodeId('e99', entities)).toBeUndefined();
164
+ });
165
+ });
166
+ describe('buildERDDataFromEntities', () => {
167
+ it('should build nodes from primary entities', () => {
168
+ const entities = [
169
+ createMockEntity({ ID: 'e1', Name: 'Entity1', Fields: [], RelatedEntities: [] })
170
+ ];
171
+ const result = buildERDDataFromEntities(entities);
172
+ expect(result.nodes).toHaveLength(1);
173
+ expect(result.links).toHaveLength(0);
174
+ });
175
+ it('should discover outgoing relationships', () => {
176
+ const parentEntity = createMockEntity({
177
+ ID: 'parent',
178
+ Name: 'Parent',
179
+ Fields: [createMockField({ ID: 'pk', Name: 'ID', IsPrimaryKey: true })],
180
+ RelatedEntities: []
181
+ });
182
+ const childEntity = createMockEntity({
183
+ ID: 'child',
184
+ Name: 'Child',
185
+ Fields: [
186
+ createMockField({ ID: 'ck', Name: 'ID', IsPrimaryKey: true }),
187
+ createMockField({ ID: 'fk', Name: 'ParentID', RelatedEntityID: 'parent' })
188
+ ],
189
+ RelatedEntities: []
190
+ });
191
+ const result = buildERDDataFromEntities([childEntity], { allEntities: [parentEntity, childEntity], includeOutgoing: true, includeIncoming: false });
192
+ expect(result.nodes).toHaveLength(2);
193
+ expect(result.links).toHaveLength(1);
194
+ expect(result.links[0].sourceNodeId).toBe('child');
195
+ expect(result.links[0].targetNodeId).toBe('parent');
196
+ expect(result.links[0].relationshipType).toBe('many-to-one');
197
+ });
198
+ it('should discover incoming relationships', () => {
199
+ const parentEntity = createMockEntity({
200
+ ID: 'parent',
201
+ Name: 'Parent',
202
+ Fields: [createMockField({ ID: 'pk', Name: 'ID', IsPrimaryKey: true })],
203
+ RelatedEntities: [
204
+ { RelatedEntity: 'Child', RelatedEntityJoinField: 'ParentID' }
205
+ ]
206
+ });
207
+ const childEntity = createMockEntity({
208
+ ID: 'child',
209
+ Name: 'Child',
210
+ Fields: [
211
+ createMockField({ ID: 'ck', Name: 'ID', IsPrimaryKey: true }),
212
+ createMockField({ ID: 'fk', Name: 'ParentID', RelatedEntityID: 'parent' })
213
+ ],
214
+ RelatedEntities: []
215
+ });
216
+ const result = buildERDDataFromEntities([parentEntity], { allEntities: [parentEntity, childEntity], includeOutgoing: false, includeIncoming: true });
217
+ expect(result.nodes).toHaveLength(2);
218
+ expect(result.links).toHaveLength(1);
219
+ expect(result.links[0].sourceNodeId).toBe('child');
220
+ expect(result.links[0].targetNodeId).toBe('parent');
221
+ });
222
+ it('should not duplicate nodes or links', () => {
223
+ const entity = createMockEntity({
224
+ ID: 'e1',
225
+ Name: 'Entity1',
226
+ Fields: [createMockField({ ID: 'pk', Name: 'ID', IsPrimaryKey: true })],
227
+ RelatedEntities: []
228
+ });
229
+ const result = buildERDDataFromEntities([entity, entity], { allEntities: [entity] });
230
+ expect(result.nodes).toHaveLength(1);
231
+ });
232
+ it('should handle self-referencing entities', () => {
233
+ const entity = createMockEntity({
234
+ ID: 'e1',
235
+ Name: 'Category',
236
+ Fields: [
237
+ createMockField({ ID: 'pk', Name: 'ID', IsPrimaryKey: true }),
238
+ createMockField({ ID: 'fk', Name: 'ParentCategoryID', RelatedEntityID: 'e1' })
239
+ ],
240
+ RelatedEntities: []
241
+ });
242
+ const result = buildERDDataFromEntities([entity], { allEntities: [entity], includeOutgoing: true });
243
+ expect(result.links).toHaveLength(1);
244
+ expect(result.links[0].isSelfReference).toBe(true);
245
+ });
246
+ it('should handle empty entities array', () => {
247
+ const result = buildERDDataFromEntities([]);
248
+ expect(result.nodes).toEqual([]);
249
+ expect(result.links).toEqual([]);
250
+ });
251
+ });
252
+ //# sourceMappingURL=entity-to-erd-adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-to-erd-adapter.test.js","sourceRoot":"","sources":["../../src/__tests__/entity-to-erd-adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,oCAAoC,CAAC;AAG5C,8CAA8C;AAC9C,SAAS,eAAe,CAAC,YAAqC,EAAE;IAC9D,OAAO;QACL,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,cAAc;QAC3B,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,KAAK;QACpB,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,IAAI;QACnB,sBAAsB,EAAE,IAAI;QAC5B,iBAAiB,EAAE,EAAE;QACrB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,YAAqC,EAAE;IAC/D,OAAO;QACL,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,eAAe;QAC5B,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,WAAW;QACtB,MAAM,EAAE,EAAE;QACV,eAAe,EAAE,EAAE;QACnB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAc,CAAC,CAAC;QAEvD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,eAAe,CAAC;YAC5B,eAAe,EAAE,cAAc;YAC/B,aAAa,EAAE,cAAc;YAC7B,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAc,CAAC,CAAC;QAEvD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAc,CAAC,CAAC;QAEvD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,eAAe,CAAC;YAC5B,iBAAiB,EAAE;gBACjB,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE;gBACnF,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE;aACxF;SACF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAc,CAAC,CAAC;QAEvD,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,cAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,cAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,cAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAC9B,MAAM,EAAE,CAAC,eAAe,EAAE,CAAC;SAC5B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAe,CAAC,CAAC;QAElD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,UAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAC9B,MAAM,EAAE;gBACN,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;gBAC7D,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAC3C,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;aAC9C;SACF,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAe,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG;YACf,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC/C,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SAChD,CAAC;QACF,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAmB,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAe,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAY;YACpB,EAAE,EAAE,GAAG;YACP,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,EAAE;SACX,CAAC;QACF,MAAM,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAAY;YACpB,EAAE,EAAE,GAAG;YACP,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SAC9B,CAAC;QACF,MAAM,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,QAAQ,GAAG;YACf,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAC9B,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC;QACF,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAmB,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,QAAQ,GAAG,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAmB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,QAAQ,GAAG;YACf,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;SACjF,CAAC;QACF,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAmB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,YAAY,GAAG,gBAAgB,CAAC;YACpC,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,gBAAgB,CAAC;YACnC,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;gBAC7D,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;aAC3E;YACD,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,wBAAwB,CACrC,CAAC,WAAoB,CAAC,EACtB,EAAE,WAAW,EAAE,CAAC,YAAqB,EAAE,WAAoB,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAC9G,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,YAAY,GAAG,gBAAgB,CAAC;YACpC,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,eAAe,EAAE;gBACf,EAAE,aAAa,EAAE,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE;aAC/D;SACF,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,gBAAgB,CAAC;YACnC,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;gBAC7D,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;aAC3E;YACD,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,wBAAwB,CACrC,CAAC,YAAqB,CAAC,EACvB,EAAE,WAAW,EAAE,CAAC,YAAqB,EAAE,WAAoB,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAC9G,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAC9B,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,wBAAwB,CACrC,CAAC,MAAe,EAAE,MAAe,CAAC,EAClC,EAAE,WAAW,EAAE,CAAC,MAAe,CAAC,EAAE,CACnC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAC9B,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE;gBACN,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;gBAC7D,eAAe,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;aAC/E;YACD,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,wBAAwB,CACrC,CAAC,MAAe,CAAC,EACjB,EAAE,WAAW,EAAE,CAAC,MAAe,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=erd-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erd-types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/erd-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ describe('ERD Types', () => {
3
+ describe('ERDField', () => {
4
+ it('should construct basic field', () => {
5
+ const field = {
6
+ id: 'f1',
7
+ name: 'ID',
8
+ type: 'uniqueidentifier',
9
+ isPrimaryKey: true
10
+ };
11
+ expect(field.isPrimaryKey).toBe(true);
12
+ });
13
+ it('should construct FK field', () => {
14
+ const field = {
15
+ id: 'f2',
16
+ name: 'ParentID',
17
+ isPrimaryKey: false,
18
+ relatedNodeId: 'e1',
19
+ relatedNodeName: 'Parent',
20
+ relatedFieldName: 'ID'
21
+ };
22
+ expect(field.relatedNodeId).toBe('e1');
23
+ });
24
+ });
25
+ describe('ERDNode', () => {
26
+ it('should construct with fields', () => {
27
+ const node = {
28
+ id: 'e1',
29
+ name: 'Users',
30
+ schemaName: 'dbo',
31
+ fields: [
32
+ { id: 'f1', name: 'ID', isPrimaryKey: true },
33
+ { id: 'f2', name: 'Name', isPrimaryKey: false }
34
+ ]
35
+ };
36
+ expect(node.fields).toHaveLength(2);
37
+ });
38
+ });
39
+ describe('ERDLink', () => {
40
+ it('should represent a many-to-one relationship', () => {
41
+ const link = {
42
+ sourceNodeId: 'child',
43
+ targetNodeId: 'parent',
44
+ sourceField: { id: 'fk', name: 'ParentID', isPrimaryKey: false },
45
+ isSelfReference: false,
46
+ relationshipType: 'many-to-one'
47
+ };
48
+ expect(link.relationshipType).toBe('many-to-one');
49
+ expect(link.isSelfReference).toBe(false);
50
+ });
51
+ });
52
+ describe('ERDConfig', () => {
53
+ it('should accept partial configuration', () => {
54
+ const config = {
55
+ nodeWidth: 200,
56
+ showFieldDetails: true,
57
+ enableDragging: true,
58
+ layoutAlgorithm: 'dagre'
59
+ };
60
+ expect(config.layoutAlgorithm).toBe('dagre');
61
+ });
62
+ });
63
+ describe('ERDFilter', () => {
64
+ it('should support schema filter', () => {
65
+ const filter = { schemaName: 'dbo' };
66
+ expect(filter.schemaName).toBe('dbo');
67
+ });
68
+ it('should support custom filter function', () => {
69
+ const filter = {
70
+ customFilter: (node) => node.name.startsWith('User')
71
+ };
72
+ const testNode = { id: '1', name: 'UserRoles', fields: [] };
73
+ expect(filter.customFilter(testNode)).toBe(true);
74
+ });
75
+ });
76
+ describe('ERDState', () => {
77
+ it('should serialize and deserialize', () => {
78
+ const state = {
79
+ selectedNodeId: 'e1',
80
+ highlightedNodeIds: ['e2', 'e3'],
81
+ zoomLevel: 1.5,
82
+ translateX: 100,
83
+ translateY: 200,
84
+ focusNodeId: null,
85
+ focusDepth: 1,
86
+ nodePositions: {
87
+ 'e1': { x: 10, y: 20 },
88
+ 'e2': { x: 30, y: 40, fx: 30, fy: 40 }
89
+ }
90
+ };
91
+ const json = JSON.stringify(state);
92
+ const parsed = JSON.parse(json);
93
+ expect(parsed.selectedNodeId).toBe('e1');
94
+ expect(parsed.nodePositions['e2'].fx).toBe(30);
95
+ });
96
+ });
97
+ describe('ERDLayoutAlgorithm', () => {
98
+ it('should support all layout types', () => {
99
+ const layouts = ['force', 'dagre', 'horizontal', 'vertical', 'radial'];
100
+ expect(layouts).toHaveLength(5);
101
+ });
102
+ });
103
+ });
104
+ //# sourceMappingURL=erd-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erd-types.test.js","sourceRoot":"","sources":["../../src/__tests__/erd-types.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ describe('@memberjunction/ng-entity-relationship-diagram', () => {
3
+ it('should have a passing test', () => {
4
+ expect(true).toBe(true);
5
+ });
6
+ });
7
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-entity-relationship-diagram",
3
- "version": "4.1.0",
3
+ "version": "4.3.0",
4
4
  "description": "MemberJunction: Entity Relationship Diagram (ERD) component for visualizing entity relationships using D3.js force-directed graphs",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -8,8 +8,9 @@
8
8
  "/dist"
9
9
  ],
10
10
  "scripts": {
11
- "test": "echo \"Error: no test specified\" && exit 1",
12
- "build": "ngc"
11
+ "test": "echo \"No tests configured yet\"",
12
+ "build": "ngc",
13
+ "test:watch": "vitest"
13
14
  },
14
15
  "keywords": [
15
16
  "angular",
@@ -24,7 +25,8 @@
24
25
  "devDependencies": {
25
26
  "@angular/compiler": "21.1.3",
26
27
  "@angular/compiler-cli": "21.1.3",
27
- "sass": "^1.97.3"
28
+ "sass": "^1.97.3",
29
+ "vitest": "^4.0.18"
28
30
  },
29
31
  "peerDependencies": {
30
32
  "@angular/common": "21.1.3",
@@ -34,7 +36,7 @@
34
36
  "dependencies": {
35
37
  "@angular/forms": "21.1.3",
36
38
  "@dagrejs/dagre": "^1.1.8",
37
- "@memberjunction/core": "4.1.0",
39
+ "@memberjunction/core": "4.3.0",
38
40
  "@progress/kendo-angular-layout": "22.0.1",
39
41
  "@types/d3": "^7.4.3",
40
42
  "d3": "^7.9.0",