Skip to content

Instantly share code, notes, and snippets.

@jkowalleck
Last active September 2, 2024 03:06
Show Gist options
  • Save jkowalleck/a0f874ee0a8af9a56a0e887631fc53d1 to your computer and use it in GitHub Desktop.
Save jkowalleck/a0f874ee0a8af9a56a0e887631fc53d1 to your computer and use it in GitHub Desktop.
CycloneDX dependency grapth to mermaid diagramm
<?xml version="1.0" encoding="utf-8"?>
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:my="http://gist.github.com/jkowalleck/a0f874ee0a8af9a56a0e887631fc53d1"
>
<!--
@author: Jan Kowalleck
@license: (MIT OR Apache-2.0)
@description: generate mermaid charts from the dependency graph in CycloneDX XML documents.
-->
<output method="text" indent="no" media-type="text/vnd.mermaid"/>
<param name="graphDirection" select="'TD'">
<!-- see https://mermaid.js.org/syntax/flowchart.html#direction -->
</param>
<variable name="bomNS" select="fn:namespace-uri(/*:bom[fn:starts-with(fn:namespace-uri(), 'http://cyclonedx.org/schema/bom/1.')])"/>
<function name="my:isNS" as="xs:boolean">
<param name="c"/>
<sequence select="fn:namespace-uri($c) = $bomNS"/>
</function>
<template match="/">
<for-each select="*:bom[my:isNS(.)]">
<text>graph </text>
<value-of select="$graphDirection"/>
<text>;&#10;</text>
<for-each select="*:dependencies[my:isNS(.)]/*:dependency[my:isNS(.)]">
<call-template name="renderDependency"/>
</for-each>
</for-each>
</template>
<template name="renderDependency">
<for-each select="*:dependency[my:isNS(.)]">
<value-of select="my:mmRelation(../@ref, @ref, 'depends')"/>
<call-template name="renderDependency">
<!-- the xml allows nested dependencies -> recursion is needed -->
</call-template>
</for-each>
<for-each select="*:provides[my:isNS(.)]">
<value-of select="my:mmRelation(../@ref, @ref, 'provides')"/>
</for-each>
</template>
<function name="my:mmEscapeNode" as="xs:string">
<!-- escape chars that mermaid does not allow for node names -->
<param name="i" as="xs:string"/>
<sequence select="fn:translate($i, '@:=[]{}() &quot;&gt;&lt;', '_____________')"/>
</function>
<function name="my:mmRelation" as="xs:string">
<param name="a" as="xs:string"/>
<param name="b" as="xs:string"/>
<param name="r" as="xs:string"/>
<xs:sequence>
<text> </text>
<value-of select="my:mmEscapeNode($a)"/>
<text>[&quot;</text>
<value-of select="$a"/>
<text>&quot;] -- </text>
<value-of select="$r"/>
<text> --&gt; </text>
<value-of select="my:mmEscapeNode($b)"/>
<text>[&quot;</text>
<value-of select="$b"/>
<text>&quot;]&#10;</text>
</xs:sequence>
</function>
</stylesheet>
@jkowalleck
Copy link
Author

jkowalleck commented Jun 22, 2024

example usage with saxon-he:

java -jar .../saxon-he-12.4.jar \
  -s:'.../my-bom.1.6.cdx.xml' \
  -xsl:'.../cyclonedx_deps_to_mermaid.xsl' \
  graphDirection:LR

example result here: https://gist.github.com/jkowalleck/a0f874ee0a8af9a56a0e887631fc53d1?permalink_comment_id=5097441#gistcomment-5097441

@jkowalleck
Copy link
Author

jkowalleck commented Jun 22, 2024

call like here: https://gist.github.com/jkowalleck/a0f874ee0a8af9a56a0e887631fc53d1?permalink_comment_id=5097436#gistcomment-5097436
example results based on https://github.com/CycloneDX/cyclonedx-php-composer/blob/704cf28ade153274d94892ebeb3cb18e8422b5d0/demo/laravel-7.12.0/results/bom.1.6.xml

