@likec4/generators 0.26.0 → 0.27.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.
@@ -0,0 +1,3 @@
1
+ import type { ComputedView } from '@likec4/core/types';
2
+ export declare function generateD2<V extends ComputedView>(view: V): string;
3
+ //# sourceMappingURL=generate-d2.d.ts.map
@@ -0,0 +1,75 @@
1
+ import { CompositeGeneratorNode, NL, joinToNode, toString } from 'langium/lib/generator';
2
+ import { isNil } from 'rambdax';
3
+ const capitalizeFirstLetter = (value) => value.charAt(0).toLocaleUpperCase() + value.slice(1);
4
+ const fqnName = (nodeId) => nodeId.split('.').map(capitalizeFirstLetter).join('');
5
+ const nodeName = (node) => {
6
+ return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id);
7
+ };
8
+ const d2direction = ({ autoLayout }) => {
9
+ switch (autoLayout) {
10
+ case "TB": {
11
+ return "down";
12
+ }
13
+ case "BT": {
14
+ return "up";
15
+ }
16
+ case "LR": {
17
+ return "right";
18
+ }
19
+ case "RL": {
20
+ return "left";
21
+ }
22
+ }
23
+ };
24
+ const d2shape = ({ shape }) => {
25
+ switch (shape) {
26
+ case 'queue':
27
+ case 'cylinder':
28
+ case 'rectangle':
29
+ case 'person': {
30
+ return shape;
31
+ }
32
+ case 'storage': {
33
+ return 'stored_data';
34
+ }
35
+ case 'mobile':
36
+ case 'browser': {
37
+ return 'rectangle';
38
+ }
39
+ }
40
+ };
41
+ export function generateD2(view) {
42
+ const { nodes, edges } = view;
43
+ const names = new Map();
44
+ const printNode = (node, parentName) => {
45
+ const name = nodeName(node);
46
+ const fqnName = (parentName ? parentName + '.' : '') + name;
47
+ names.set(node.id, fqnName);
48
+ const label = node.title.replaceAll('\n', '\\n');
49
+ const shape = d2shape(node);
50
+ return new CompositeGeneratorNode()
51
+ .append(name, ': {', NL)
52
+ .indent({
53
+ indentedChildren: indent => indent
54
+ .append('label: "', label, '"', NL)
55
+ .appendIf(shape !== 'rectangle', 'shape: ', shape, NL)
56
+ .appendIf(node.children.length > 0, NL, joinToNode(nodes.filter(n => n.parent === node.id), n => printNode(n, fqnName))),
57
+ indentation: 2
58
+ })
59
+ .append('}', NL);
60
+ };
61
+ // return `${names.get(edge.source)} -> ${names.get(edge.target)}${edge.label ? ': ' + edge.label : ''}`
62
+ const printEdge = (edge) => {
63
+ return new CompositeGeneratorNode()
64
+ .append(names.get(edge.source), ' -> ', names.get(edge.target))
65
+ .append(out => edge.label && out.append(': ', edge.label.replaceAll('\n', '\\n')));
66
+ };
67
+ return toString(new CompositeGeneratorNode()
68
+ .append('direction: ', d2direction(view), NL, NL)
69
+ .append(joinToNode(nodes.filter(n => isNil(n.parent)), n => printNode(n), {
70
+ appendNewLineIfNotEmpty: true
71
+ }))
72
+ .appendIf(edges.length > 0, NL, joinToNode(edges, e => printEdge(e), {
73
+ appendNewLineIfNotEmpty: true
74
+ })));
75
+ }
@@ -0,0 +1,2 @@
1
+ export * from './generate-d2';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ export * from './generate-d2';
@@ -0,0 +1,4 @@
1
+ export { generateReact } from './react/generate-react';
2
+ export { generateD2 } from './d2/generate-d2';
3
+ export { generateViewsDataTs } from './views-data-ts/generate-views-data';
4
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { generateReact } from './react/generate-react';
2
+ export { generateD2 } from './d2/generate-d2';
3
+ export { generateViewsDataTs } from './views-data-ts/generate-views-data';
@@ -0,0 +1,3 @@
1
+ import type { DiagramView } from '@likec4/core/types';
2
+ export declare function generateReact(views: DiagramView[]): string;
3
+ //# sourceMappingURL=generate-react.d.ts.map
@@ -0,0 +1,78 @@
1
+ import JSON5 from 'json5';
2
+ import { CompositeGeneratorNode, NL, expandToNode, joinToNode, toString } from 'langium/lib/generator';
3
+ const componentName = (value) => {
4
+ if (!value.charAt(0).match(/[a-zA-Z]/)) {
5
+ value = 'View' + value;
6
+ }
7
+ value = value.replaceAll('_', '');
8
+ return value.charAt(0).toLocaleUpperCase() + value.slice(1);
9
+ };
10
+ export function generateReact(views) {
11
+ const components = views.map(({ id }) => {
12
+ return {
13
+ id,
14
+ name: componentName(id)
15
+ };
16
+ });
17
+ const out = new CompositeGeneratorNode();
18
+ out.appendTemplate `
19
+ /******************************************************************************
20
+ * This file was generated
21
+ * DO NOT EDIT MANUALLY!
22
+ ******************************************************************************/
23
+ /* eslint-disable */
24
+
25
+ import type { DiagramView, EmbeddedDiagramProps } from '@likec4/diagrams'
26
+ import { EmbeddedDiagram } from '@likec4/diagrams'
27
+ `.append(NL, NL);
28
+ if (components.length == 0) {
29
+ out.append('export {}', NL);
30
+ return toString(out);
31
+ }
32
+ out
33
+ .append('export const LikeC4ViewsData = {', NL)
34
+ .indent({
35
+ indentation: 2,
36
+ indentedChildren: indent => {
37
+ indent.append(joinToNode(views, view => expandToNode `'${view.id}': (${JSON5.stringify(view)} as unknown) as DiagramView`, {
38
+ separator: ',',
39
+ appendNewLineIfNotEmpty: true
40
+ }));
41
+ }
42
+ })
43
+ .append('} as const', NL, NL).appendTemplate `
44
+ export type LikeC4ViewsData = typeof LikeC4ViewsData
45
+ export type LikeC4ViewId = keyof LikeC4ViewsData
46
+ export function isLikeC4ViewId(value: unknown): value is LikeC4ViewId {
47
+ return typeof value === 'string' && value in LikeC4ViewsData
48
+ }
49
+
50
+ export type LikeC4ViewProps = Omit<EmbeddedDiagramProps<LikeC4ViewsData, LikeC4ViewId>, 'views'>;
51
+ export function LikeC4View(props: LikeC4ViewProps) {
52
+ return <EmbeddedDiagram views={LikeC4ViewsData} {...props}/>
53
+ }
54
+
55
+ type LikeC4ViewsProps = Omit<EmbeddedDiagramProps<LikeC4ViewsData, LikeC4ViewId>, 'views' | 'viewId'>
56
+ export const LikeC4Views = {
57
+ `
58
+ .append(NL)
59
+ .indent({
60
+ indentation: 2,
61
+ indentedChildren: components.map(({ id, name }) => expandToNode `
62
+ ['${name}']: (props: LikeC4ViewsProps) => <LikeC4View viewId={'${id}'} {...props}/>,
63
+ `.append(NL))
64
+ // indentedChildren: [joinToNode(
65
+ // components,
66
+ // ({ id, name }) =>
67
+ // expandToNode`
68
+ // ['${name}']: (props: NamedViewProps) => <EmbeddedDiagram views={LikeC4ViewsData} viewId={'${id}'} {...props}/>
69
+ // `,
70
+ // {
71
+ // separator: ',',
72
+ // appendNewLineIfNotEmpty: true
73
+ // }
74
+ // )],
75
+ })
76
+ .append('} as const', NL, NL);
77
+ return toString(out);
78
+ }
@@ -0,0 +1,2 @@
1
+ export * from './generate-react';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ export * from './generate-react';
@@ -0,0 +1,3 @@
1
+ import type { DiagramView } from '@likec4/core/types';
2
+ export declare function generateViewsDataTs(views: DiagramView[]): string;
3
+ //# sourceMappingURL=generate-views-data.d.ts.map
@@ -0,0 +1,33 @@
1
+ import JSON5 from 'json5';
2
+ import { CompositeGeneratorNode, NL, expandToNode, joinToNode, toString } from 'langium/lib/generator';
3
+ export function generateViewsDataTs(views) {
4
+ const out = new CompositeGeneratorNode();
5
+ out.appendTemplate `
6
+ /******************************************************************************
7
+ * This file was generated
8
+ * DO NOT EDIT MANUALLY!
9
+ ******************************************************************************/
10
+ /* eslint-disable */
11
+
12
+ import type { DiagramView } from '@likec4/diagrams'
13
+ `.append(NL, NL);
14
+ out
15
+ .append('export const LikeC4ViewsData = {', NL)
16
+ .indent({
17
+ indentation: 2,
18
+ indentedChildren: indent => {
19
+ indent.append(joinToNode(views, view => expandToNode `'${view.id}': (${JSON5.stringify(view)} as unknown) as DiagramView`, {
20
+ separator: ',',
21
+ appendNewLineIfNotEmpty: true
22
+ }));
23
+ }
24
+ })
25
+ .append('} as const', NL, NL).appendTemplate `
26
+ export type LikeC4ViewsData = typeof LikeC4ViewsData
27
+ export type LikeC4ViewId = keyof LikeC4ViewsData
28
+ export function isLikeC4ViewId(value: unknown): value is LikeC4ViewId {
29
+ return typeof value === 'string' && value in LikeC4ViewsData
30
+ }
31
+ `.append(NL);
32
+ return toString(out);
33
+ }
@@ -0,0 +1,2 @@
1
+ export * from './generate-views-data';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ export * from './generate-views-data';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@likec4/generators",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "license": "MIT",
5
5
  "bugs": "https://github.com/likec4/likec4/issues",
6
6
  "homepage": "https://likec4.dev",
@@ -38,7 +38,7 @@
38
38
  "test:watch": "run -T vitest"
39
39
  },
40
40
  "dependencies": {
41
- "@likec4/core": "0.26.0",
41
+ "@likec4/core": "0.27.0",
42
42
  "json5": "^2.2.3",
43
43
  "langium": "^1.2.1",
44
44
  "rambdax": "^9.1.1"