bridgelist 1.0.7 → 1.1.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 +3 -3
- package/dist/analyzers/array-analyzer.d.ts +14 -0
- package/dist/analyzers/array-analyzer.js +103 -0
- package/dist/analyzers/array-analyzer.js.map +1 -0
- package/dist/analyzers/ast-analyzer.js +11 -65
- package/dist/analyzers/ast-analyzer.js.map +1 -1
- package/dist/analyzers/method-analyzer.d.ts +3 -2
- package/dist/analyzers/method-analyzer.js +91 -89
- package/dist/analyzers/method-analyzer.js.map +1 -1
- package/dist/analyzers/property-access-analyzer.d.ts +3 -6
- package/dist/analyzers/property-access-analyzer.js +62 -58
- package/dist/analyzers/property-access-analyzer.js.map +1 -1
- package/dist/decorators/array-documentation.d.ts +2 -0
- package/dist/decorators/array-documentation.js +9 -0
- package/dist/decorators/array-documentation.js.map +1 -0
- package/dist/decorators/mapping-documentation.js.map +1 -1
- package/dist/generators/array-list-generator.d.ts +1 -0
- package/dist/generators/array-list-generator.js +143 -0
- package/dist/generators/array-list-generator.js.map +1 -0
- package/dist/generators/doc-generator-html.d.ts +1 -0
- package/dist/generators/doc-generator-html.js +375 -0
- package/dist/generators/doc-generator-html.js.map +1 -0
- package/dist/generators/doc-output-registry.d.ts +4 -0
- package/dist/generators/doc-output-registry.js +21 -0
- package/dist/generators/doc-output-registry.js.map +1 -0
- package/dist/generators/mapping-generator.d.ts +2 -0
- package/dist/generators/mapping-generator.js +167 -0
- package/dist/generators/mapping-generator.js.map +1 -0
- package/dist/index.d.ts +8 -3
- package/dist/index.js +16 -6
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/utils/array-scanner.d.ts +7 -0
- package/dist/utils/array-scanner.js +53 -0
- package/dist/utils/array-scanner.js.map +1 -0
- package/dist/utils/find-all-ts-files.d.ts +1 -0
- package/dist/utils/find-all-ts-files.js +25 -0
- package/dist/utils/find-all-ts-files.js.map +1 -0
- package/dist/utils/find-decorated-methods.d.ts +16 -0
- package/dist/utils/find-decorated-methods.js +103 -0
- package/dist/utils/find-decorated-methods.js.map +1 -0
- package/dist/utils/mapping-scanner.d.ts +7 -0
- package/dist/utils/mapping-scanner.js +53 -0
- package/dist/utils/mapping-scanner.js.map +1 -0
- package/docs/documentation.html +434 -0
- package/package.json +6 -3
- package/docs/example-mapping.html +0 -1170
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="de">
|
|
4
|
+
<head>
|
|
5
|
+
<title>bridgelist</title>
|
|
6
|
+
<style>
|
|
7
|
+
* {
|
|
8
|
+
margin: 0;
|
|
9
|
+
padding: 0;
|
|
10
|
+
box-sizing: border-box;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
body {
|
|
14
|
+
font-family: Roboto, Helvetica, sans-serif;
|
|
15
|
+
padding: 2rem;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
h1 {
|
|
19
|
+
margin-bottom: 2rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
h2 {
|
|
23
|
+
margin: 1.5rem 0 1rem 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
h3, p {
|
|
27
|
+
margin-bottom: 1rem;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.header {
|
|
31
|
+
position: fixed;
|
|
32
|
+
top: 0;
|
|
33
|
+
left: 0;
|
|
34
|
+
display: flex;
|
|
35
|
+
justify-content: space-between;
|
|
36
|
+
align-items: center;
|
|
37
|
+
height: 5rem;
|
|
38
|
+
padding: 1rem 2rem;
|
|
39
|
+
background-color: #c2e5da;
|
|
40
|
+
width: 100%;
|
|
41
|
+
z-index: 100;
|
|
42
|
+
}
|
|
43
|
+
.container {
|
|
44
|
+
margin-top: 7rem;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.doc-card {
|
|
48
|
+
width: 100%;
|
|
49
|
+
display: flex;
|
|
50
|
+
flex-direction: column;
|
|
51
|
+
align-items: flex-start;
|
|
52
|
+
border: 1px solid #ddd;
|
|
53
|
+
border-radius: 5px;
|
|
54
|
+
padding: 1rem;
|
|
55
|
+
margin: 1rem 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.show-hide {
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
padding: 1rem;
|
|
61
|
+
width: 100%;
|
|
62
|
+
background-color: #7ac29d44;
|
|
63
|
+
display: flex;
|
|
64
|
+
justify-content: flex-start;
|
|
65
|
+
gap: 1rem;
|
|
66
|
+
align-items: center;
|
|
67
|
+
user-select: none;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.show-hide.array {
|
|
71
|
+
background-color: #f9dcbe44;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.collapse {
|
|
75
|
+
width: 24px;
|
|
76
|
+
height: 24px;
|
|
77
|
+
border: 1px solid #000;
|
|
78
|
+
border-radius: 50%;
|
|
79
|
+
display: flex;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
align-items: center;
|
|
82
|
+
pointer-events: none;
|
|
83
|
+
}
|
|
84
|
+
.rotate {
|
|
85
|
+
transform: rotate(180deg);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.hidden {
|
|
89
|
+
display: none;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
input[type="text"] {
|
|
93
|
+
padding: 0.5rem;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.class-method {
|
|
97
|
+
width: 100%;
|
|
98
|
+
display: flex;
|
|
99
|
+
justify-content: space-between;
|
|
100
|
+
align-items: center;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.class-method-col {
|
|
104
|
+
width: 33%;
|
|
105
|
+
display: flex;
|
|
106
|
+
flex-direction: column;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.styled-text {
|
|
110
|
+
font-size: 1.2rem;
|
|
111
|
+
font-weight: lighter;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
table {
|
|
115
|
+
border-collapse: collapse;
|
|
116
|
+
width: 100%;
|
|
117
|
+
margin: 1rem 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
th, td {
|
|
121
|
+
border: 1px solid #ddd;
|
|
122
|
+
padding: 8px;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
th {
|
|
126
|
+
background-color: #f2f2f2;
|
|
127
|
+
text-align: left;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.arrow {
|
|
131
|
+
color: #666;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.constant-value {
|
|
135
|
+
background-color: #f9dcbe44;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.transformed-value {
|
|
139
|
+
background-color: #dae6e366;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
ul.array-list {
|
|
143
|
+
list-style-type: none;
|
|
144
|
+
padding: 0;
|
|
145
|
+
width: 100%;
|
|
146
|
+
margin-top: 1rem;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
li.array-item {
|
|
150
|
+
padding: 0.75rem 1rem;
|
|
151
|
+
margin-bottom: 0.5rem;
|
|
152
|
+
border: 1px solid #ddd;
|
|
153
|
+
border-radius: 5px;
|
|
154
|
+
background-color: #f9f9f9;
|
|
155
|
+
width: 100%;
|
|
156
|
+
overflow-x: auto;
|
|
157
|
+
white-space: pre;
|
|
158
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@media (max-width: 1024px) {
|
|
162
|
+
.last { display: none; }
|
|
163
|
+
}
|
|
164
|
+
</style>
|
|
165
|
+
</head>
|
|
166
|
+
<body>
|
|
167
|
+
<div class="header">
|
|
168
|
+
<h1 style="margin: 0; flex: 1">bridgelist</h1>
|
|
169
|
+
<input style="flex: 1;"
|
|
170
|
+
type="text"
|
|
171
|
+
id="searchInput"
|
|
172
|
+
name="search"
|
|
173
|
+
size="30"
|
|
174
|
+
placeholder="Search for title, method or class..." />
|
|
175
|
+
<div style="flex: 1"></div>
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
<div class="container">
|
|
179
|
+
<h2>Arrays</h2><div class="doc-card doc-entry">
|
|
180
|
+
<div class="class-method">
|
|
181
|
+
<div class="class-method-col">
|
|
182
|
+
<span class="styled-text">Class:</span><h3>SimpleMapper</h3>
|
|
183
|
+
</div>
|
|
184
|
+
<div class="class-method-col">
|
|
185
|
+
<span class="styled-text">Method:</span><h3>removeAllIrrelevantProperties</h3>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="class-method-col last"></div>
|
|
188
|
+
</div><span class="styled-text">Title:</span><h3>Simple mapper properties</h3>
|
|
189
|
+
<p>Show only relevant properties</p>
|
|
190
|
+
|
|
191
|
+
<div class="show-hide array">
|
|
192
|
+
<div class="collapse">
|
|
193
|
+
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
194
|
+
<g id="Arrow / Caret_Down_MD">
|
|
195
|
+
<path id="Vector" d="M16 10L12 14L8 10" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
196
|
+
</g>
|
|
197
|
+
</svg>
|
|
198
|
+
</div>
|
|
199
|
+
<span>Array-Liste (<strong>4</strong>)</span>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<div class="array-list hidden">
|
|
203
|
+
<input style="flex: 1; margin-top: 1rem; margin-bottom: 1rem;"
|
|
204
|
+
type="text"
|
|
205
|
+
id="fieldSearch"
|
|
206
|
+
name="fieldSearch"
|
|
207
|
+
size="30"
|
|
208
|
+
placeholder="Search for field..." />
|
|
209
|
+
<ul>
|
|
210
|
+
<li class="array-item"><span class="item-index">[0] </span><span class="list-item">objectId</span></li><li class="array-item"><span class="item-index">[1] </span><span class="list-item">lastname</span></li><li class="array-item"><span class="item-index">[2] </span><span class="list-item">city</span></li><li class="array-item"><span class="item-index">[3] </span><span class="list-item">zip</span></li>
|
|
211
|
+
</ul>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
<h2>Mappings</h2>
|
|
215
|
+
<div class="doc-card doc-entry">
|
|
216
|
+
<div class="class-method">
|
|
217
|
+
<div class="class-method-col">
|
|
218
|
+
<span class="styled-text">Class:</span><h3>ComplexMapper</h3>
|
|
219
|
+
</div>
|
|
220
|
+
<div class="class-method-col">
|
|
221
|
+
<span class="styled-text">Method:</span><h3>mapContactToCustomer</h3>
|
|
222
|
+
</div>
|
|
223
|
+
<div class="class-method-col last"></div>
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
<p>Converts CRM contacts to ERP customers</p>
|
|
227
|
+
|
|
228
|
+
<div class="show-hide">
|
|
229
|
+
<div class="collapse">
|
|
230
|
+
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
231
|
+
<g id="Arrow / Caret_Down_MD">
|
|
232
|
+
<path id="Vector" d="M16 10L12 14L8 10" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
233
|
+
</g>
|
|
234
|
+
</svg>
|
|
235
|
+
</div>
|
|
236
|
+
<span>Mapping von <strong>CRM</strong> nach <strong>ERP</strong></span>
|
|
237
|
+
</div>
|
|
238
|
+
|
|
239
|
+
<table class="mapping-table hidden">
|
|
240
|
+
<tr>
|
|
241
|
+
<th>CRM Field</th>
|
|
242
|
+
<th></th>
|
|
243
|
+
<th>ERP Field</th>
|
|
244
|
+
<th>Transformation</th>
|
|
245
|
+
</tr>
|
|
246
|
+
|
|
247
|
+
<tr>
|
|
248
|
+
<td>contact.id</td>
|
|
249
|
+
<td class="arrow">→</td>
|
|
250
|
+
<td>customerId</td>
|
|
251
|
+
<td>Direct mapping</td>
|
|
252
|
+
</tr>
|
|
253
|
+
|
|
254
|
+
<tr>
|
|
255
|
+
<td>contact.firstName, contact.lastName</td>
|
|
256
|
+
<td class="arrow">→</td>
|
|
257
|
+
<td>fullName</td>
|
|
258
|
+
<td>Expression</td>
|
|
259
|
+
</tr>
|
|
260
|
+
|
|
261
|
+
<tr>
|
|
262
|
+
<td>contact.address.streetName</td>
|
|
263
|
+
<td class="arrow">→</td>
|
|
264
|
+
<td>address.street</td>
|
|
265
|
+
<td>Direct mapping</td>
|
|
266
|
+
</tr>
|
|
267
|
+
|
|
268
|
+
<tr>
|
|
269
|
+
<td>contact.address.city</td>
|
|
270
|
+
<td class="arrow">→</td>
|
|
271
|
+
<td>address.city</td>
|
|
272
|
+
<td>Direct mapping</td>
|
|
273
|
+
</tr>
|
|
274
|
+
|
|
275
|
+
<tr>
|
|
276
|
+
<td>Constant value</td>
|
|
277
|
+
<td class="arrow">→</td>
|
|
278
|
+
<td>address.country</td>
|
|
279
|
+
<td>defaultCountry</td>
|
|
280
|
+
</tr>
|
|
281
|
+
|
|
282
|
+
<tr>
|
|
283
|
+
<td>contact.address.streetName</td>
|
|
284
|
+
<td class="arrow">→</td>
|
|
285
|
+
<td>street</td>
|
|
286
|
+
<td>Direct mapping</td>
|
|
287
|
+
</tr>
|
|
288
|
+
|
|
289
|
+
<tr>
|
|
290
|
+
<td>contact.address.city</td>
|
|
291
|
+
<td class="arrow">→</td>
|
|
292
|
+
<td>city</td>
|
|
293
|
+
<td>Direct mapping</td>
|
|
294
|
+
</tr>
|
|
295
|
+
|
|
296
|
+
<tr>
|
|
297
|
+
<td>Constant value</td>
|
|
298
|
+
<td class="arrow">→</td>
|
|
299
|
+
<td>country</td>
|
|
300
|
+
<td>defaultCountry</td>
|
|
301
|
+
</tr>
|
|
302
|
+
|
|
303
|
+
</table>
|
|
304
|
+
</div>
|
|
305
|
+
|
|
306
|
+
<div class="doc-card doc-entry">
|
|
307
|
+
<div class="class-method">
|
|
308
|
+
<div class="class-method-col">
|
|
309
|
+
<span class="styled-text">Class:</span><h3>SimpleMapper</h3>
|
|
310
|
+
</div>
|
|
311
|
+
<div class="class-method-col">
|
|
312
|
+
<span class="styled-text">Method:</span><h3>mapAToB</h3>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="class-method-col last"></div>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
<p>Simple mapping example</p>
|
|
318
|
+
|
|
319
|
+
<div class="show-hide">
|
|
320
|
+
<div class="collapse">
|
|
321
|
+
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
322
|
+
<g id="Arrow / Caret_Down_MD">
|
|
323
|
+
<path id="Vector" d="M16 10L12 14L8 10" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
324
|
+
</g>
|
|
325
|
+
</svg>
|
|
326
|
+
</div>
|
|
327
|
+
<span>Mapping von <strong>System A</strong> nach <strong>System B</strong></span>
|
|
328
|
+
</div>
|
|
329
|
+
|
|
330
|
+
<table class="mapping-table hidden">
|
|
331
|
+
<tr>
|
|
332
|
+
<th>System A Field</th>
|
|
333
|
+
<th></th>
|
|
334
|
+
<th>System B Field</th>
|
|
335
|
+
<th>Transformation</th>
|
|
336
|
+
</tr>
|
|
337
|
+
|
|
338
|
+
<tr>
|
|
339
|
+
<td>sourceObject.id</td>
|
|
340
|
+
<td class="arrow">→</td>
|
|
341
|
+
<td>objectId</td>
|
|
342
|
+
<td>Direct mapping</td>
|
|
343
|
+
</tr>
|
|
344
|
+
|
|
345
|
+
<tr>
|
|
346
|
+
<td>sourceObject.firstname</td>
|
|
347
|
+
<td class="arrow">→</td>
|
|
348
|
+
<td>firstname</td>
|
|
349
|
+
<td>Direct mapping</td>
|
|
350
|
+
</tr>
|
|
351
|
+
|
|
352
|
+
<tr>
|
|
353
|
+
<td>sourceObject.lastname</td>
|
|
354
|
+
<td class="arrow">→</td>
|
|
355
|
+
<td>lastname</td>
|
|
356
|
+
<td>Direct mapping</td>
|
|
357
|
+
</tr>
|
|
358
|
+
|
|
359
|
+
<tr>
|
|
360
|
+
<td>sourceObject.city</td>
|
|
361
|
+
<td class="arrow">→</td>
|
|
362
|
+
<td>city</td>
|
|
363
|
+
<td>Direct mapping</td>
|
|
364
|
+
</tr>
|
|
365
|
+
|
|
366
|
+
<tr>
|
|
367
|
+
<td>sourceObject.details</td>
|
|
368
|
+
<td class="arrow">→</td>
|
|
369
|
+
<td>description</td>
|
|
370
|
+
<td>Direct mapping</td>
|
|
371
|
+
</tr>
|
|
372
|
+
|
|
373
|
+
<tr>
|
|
374
|
+
<td>sourceObject.zip</td>
|
|
375
|
+
<td class="arrow">→</td>
|
|
376
|
+
<td>zip</td>
|
|
377
|
+
<td>Direct mapping</td>
|
|
378
|
+
</tr>
|
|
379
|
+
|
|
380
|
+
</table>
|
|
381
|
+
</div>
|
|
382
|
+
|
|
383
|
+
</div>
|
|
384
|
+
<script>
|
|
385
|
+
const search = document.getElementById('searchInput');
|
|
386
|
+
const fieldSearch = document.getElementById('fieldSearch');
|
|
387
|
+
const entries = document.querySelectorAll('.doc-entry');
|
|
388
|
+
const listItems = document.querySelectorAll('.array-item');
|
|
389
|
+
|
|
390
|
+
document.querySelectorAll('table.mapping-table tr').forEach(row => {
|
|
391
|
+
if (!row.cells || row.cells.length < 4) return;
|
|
392
|
+
const sourceField = row.cells[0].textContent || '';
|
|
393
|
+
const transformation = row.cells[3].textContent || '';
|
|
394
|
+
if (sourceField.includes('Constant value')) {
|
|
395
|
+
row.classList.add('constant-value');
|
|
396
|
+
} else if (transformation.includes('Transformed')) {
|
|
397
|
+
row.classList.add('transformed-value');
|
|
398
|
+
} else if (!sourceField.includes('Constant value') && !transformation.includes('Direct mapping')) {
|
|
399
|
+
row.classList.add('transformed-value');
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
search.addEventListener('input', (e) => {
|
|
404
|
+
const searchTerm = (e.target.value || '').toLowerCase();
|
|
405
|
+
entries.forEach(entry => {
|
|
406
|
+
let text = '';
|
|
407
|
+
entry.querySelectorAll('h3').forEach(h => text += (h.textContent || '').toLowerCase());
|
|
408
|
+
entry.style.display = text.includes(searchTerm) ? 'flex' : 'none';
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
if (fieldSearch) {
|
|
413
|
+
fieldSearch.addEventListener('input', (e) => {
|
|
414
|
+
const searchTerm = (e.target.value || '').toLowerCase();
|
|
415
|
+
listItems.forEach(item => {
|
|
416
|
+
const itemText = item.querySelector('.list-item')?.textContent.toLowerCase();
|
|
417
|
+
item.style.display = itemText.includes(searchTerm) ? '' : 'none';
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
document.querySelectorAll('.show-hide').forEach(button => {
|
|
423
|
+
button.addEventListener('click', () => {
|
|
424
|
+
const next = button.nextElementSibling;
|
|
425
|
+
const caret = button.querySelector('.collapse');
|
|
426
|
+
if (!next) return;
|
|
427
|
+
next.classList.toggle('hidden');
|
|
428
|
+
if (caret) caret.classList.toggle('rotate');
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
</script>
|
|
432
|
+
</body>
|
|
433
|
+
</html>
|
|
434
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bridgelist",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A TypeScript-based tool for automatically documenting field mappings between different API systems",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -31,8 +31,11 @@
|
|
|
31
31
|
},
|
|
32
32
|
"homepage": "https://biga.de",
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"typescript": "^5.9.2",
|
|
35
34
|
"@types/node": "^24.3.0",
|
|
36
|
-
"ts-node": "^10.9.2"
|
|
35
|
+
"ts-node": "^10.9.2",
|
|
36
|
+
"typescript": "^5.9.2"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"ts-morph": "^27.0.0"
|
|
37
40
|
}
|
|
38
41
|
}
|