graph LR;
    asm89/stack-cors-1.3.0.0["asm89/stack-cors-1.3.0.0"] -- depends --> symfony/http-foundation-5.4.16.0["symfony/http-foundation-5.4.16.0"]
    asm89/stack-cors-1.3.0.0["asm89/stack-cors-1.3.0.0"] -- depends --> symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"]
    egulias/email-validator-2.1.25.0["egulias/email-validator-2.1.25.0"] -- depends --> doctrine/lexer-1.2.3.0["doctrine/lexer-1.2.3.0"]
    egulias/email-validator-2.1.25.0["egulias/email-validator-2.1.25.0"] -- depends --> symfony/polyfill-intl-idn-1.27.0.0["symfony/polyfill-intl-idn-1.27.0.0"]
    fruitcake/laravel-cors-1.0.6.0["fruitcake/laravel-cors-1.0.6.0"] -- depends --> asm89/stack-cors-1.3.0.0["asm89/stack-cors-1.3.0.0"]
    fruitcake/laravel-cors-1.0.6.0["fruitcake/laravel-cors-1.0.6.0"] -- depends --> symfony/http-foundation-5.4.16.0["symfony/http-foundation-5.4.16.0"]
    fruitcake/laravel-cors-1.0.6.0["fruitcake/laravel-cors-1.0.6.0"] -- depends --> symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"]
    guzzlehttp/guzzle-6.5.8.0["guzzlehttp/guzzle-6.5.8.0"] -- depends --> guzzlehttp/promises-1.5.2.0["guzzlehttp/promises-1.5.2.0"]
    guzzlehttp/guzzle-6.5.8.0["guzzlehttp/guzzle-6.5.8.0"] -- depends --> guzzlehttp/psr7-1.9.0.0["guzzlehttp/psr7-1.9.0.0"]
    guzzlehttp/guzzle-6.5.8.0["guzzlehttp/guzzle-6.5.8.0"] -- depends --> symfony/polyfill-intl-idn-1.27.0.0["symfony/polyfill-intl-idn-1.27.0.0"]
    guzzlehttp/psr7-1.9.0.0["guzzlehttp/psr7-1.9.0.0"] -- depends --> psr/http-message-1.0.1.0["psr/http-message-1.0.1.0"]
    guzzlehttp/psr7-1.9.0.0["guzzlehttp/psr7-1.9.0.0"] -- depends --> ralouphie/getallheaders-3.0.3.0["ralouphie/getallheaders-3.0.3.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> doctrine/inflector-2.0.6.0["doctrine/inflector-2.0.6.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> dragonmantank/cron-expression-2.3.1.0["dragonmantank/cron-expression-2.3.1.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> egulias/email-validator-2.1.25.0["egulias/email-validator-2.1.25.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> league/commonmark-1.6.7.0["league/commonmark-1.6.7.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> league/flysystem-1.1.10.0["league/flysystem-1.1.10.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> monolog/monolog-2.8.0.0["monolog/monolog-2.8.0.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> nesbot/carbon-2.63.0.0["nesbot/carbon-2.63.0.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> opis/closure-3.6.3.0["opis/closure-3.6.3.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> psr/container-1.1.1.0["psr/container-1.1.1.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> psr/simple-cache-1.0.1.0["psr/simple-cache-1.0.1.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> ramsey/uuid-4.2.3.0["ramsey/uuid-4.2.3.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> swiftmailer/swiftmailer-6.3.0.0["swiftmailer/swiftmailer-6.3.0.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/console-5.4.16.0["symfony/console-5.4.16.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/error-handler-5.4.15.0["symfony/error-handler-5.4.15.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/finder-5.4.11.0["symfony/finder-5.4.11.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/http-foundation-5.4.16.0["symfony/http-foundation-5.4.16.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/mime-5.4.16.0["symfony/mime-5.4.16.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/polyfill-php73-1.27.0.0["symfony/polyfill-php73-1.27.0.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/process-5.4.11.0["symfony/process-5.4.11.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/routing-5.4.15.0["symfony/routing-5.4.15.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> symfony/var-dumper-5.4.14.0["symfony/var-dumper-5.4.14.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> tijsverkoyen/css-to-inline-styles-2.2.5.0["tijsverkoyen/css-to-inline-styles-2.2.5.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> vlucas/phpdotenv-4.3.0.0["vlucas/phpdotenv-4.3.0.0"]
    laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"] -- depends --> voku/portable-ascii-1.6.1.0["voku/portable-ascii-1.6.1.0"]
    laravel/laravel-7.12.0.0["laravel/laravel-7.12.0.0"] -- depends --> fideloper/proxy-4.4.2.0["fideloper/proxy-4.4.2.0"]
    laravel/laravel-7.12.0.0["laravel/laravel-7.12.0.0"] -- depends --> fruitcake/laravel-cors-1.0.6.0["fruitcake/laravel-cors-1.0.6.0"]
    laravel/laravel-7.12.0.0["laravel/laravel-7.12.0.0"] -- depends --> guzzlehttp/guzzle-6.5.8.0["guzzlehttp/guzzle-6.5.8.0"]
    laravel/laravel-7.12.0.0["laravel/laravel-7.12.0.0"] -- depends --> laravel/framework-7.30.6.0["laravel/framework-7.30.6.0"]
    laravel/laravel-7.12.0.0["laravel/laravel-7.12.0.0"] -- depends --> laravel/tinker-2.7.3.0["laravel/tinker-2.7.3.0"]
    laravel/tinker-2.7.3.0["laravel/tinker-2.7.3.0"] -- depends --> psy/psysh-0.11.9.0["psy/psysh-0.11.9.0"]
    laravel/tinker-2.7.3.0["laravel/tinker-2.7.3.0"] -- depends --> symfony/var-dumper-5.4.14.0["symfony/var-dumper-5.4.14.0"]
    league/flysystem-1.1.10.0["league/flysystem-1.1.10.0"] -- depends --> league/mime-type-detection-1.11.0.0["league/mime-type-detection-1.11.0.0"]
    monolog/monolog-2.8.0.0["monolog/monolog-2.8.0.0"] -- depends --> psr/log-1.1.4.0["psr/log-1.1.4.0"]
    nesbot/carbon-2.63.0.0["nesbot/carbon-2.63.0.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    nesbot/carbon-2.63.0.0["nesbot/carbon-2.63.0.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    nesbot/carbon-2.63.0.0["nesbot/carbon-2.63.0.0"] -- depends --> symfony/translation-5.4.14.0["symfony/translation-5.4.14.0"]
    psy/psysh-0.11.9.0["psy/psysh-0.11.9.0"] -- depends --> nikic/php-parser-4.15.2.0["nikic/php-parser-4.15.2.0"]
    psy/psysh-0.11.9.0["psy/psysh-0.11.9.0"] -- depends --> symfony/console-5.4.16.0["symfony/console-5.4.16.0"]
    psy/psysh-0.11.9.0["psy/psysh-0.11.9.0"] -- depends --> symfony/var-dumper-5.4.14.0["symfony/var-dumper-5.4.14.0"]
    ramsey/collection-1.2.2.0["ramsey/collection-1.2.2.0"] -- depends --> symfony/polyfill-php81-1.27.0.0["symfony/polyfill-php81-1.27.0.0"]
    ramsey/uuid-4.2.3.0["ramsey/uuid-4.2.3.0"] -- depends --> brick/math-0.9.3.0["brick/math-0.9.3.0"]
    ramsey/uuid-4.2.3.0["ramsey/uuid-4.2.3.0"] -- depends --> ramsey/collection-1.2.2.0["ramsey/collection-1.2.2.0"]
    ramsey/uuid-4.2.3.0["ramsey/uuid-4.2.3.0"] -- depends --> symfony/polyfill-ctype-1.27.0.0["symfony/polyfill-ctype-1.27.0.0"]
    ramsey/uuid-4.2.3.0["ramsey/uuid-4.2.3.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    swiftmailer/swiftmailer-6.3.0.0["swiftmailer/swiftmailer-6.3.0.0"] -- depends --> egulias/email-validator-2.1.25.0["egulias/email-validator-2.1.25.0"]
    swiftmailer/swiftmailer-6.3.0.0["swiftmailer/swiftmailer-6.3.0.0"] -- depends --> symfony/polyfill-iconv-1.27.0.0["symfony/polyfill-iconv-1.27.0.0"]
    swiftmailer/swiftmailer-6.3.0.0["swiftmailer/swiftmailer-6.3.0.0"] -- depends --> symfony/polyfill-intl-idn-1.27.0.0["symfony/polyfill-intl-idn-1.27.0.0"]
    swiftmailer/swiftmailer-6.3.0.0["swiftmailer/swiftmailer-6.3.0.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    symfony/console-5.4.16.0["symfony/console-5.4.16.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/console-5.4.16.0["symfony/console-5.4.16.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    symfony/console-5.4.16.0["symfony/console-5.4.16.0"] -- depends --> symfony/polyfill-php73-1.27.0.0["symfony/polyfill-php73-1.27.0.0"]
    symfony/console-5.4.16.0["symfony/console-5.4.16.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/console-5.4.16.0["symfony/console-5.4.16.0"] -- depends --> symfony/service-contracts-2.5.2.0["symfony/service-contracts-2.5.2.0"]
    symfony/console-5.4.16.0["symfony/console-5.4.16.0"] -- depends --> symfony/string-5.4.15.0["symfony/string-5.4.15.0"]
    symfony/css-selector-5.4.11.0["symfony/css-selector-5.4.11.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/error-handler-5.4.15.0["symfony/error-handler-5.4.15.0"] -- depends --> psr/log-1.1.4.0["psr/log-1.1.4.0"]
    symfony/error-handler-5.4.15.0["symfony/error-handler-5.4.15.0"] -- depends --> symfony/var-dumper-5.4.14.0["symfony/var-dumper-5.4.14.0"]
    symfony/event-dispatcher-5.4.9.0["symfony/event-dispatcher-5.4.9.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/event-dispatcher-5.4.9.0["symfony/event-dispatcher-5.4.9.0"] -- depends --> symfony/event-dispatcher-contracts-2.5.2.0["symfony/event-dispatcher-contracts-2.5.2.0"]
    symfony/event-dispatcher-5.4.9.0["symfony/event-dispatcher-5.4.9.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/event-dispatcher-contracts-2.5.2.0["symfony/event-dispatcher-contracts-2.5.2.0"] -- depends --> psr/event-dispatcher-1.0.0.0["psr/event-dispatcher-1.0.0.0"]
    symfony/finder-5.4.11.0["symfony/finder-5.4.11.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/finder-5.4.11.0["symfony/finder-5.4.11.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/http-foundation-5.4.16.0["symfony/http-foundation-5.4.16.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/http-foundation-5.4.16.0["symfony/http-foundation-5.4.16.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    symfony/http-foundation-5.4.16.0["symfony/http-foundation-5.4.16.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> psr/log-1.1.4.0["psr/log-1.1.4.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> symfony/error-handler-5.4.15.0["symfony/error-handler-5.4.15.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> symfony/event-dispatcher-5.4.9.0["symfony/event-dispatcher-5.4.9.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> symfony/http-foundation-5.4.16.0["symfony/http-foundation-5.4.16.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> symfony/polyfill-ctype-1.27.0.0["symfony/polyfill-ctype-1.27.0.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> symfony/polyfill-php73-1.27.0.0["symfony/polyfill-php73-1.27.0.0"]
    symfony/http-kernel-5.4.16.0["symfony/http-kernel-5.4.16.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/mime-5.4.16.0["symfony/mime-5.4.16.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/mime-5.4.16.0["symfony/mime-5.4.16.0"] -- depends --> symfony/polyfill-intl-idn-1.27.0.0["symfony/polyfill-intl-idn-1.27.0.0"]
    symfony/mime-5.4.16.0["symfony/mime-5.4.16.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    symfony/mime-5.4.16.0["symfony/mime-5.4.16.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/polyfill-intl-idn-1.27.0.0["symfony/polyfill-intl-idn-1.27.0.0"] -- depends --> symfony/polyfill-intl-normalizer-1.27.0.0["symfony/polyfill-intl-normalizer-1.27.0.0"]
    symfony/polyfill-intl-idn-1.27.0.0["symfony/polyfill-intl-idn-1.27.0.0"] -- depends --> symfony/polyfill-php72-1.27.0.0["symfony/polyfill-php72-1.27.0.0"]
    symfony/process-5.4.11.0["symfony/process-5.4.11.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/routing-5.4.15.0["symfony/routing-5.4.15.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/routing-5.4.15.0["symfony/routing-5.4.15.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/service-contracts-2.5.2.0["symfony/service-contracts-2.5.2.0"] -- depends --> psr/container-1.1.1.0["psr/container-1.1.1.0"]
    symfony/service-contracts-2.5.2.0["symfony/service-contracts-2.5.2.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/string-5.4.15.0["symfony/string-5.4.15.0"] -- depends --> symfony/polyfill-ctype-1.27.0.0["symfony/polyfill-ctype-1.27.0.0"]
    symfony/string-5.4.15.0["symfony/string-5.4.15.0"] -- depends --> symfony/polyfill-intl-grapheme-1.27.0.0["symfony/polyfill-intl-grapheme-1.27.0.0"]
    symfony/string-5.4.15.0["symfony/string-5.4.15.0"] -- depends --> symfony/polyfill-intl-normalizer-1.27.0.0["symfony/polyfill-intl-normalizer-1.27.0.0"]
    symfony/string-5.4.15.0["symfony/string-5.4.15.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    symfony/string-5.4.15.0["symfony/string-5.4.15.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/translation-5.4.14.0["symfony/translation-5.4.14.0"] -- depends --> symfony/deprecation-contracts-2.5.2.0["symfony/deprecation-contracts-2.5.2.0"]
    symfony/translation-5.4.14.0["symfony/translation-5.4.14.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    symfony/translation-5.4.14.0["symfony/translation-5.4.14.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    symfony/translation-5.4.14.0["symfony/translation-5.4.14.0"] -- depends --> symfony/translation-contracts-2.5.2.0["symfony/translation-contracts-2.5.2.0"]
    symfony/var-dumper-5.4.14.0["symfony/var-dumper-5.4.14.0"] -- depends --> symfony/polyfill-mbstring-1.27.0.0["symfony/polyfill-mbstring-1.27.0.0"]
    symfony/var-dumper-5.4.14.0["symfony/var-dumper-5.4.14.0"] -- depends --> symfony/polyfill-php80-1.27.0.0["symfony/polyfill-php80-1.27.0.0"]
    tijsverkoyen/css-to-inline-styles-2.2.5.0["tijsverkoyen/css-to-inline-styles-2.2.5.0"] -- depends --> symfony/css-selector-5.4.11.0["symfony/css-selector-5.4.11.0"]
    vlucas/phpdotenv-4.3.0.0["vlucas/phpdotenv-4.3.0.0"] -- depends --> phpoption/phpoption-1.9.0.0["phpoption/phpoption-1.9.0.0"]
    vlucas/phpdotenv-4.3.0.0["vlucas/phpdotenv-4.3.0.0"] -- depends --> symfony/polyfill-ctype-1.27.0.0["symfony/polyfill-ctype-1.27.0.0"]
    cyclonedx/cyclonedx-php-composer-demo-dev-master["cyclonedx/cyclonedx-php-composer-demo-dev-master"] -- depends --> laravel/laravel-7.12.0.0["laravel/laravel-7.12.0.0"]

rendered: https://mermaid.live/view#pako:eNrNnM1zqzYQwP-VDOcAxrFN7M701GN7aW9telCEbKsWEiMJv5DM-9-7fJja5sM2SPS9N5MQdq39Ia12VxLJl4NFRJyNs5Mo2T_9-vtPb_wJ_iEVv659pRE-uFhI5QbeizfzZn-9OV2iN-fvJ9d9ikhCeKTg8ucnlcVbwTN_r3XibkXKI6Sp4O7SW3jBqmjtlgq0ao3oQCQnrJPmSlyTkF3KKFI-iRFl7hExCsxCunMv8ObLop1bKi1kkcBaUk58Rj6IhEeY5w8BbbULLNOcOiIRLNtSxlzKNXyJeG4_rPr9tlJNuZUp1Rgd4CmQREfo1mqgZl7Z8_0KLYTD_MEWjUlPt0w30Ot36ecnI7mKX166K2_pvRYNdMpaWM50EyliqkhOvgSvvmrpWmqVRMkQ7KwrB-qQGCcwPcuGPNE1E4hLR4iJUmhHCrcKika6REbtS8REmuwp8XdEI8b2BEUEvDufwWVAvKFR01STw99KFJNvQh7c0Hs5zaFuYV9spnzLCC5j56mlbqENEol2gseIa8QPPpYQP8hHImE88lCSZ4ZyqO7Ss8BnJhuZpmIE7VLiYxHHeaeAcgCaYdlQl8wex5ZlKlOaxGAK_s_OOZoyCxzwpIKJnV99h65_reZph8QCAyfqXWgfI_leeOTqlL3bBRYIREKVj5lQqSQQPFZVeGm7bcF6HkyxgPkJoUOWg10H2cZ9S_YVjRNIUBjh_XWcbxNZoAAdRTI_TWnkLuqSt-WuBdvqG93qPAgReNz_rt1VXUje0LDBVCV78AAloP9bqrRrkUUKIiUE5j3iUf7UhcHlBUu7gkWiLeXRyVJwgXIlschgosa3RDWwtjdPE9O41Xkv7lu0XxfLyT4JX3rL6UsNm0xSYCjA2pz3WmSRQopUU75rm83XIosURyTdKI2T04xdXIC0SC2waPqPOhJ5EBnhPobe1wLWVgzyrqt0xmDlOYfcU3bR3boWOI8sxVAvg59GQhN-hJR4SlBdIhsU4pDCpJEavUPyQQpTWlTKpSP3SBssp02L0Avm1XN0iVo4tjQiTIBr5JPmI4MnXlR7Bx0S0_ZH786YpBm6E2GSYbiP2aCACAZpDqZjWBWT7YKG9fs_16ykIYDDom3vzvLgva5q6OubBi0aiKIDV6IdK9oiressIW5ENMFFzRMUmey8xT6tmmzI2rRtbZNr5OCLeklzdqe29vgq9GbFEb-rfD9o11t0NJRsEkF6eJ3dqoHONCywaIm4YmfF8KWrtolrivvnV2OPgR4ozrOjmyCpYB4UdU2ZLTplBuyOWcWNtzo8KlTrbiwYq6fnvOqvTtm9Hhjc9MCg6YGP7A9cU7xLig9-jHTea-vqo82bRmwN7bnxlhs9iYsI29fXlxp2KAbHHBO7MjZ3pW3wNY94IDwc-w-BLjQmpht3SjUJ48gsPCyCd1HBPUlwmd7yvV2JsM5XjKdcdJeeJbYfs8fG79_Y4xkY14zyQMFypJj0elOnji2m0jNaNpauJE37SrmKVIenLdtjrfJJRmv4DvjwNYl52-Mrw9rkkXDtRlQlSON9pbm-pOpQmTw-2mFtfKQP-LbyRNQGZ4Tx52-bKY0PFpsE9bTpEjdoHzkvmtY7TZCZG9VxZ1rT9pwdVtN1kGVKMyP-8Hnh-Kxmxu4EHmaMcewpuiWqUXnGJpmJ83U7ZOP3WCxzjV4t2eMaF63ufZ9g2jgxlsrYjoppHkM50BjPaP8Z39P3jSEXMkaMfpa_qNFvoEX3_-DOI8L8ZsyY9zA-9F6L_bF-7A2XaSOGGTZzfTV2H8nMW622aOyO5SP7XfYrCqM0RSApfiWQxOR2yGloTkBnOtIaJTSUP40yjY4Vw87wp52TZhlNj6cluh9sZM_V-0a2V6_BOGTveqpxtcI2eFRtvdfa-ZbLwNObknbY262NumOfiCT3JL--Ovvtwx6pYQ5zeR1nmAlOog-_vsoHHGZKnIj8faWIxAK-HN0YKU0kNP3oR3reonzsXUzn2YkJpFgaORvnK-cHz8oLgjdnA5cRkoc3541_Bz2UavFHxrGz0TIlzw5Uvbu9s9kipuCnNImQJr9QBBVFfFIhEQXP-a38OwXFnyt4dhLE_xSiVoEfnc2X8-FswhU47CoIw3X4ugyWq_mzkzmbubcKZ8HLbBYsFsF6uVyG35-dz6KB4Pu_B1bYBg

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment