@likec4/generators 1.31.0 → 1.32.1

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.
Files changed (40) hide show
  1. package/dist/d2/generate-d2.d.ts +3 -2
  2. package/dist/d2/generate-d2.js +2 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +1 -0
  5. package/dist/mmd/generate-mmd.d.ts +3 -2
  6. package/dist/mmd/generate-mmd.js +2 -1
  7. package/dist/model/generate-aux.d.ts +2 -0
  8. package/dist/model/generate-aux.js +66 -0
  9. package/dist/model/generate-likec4-model.d.ts +2 -2
  10. package/dist/model/generate-likec4-model.js +8 -10
  11. package/dist/puml/generate-puml.d.ts +2 -0
  12. package/dist/puml/generate-puml.js +176 -0
  13. package/dist/puml/index.d.ts +1 -0
  14. package/dist/puml/index.js +1 -0
  15. package/dist/react/generate-react-types.d.ts +2 -2
  16. package/dist/react/generate-react-types.js +14 -73
  17. package/dist/views-data-ts/generate-views-data.d.ts +9 -0
  18. package/package.json +7 -7
  19. package/src/__mocks__/data.ts +83 -83
  20. package/src/d2/__snapshots__/generate-d2.spec.ts.snap +78 -0
  21. package/src/d2/generate-d2.spec.ts +91 -4
  22. package/src/d2/generate-d2.ts +20 -15
  23. package/src/index.ts +1 -0
  24. package/src/mmd/generate-mmd.spec.ts +12 -4
  25. package/src/mmd/generate-mmd.ts +25 -20
  26. package/src/model/__snapshots__/aux.generate-valid-code.snap +56 -0
  27. package/src/model/__snapshots__/{likec4-model.snap → likec4.computed-model.snap} +342 -165
  28. package/src/model/__snapshots__/likec4.parsed-model.snap +671 -0
  29. package/src/model/generate-aux.spec.ts +65 -0
  30. package/src/model/generate-aux.ts +72 -0
  31. package/src/model/generate-likec4-model.spec.ts +34 -8
  32. package/src/model/generate-likec4-model.ts +13 -14
  33. package/src/puml/__snapshots__/generate-puml.spec.ts.snap +184 -0
  34. package/src/puml/generate-puml.spec.ts +26 -0
  35. package/src/puml/generate-puml.ts +264 -0
  36. package/src/puml/index.ts +1 -0
  37. package/src/react/__snapshots__/valid-code.snap +111 -0
  38. package/src/react/generate-react-types.spec.ts +67 -0
  39. package/src/react/generate-react-types.ts +16 -77
  40. package/src/views-data-ts/generate-views-data.ts +18 -9
