@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.
- package/dist/d2/generate-d2.d.ts +3 -2
- package/dist/d2/generate-d2.js +2 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/mmd/generate-mmd.d.ts +3 -2
- package/dist/mmd/generate-mmd.js +2 -1
- package/dist/model/generate-aux.d.ts +2 -0
- package/dist/model/generate-aux.js +66 -0
- package/dist/model/generate-likec4-model.d.ts +2 -2
- package/dist/model/generate-likec4-model.js +8 -10
- package/dist/puml/generate-puml.d.ts +2 -0
- package/dist/puml/generate-puml.js +176 -0
- package/dist/puml/index.d.ts +1 -0
- package/dist/puml/index.js +1 -0
- package/dist/react/generate-react-types.d.ts +2 -2
- package/dist/react/generate-react-types.js +14 -73
- package/dist/views-data-ts/generate-views-data.d.ts +9 -0
- package/package.json +7 -7
- package/src/__mocks__/data.ts +83 -83
- package/src/d2/__snapshots__/generate-d2.spec.ts.snap +78 -0
- package/src/d2/generate-d2.spec.ts +91 -4
- package/src/d2/generate-d2.ts +20 -15
- package/src/index.ts +1 -0
- package/src/mmd/generate-mmd.spec.ts +12 -4
- package/src/mmd/generate-mmd.ts +25 -20
- package/src/model/__snapshots__/aux.generate-valid-code.snap +56 -0
- package/src/model/__snapshots__/{likec4-model.snap → likec4.computed-model.snap} +342 -165
- package/src/model/__snapshots__/likec4.parsed-model.snap +671 -0
- package/src/model/generate-aux.spec.ts +65 -0
- package/src/model/generate-aux.ts +72 -0
- package/src/model/generate-likec4-model.spec.ts +34 -8
- package/src/model/generate-likec4-model.ts +13 -14
- package/src/puml/__snapshots__/generate-puml.spec.ts.snap +184 -0
- package/src/puml/generate-puml.spec.ts +26 -0
- package/src/puml/generate-puml.ts +264 -0
- package/src/puml/index.ts +1 -0
- package/src/react/__snapshots__/valid-code.snap +111 -0
- package/src/react/generate-react-types.spec.ts +67 -0
- package/src/react/generate-react-types.ts +16 -77
- package/src/views-data-ts/generate-views-data.ts +18 -9
package/src/d2/generate-d2.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { LikeC4ViewModel } from '@likec4/core/model'
|
|
2
|
+
import type { aux, ComputedNode, NodeId, ProcessedView as AnyView } from '@likec4/core/types'
|
|
2
3
|
import { CompositeGeneratorNode, joinToNode, NL, toString } from 'langium/generate'
|
|
3
4
|
import { isNullish as isNil } from 'remeda'
|
|
4
5
|
|
|
@@ -10,7 +11,10 @@ const nodeName = (node: ComputedNode): string => {
|
|
|
10
11
|
return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id)
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
type Node = AnyView['nodes'][number]
|
|
15
|
+
type Edge = AnyView['edges'][number]
|
|
16
|
+
|
|
17
|
+
const d2direction = ({ autoLayout }: AnyView) => {
|
|
14
18
|
switch (autoLayout.direction) {
|
|
15
19
|
case 'TB': {
|
|
16
20
|
return 'down'
|
|
@@ -27,7 +31,7 @@ const d2direction = ({ autoLayout }: ComputedView) => {
|
|
|
27
31
|
}
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
const d2shape = ({ shape }:
|
|
34
|
+
const d2shape = ({ shape }: Node) => {
|
|
31
35
|
switch (shape) {
|
|
32
36
|
case 'queue':
|
|
33
37
|
case 'cylinder':
|
|
@@ -45,11 +49,12 @@ const d2shape = ({ shape }: ComputedNode) => {
|
|
|
45
49
|
}
|
|
46
50
|
}
|
|
47
51
|
|
|
48
|
-
export function generateD2
|
|
52
|
+
export function generateD2(viewmodel: LikeC4ViewModel<aux.Unknown>) {
|
|
53
|
+
const view = viewmodel.$view
|
|
49
54
|
const { nodes, edges } = view
|
|
50
55
|
const names = new Map<NodeId, string>()
|
|
51
56
|
|
|
52
|
-
const printNode = (node:
|
|
57
|
+
const printNode = (node: Node, parentName?: string): CompositeGeneratorNode => {
|
|
53
58
|
const name = nodeName(node)
|
|
54
59
|
const fqnName = (parentName ? parentName + '.' : '') + name
|
|
55
60
|
names.set(node.id, fqnName)
|
|
@@ -69,15 +74,15 @@ export function generateD2<V extends ComputedView>(view: V) {
|
|
|
69
74
|
NL,
|
|
70
75
|
joinToNode(
|
|
71
76
|
nodes.filter(n => n.parent === node.id),
|
|
72
|
-
n => printNode(n, fqnName)
|
|
73
|
-
)
|
|
77
|
+
n => printNode(n, fqnName),
|
|
78
|
+
),
|
|
74
79
|
),
|
|
75
|
-
indentation: 2
|
|
80
|
+
indentation: 2,
|
|
76
81
|
})
|
|
77
82
|
.append('}', NL)
|
|
78
83
|
}
|
|
79
84
|
// return `${names.get(edge.source)} -> ${names.get(edge.target)}${edge.label ? ': ' + edge.label : ''}`
|
|
80
|
-
const printEdge = (edge:
|
|
85
|
+
const printEdge = (edge: Edge): CompositeGeneratorNode => {
|
|
81
86
|
return new CompositeGeneratorNode()
|
|
82
87
|
.append(names.get(edge.source), ' -> ', names.get(edge.target))
|
|
83
88
|
.append(out => edge.label && out.append(': ', JSON.stringify(edge.label)))
|
|
@@ -91,16 +96,16 @@ export function generateD2<V extends ComputedView>(view: V) {
|
|
|
91
96
|
nodes.filter(n => isNil(n.parent)),
|
|
92
97
|
n => printNode(n),
|
|
93
98
|
{
|
|
94
|
-
appendNewLineIfNotEmpty: true
|
|
95
|
-
}
|
|
96
|
-
)
|
|
99
|
+
appendNewLineIfNotEmpty: true,
|
|
100
|
+
},
|
|
101
|
+
),
|
|
97
102
|
)
|
|
98
103
|
.appendIf(
|
|
99
104
|
edges.length > 0,
|
|
100
105
|
NL,
|
|
101
106
|
joinToNode(edges, e => printEdge(e), {
|
|
102
|
-
appendNewLineIfNotEmpty: true
|
|
103
|
-
})
|
|
104
|
-
)
|
|
107
|
+
appendNewLineIfNotEmpty: true,
|
|
108
|
+
}),
|
|
109
|
+
),
|
|
105
110
|
)
|
|
106
111
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { generateD2 } from './d2/generate-d2'
|
|
2
2
|
export { generateMermaid } from './mmd/generate-mmd'
|
|
3
3
|
export { generateLikeC4Model } from './model/generate-likec4-model'
|
|
4
|
+
export { generatePuml } from './puml/generate-puml'
|
|
4
5
|
export { generateReactNext } from './react-next/generate-react-next'
|
|
5
6
|
export { generateReactTypes } from './react/generate-react-types'
|
|
6
7
|
export { generateViewsDataDTs, generateViewsDataJs, generateViewsDataTs } from './views-data-ts/generate-views-data'
|
|
@@ -1,15 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { LikeC4ViewModel } from '@likec4/core/model'
|
|
2
|
+
import type { aux, ProcessedView } from '@likec4/core/types'
|
|
3
|
+
import { expect, test, vi } from 'vitest'
|
|
2
4
|
import { fakeComputedView3Levels, fakeDiagram, fakeDiagram2 } from '../__mocks__/data'
|
|
3
5
|
import { generateMermaid } from './generate-mmd'
|
|
4
6
|
|
|
7
|
+
const mockViewModel = vi.fn(function($view: ProcessedView) {
|
|
8
|
+
return {
|
|
9
|
+
$view,
|
|
10
|
+
} as unknown as LikeC4ViewModel<aux.Unknown>
|
|
11
|
+
})
|
|
12
|
+
|
|
5
13
|
test('generate mermaid - fakeDiagram', () => {
|
|
6
|
-
expect(generateMermaid(fakeDiagram)).toMatchSnapshot()
|
|
14
|
+
expect(generateMermaid(mockViewModel(fakeDiagram))).toMatchSnapshot()
|
|
7
15
|
})
|
|
8
16
|
|
|
9
17
|
test('generate mermaid - fakeDiagram2', () => {
|
|
10
|
-
expect(generateMermaid(fakeDiagram2)).toMatchSnapshot()
|
|
18
|
+
expect(generateMermaid(mockViewModel(fakeDiagram2))).toMatchSnapshot()
|
|
11
19
|
})
|
|
12
20
|
|
|
13
21
|
test('generate mermaid - fakeComputedView 3 Levels', () => {
|
|
14
|
-
expect(generateMermaid(fakeComputedView3Levels)).toMatchSnapshot()
|
|
22
|
+
expect(generateMermaid(mockViewModel(fakeComputedView3Levels))).toMatchSnapshot()
|
|
15
23
|
})
|
package/src/mmd/generate-mmd.ts
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import {
|
|
1
|
+
import type { LikeC4ViewModel } from '@likec4/core/model'
|
|
2
|
+
import type { aux, NodeId, ProcessedView as AnyView } from '@likec4/core/types'
|
|
3
|
+
import { CompositeGeneratorNode, joinToNode, NL, toString } from 'langium/generate'
|
|
3
4
|
import { isNullish as isNil } from 'remeda'
|
|
4
5
|
|
|
5
6
|
const capitalizeFirstLetter = (value: string) => value.charAt(0).toLocaleUpperCase() + value.slice(1)
|
|
6
7
|
|
|
7
8
|
const fqnName = (nodeId: string): string => nodeId.split('.').map(capitalizeFirstLetter).join('')
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
type Node = AnyView['nodes'][number]
|
|
11
|
+
type Edge = AnyView['edges'][number]
|
|
12
|
+
|
|
13
|
+
const nodeName = (node: Node): string => {
|
|
10
14
|
return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id)
|
|
11
15
|
}
|
|
12
16
|
|
|
13
|
-
const mmdshape = ({ shape }:
|
|
17
|
+
const mmdshape = ({ shape }: Node): [start: string, end: string] => {
|
|
14
18
|
switch (shape) {
|
|
15
19
|
case 'queue':
|
|
16
20
|
case 'cylinder':
|
|
@@ -28,11 +32,12 @@ const mmdshape = ({ shape }: ComputedNode): [start: string, end: string] => {
|
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
34
|
|
|
31
|
-
export function generateMermaid
|
|
35
|
+
export function generateMermaid(viewmodel: LikeC4ViewModel<aux.Unknown>) {
|
|
36
|
+
const view = viewmodel.$view
|
|
32
37
|
const { nodes, edges } = view
|
|
33
38
|
const names = new Map<NodeId, string>()
|
|
34
39
|
|
|
35
|
-
const printNode = (node:
|
|
40
|
+
const printNode = (node: Node, parentName?: string): CompositeGeneratorNode => {
|
|
36
41
|
const name = nodeName(node)
|
|
37
42
|
const fqnName = (parentName ? parentName + '.' : '') + name
|
|
38
43
|
names.set(node.id, fqnName)
|
|
@@ -50,11 +55,11 @@ export function generateMermaid<V extends ComputedView>(view: V) {
|
|
|
50
55
|
nodes.filter(n => n.parent === node.id),
|
|
51
56
|
n => printNode(n, fqnName),
|
|
52
57
|
{
|
|
53
|
-
appendNewLineIfNotEmpty: true
|
|
54
|
-
}
|
|
55
|
-
)
|
|
58
|
+
appendNewLineIfNotEmpty: true,
|
|
59
|
+
},
|
|
60
|
+
),
|
|
56
61
|
],
|
|
57
|
-
indentation: 2
|
|
62
|
+
indentation: 2,
|
|
58
63
|
})
|
|
59
64
|
.append('end', NL)
|
|
60
65
|
} else {
|
|
@@ -63,13 +68,13 @@ export function generateMermaid<V extends ComputedView>(view: V) {
|
|
|
63
68
|
return baseNode
|
|
64
69
|
}
|
|
65
70
|
// return `${names.get(edge.source)} -> ${names.get(edge.target)}${edge.label ? ': ' + edge.label : ''}`
|
|
66
|
-
const printEdge = (edge:
|
|
71
|
+
const printEdge = (edge: Edge): CompositeGeneratorNode => {
|
|
67
72
|
return new CompositeGeneratorNode().append(
|
|
68
73
|
names.get(edge.source),
|
|
69
74
|
' -.',
|
|
70
75
|
edge.label ? ' "' + edge.label.replaceAll('\n', '\\n') + '" .-' : '-',
|
|
71
76
|
'> ',
|
|
72
|
-
names.get(edge.target)
|
|
77
|
+
names.get(edge.target),
|
|
73
78
|
)
|
|
74
79
|
}
|
|
75
80
|
|
|
@@ -82,7 +87,7 @@ export function generateMermaid<V extends ComputedView>(view: V) {
|
|
|
82
87
|
`title: ${JSON.stringify(view.title)}`,
|
|
83
88
|
NL,
|
|
84
89
|
'---',
|
|
85
|
-
NL
|
|
90
|
+
NL,
|
|
86
91
|
)
|
|
87
92
|
.append('graph ', view.autoLayout.direction, NL)
|
|
88
93
|
.indent({
|
|
@@ -93,18 +98,18 @@ export function generateMermaid<V extends ComputedView>(view: V) {
|
|
|
93
98
|
nodes.filter(n => isNil(n.parent)),
|
|
94
99
|
n => printNode(n),
|
|
95
100
|
{
|
|
96
|
-
appendNewLineIfNotEmpty: true
|
|
97
|
-
}
|
|
98
|
-
)
|
|
101
|
+
appendNewLineIfNotEmpty: true,
|
|
102
|
+
},
|
|
103
|
+
),
|
|
99
104
|
)
|
|
100
105
|
.appendIf(
|
|
101
106
|
edges.length > 0,
|
|
102
107
|
joinToNode(edges, e => printEdge(e), {
|
|
103
|
-
appendNewLineIfNotEmpty: true
|
|
104
|
-
})
|
|
108
|
+
appendNewLineIfNotEmpty: true,
|
|
109
|
+
}),
|
|
105
110
|
)
|
|
106
111
|
},
|
|
107
|
-
indentation: 2
|
|
108
|
-
})
|
|
112
|
+
indentation: 2,
|
|
113
|
+
}),
|
|
109
114
|
)
|
|
110
115
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Aux, SpecAux } from '@likec4/core/types';
|
|
2
|
+
|
|
3
|
+
export type $Specs = SpecAux<
|
|
4
|
+
// Element kinds
|
|
5
|
+
| "actor"
|
|
6
|
+
| "component"
|
|
7
|
+
| "system",
|
|
8
|
+
// Deployment kinds
|
|
9
|
+
| "env"
|
|
10
|
+
| "vm",
|
|
11
|
+
// Relationship kinds
|
|
12
|
+
| "dislike"
|
|
13
|
+
| "like",
|
|
14
|
+
// Tags
|
|
15
|
+
| "tag1"
|
|
16
|
+
| "tag2",
|
|
17
|
+
// Metadata keys
|
|
18
|
+
| "key1"
|
|
19
|
+
| "key2"
|
|
20
|
+
>
|
|
21
|
+
|
|
22
|
+
export type $Aux = Aux<
|
|
23
|
+
"computed",
|
|
24
|
+
// Elements
|
|
25
|
+
| "alice"
|
|
26
|
+
| "bob"
|
|
27
|
+
| "cloud"
|
|
28
|
+
| "cloud.backend"
|
|
29
|
+
| "cloud.frontend"
|
|
30
|
+
| "cloud.backend.api"
|
|
31
|
+
| "cloud.backend.db",
|
|
32
|
+
// Deployments
|
|
33
|
+
| "dev"
|
|
34
|
+
| "prod"
|
|
35
|
+
| "dev.api"
|
|
36
|
+
| "dev.vm1"
|
|
37
|
+
| "prod.vm1"
|
|
38
|
+
| "prod.vm2",
|
|
39
|
+
// Views
|
|
40
|
+
| "view1"
|
|
41
|
+
| "view2",
|
|
42
|
+
// Project ID
|
|
43
|
+
"from-builder",
|
|
44
|
+
$Specs
|
|
45
|
+
>
|
|
46
|
+
|
|
47
|
+
export type $ElementId = $Aux['ElementId']
|
|
48
|
+
export type $DeploymentId = $Aux['DeploymentId']
|
|
49
|
+
export type $ViewId = $Aux['ViewId']
|
|
50
|
+
|
|
51
|
+
export type $ElementKind = $Aux['ElementKind']
|
|
52
|
+
export type $RelationKind = $Aux['RelationKind']
|
|
53
|
+
export type $DeploymentKind = $Aux['DeploymentKind']
|
|
54
|
+
export type $Tag = $Aux['Tag']
|
|
55
|
+
export type $Tags = readonly $Aux['Tag'][]
|
|
56
|
+
export type $MetadataKey = $Aux['MetadataKey']
|