@likec4/generators 1.5.0 → 1.29.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.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/dist/d2/generate-d2.d.ts +1 -2
  3. package/dist/d2/generate-d2.js +70 -63
  4. package/dist/d2/index.d.ts +0 -1
  5. package/dist/d2/index.js +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js +6 -5
  8. package/dist/mmd/generate-mmd.d.ts +1 -2
  9. package/dist/mmd/generate-mmd.js +82 -63
  10. package/dist/mmd/index.d.ts +0 -1
  11. package/dist/mmd/index.js +1 -1
  12. package/dist/model/generate-likec4-model.d.ts +2 -0
  13. package/dist/model/generate-likec4-model.js +29 -0
  14. package/dist/model/generate-likec4.d.ts +2 -0
  15. package/dist/model/generate-likec4.js +2 -0
  16. package/dist/react/generate-react-types.d.ts +2 -0
  17. package/dist/react/generate-react-types.js +122 -0
  18. package/dist/react/index.d.ts +1 -2
  19. package/dist/react/index.js +1 -1
  20. package/dist/react-next/generate-react-next.d.ts +9 -7
  21. package/dist/react-next/generate-react-next.js +26 -26
  22. package/dist/react-next/index.d.ts +0 -1
  23. package/dist/react-next/index.js +1 -1
  24. package/dist/views-data-ts/generate-views-data.d.ts +3 -4
  25. package/dist/views-data-ts/generate-views-data.js +64 -54
  26. package/dist/views-data-ts/generateViewId.d.ts +1 -2
  27. package/dist/views-data-ts/generateViewId.js +5 -4
  28. package/dist/views-data-ts/index.d.ts +0 -1
  29. package/dist/views-data-ts/index.js +1 -1
  30. package/package.json +25 -27
  31. package/src/__mocks__/data.ts +463 -0
  32. package/src/d2/__snapshots__/generate-d2.spec.ts.snap +91 -0
  33. package/src/d2/generate-d2.spec.ts +15 -0
  34. package/src/d2/generate-d2.ts +106 -0
  35. package/src/d2/index.ts +1 -0
  36. package/src/index.ts +6 -0
  37. package/src/mmd/__snapshots__/generate-mmd.spec.ts.snap +55 -0
  38. package/src/mmd/generate-mmd.spec.ts +15 -0
  39. package/src/mmd/generate-mmd.ts +110 -0
  40. package/src/mmd/index.ts +1 -0
  41. package/src/model/__snapshots__/likec4-model.snap +990 -0
  42. package/src/model/generate-likec4-model.spec.ts +158 -0
  43. package/src/model/generate-likec4-model.ts +33 -0
  44. package/src/model/generate-likec4.ts +5 -0
  45. package/src/react/generate-react-types.ts +127 -0
  46. package/src/react/index.ts +1 -0
  47. package/src/react-next/generate-react-next.ts +111 -0
  48. package/src/react-next/index.ts +1 -0
  49. package/src/views-data-ts/__snapshots__/generate-views-data.spec.ts.snap +83 -0
  50. package/src/views-data-ts/generate-views-data.spec.ts +15 -0
  51. package/src/views-data-ts/generate-views-data.ts +147 -0
  52. package/src/views-data-ts/generateViewId.ts +9 -0
  53. package/src/views-data-ts/index.ts +1 -0
  54. package/dist/__mocks__/data.d.ts +0 -5
  55. package/dist/__mocks__/data.d.ts.map +0 -1
  56. package/dist/__mocks__/data.js +0 -456
  57. package/dist/d2/generate-d2.d.ts.map +0 -1
  58. package/dist/d2/generate-d2.spec.d.ts +0 -2
  59. package/dist/d2/generate-d2.spec.d.ts.map +0 -1
  60. package/dist/d2/generate-d2.spec.js +0 -12
  61. package/dist/d2/index.d.ts.map +0 -1
  62. package/dist/index.d.ts.map +0 -1
  63. package/dist/mmd/generate-mmd.d.ts.map +0 -1
  64. package/dist/mmd/generate-mmd.spec.d.ts +0 -2
  65. package/dist/mmd/generate-mmd.spec.d.ts.map +0 -1
  66. package/dist/mmd/generate-mmd.spec.js +0 -12
  67. package/dist/mmd/index.d.ts.map +0 -1
  68. package/dist/react/generate-react.d.ts +0 -3
  69. package/dist/react/generate-react.d.ts.map +0 -1
  70. package/dist/react/generate-react.js +0 -97
  71. package/dist/react/generate-react.spec.d.ts +0 -2
  72. package/dist/react/generate-react.spec.d.ts.map +0 -1
  73. package/dist/react/generate-react.spec.js +0 -6
  74. package/dist/react/index.d.ts.map +0 -1
  75. package/dist/react-next/generate-react-next.d.ts.map +0 -1
  76. package/dist/react-next/generate-react-next.spec.d.ts +0 -2
  77. package/dist/react-next/generate-react-next.spec.d.ts.map +0 -1
  78. package/dist/react-next/generate-react-next.spec.js +0 -9
  79. package/dist/react-next/index.d.ts.map +0 -1
  80. package/dist/views-data-ts/generate-views-data.d.ts.map +0 -1
  81. package/dist/views-data-ts/generate-views-data.spec.d.ts +0 -2
  82. package/dist/views-data-ts/generate-views-data.spec.d.ts.map +0 -1
  83. package/dist/views-data-ts/generate-views-data.spec.js +0 -12
  84. package/dist/views-data-ts/generateViewId.d.ts.map +0 -1
  85. package/dist/views-data-ts/index.d.ts.map +0 -1
@@ -0,0 +1,55 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`generate mermaid - fakeComputedView 3 Levels 1`] = `
4
+ "---
5
+ title: "Context: Cloud"
6
+ ---
7
+ graph TB
8
+ Amazon[amazon]
9
+ subgraph Cloud["cloud"]
10
+ subgraph Cloud.Backend["backend"]
11
+ Cloud.Backend.Graphql[graphql]
12
+ Cloud.Backend.Storage[storage]
13
+ end
14
+ Cloud.FrontendAdminPanel[adminPanel]
15
+ Cloud.FrontendDashboard[dashboard]
16
+ end
17
+ Customer[customer]
18
+ Support[support]
19
+ Cloud.FrontendDashboard -.-> Cloud.Backend.Graphql
20
+ Cloud.FrontendAdminPanel -.-> Cloud.Backend.Graphql
21
+ Cloud.Backend.Storage -.-> Amazon
22
+ Cloud.Backend.Graphql -.-> Cloud.Backend.Storage
23
+ Support -.-> Cloud.FrontendAdminPanel
24
+ Customer -.-> Cloud.FrontendDashboard
25
+ "
26
+ `;
27
+
28
+ exports[`generate mermaid - fakeDiagram 1`] = `
29
+ "graph TB
30
+ Amazon[amazon]
31
+ subgraph Cloud["cloud"]
32
+ Cloud.Backend[backend]
33
+ Cloud.Frontend[frontend]
34
+ end
35
+ Customer[customer]
36
+ Support[support]
37
+ Cloud.Frontend -. "requests" .-> Cloud.Backend
38
+ Cloud.Backend -.-> Amazon
39
+ Support -.-> Cloud.Frontend
40
+ Customer -. "opens" .-> Cloud.Frontend
41
+ "
42
+ `;
43
+
44
+ exports[`generate mermaid - fakeDiagram2 1`] = `
45
+ "---
46
+ title: "frontend"
47
+ ---
48
+ graph TB
49
+ Client[client]
50
+ SystemBackend[backend]
51
+ SystemFrontend[frontend]
52
+ SystemFrontend -. "requests" .-> SystemBackend
53
+ Client -. "opens" .-> SystemFrontend
54
+ "
55
+ `;
@@ -0,0 +1,15 @@
1
+ import { expect, test } from 'vitest'
2
+ import { fakeComputedView3Levels, fakeDiagram, fakeDiagram2 } from '../__mocks__/data'
3
+ import { generateMermaid } from './generate-mmd'
4
+
5
+ test('generate mermaid - fakeDiagram', () => {
6
+ expect(generateMermaid(fakeDiagram)).toMatchSnapshot()
7
+ })
8
+
9
+ test('generate mermaid - fakeDiagram2', () => {
10
+ expect(generateMermaid(fakeDiagram2)).toMatchSnapshot()
11
+ })
12
+
13
+ test('generate mermaid - fakeComputedView 3 Levels', () => {
14
+ expect(generateMermaid(fakeComputedView3Levels)).toMatchSnapshot()
15
+ })
@@ -0,0 +1,110 @@
1
+ import type { ComputedEdge, ComputedNode, ComputedView, NodeId } from '@likec4/core'
2
+ import { CompositeGeneratorNode, expandToNode, joinToNode, NL, NLEmpty, toString } from 'langium/generate'
3
+ import { isNullish as isNil } from 'remeda'
4
+
5
+ const capitalizeFirstLetter = (value: string) => value.charAt(0).toLocaleUpperCase() + value.slice(1)
6
+
7
+ const fqnName = (nodeId: string): string => nodeId.split('.').map(capitalizeFirstLetter).join('')
8
+
9
+ const nodeName = (node: ComputedNode): string => {
10
+ return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id)
11
+ }
12
+
13
+ const mmdshape = ({ shape }: ComputedNode): [start: string, end: string] => {
14
+ switch (shape) {
15
+ case 'queue':
16
+ case 'cylinder':
17
+ return ['[(', ')]']
18
+ case 'person': {
19
+ return ['[fa:fa-user ', ']']
20
+ }
21
+ case 'storage':
22
+ return ['([', '])']
23
+ case 'mobile':
24
+ case 'browser':
25
+ case 'rectangle': {
26
+ return ['[', ']']
27
+ }
28
+ }
29
+ }
30
+
31
+ export function generateMermaid<V extends ComputedView>(view: V) {
32
+ const { nodes, edges } = view
33
+ const names = new Map<NodeId, string>()
34
+
35
+ const printNode = (node: ComputedNode, parentName?: string): CompositeGeneratorNode => {
36
+ const name = nodeName(node)
37
+ const fqnName = (parentName ? parentName + '.' : '') + name
38
+ names.set(node.id, fqnName)
39
+
40
+ const label = node.title.replaceAll('\n', '\\n')
41
+ const shape = mmdshape(node)
42
+
43
+ const baseNode = new CompositeGeneratorNode()
44
+ if (node.children.length > 0) {
45
+ baseNode
46
+ .append('subgraph ', fqnName, '[', JSON.stringify(node.title), ']', NL)
47
+ .indent({
48
+ indentedChildren: [
49
+ joinToNode(
50
+ nodes.filter(n => n.parent === node.id),
51
+ n => printNode(n, fqnName),
52
+ {
53
+ appendNewLineIfNotEmpty: true
54
+ }
55
+ )
56
+ ],
57
+ indentation: 2
58
+ })
59
+ .append('end', NL)
60
+ } else {
61
+ baseNode.append(fqnName, shape[0], label, shape[1])
62
+ }
63
+ return baseNode
64
+ }
65
+ // return `${names.get(edge.source)} -> ${names.get(edge.target)}${edge.label ? ': ' + edge.label : ''}`
66
+ const printEdge = (edge: ComputedEdge): CompositeGeneratorNode => {
67
+ return new CompositeGeneratorNode().append(
68
+ names.get(edge.source),
69
+ ' -.',
70
+ edge.label ? ' "' + edge.label.replaceAll('\n', '\\n') + '" .-' : '-',
71
+ '> ',
72
+ names.get(edge.target)
73
+ )
74
+ }
75
+
76
+ return toString(
77
+ new CompositeGeneratorNode()
78
+ .appendIf(
79
+ view.title !== null && view.title.length > 0,
80
+ '---',
81
+ NL,
82
+ `title: ${JSON.stringify(view.title)}`,
83
+ NL,
84
+ '---',
85
+ NL
86
+ )
87
+ .append('graph ', view.autoLayout.direction, NL)
88
+ .indent({
89
+ indentedChildren: indent => {
90
+ indent
91
+ .append(
92
+ joinToNode(
93
+ nodes.filter(n => isNil(n.parent)),
94
+ n => printNode(n),
95
+ {
96
+ appendNewLineIfNotEmpty: true
97
+ }
98
+ )
99
+ )
100
+ .appendIf(
101
+ edges.length > 0,
102
+ joinToNode(edges, e => printEdge(e), {
103
+ appendNewLineIfNotEmpty: true
104
+ })
105
+ )
106
+ },
107
+ indentation: 2
108
+ })
109
+ )
110
+ }
@@ -0,0 +1 @@
1
+ export * from './generate-mmd'