@@ -0,0 +1,671 @@
1
+ /* prettier-ignore-start */
2
+ /* eslint-disable */
3
+
4
+ /******************************************************************************
5
+ * This file was generated
6
+ * DO NOT EDIT MANUALLY!
7
+ ******************************************************************************/
8
+
9
+ import { LikeC4Model } from '@likec4/core/model'
10
+ import type { ParsedLikeC4ModelData } from '@likec4/core/types'
11
+ import type { Aux, SpecAux } from '@likec4/core/types';
12
+
13
+ export type $Specs = SpecAux<
14
+ // Element kinds
15
+ | "component"
16
+ | "mobile"
17
+ | "person"
18
+ | "system"
19
+ | "webapp",
20
+ // Deployment kinds
21
+ | "env"
22
+ | "node"
23
+ | "zone",
24
+ // Relationship kinds
25
+ never,
26
+ // Tags
27
+ | "external"
28
+ | "internal",
29
+ // Metadata keys
30
+ | "key1"
31
+ >
32
+
33
+ export type $Aux = Aux<
34
+ "parsed",
35
+ // Elements
36
+ | "aws"
37
+ | "cloud"
38
+ | "customer"
39
+ | "email"
40
+ | "aws.rds"
41
+ | "aws.s3"
42
+ | "cloud.auth"
43
+ | "cloud.backend"
44
+ | "cloud.frontend"
45
+ | "cloud.media"
46
+ | "cloud.backend.api"
47
+ | "cloud.backend.graphql"
48
+ | "cloud.frontend.dashboard"
49
+ | "cloud.frontend.mobile",
50
+ // Deployments
51
+ | "customer"
52
+ | "prod"
53
+ | "customer.instance"
54
+ | "prod.eu"
55
+ | "prod.us"
56
+ | "prod.eu.db"
57
+ | "prod.eu.media"
58
+ | "prod.eu.zone1"
59
+ | "prod.eu.zone2"
60
+ | "prod.us.db"
61
+ | "prod.eu.zone1.api"
62
+ | "prod.eu.zone1.ui"
63
+ | "prod.eu.zone2.api"
64
+ | "prod.eu.zone2.ui",
65
+ // Views
66
+ | "cloud"
67
+ | "index"
68
+ | "prod",
69
+ // Project ID
70
+ "from-builder",
71
+ $Specs
72
+ >
73
+
74
+ export type $ElementId = $Aux['ElementId']
75
+ export type $DeploymentId = $Aux['DeploymentId']
76
+ export type $ViewId = $Aux['ViewId']
77
+
78
+ export type $ElementKind = $Aux['ElementKind']
79
+ export type $RelationKind = $Aux['RelationKind']
80
+ export type $DeploymentKind = $Aux['DeploymentKind']
81
+ export type $Tag = $Aux['Tag']
82
+ export type $Tags = readonly $Aux['Tag'][]
83
+ export type $MetadataKey = $Aux['MetadataKey']
84
+
85
+
86
+ export const likec4model: LikeC4Model<$Aux> = new LikeC4Model(<ParsedLikeC4ModelData<$Aux>>({
87
+ _stage: 'parsed',
88
+ projectId: 'from-builder',
89
+ specification: {
90
+ elements: {
91
+ person: {
92
+ style: {
93
+ shape: 'person',
94
+ },
95
+ },
96
+ system: {},
97
+ component: {},
98
+ webapp: {
99
+ style: {
100
+ shape: 'browser',
101
+ },
102
+ },
103
+ mobile: {
104
+ style: {
105
+ shape: 'mobile',
106
+ },
107
+ },
108
+ },
109
+ deployments: {
110
+ env: {},
111
+ zone: {},
112
+ node: {},
113
+ },
114
+ relationships: {},
115
+ tags: {
116
+ internal: {
117
+ color: 'primary',
118
+ },
119
+ external: {
120
+ color: 'primary',
121
+ },
122
+ },
123
+ metadataKeys: [
124
+ 'key1',
125
+ ],
126
+ customColors: {},
127
+ },
128
+ elements: {
129
+ customer: {
130
+ id: 'customer',
131
+ kind: 'person',
132
+ title: 'customer',
133
+ description: null,
134
+ technology: null,
135
+ tags: [],
136
+ color: 'primary',
137
+ shape: 'person',
138
+ style: {},
139
+ links: null,
140
+ },
141
+ cloud: {
142
+ id: 'cloud',
143
+ kind: 'system',
144
+ title: 'cloud',
145
+ description: null,
146
+ technology: null,
147
+ tags: [],
148
+ color: 'primary',
149
+ shape: 'rectangle',
150
+ style: {},
151
+ links: null,
152
+ },
153
+ 'cloud.frontend': {
154
+ id: 'cloud.frontend',
155
+ kind: 'component',
156
+ title: 'frontend',
157
+ description: null,
158
+ technology: null,
159
+ tags: [],
160
+ color: 'primary',
161
+ shape: 'rectangle',
162
+ style: {},
163
+ links: null,
164
+ },
165
+ 'cloud.frontend.dashboard': {
166
+ id: 'cloud.frontend.dashboard',
167
+ kind: 'webapp',
168
+ title: 'dashboard',
169
+ description: null,
170
+ technology: null,
171
+ tags: [],
172
+ color: 'primary',
173
+ shape: 'browser',
174
+ style: {},
175
+ links: null,
176
+ },
177
+ 'cloud.frontend.mobile': {
178
+ id: 'cloud.frontend.mobile',
179
+ kind: 'mobile',
180
+ title: 'mobile',
181
+ description: null,
182
+ technology: null,
183
+ tags: [],
184
+ color: 'primary',
185
+ shape: 'mobile',
186
+ style: {},
187
+ links: null,
188
+ },
189
+ 'cloud.auth': {
190
+ id: 'cloud.auth',
191
+ kind: 'component',
192
+ title: 'auth',
193
+ description: null,
194
+ technology: null,
195
+ tags: [],
196
+ color: 'primary',
197
+ shape: 'rectangle',
198
+ style: {},
199
+ links: null,
200
+ },
201
+ 'cloud.backend': {
202
+ id: 'cloud.backend',
203
+ kind: 'component',
204
+ title: 'backend',
205
+ description: null,
206
+ technology: null,
207
+ tags: [
208
+ 'external',
209
+ ],
210
+ color: 'primary',
211
+ shape: 'rectangle',
212
+ style: {},
213
+ links: null,
214
+ metadata: {
215
+ key1: 'value1',
216
+ },
217
+ },
218
+ 'cloud.backend.api': {
219
+ id: 'cloud.backend.api',
220
+ kind: 'component',
221
+ title: 'api',
222
+ description: null,
223
+ technology: null,
224
+ tags: [],
225
+ color: 'primary',
226
+ shape: 'rectangle',
227
+ style: {},
228
+ links: null,
229
+ },
230
+ 'cloud.backend.graphql': {
231
+ id: 'cloud.backend.graphql',
232
+ kind: 'component',
233
+ title: 'graphql',
234
+ description: null,
235
+ technology: null,
236
+ tags: [],
237
+ color: 'primary',
238
+ shape: 'rectangle',
239
+ style: {},
240
+ links: null,
241
+ },
242
+ 'cloud.media': {
243
+ id: 'cloud.media',
244
+ kind: 'component',
245
+ title: 'media',
246
+ description: null,
247
+ technology: null,
248
+ tags: [
249
+ 'internal',
250
+ ],
251
+ color: 'primary',
252
+ shape: 'storage',
253
+ style: {},
254
+ links: null,
255
+ },
256
+ aws: {
257
+ id: 'aws',
258
+ kind: 'system',
259
+ title: 'aws',
260
+ description: null,
261
+ technology: null,
262
+ tags: [],
263
+ color: 'primary',
264
+ shape: 'rectangle',
265
+ style: {},
266
+ links: null,
267
+ },
268
+ 'aws.rds': {
269
+ id: 'aws.rds',
270
+ kind: 'component',
271
+ title: 'rds',
272
+ description: null,
273
+ technology: null,
274
+ tags: [],
275
+ color: 'primary',
276
+ shape: 'storage',
277
+ style: {},
278
+ links: null,
279
+ },
280
+ 'aws.s3': {
281
+ id: 'aws.s3',
282
+ kind: 'component',
283
+ title: 's3',
284
+ description: null,
285
+ technology: null,
286
+ tags: [],
287
+ color: 'primary',
288
+ shape: 'storage',
289
+ style: {},
290
+ links: null,
291
+ metadata: {
292
+ key1: 'value2',
293
+ },
294
+ },
295
+ email: {
296
+ id: 'email',
297
+ kind: 'system',
298
+ title: 'email',
299
+ description: null,
300
+ technology: null,
301
+ tags: [],
302
+ color: 'primary',
303
+ shape: 'rectangle',
304
+ style: {},
305
+ links: null,
306
+ },
307
+ },
308
+ relations: {
309
+ rel1: {
310
+ id: 'rel1',
311
+ source: {
312
+ model: 'customer',
313
+ },
314
+ target: {
315
+ model: 'cloud',
316
+ },
317
+ title: 'uses services',
318
+ },
319
+ rel2: {
320
+ id: 'rel2',
321
+ source: {
322
+ model: 'customer',
323
+ },
324
+ target: {
325
+ model: 'cloud.frontend.mobile',
326
+ },
327
+ title: 'opens mobile app',
328
+ },
329
+ rel3: {
330
+ id: 'rel3',
331
+ source: {
332
+ model: 'customer',
333
+ },
334
+ target: {
335
+ model: 'cloud.frontend.dashboard',
336
+ },
337
+ title: 'opens in browser',
338
+ },
339
+ rel4: {
340
+ id: 'rel4',
341
+ source: {
342
+ model: 'cloud.frontend.dashboard',
343
+ },
344
+ target: {
345
+ model: 'cloud.auth',
346
+ },
347
+ title: 'authenticates',
348
+ },
349
+ rel5: {
350
+ id: 'rel5',
351
+ source: {
352
+ model: 'cloud.frontend.dashboard',
353
+ },
354
+ target: {
355
+ model: 'cloud.backend.api',
356
+ },
357
+ title: 'fetches data',
358
+ },
359
+ rel6: {
360
+ id: 'rel6',
361
+ source: {
362
+ model: 'cloud.frontend.dashboard',
363
+ },
364
+ target: {
365
+ model: 'cloud.media',
366
+ },
367
+ title: 'fetches media',
368
+ },
369
+ rel7: {
370
+ id: 'rel7',
371
+ source: {
372
+ model: 'cloud.frontend.mobile',
373
+ },
374
+ target: {
375
+ model: 'cloud.auth',
376
+ },
377
+ title: 'authenticates',
378
+ },
379
+ rel8: {
380
+ id: 'rel8',
381
+ source: {
382
+ model: 'cloud.frontend.mobile',
383
+ },
384
+ target: {
385
+ model: 'cloud.backend.api',
386
+ },
387
+ title: 'fetches data',
388
+ },
389
+ rel9: {
390
+ id: 'rel9',
391
+ source: {
392
+ model: 'cloud.frontend.mobile',
393
+ },
394
+ target: {
395
+ model: 'cloud.media',
396
+ },
397
+ title: 'fetches media',
398
+ },
399
+ rel10: {
400
+ id: 'rel10',
401
+ source: {
402
+ model: 'cloud.backend.api',
403
+ },
404
+ target: {
405
+ model: 'cloud.auth',
406
+ },
407
+ title: 'authorizes',
408
+ },
409
+ rel11: {
410
+ id: 'rel11',
411
+ source: {
412
+ model: 'cloud.backend.api',
413
+ },
414
+ target: {
415
+ model: 'cloud.media',
416
+ },
417
+ title: 'uploads media',
418
+ },
419
+ rel12: {
420
+ id: 'rel12',
421
+ source: {
422
+ model: 'cloud.backend.api',
423
+ },
424
+ target: {
425
+ model: 'aws.rds',
426
+ },
427
+ title: 'reads/writes',
428
+ },
429
+ rel13: {
430
+ id: 'rel13',
431
+ source: {
432
+ model: 'cloud.backend.api',
433
+ },
434
+ target: {
435
+ model: 'email',
436
+ },
437
+ title: 'sends emails',
438
+ },
439
+ rel14: {
440
+ id: 'rel14',
441
+ source: {
442
+ model: 'cloud.media',
443
+ },
444
+ target: {
445
+ model: 'aws.s3',
446
+ },
447
+ title: 'uploads',
448
+ },
449
+ rel15: {
450
+ id: 'rel15',
451
+ source: {
452
+ model: 'email',
453
+ },
454
+ target: {
455
+ model: 'customer',
456
+ },
457
+ title: 'sends emails',
458
+ tags: [
459
+ 'external',
460
+ ],
461
+ metadata: {
462
+ key1: 'value3',
463
+ },
464
+ },
465
+ },
466
+ globals: {
467
+ predicates: {},
468
+ dynamicPredicates: {},
469
+ styles: {},
470
+ },
471
+ deployments: {
472
+ elements: {
473
+ customer: {
474
+ id: 'customer',
475
+ kind: 'node',
476
+ title: 'customer',
477
+ description: null,
478
+ technology: null,
479
+ tags: null,
480
+ style: {
481
+ color: 'primary',
482
+ shape: 'rectangle',
483
+ },
484
+ },
485
+ 'customer.instance': {
486
+ id: 'customer.instance',
487
+ element: 'customer',
488
+ },
489
+ prod: {
490
+ id: 'prod',
491
+ kind: 'env',
492
+ title: 'prod',
493
+ description: null,
494
+ technology: null,
495
+ tags: null,
496
+ style: {
497
+ color: 'primary',
498
+ shape: 'rectangle',
499
+ },
500
+ },
501
+ 'prod.eu': {
502
+ id: 'prod.eu',
503
+ kind: 'zone',
504
+ title: 'eu',
505
+ description: null,
506
+ technology: null,
507
+ tags: null,
508
+ style: {
509
+ color: 'primary',
510
+ shape: 'rectangle',
511
+ },
512
+ },
513
+ 'prod.eu.zone1': {
514
+ id: 'prod.eu.zone1',
515
+ kind: 'zone',
516
+ title: 'zone1',
517
+ description: null,
518
+ technology: null,
519
+ tags: null,
520
+ style: {
521
+ color: 'primary',
522
+ shape: 'rectangle',
523
+ },
524
+ },
525
+ 'prod.eu.zone1.ui': {
526
+ id: 'prod.eu.zone1.ui',
527
+ element: 'cloud.frontend.dashboard',
528
+ },
529
+ 'prod.eu.zone1.api': {
530
+ id: 'prod.eu.zone1.api',
531
+ element: 'cloud.backend.api',
532
+ },
533
+ 'prod.eu.zone2': {
534
+ id: 'prod.eu.zone2',
535
+ kind: 'zone',
536
+ title: 'zone2',
537
+ description: null,
538
+ technology: null,
539
+ tags: null,
540
+ style: {
541
+ color: 'primary',
542
+ shape: 'rectangle',
543
+ },
544
+ },
545
+ 'prod.eu.zone2.ui': {
546
+ id: 'prod.eu.zone2.ui',
547
+ element: 'cloud.frontend.dashboard',
548
+ },
549
+ 'prod.eu.zone2.api': {
550
+ id: 'prod.eu.zone2.api',
551
+ element: 'cloud.backend.api',
552
+ },
553
+ 'prod.eu.media': {
554
+ id: 'prod.eu.media',
555
+ element: 'cloud.media',
556
+ },
557
+ 'prod.eu.db': {
558
+ id: 'prod.eu.db',
559
+ element: 'aws.rds',
560
+ },
561
+ 'prod.us': {
562
+ id: 'prod.us',
563
+ kind: 'zone',
564
+ title: 'us',
565
+ description: null,
566
+ technology: null,
567
+ tags: null,
568
+ style: {
569
+ color: 'primary',
570
+ shape: 'rectangle',
571
+ },
572
+ },
573
+ 'prod.us.db': {
574
+ id: 'prod.us.db',
575
+ element: 'aws.rds',
576
+ },
577
+ },
578
+ relations: {
579
+ deploy_rel1: {
580
+ id: 'deploy_rel1',
581
+ source: {
582
+ deployment: 'prod.eu.db',
583
+ },
584
+ target: {
585
+ deployment: 'prod.us.db',
586
+ },
587
+ title: 'replicates',
588
+ },
589
+ },
590
+ },
591
+ views: {
592
+ index: {
593
+ id: 'index',
594
+ title: null,
595
+ description: null,
596
+ tags: [],
597
+ links: null,
598
+ _stage: 'parsed',
599
+ _type: 'element',
600
+ rules: [
601
+ {
602
+ include: [
603
+ {
604
+ wildcard: true,
605
+ },
606
+ ],
607
+ },
608
+ ],
609
+ },
610
+ cloud: {
611
+ id: 'cloud',
612
+ title: null,
613
+ description: null,
614
+ tags: [],
615
+ links: null,
616
+ _stage: 'parsed',
617
+ viewOf: 'cloud',
618
+ _type: 'element',
619
+ rules: [
620
+ {
621
+ include: [
622
+ {
623
+ wildcard: true,
624
+ },
625
+ ],
626
+ },
627
+ {
628
+ include: [
629
+ {
630
+ ref: {
631
+ model: 'cloud.frontend.dashboard',
632
+ },
633
+ },
634
+ ],
635
+ },
636
+ ],
637
+ },
638
+ prod: {
639
+ id: 'prod',
640
+ title: 'prod',
641
+ description: null,
642
+ tags: [],
643
+ links: null,
644
+ _stage: 'parsed',
645
+ _type: 'deployment',
646
+ rules: [
647
+ {
648
+ include: [
649
+ {
650
+ ref: {
651
+ deployment: 'customer.instance',
652
+ },
653
+ },
654
+ ],
655
+ },
656
+ {
657
+ include: [
658
+ {
659
+ ref: {
660
+ deployment: 'prod.eu.zone1.ui',
661
+ },
662
+ },
663
+ ],
664
+ },
665
+ ],
666
+ },
667
+ },
668
+ imports: {},
669
+ } as unknown))
670
+
671
+ /* prettier-ignore-end */
@@ -0,0 +1,65 @@
1
+ import { Builder } from '@likec4/core/builder'
2
+ import { describe, it } from 'vitest'
3
+ import { generateAux } from './generate-aux'
4
+
5
+ describe('generateAux', () => {
6
+ const m = Builder
7
+ .specification({
8
+ elements: {
9
+ actor: {},
10
+ system: {},
11
+ component: {},
12
+ },
13
+ deployments: {
14
+ env: {},
15
+ vm: {},
16
+ },
17
+ relationships: {
18
+ like: {},
19
+ dislike: {},
20
+ },
21
+ tags: {
22
+ tag1: {},
23
+ tag2: {},
24
+ },
25
+ metadataKeys: ['key1', 'key2'],
26
+ })
27
+ .model(({ actor, system, component, relTo }, _) =>
28
+ _(
29
+ actor('alice'),
30
+ actor('bob'),
31
+ system('cloud').with(
32
+ component('backend').with(
33
+ component('api'),
34
+ component('db'),
35
+ ),
36
+ component('frontend'),
37
+ ),
38
+ )
39
+ )
40
+ .deployment(({ env, vm, instanceOf }, _) =>
41
+ _(
42
+ env('prod').with(
43
+ vm('vm1'),
44
+ vm('vm2'),
45
+ ),
46
+ env('dev').with(
47
+ vm('vm1'),
48
+ instanceOf('cloud.backend.api'),
49
+ ),
50
+ )
51
+ )
52
+ // Test Element View
53
+ .views(({ view, $include }, _) =>
54
+ _(
55
+ // rules inside
56
+ view('view1', $include('cloud.backend')),
57
+ view('view2', $include('cloud.backend')),
58
+ )
59
+ )
60
+
61
+ it('generate valid code', async ({ expect }) => {
62
+ const aux = generateAux(m.toLikeC4Model())
63
+ await expect(aux).toMatchFileSnapshot('__snapshots__/aux.generate-valid-code.snap')
64
+ })
65
+ })