@aws/pdk
Version:
All documentation is located at: https://aws.github.io/aws-pdk
120 lines • 16.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveCfnResourceImage = resolveCfnResourceImage;
exports.resolveResourceImage = resolveResourceImage;
exports.resolveCustomResourceImage = resolveCustomResourceImage;
/*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0 */
const aws_arch_1 = require("../../../aws-arch");
const theme_1 = require("../graphviz/theme");
const theme_2 = require("../graphviz/theme/theme");
/** Resolves CfnResource image from {@link AwsArchitecture} asset */
function resolveCfnResourceImage(node) {
let min = theme_1.GraphTheme.instance.rendering.resourceIconMin;
let max = theme_1.GraphTheme.instance.rendering.resourceIconMax;
// lower max to general when wrapped cfn resource is rendered as wrapper will show service icon
if (node.resource?.isWrapper) {
min = theme_2.GraphThemeRenderingIconTarget.SERVICE;
}
return _resolveResourceLikeImage(node, min, max, theme_1.GraphTheme.instance.awsTheme?.id);
}
/** Resolves Resource image from {@link AwsArchitecture} asset */
function resolveResourceImage(node) {
let min = theme_1.GraphTheme.instance.rendering.resourceIconMin;
let max = theme_1.GraphTheme.instance.rendering.resourceIconMax;
// elevate min to service when wrapped cfn resource is rendered
if (node.isWrapper) {
min = theme_2.GraphThemeRenderingIconTarget.SERVICE;
}
return _resolveResourceLikeImage(node, min, max, theme_1.GraphTheme.instance.awsTheme?.id);
}
/** Resolves CustomResource image from {@link AwsArchitecture} asset */
function resolveCustomResourceImage(_node) {
return aws_arch_1.AwsArchitecture.getResource("AWS::CloudFormation::CustomResource").icon("svg", theme_1.GraphTheme.instance.awsTheme?.id);
}
/** Resolves Resource image from {@link AwsArchitecture} asset */
function _resolveResourceLikeImage(node, min, max, theme) {
const cfnResourceType = node.cfnType;
try {
if (min <= theme_2.GraphThemeRenderingIconTarget.DATA &&
max >= theme_2.GraphThemeRenderingIconTarget.DATA) {
const dataImage = _resolveResourceLikeDataImage(node, theme);
if (dataImage) {
return dataImage;
}
}
else if (max <= theme_2.GraphThemeRenderingIconTarget.DATA) {
return;
}
const resource = aws_arch_1.AwsArchitecture.getResource(cfnResourceType);
if (min <= theme_2.GraphThemeRenderingIconTarget.RESOURCE &&
max >= theme_2.GraphThemeRenderingIconTarget.RESOURCE) {
try {
const icon = resource.getResourceIcon("svg", theme);
if (icon) {
return icon;
}
if (min <= theme_2.GraphThemeRenderingIconTarget.GENERAL &&
max >= theme_2.GraphThemeRenderingIconTarget.GENERAL) {
const generalIcon = resource.getGeneralIcon("svg", theme);
if (generalIcon) {
return generalIcon;
}
}
}
catch { }
}
if (min <= theme_2.GraphThemeRenderingIconTarget.SERVICE &&
max >= theme_2.GraphThemeRenderingIconTarget.SERVICE) {
try {
const icon = resource.getServiceIcon("svg", theme);
if (icon) {
return icon;
}
}
catch { }
}
if (min <= theme_2.GraphThemeRenderingIconTarget.CATEGORY &&
max >= theme_2.GraphThemeRenderingIconTarget.CATEGORY) {
try {
return resource.getCategoryIcon("svg", theme);
}
catch { }
}
return;
}
catch {
return;
}
}
/** Resolves CfnResource image from {@link AwsArchitecture} asset */
function _resolveResourceLikeDataImage(node, theme) {
const cfnResourceType = node.cfnType;
if (cfnResourceType === aws_arch_1.aws_arch.CfnSpec.ServiceResourceDictionary.EC2.Instance) {
const instanceType = node.getCfnProp("instanceType");
if (instanceType) {
try {
return aws_arch_1.AwsArchitecture.getInstanceTypeIcon(instanceType.toLowerCase().split(".")[0], "svg", theme);
}
catch { }
}
}
if (cfnResourceType ===
aws_arch_1.aws_arch.CfnSpec.ServiceResourceDictionary.RDS.DBInstance) {
let engine = node.getCfnProp("engine");
if (engine) {
engine = engine.toLowerCase().split("-")[0];
// Resolve postgresql variant
if (engine === "postgres") {
engine = "postgresql";
}
try {
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-engine
return aws_arch_1.AwsArchitecture.getRdsInstanceTypeIcon(engine, "svg", theme);
}
catch { }
}
}
return undefined;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtaW1hZ2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtaW1hZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsMERBZUM7QUFHRCxvREFlQztBQUdELGdFQU1DO0FBbEREO3NDQUNzQztBQUN0Qyw0Q0FBMEQ7QUFFMUQsNkNBQStDO0FBQy9DLG1EQUF3RTtBQUV4RSxvRUFBb0U7QUFDcEUsU0FBZ0IsdUJBQXVCLENBQ3JDLElBQTJCO0lBRTNCLElBQUksR0FBRyxHQUFHLGtCQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFDeEQsSUFBSSxHQUFHLEdBQUcsa0JBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUN4RCwrRkFBK0Y7SUFDL0YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzdCLEdBQUcsR0FBRyxxQ0FBNkIsQ0FBQyxPQUFPLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8seUJBQXlCLENBQzlCLElBQUksRUFDSixHQUFHLEVBQ0gsR0FBRyxFQUNILGtCQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ2pDLENBQUM7QUFDSixDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLFNBQWdCLG9CQUFvQixDQUNsQyxJQUF3QjtJQUV4QixJQUFJLEdBQUcsR0FBRyxrQkFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO0lBQ3hELElBQUksR0FBRyxHQUFHLGtCQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFDeEQsK0RBQStEO0lBQy9ELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLEdBQUcsR0FBRyxxQ0FBNkIsQ0FBQyxPQUFPLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8seUJBQXlCLENBQzlCLElBQUksRUFDSixHQUFHLEVBQ0gsR0FBRyxF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WyIvKiEgQ29weXJpZ2h0IFtBbWF6b24uY29tXShodHRwOi8vYW1hem9uLmNvbS8pLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cbmltcG9ydCB7IEF3c0FyY2hpdGVjdHVyZSwgYXdzX2FyY2ggfSBmcm9tIFwiQGF3cy9hd3MtYXJjaFwiO1xuaW1wb3J0IHsgR3JhcGggfSBmcm9tIFwiQGF3cy9jZGstZ3JhcGhcIjtcbmltcG9ydCB7IEdyYXBoVGhlbWUgfSBmcm9tIFwiLi4vZ3JhcGh2aXovdGhlbWVcIjtcbmltcG9ydCB7IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0IH0gZnJvbSBcIi4uL2dyYXBodml6L3RoZW1lL3RoZW1lXCI7XG5cbi8qKiBSZXNvbHZlcyBDZm5SZXNvdXJjZSBpbWFnZSBmcm9tIHtAbGluayBBd3NBcmNoaXRlY3R1cmV9IGFzc2V0ICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNmblJlc291cmNlSW1hZ2UoXG4gIG5vZGU6IEdyYXBoLkNmblJlc291cmNlTm9kZVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IG1pbiA9IEdyYXBoVGhlbWUuaW5zdGFuY2UucmVuZGVyaW5nLnJlc291cmNlSWNvbk1pbjtcbiAgbGV0IG1heCA9IEdyYXBoVGhlbWUuaW5zdGFuY2UucmVuZGVyaW5nLnJlc291cmNlSWNvbk1heDtcbiAgLy8gbG93ZXIgbWF4IHRvIGdlbmVyYWwgd2hlbiB3cmFwcGVkIGNmbiByZXNvdXJjZSBpcyByZW5kZXJlZCBhcyB3cmFwcGVyIHdpbGwgc2hvdyBzZXJ2aWNlIGljb25cbiAgaWYgKG5vZGUucmVzb3VyY2U/LmlzV3JhcHBlcikge1xuICAgIG1pbiA9IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0LlNFUlZJQ0U7XG4gIH1cbiAgcmV0dXJuIF9yZXNvbHZlUmVzb3VyY2VMaWtlSW1hZ2UoXG4gICAgbm9kZSxcbiAgICBtaW4sXG4gICAgbWF4LFxuICAgIEdyYXBoVGhlbWUuaW5zdGFuY2UuYXdzVGhlbWU/LmlkXG4gICk7XG59XG5cbi8qKiBSZXNvbHZlcyBSZXNvdXJjZSBpbWFnZSBmcm9tIHtAbGluayBBd3NBcmNoaXRlY3R1cmV9IGFzc2V0ICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlc291cmNlSW1hZ2UoXG4gIG5vZGU6IEdyYXBoLlJlc291cmNlTm9kZVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IG1pbiA9IEdyYXBoVGhlbWUuaW5zdGFuY2UucmVuZGVyaW5nLnJlc291cmNlSWNvbk1pbjtcbiAgbGV0IG1heCA9IEdyYXBoVGhlbWUuaW5zdGFuY2UucmVuZGVyaW5nLnJlc291cmNlSWNvbk1heDtcbiAgLy8gZWxldmF0ZSBtaW4gdG8gc2VydmljZSB3aGVuIHdyYXBwZWQgY2ZuIHJlc291cmNlIGlzIHJlbmRlcmVkXG4gIGlmIChub2RlLmlzV3JhcHBlcikge1xuICAgIG1pbiA9IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0LlNFUlZJQ0U7XG4gIH1cbiAgcmV0dXJuIF9yZXNvbHZlUmVzb3VyY2VMaWtlSW1hZ2UoXG4gICAgbm9kZSxcbiAgICBtaW4sXG4gICAgbWF4LFxuICAgIEdyYXBoVGhlbWUuaW5zdGFuY2UuYXdzVGhlbWU/LmlkXG4gICk7XG59XG5cbi8qKiBSZXNvbHZlcyBDdXN0b21SZXNvdXJjZSBpbWFnZSBmcm9tIHtAbGluayBBd3NBcmNoaXRlY3R1cmV9IGFzc2V0ICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUN1c3RvbVJlc291cmNlSW1hZ2UoXG4gIF9ub2RlOiBHcmFwaC5Ob2RlXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gQXdzQXJjaGl0ZWN0dXJlLmdldFJlc291cmNlKFxuICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6Q3VzdG9tUmVzb3VyY2VcIlxuICApLmljb24oXCJzdmdcIiwgR3JhcGhUaGVtZS5pbnN0YW5jZS5hd3NUaGVtZT8uaWQpO1xufVxuXG4vKiogUmVzb2x2ZXMgUmVzb3VyY2UgaW1hZ2UgZnJvbSB7QGxpbmsgQXdzQXJjaGl0ZWN0dXJlfSBhc3NldCAqL1xuZnVuY3Rpb24gX3Jlc29sdmVSZXNvdXJjZUxpa2VJbWFnZShcbiAgbm9kZTogR3JhcGguUmVzb3VyY2VOb2RlIHwgR3JhcGguQ2ZuUmVzb3VyY2VOb2RlLFxuICBtaW46IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0LFxuICBtYXg6IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0LFxuICB0aGVtZT86IGF3c19hcmNoLlRoZW1lc1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2ZuUmVzb3VyY2VUeXBlID0gbm9kZS5jZm5UeXBlO1xuXG4gIHRyeSB7XG4gICAgaWYgKFxuICAgICAgbWluIDw9IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0LkRBVEEgJiZcbiAgICAgIG1heCA+PSBHcmFwaFRoZW1lUmVuZGVyaW5nSWNvblRhcmdldC5EQVRBXG4gICAgKSB7XG4gICAgICBjb25zdCBkYXRhSW1hZ2UgPSBfcmVzb2x2ZVJlc291cmNlTGlrZURhdGFJbWFnZShub2RlLCB0aGVtZSk7XG4gICAgICBpZiAoZGF0YUltYWdlKSB7XG4gICAgICAgIHJldHVybiBkYXRhSW1hZ2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtYXggPD0gR3JhcGhUaGVtZVJlbmRlcmluZ0ljb25UYXJnZXQuREFUQSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gQXdzQXJjaGl0ZWN0dXJlLmdldFJlc291cmNlKGNmblJlc291cmNlVHlwZSBhcyBhbnkpO1xuXG4gICAgaWYgKFxuICAgICAgbWluIDw9IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0LlJFU09VUkNFICYmXG4gICAgICBtYXggPj0gR3JhcGhUaGVtZVJlbmRlcmluZ0ljb25UYXJnZXQuUkVTT1VSQ0VcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGljb24gPSByZXNvdXJjZS5nZXRSZXNvdXJjZUljb24oXCJzdmdcIiwgdGhlbWUpO1xuICAgICAgICBpZiAoaWNvbikge1xuICAgICAgICAgIHJldHVybiBpY29uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtaW4gPD0gR3JhcGhUaGVtZVJlbmRlcmluZ0ljb25UYXJnZXQuR0VORVJBTCAmJlxuICAgICAgICAgIG1heCA+PSBHcmFwaFRoZW1lUmVuZGVyaW5nSWNvblRhcmdldC5HRU5FUkFMXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGdlbmVyYWxJY29uID0gcmVzb3VyY2UuZ2V0R2VuZXJhbEljb24oXCJzdmdcIiwgdGhlbWUpO1xuICAgICAgICAgIGlmIChnZW5lcmFsSWNvbikge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYWxJY29uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG1pbiA8PSBHcmFwaFRoZW1lUmVuZGVyaW5nSWNvblRhcmdldC5TRVJWSUNFICYmXG4gICAgICBtYXggPj0gR3JhcGhUaGVtZVJlbmRlcmluZ0ljb25UYXJnZXQuU0VSVklDRVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHJlc291cmNlLmdldFNlcnZpY2VJY29uKFwic3ZnXCIsIHRoZW1lKTtcbiAgICAgICAgaWYgKGljb24pIHtcbiAgICAgICAgICByZXR1cm4gaWNvbjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG1pbiA8PSBHcmFwaFRoZW1lUmVuZGVyaW5nSWNvblRhcmdldC5DQVRFR09SWSAmJlxuICAgICAgbWF4ID49IEdyYXBoVGhlbWVSZW5kZXJpbmdJY29uVGFyZ2V0LkNBVEVHT1JZXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0Q2F0ZWdvcnlJY29uKFwic3ZnXCIsIHRoZW1lKTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKiogUmVzb2x2ZXMgQ2ZuUmVzb3VyY2UgaW1hZ2UgZnJvbSB7QGxpbmsgQXdzQXJjaGl0ZWN0dXJlfSBhc3NldCAqL1xuZnVuY3Rpb24gX3Jlc29sdmVSZXNvdXJjZUxpa2VEYXRhSW1hZ2UoXG4gIG5vZGU6IEdyYXBoLkNmblJlc291cmNlTm9kZSB8IEdyYXBoLlJlc291cmNlTm9kZSxcbiAgdGhlbWU/OiBhd3NfYXJjaC5UaGVtZXNcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNmblJlc291cmNlVHlwZSA9IG5vZGUuY2ZuVHlwZTtcblxuICBpZiAoXG4gICAgY2ZuUmVzb3VyY2VUeXBlID09PSBhd3NfYXJjaC5DZm5TcGVjLlNlcnZpY2VSZXNvdXJjZURpY3Rpb25hcnkuRUMyLkluc3RhbmNlXG4gICkge1xuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IG5vZGUuZ2V0Q2ZuUHJvcChcImluc3RhbmNlVHlwZVwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGluc3RhbmNlVHlwZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEF3c0FyY2hpdGVjdHVyZS5nZXRJbnN0YW5jZVR5cGVJY29uKFxuICAgICAgICAgIGluc3RhbmNlVHlwZS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLlwiKVswXSBhcyBhbnksXG4gICAgICAgICAgXCJzdmdcIixcbiAgICAgICAgICB0aGVtZVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjZm5SZXNvdXJjZVR5cGUgPT09XG4gICAgYXdzX2FyY2guQ2ZuU3BlYy5TZXJ2aWNlUmVzb3VyY2VEaWN0aW9uYXJ5LlJEUy5EQkluc3RhbmNlXG4gICkge1xuICAgIGxldCBlbmdpbmUgPSBub2RlLmdldENmblByb3AoXCJlbmdpbmVcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChlbmdpbmUpIHtcbiAgICAgIGVuZ2luZSA9IGVuZ2luZS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLVwiKVswXSBhcyBhbnk7XG4gICAgICAvLyBSZXNvbHZlIHBvc3RncmVzcWwgdmFyaWFudFxuICAgICAgaWYgKGVuZ2luZSA9PT0gXCJwb3N0Z3Jlc1wiKSB7XG4gICAgICAgIGVuZ2luZSA9IFwicG9zdGdyZXNxbFwiO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLXJkcy1kYmluc3RhbmNlLmh0bWwjY2ZuLXJkcy1kYmluc3RhbmNlLWVuZ2luZVxuICAgICAgICByZXR1cm4gQXdzQXJjaGl0ZWN0dXJlLmdldFJkc0luc3RhbmNlVHlwZUljb24oXG4gICAgICAgICAgZW5naW5lIGFzIGFueSxcbiAgICAgICAgICBcInN2Z1wiLFxuICAgICAgICAgIHRoZW1lXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==