@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
@@ -1,4 +1,5 @@
1
- import type { ComputedEdge, ComputedNode, ComputedView, NodeId } from '@likec4/core'
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
- const d2direction = ({ autoLayout }: ComputedView) => {
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 }: ComputedNode) => {
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<V extends ComputedView>(view: V) {
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: ComputedNode, parentName?: string): CompositeGeneratorNode => {
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: ComputedEdge): CompositeGeneratorNode => {
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 { expect, test } from 'vitest'
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
  })
@@ -1,16 +1,20 @@
1
- import type { ComputedEdge, ComputedNode, ComputedView, NodeId } from '@likec4/core'
2
- import { CompositeGeneratorNode, expandToNode, joinToNode, NL, NLEmpty, toString } from 'langium/generate'
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
- const nodeName = (node: ComputedNode): string => {
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 }: ComputedNode): [start: string, end: string] => {
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<V extends ComputedView>(view: V) {
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: ComputedNode, parentName?: string): CompositeGeneratorNode => {
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: ComputedEdge): CompositeGeneratorNode => {
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']