@likec4/generators
Advanced tools
Comparing version 0.37.1 to 0.40.0
@@ -1,3 +0,2 @@ | ||
import type { ComputedView } from '@likec4/core/types'; | ||
export declare function generateD2<V extends ComputedView>(view: V): string; | ||
//# sourceMappingURL=generate-d2.d.ts.map | ||
import type { ComputedView } from '@likec4/core'; | ||
export declare function generateD2<V extends ComputedView>(view: V): any; |
@@ -1,75 +0,82 @@ | ||
import { CompositeGeneratorNode, NL, joinToNode, toString } from 'langium'; | ||
import { isNil } from 'rambdax'; | ||
import { CompositeGeneratorNode, NL, joinToNode, toString } from "langium"; | ||
import { isNil } from "rambdax"; | ||
const capitalizeFirstLetter = (value) => value.charAt(0).toLocaleUpperCase() + value.slice(1); | ||
const fqnName = (nodeId) => nodeId.split('.').map(capitalizeFirstLetter).join(''); | ||
const fqnName = (nodeId) => nodeId.split(".").map(capitalizeFirstLetter).join(""); | ||
const nodeName = (node) => { | ||
return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id); | ||
return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id); | ||
}; | ||
const d2direction = ({ autoLayout }) => { | ||
switch (autoLayout) { | ||
case 'TB': { | ||
return 'down'; | ||
} | ||
case 'BT': { | ||
return 'up'; | ||
} | ||
case 'LR': { | ||
return 'right'; | ||
} | ||
case 'RL': { | ||
return 'left'; | ||
} | ||
switch (autoLayout) { | ||
case "TB": { | ||
return "down"; | ||
} | ||
case "BT": { | ||
return "up"; | ||
} | ||
case "LR": { | ||
return "right"; | ||
} | ||
case "RL": { | ||
return "left"; | ||
} | ||
} | ||
}; | ||
const d2shape = ({ shape }) => { | ||
switch (shape) { | ||
case 'queue': | ||
case 'cylinder': | ||
case 'rectangle': | ||
case 'person': { | ||
return shape; | ||
} | ||
case 'storage': { | ||
return 'stored_data'; | ||
} | ||
case 'mobile': | ||
case 'browser': { | ||
return 'rectangle'; | ||
} | ||
switch (shape) { | ||
case "queue": | ||
case "cylinder": | ||
case "rectangle": | ||
case "person": { | ||
return shape; | ||
} | ||
case "storage": { | ||
return "stored_data"; | ||
} | ||
case "mobile": | ||
case "browser": { | ||
return "rectangle"; | ||
} | ||
} | ||
}; | ||
export function generateD2(view) { | ||
const { nodes, edges } = view; | ||
const names = new Map(); | ||
const printNode = (node, parentName) => { | ||
const name = nodeName(node); | ||
const fqnName = (parentName ? parentName + '.' : '') + name; | ||
names.set(node.id, fqnName); | ||
const label = node.title.replaceAll('\n', '\\n'); | ||
const shape = d2shape(node); | ||
return new CompositeGeneratorNode() | ||
.append(name, ': {', NL) | ||
.indent({ | ||
indentedChildren: indent => indent | ||
.append('label: "', label, '"', NL) | ||
.appendIf(shape !== 'rectangle', 'shape: ', shape, NL) | ||
.appendIf(node.children.length > 0, NL, joinToNode(nodes.filter(n => n.parent === node.id), n => printNode(n, fqnName))), | ||
indentation: 2 | ||
}) | ||
.append('}', NL); | ||
}; | ||
// return `${names.get(edge.source)} -> ${names.get(edge.target)}${edge.label ? ': ' + edge.label : ''}` | ||
const printEdge = (edge) => { | ||
return new CompositeGeneratorNode() | ||
.append(names.get(edge.source), ' -> ', names.get(edge.target)) | ||
.append(out => edge.label && out.append(': ', edge.label.replaceAll('\n', '\\n'))); | ||
}; | ||
return toString(new CompositeGeneratorNode() | ||
.append('direction: ', d2direction(view), NL, NL) | ||
.append(joinToNode(nodes.filter(n => isNil(n.parent)), n => printNode(n), { | ||
const { nodes, edges } = view; | ||
const names = /* @__PURE__ */ new Map(); | ||
const printNode = (node, parentName) => { | ||
const name = nodeName(node); | ||
const fqnName2 = (parentName ? parentName + "." : "") + name; | ||
names.set(node.id, fqnName2); | ||
const label = node.title.replaceAll("\n", "\\n"); | ||
const shape = d2shape(node); | ||
return new CompositeGeneratorNode().append(name, ": {", NL).indent({ | ||
indentedChildren: (indent) => indent.append('label: "', label, '"', NL).appendIf(shape !== "rectangle", "shape: ", shape, NL).appendIf( | ||
node.children.length > 0, | ||
NL, | ||
joinToNode( | ||
nodes.filter((n) => n.parent === node.id), | ||
(n) => printNode(n, fqnName2) | ||
) | ||
), | ||
indentation: 2 | ||
}).append("}", NL); | ||
}; | ||
const printEdge = (edge) => { | ||
return new CompositeGeneratorNode().append(names.get(edge.source), " -> ", names.get(edge.target)).append((out) => edge.label && out.append(": ", edge.label.replaceAll("\n", "\\n"))); | ||
}; | ||
return toString( | ||
new CompositeGeneratorNode().append("direction: ", d2direction(view), NL, NL).append( | ||
joinToNode( | ||
nodes.filter((n) => isNil(n.parent)), | ||
(n) => printNode(n), | ||
{ | ||
appendNewLineIfNotEmpty: true | ||
} | ||
) | ||
).appendIf( | ||
edges.length > 0, | ||
NL, | ||
joinToNode(edges, (e) => printEdge(e), { | ||
appendNewLineIfNotEmpty: true | ||
})) | ||
.appendIf(edges.length > 0, NL, joinToNode(edges, e => printEdge(e), { | ||
appendNewLineIfNotEmpty: true | ||
}))); | ||
}) | ||
) | ||
); | ||
} |
export * from './generate-d2'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
export * from './generate-d2'; | ||
export * from "./generate-d2.js"; |
export { generateReact } from './react/generate-react'; | ||
export { generateD2 } from './d2/generate-d2'; | ||
export { generateMermaid } from './mmd/generate-mmd'; | ||
export { generateViewsDataTs } from './views-data-ts/generate-views-data'; | ||
//# sourceMappingURL=index.d.ts.map | ||
export { generateViewsDataTs, generateViewsDataJs } from './views-data-ts/generate-views-data'; |
@@ -1,4 +0,4 @@ | ||
export { generateReact } from './react/generate-react'; | ||
export { generateD2 } from './d2/generate-d2'; | ||
export { generateMermaid } from './mmd/generate-mmd'; | ||
export { generateViewsDataTs } from './views-data-ts/generate-views-data'; | ||
export { generateReact } from "./react/generate-react.js"; | ||
export { generateD2 } from "./d2/generate-d2.js"; | ||
export { generateMermaid } from "./mmd/generate-mmd.js"; | ||
export { generateViewsDataTs, generateViewsDataJs } from "./views-data-ts/generate-views-data.js"; |
@@ -1,3 +0,2 @@ | ||
import type { ComputedView } from '@likec4/core/types'; | ||
export declare function generateMermaid<V extends ComputedView>(view: V): string; | ||
//# sourceMappingURL=generate-mmd.d.ts.map | ||
import type { ComputedView } from '@likec4/core'; | ||
export declare function generateMermaid<V extends ComputedView>(view: V): any; |
@@ -1,62 +0,86 @@ | ||
import { CompositeGeneratorNode, NL, joinToNode, toString } from 'langium'; | ||
import { isNil } from 'rambdax'; | ||
import { CompositeGeneratorNode, NL, joinToNode, toString } from "langium"; | ||
import { isNil } from "rambdax"; | ||
const capitalizeFirstLetter = (value) => value.charAt(0).toLocaleUpperCase() + value.slice(1); | ||
const fqnName = (nodeId) => nodeId.split('.').map(capitalizeFirstLetter).join(''); | ||
const fqnName = (nodeId) => nodeId.split(".").map(capitalizeFirstLetter).join(""); | ||
const nodeName = (node) => { | ||
return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id); | ||
return fqnName(node.parent ? node.id.slice(node.parent.length + 1) : node.id); | ||
}; | ||
const mmdshape = ({ shape }) => { | ||
switch (shape) { | ||
case 'queue': | ||
case 'cylinder': | ||
return ['[(', ')]']; | ||
case 'person': { | ||
return ['[fa:fa-user ', ']']; | ||
} | ||
case 'storage': | ||
return ['([', '])']; | ||
case 'mobile': | ||
case 'browser': | ||
case 'rectangle': { | ||
return ['[', ']']; | ||
} | ||
switch (shape) { | ||
case "queue": | ||
case "cylinder": | ||
return ["[(", ")]"]; | ||
case "person": { | ||
return ["[fa:fa-user ", "]"]; | ||
} | ||
case "storage": | ||
return ["([", "])"]; | ||
case "mobile": | ||
case "browser": | ||
case "rectangle": { | ||
return ["[", "]"]; | ||
} | ||
} | ||
}; | ||
export function generateMermaid(view) { | ||
const { nodes, edges } = view; | ||
const names = new Map(); | ||
const printNode = (node, parentName) => { | ||
const name = nodeName(node); | ||
const fqnName = (parentName ? parentName + '.' : '') + name; | ||
names.set(node.id, fqnName); | ||
const label = node.title.replaceAll('\n', '\\n'); | ||
const shape = mmdshape(node); | ||
const baseNode = new CompositeGeneratorNode(); | ||
if (node.children.length > 0) { | ||
baseNode | ||
.append('subgraph ', fqnName, '["', label, '"]', NL) | ||
.indent({ | ||
indentedChildren: indent => indent.appendIf(node.children.length > 0, NL, joinToNode(nodes.filter(n => n.parent === node.id), n => printNode(n, fqnName))), | ||
indentation: 2 | ||
}) | ||
.append('end', NL); | ||
const { nodes, edges } = view; | ||
const names = /* @__PURE__ */ new Map(); | ||
const printNode = (node, parentName) => { | ||
const name = nodeName(node); | ||
const fqnName2 = (parentName ? parentName + "." : "") + name; | ||
names.set(node.id, fqnName2); | ||
const label = node.title.replaceAll("\n", "\\n"); | ||
const shape = mmdshape(node); | ||
const baseNode = new CompositeGeneratorNode(); | ||
if (node.children.length > 0) { | ||
baseNode.append("subgraph ", fqnName2, '["', label, '"]', NL).indent({ | ||
indentedChildren: (indent) => indent.appendIf( | ||
node.children.length > 0, | ||
NL, | ||
joinToNode( | ||
nodes.filter((n) => n.parent === node.id), | ||
(n) => printNode(n, fqnName2) | ||
) | ||
), | ||
indentation: 2 | ||
}).append("end", NL); | ||
} else { | ||
baseNode.append(fqnName2, shape[0], label, shape[1], NL); | ||
} | ||
return baseNode; | ||
}; | ||
const printEdge = (edge) => { | ||
return new CompositeGeneratorNode().append( | ||
names.get(edge.source), | ||
" --", | ||
edge.label ? '"' + edge.label.replaceAll("\n", "\\n") + '"--' : "", | ||
"> ", | ||
names.get(edge.target) | ||
); | ||
}; | ||
return toString( | ||
new CompositeGeneratorNode().appendIf( | ||
view.title !== null && view.title.length > 0, | ||
"---", | ||
NL, | ||
`title: ${view.title}`, | ||
NL, | ||
"---", | ||
NL | ||
).append("graph ", view.autoLayout, NL, NL).append( | ||
joinToNode( | ||
nodes.filter((n) => isNil(n.parent)), | ||
(n) => printNode(n), | ||
{ | ||
appendNewLineIfNotEmpty: true | ||
} | ||
else { | ||
baseNode.append(fqnName, shape[0], label, shape[1], NL); | ||
} | ||
return baseNode; | ||
}; | ||
// return `${names.get(edge.source)} -> ${names.get(edge.target)}${edge.label ? ': ' + edge.label : ''}` | ||
const printEdge = (edge) => { | ||
return new CompositeGeneratorNode().append(names.get(edge.source), ' --', edge.label ? '"' + edge.label.replaceAll('\n', '\\n') + '"--' : '', '> ', names.get(edge.target)); | ||
}; | ||
return toString(new CompositeGeneratorNode() | ||
.appendIf(view.title !== null && view.title.length > 0, '---', NL, `title: ${view.title}`, NL, '---', NL) | ||
.append('graph ', view.autoLayout, NL, NL) | ||
.append(joinToNode(nodes.filter(n => isNil(n.parent)), n => printNode(n), { | ||
) | ||
).appendIf( | ||
edges.length > 0, | ||
NL, | ||
joinToNode(edges, (e) => printEdge(e), { | ||
appendNewLineIfNotEmpty: true | ||
})) | ||
.appendIf(edges.length > 0, NL, joinToNode(edges, e => printEdge(e), { | ||
appendNewLineIfNotEmpty: true | ||
}))); | ||
}) | ||
) | ||
); | ||
} |
export * from './generate-mmd'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
export * from './generate-mmd'; | ||
export * from "./generate-mmd.js"; |
import type { DiagramView } from '@likec4/core'; | ||
import { CompositeGeneratorNode } from 'langium'; | ||
export declare const generateViewId: (views: DiagramView[]) => CompositeGeneratorNode | undefined; | ||
export declare function generateReact(views: DiagramView[]): string; | ||
//# sourceMappingURL=generate-react.d.ts.map | ||
export declare const generateViewId: (views: DiagramView[]) => any; | ||
export declare function generateReact(views: DiagramView[]): any; |
@@ -1,22 +0,22 @@ | ||
import JSON5 from 'json5'; | ||
import { CompositeGeneratorNode, NL, expandToNode, joinToNode, toString } from 'langium'; | ||
import JSON5 from "json5"; | ||
import { CompositeGeneratorNode, NL, expandToNode, joinToNode, toString } from "langium"; | ||
const componentName = (value) => { | ||
if (!value.charAt(0).match(/[a-zA-Z]/)) { | ||
value = 'View' + value; | ||
} | ||
value = value.replaceAll('_', ''); | ||
return value.charAt(0).toLocaleUpperCase() + value.slice(1); | ||
if (!value.charAt(0).match(/[a-zA-Z]/)) { | ||
value = "View" + value; | ||
} | ||
value = value.replaceAll("_", ""); | ||
return value.charAt(0).toLocaleUpperCase() + value.slice(1); | ||
}; | ||
export const generateViewId = (views) => joinToNode(views, view => expandToNode `'${view.id}'`, { | ||
separator: ' | ' | ||
export const generateViewId = (views) => joinToNode(views, (view) => expandToNode`'${view.id}'`, { | ||
separator: " | " | ||
}); | ||
export function generateReact(views) { | ||
const components = views.map(({ id }) => { | ||
return { | ||
id, | ||
name: componentName(id) | ||
}; | ||
}); | ||
const out = new CompositeGeneratorNode(); | ||
out.appendTemplate ` | ||
const components = views.map(({ id }) => { | ||
return { | ||
id, | ||
name: componentName(id) | ||
}; | ||
}); | ||
const out = new CompositeGeneratorNode(); | ||
out.appendTemplate` | ||
/****************************************************************************** | ||
@@ -31,21 +31,25 @@ * This file was generated | ||
`.append(NL, NL); | ||
if (components.length == 0) { | ||
out.append('export {}', NL); | ||
return toString(out); | ||
} | ||
out.appendTemplate ` | ||
if (components.length == 0) { | ||
out.append("export {}", NL); | ||
return toString(out); | ||
} | ||
out.appendTemplate` | ||
export type LikeC4ViewId = ${generateViewId(views)}; | ||
export const LikeC4Views = { | ||
` | ||
.indent({ | ||
indentation: 2, | ||
indentedChildren(indented) { | ||
indented.appendNewLineIf(views.length > 1).append(joinToNode(views, view => expandToNode `${JSON5.stringify(view.id)}: (${JSON5.stringify(view)} as unknown) as DiagramView`, { | ||
separator: ',', | ||
appendNewLineIfNotEmpty: true | ||
})); | ||
} | ||
}) | ||
.append('} as const satisfies Record<LikeC4ViewId, DiagramView>', NL, NL).appendTemplate ` | ||
`.indent({ | ||
indentation: 2, | ||
indentedChildren(indented) { | ||
indented.appendNewLineIf(views.length > 1).append( | ||
joinToNode( | ||
views, | ||
(view) => expandToNode`${JSON5.stringify(view.id)}: (${JSON5.stringify(view)} as unknown) as DiagramView`, | ||
{ | ||
separator: ",", | ||
appendNewLineIfNotEmpty: true | ||
} | ||
) | ||
); | ||
} | ||
}).append("} as const satisfies Record<LikeC4ViewId, DiagramView>", NL, NL).appendTemplate` | ||
export type LikeC4Views = typeof LikeC4Views | ||
@@ -87,3 +91,3 @@ | ||
`.append(NL, NL); | ||
return toString(out); | ||
return toString(out); | ||
} |
export * from './generate-react'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
export * from './generate-react'; | ||
export * from "./generate-react.js"; |
import type { DiagramView } from '@likec4/core'; | ||
export declare function generateViewsDataTs(views: DiagramView[]): string; | ||
//# sourceMappingURL=generate-views-data.d.ts.map | ||
export declare function generateViewsDataJs(views: DiagramView[]): any; | ||
export declare function generateViewsDataTs(views: DiagramView[]): any; |
@@ -1,7 +0,45 @@ | ||
import JSON5 from 'json5'; | ||
import { CompositeGeneratorNode, NL, expandToNode, joinToNode, toString } from 'langium'; | ||
import { generateViewId } from '../react/generate-react'; | ||
import JSON5 from "json5"; | ||
import { CompositeGeneratorNode, NL, expandToNode, joinToNode, toString } from "langium"; | ||
import { generateViewId } from "../react/generate-react.js"; | ||
export function generateViewsDataJs(views) { | ||
const out = new CompositeGeneratorNode(); | ||
out.appendTemplate` | ||
/****************************************************************************** | ||
* This file was generated | ||
* DO NOT EDIT MANUALLY! | ||
******************************************************************************/ | ||
/* eslint-disable */ | ||
`.append(NL, NL); | ||
if (views.length == 0) { | ||
out.append("export const LikeC4Views = {}", NL); | ||
return toString(out); | ||
} | ||
out.appendTemplate` | ||
export const LikeC4Views = { | ||
`.indent({ | ||
indentation: 2, | ||
indentedChildren(indented) { | ||
indented.appendNewLineIf(views.length > 1).append( | ||
joinToNode(views, (view) => expandToNode`${JSON5.stringify(view.id)}: ${JSON5.stringify(view)}`, { | ||
separator: ",", | ||
appendNewLineIfNotEmpty: true | ||
}) | ||
); | ||
} | ||
}).append("}", NL, NL).appendTemplate` | ||
export function isLikeC4ViewId(value) { | ||
return ( | ||
value != null && | ||
typeof value === 'string' && | ||
Object.prototype.hasOwnProperty.call(LikeC4Views, value) | ||
) | ||
} | ||
`.append(NL, NL); | ||
return toString(out); | ||
} | ||
export function generateViewsDataTs(views) { | ||
const out = new CompositeGeneratorNode(); | ||
out.appendTemplate ` | ||
const out = new CompositeGeneratorNode(); | ||
out.appendTemplate` | ||
/****************************************************************************** | ||
@@ -15,20 +53,24 @@ * This file was generated | ||
`.append(NL, NL); | ||
if (views.length == 0) { | ||
out.append('export {}', NL); | ||
return toString(out); | ||
} | ||
out.appendTemplate ` | ||
if (views.length == 0) { | ||
out.append("export {}", NL); | ||
return toString(out); | ||
} | ||
out.appendTemplate` | ||
export type LikeC4ViewId = ${generateViewId(views)}; | ||
export const LikeC4Views = { | ||
` | ||
.indent({ | ||
indentation: 2, | ||
indentedChildren(indented) { | ||
indented.appendNewLineIf(views.length > 1).append(joinToNode(views, view => expandToNode `${JSON5.stringify(view.id)}: (${JSON5.stringify(view)} as unknown) as DiagramView`, { | ||
separator: ',', | ||
appendNewLineIfNotEmpty: true | ||
})); | ||
} | ||
}) | ||
.append('} as const satisfies Record<LikeC4ViewId, DiagramView>', NL, NL).appendTemplate ` | ||
`.indent({ | ||
indentation: 2, | ||
indentedChildren(indented) { | ||
indented.appendNewLineIf(views.length > 1).append( | ||
joinToNode( | ||
views, | ||
(view) => expandToNode`${JSON5.stringify(view.id)}: (${JSON5.stringify(view)} as unknown) as DiagramView`, | ||
{ | ||
separator: ",", | ||
appendNewLineIfNotEmpty: true | ||
} | ||
) | ||
); | ||
} | ||
}).append("} as const satisfies Record<LikeC4ViewId, DiagramView>", NL, NL).appendTemplate` | ||
export type LikeC4Views = typeof LikeC4Views | ||
@@ -61,3 +103,3 @@ | ||
`.append(NL, NL); | ||
return toString(out); | ||
return toString(out); | ||
} |
export * from './generate-views-data'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
export * from './generate-views-data'; | ||
export * from "./generate-views-data.js"; |
{ | ||
"name": "@likec4/generators", | ||
"version": "0.37.1", | ||
"version": "0.40.0", | ||
"license": "MIT", | ||
@@ -19,17 +19,18 @@ "bugs": "https://github.com/likec4/likec4/issues", | ||
}, | ||
"main": "./dist/index.js", | ||
"module": "./dist/index.js", | ||
"types": "./dist/index.d.ts", | ||
"type": "module", | ||
"sideEffects": false, | ||
"exports": { | ||
".": { | ||
"types": "./dist/index.d.ts", | ||
"default": "./dist/index.js" | ||
} | ||
}, | ||
"publishConfig": { | ||
"registry": "https://registry.npmjs.org", | ||
"access": "public", | ||
"main": "./dist/index.js", | ||
"module": "./dist/index.js", | ||
"types": "./dist/index.d.ts" | ||
"access": "public" | ||
}, | ||
"scripts": { | ||
"compile": "tsc --noEmit", | ||
"build": "tsc", | ||
"typecheck": "tsc --emitDeclarationOnly", | ||
"build:watch": "tsc --watch", | ||
"build": "unbuild", | ||
"dev": "tsc --watch", | ||
@@ -42,3 +43,3 @@ "lint": "run -T eslint src/ --fix", | ||
"dependencies": { | ||
"@likec4/core": "0.37.1", | ||
"@likec4/core": "0.40.0", | ||
"json5": "^2.2.3", | ||
@@ -51,5 +52,6 @@ "langium": "^2.0.2", | ||
"typescript": "^5.2.2", | ||
"vitest": "^0.34.4" | ||
"unbuild": "^2.0.0", | ||
"vitest": "^0.34.6" | ||
}, | ||
"packageManager": "yarn@3.6.3" | ||
} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
13479
378
4
1
+ Added@likec4/core@0.40.0(transitive)
- Removed@likec4/core@0.37.1(transitive)
Updated@likec4/core@0.40.0