@oselvar/c4
Version:
Test helpers for Cloudflare Workers
136 lines (134 loc) • 3.33 kB
JavaScript
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