UNPKG

@oselvar/c4

Version:

Test helpers for Cloudflare Workers

136 lines (134 loc) 3.33 kB
import { C4ModelBuilder, callKey, camelCase, getUniqueCalls, objectKey } from "../chunk-ZMBFSHSD.js"; // src/generators/toDsl.ts function toStructurizr(model) { const builder = new C4ModelBuilder(model, Promise.resolve()); let s = `workspace { model { `; const level = 2; s = modelAndCalls( level, s, builder, model, (object, indent) => { return object.tags.map((tag) => `${indent} tags "${tag}"`).join("\n"); } ); s += ` views { `; model.callchains.forEach((callchain) => { s += ` dynamic * { `; s += ` title "${callchain.name}" { `; let lastCallKey = ""; callchain.calls.forEach((call) => { if (lastCallKey === callKey(call)) { return; } const caller = builder.getObject(call.callerName); const callee = builder.getObject(call.calleeName); s += ` ${objectKey(caller)} -> ${objectKey(callee)} "${call.operationName}" `; lastCallKey = callKey(call); }); s += ` } `; s += ` } `; }); s += ` styles { element "Database" { shape cylinder } } `; s += ` } `; s += ` } } `; return s; } function toLikeC4(model) { const builder = new C4ModelBuilder(model, Promise.resolve()); let s = `model { `; const level = 1; s = modelAndCalls(level, s, builder, model, () => ""); s += `} views { `; Object.values(model.objects).filter( (object) => object.type === "softwareSystem" || object.type === "container" ).forEach((object) => { s += ` view ${object.name} of ${objectKey(object)} { `; s += ` include * `; s += ` } `; }); model.callchains.forEach((callchain) => { s += ` dynamic view ${camelCase(callchain.name)} { `; s += ` title "${callchain.name}" `; let lastCallKey = ""; callchain.calls.forEach((call) => { if (lastCallKey === callKey(call)) { return; } const caller = builder.getObject(call.callerName); const callee = builder.getObject(call.calleeName); s += ` ${objectKey(caller)} -> ${objectKey(callee)} "${call.operationName}" `; lastCallKey = callKey(call); }); s += ` } `; }); s += `} `; return s; } function modelAndCalls(level, s, builder, model, renderTags) { const indent = " ".repeat(level); s += recursiveWalk(builder.rootObjects(), builder, level, renderTags); s += "\n\n"; Object.values(model.objects).forEach((object) => { Object.values(getUniqueCalls(model.callchains)).filter((call) => call.callerName === object.name).forEach((call) => { s += `${indent}${objectKey(object)} -> ${objectKey(builder.getObject(call.calleeName))} "${call.operationName}" `; }); }); return s; } function recursiveWalk(objects, builder, level, renderTags) { const indent = " ".repeat(level); return objects.map((object) => { const line = `${indent}${objectKey(object)} = ${object.type} "${object.name}" {`; const tags = renderTags(object, indent); const children = recursiveWalk( builder.children(object), builder, level + 1, renderTags ); const close = `${indent}}`; return [line, tags, children, close].filter(Boolean).join("\n"); }).join("\n"); } export { toLikeC4, toStructurizr }; //# sourceMappingURL=index.js.map