{"_id":"@acbart/tsuml2","_rev":"3-6a4831853c72f793c45931d0367874be","name":"@acbart/tsuml2","dist-tags":{"latest":"0.17.2"},"versions":{"0.17.0":{"name":"@acbart/tsuml2","version":"0.17.0","keywords":["typescript","uml","diagram","generator","class"],"author":{"url":"based on work of Remo H. Jansen","name":"Austin Cory Bart"},"license":"MIT","_id":"@acbart/tsuml2@0.17.0","maintainers":[{"name":"acbart","email":"acbart@udel.edu"}],"homepage":"https://github.com/acbart/TsUML2#readme","bugs":{"url":"https://github.com/acbart/TsUML2/issues"},"bin":{"tsuml2":"dist/bin/index.js"},"dist":{"shasum":"5fa74e7ec8d7a5f8afdc59eeef952fae5e7864fb","tarball":"https://registry.npmjs.org/@acbart/tsuml2/-/tsuml2-0.17.0.tgz","fileCount":43,"integrity":"sha512-4wXS9KwBV4l5Y4+d3NHj0KzB6CKB0gcJvq9aty4d37OPyOfLNmoa3dgbBSYnrNz7ofW955Qqv8yVngqYyW5aZQ==","signatures":[{"sig":"MEUCIFt7q77x0om0UZQqgYVMXfNfD2B7Ol+hTXvQpuABAj56AiEAuC2aSHWf7tawRy/C20+1krn1rZ3MKDDNa8pCfkQEGnE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":81592},"main":"dist/lib/index.js","types":"./dist/lib/index.d.ts","gitHead":"3016128b69bad53b68ccaec14728afa00e8f0546","scripts":{"build":"tsc -p tsconfig.json","watch":"tsc -p tsconfig.json --watch"},"_npmUser":{"name":"acbart","email":"acbart@udel.edu"},"repository":{"url":"git+https://github.com/acbart/TsUML2.git","type":"git"},"_npmVersion":"8.19.4","description":"UML diagrams for TypeScript","directories":{},"_nodeVersion":"16.20.2","dependencies":{"chalk":"^4.1.2","yargs":"^17.7.2","nomnoml":"^1.6.1","ts-morph":"^19.0.0","typescript":"^5.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^18.11.18","@types/yargs":"^17.0.24"},"_npmOperationalInternal":{"tmp":"tmp/tsuml2_0.17.0_1715525120439_0.7895016657763203","host":"s3://npm-registry-packages"}},"0.17.1":{"name":"@acbart/tsuml2","version":"0.17.1","keywords":["typescript","uml","diagram","generator","class"],"author":{"url":"based on work of Remo H. Jansen","name":"Austin Cory Bart"},"license":"MIT","_id":"@acbart/tsuml2@0.17.1","maintainers":[{"name":"acbart","email":"acbart@udel.edu"}],"homepage":"https://github.com/acbart/TsUML2#readme","bugs":{"url":"https://github.com/acbart/TsUML2/issues"},"bin":{"tsuml2":"dist/bin/index.js"},"dist":{"shasum":"75de6294271b286bc1ab743a60422ee59e3fa158","tarball":"https://registry.npmjs.org/@acbart/tsuml2/-/tsuml2-0.17.1.tgz","fileCount":43,"integrity":"sha512-nFvm+pQpKn+JXk7UaEoFEF2fbu4BgAbDWOSeMOG6+ZdogHt980ImUq7onHg147t8noSLgvuH4Kqa7MeH24C49A==","signatures":[{"sig":"MEUCIQDvRaTE4fimqtz6LvG3OvGqWQK21MA/qtN7TNWBc34buwIgbj07WyitF/mPmbaLLD03trC75R/NTu1s+JMZqgMLIt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81718},"main":"dist/lib/index.js","types":"./dist/lib/index.d.ts","gitHead":"e736231fe7a63b0be26584bd33fb97f2be068d08","scripts":{"build":"tsc -p tsconfig.json","watch":"tsc -p tsconfig.json --watch"},"_npmUser":{"name":"acbart","email":"acbart@udel.edu"},"repository":{"url":"git+https://github.com/acbart/TsUML2.git","type":"git"},"_npmVersion":"10.9.0","description":"UML diagrams for TypeScript","directories":{},"_nodeVersion":"22.12.0","dependencies":{"chalk":"^4.1.2","yargs":"^17.7.2","nomnoml":"^1.6.1","ts-morph":"^19.0.0","typescript":"^5.1.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^18.11.18","@types/yargs":"^17.0.24"},"_npmOperationalInternal":{"tmp":"tmp/tsuml2_0.17.1_1741724339161_0.24106877300400442","host":"s3://npm-registry-packages-npm-production"}},"0.17.2":{"name":"@acbart/tsuml2","version":"0.17.2","description":"UML diagrams for TypeScript","main":"dist/lib/index.js","bin":{"tsuml2":"dist/bin/index.js"},"devDependencies":{"@types/node":"^18.11.18","@types/yargs":"^17.0.24"},"dependencies":{"chalk":"^4.1.2","nomnoml":"^1.6.1","ts-morph":"^19.0.0","typescript":"^5.1.3","yargs":"^17.7.2"},"scripts":{"build":"tsc -p tsconfig.json","watch":"tsc -p tsconfig.json --watch"},"repository":{"type":"git","url":"git+https://github.com/acbart/TsUML2.git"},"keywords":["typescript","uml","diagram","generator","class"],"author":{"name":"Austin Cory Bart","url":"based on work of Remo H. Jansen"},"license":"MIT","bugs":{"url":"https://github.com/acbart/TsUML2/issues"},"homepage":"https://github.com/acbart/TsUML2#readme","_id":"@acbart/tsuml2@0.17.2","gitHead":"e736231fe7a63b0be26584bd33fb97f2be068d08","types":"./dist/lib/index.d.ts","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-+TRhzTjuxbQhzdueao3fy2sgk/Vt/LlLnJT31WlmmaJOIh6+HCusSU8xDrH+0ZA5PJWXh4Q3+MPHS+UXm01boA==","shasum":"51789145d072ef83d306f96c7d1d27dcf8b69528","tarball":"https://registry.npmjs.org/@acbart/tsuml2/-/tsuml2-0.17.2.tgz","fileCount":43,"unpackedSize":82307,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGwTZLkGWUHBuJFFAipjwfOQAuthyvY0KrAqP2mJAvcBAiANwk7e3Q+IX5nSJGH9yOMfiPQFy9bXl4d3QpuV0J4t8Q=="}]},"_npmUser":{"name":"acbart","email":"acbart@udel.edu"},"directories":{},"maintainers":[{"name":"acbart","email":"acbart@udel.edu"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tsuml2_0.17.2_1741724568648_0.09363712322113238"},"_hasShrinkwrap":false}},"time":{"created":"2024-05-12T14:45:20.307Z","modified":"2025-03-11T20:22:48.972Z","0.17.0":"2024-05-12T14:45:20.620Z","0.17.1":"2025-03-11T20:18:59.340Z","0.17.2":"2025-03-11T20:22:48.809Z"},"bugs":{"url":"https://github.com/acbart/TsUML2/issues"},"author":{"name":"Austin Cory Bart","url":"based on work of Remo H. Jansen"},"license":"MIT","homepage":"https://github.com/acbart/TsUML2#readme","keywords":["typescript","uml","diagram","generator","class"],"repository":{"type":"git","url":"git+https://github.com/acbart/TsUML2.git"},"description":"UML diagrams for TypeScript","maintainers":[{"name":"acbart","email":"acbart@udel.edu"}],"readme":"<img src=\"./assets/logo.png\" width=\"150\" align=\"right\" />\r\n\r\nThis is based off of work by `demike`. I added dependency tracking. Maybe it even works!\r\n\r\n# TsUML2 [![npm version](https://badge.fury.io/js/tsuml2.svg)](https://badge.fury.io/js/tsuml2) [![Known Vulnerabilities](https://snyk.io/test/npm/tsuml2/badge.svg)](https://snyk.io/test/npm/tsuml2)\r\n\r\nGenerate UML diagram for your TypeScript applications powered by nomnoml.\r\n\r\nTsUML2 works offline, so no third party servers are involved.\r\nIt supports\r\n- classes\r\n- interfaces\r\n- enums\r\n- type literals\r\n\r\n\r\n\r\n## Installation\r\n\r\n```sh\r\nnpm install -g tsuml2\r\n```\r\n\r\n## Usage\r\n\r\n```\r\ntsuml2 --glob \"./src/**/*.ts\" \r\n```\r\nBy default tsuml2 assumes that the required `tsconfig.json` file resides in the current directoy\r\nif this is not the case use the tsconfig parameter: \r\n```sh\r\n--tsconfig \"./somewhere/tsconfig.alt.json\"\r\n```\r\n\r\n\r\nTo avoid getting unwanted interfaces / classes you might want to exclude d.ts and spec.ts files:\r\n```sh\r\ntsuml2 --glob \"./src/**/!(*.d|*.spec).ts\"\r\n```\r\n\r\n### Options\r\n```\r\n      --help                Show help                                  [boolean]\r\n      --version             Show version number                        [boolean]\r\n  -g, --glob                pattern to match the source files (i.e.:\r\n                            ./src/**/*.ts)                   [string] [required]\r\n      --tsconfig            the path to tsconfig.json file\r\n  -o, --outFile             the path to the output file     [default: \"out.svg\"]\r\n      --propertyTypes       show property types and method return types\r\n                                                       [boolean] [default: true]\r\n      --modifiers           show modifiers like public,protected,private,static\r\n                                                       [boolean] [default: true]\r\n      --typeLinks           add links for classes, interface, enums that point\r\n                            to the source files        [boolean] [default: true]\r\n      --nomnoml             nomnoml layouting and styling options (an array of\r\n                            strings, each representing a nomnoml line), i.e.:\r\n                            --nomnoml \"#arrowSize: 1\" \"#.interface: fill=#8f8\r\n                            dashed\"                                      [array]\r\n      --outDsl              the path to the output DSL file (nomnoml)   [string]\r\n      --mermaid             mermaid layouting and styling options (an array of\r\n                            strings, each representing a mermaid line), i.e.:\r\n                            --mermaid \"direction LR\"                     [array]\r\n      --outMermaidDsl       the path to the output mermaid DSL file     [string]\r\n  -m, --memberAssociations  show associations between classes, interfaces, types\r\n                            and their member types    [boolean] [default: false]\r\n      --exportedTypesOnly   show only exported types, classes, interfaces, enums\r\n                                                      [boolean] [default: false]\r\n      --config              path to a json config file (command line options can\r\n                            be provided as keys in it)                  [string]\r\n```\r\n\r\nan example config.json could look like:\r\n```json\r\n{\r\n  \"glob\": \"./src/**/!(*.d|*.spec).ts\",\r\n  \"modifiers\": false,\r\n  \"nomnoml\": [\"#arrowSize: 1.5\",\"#.interface: fill=#8f8 dashed\"]\r\n}\r\n```\r\n\r\n> **_NOTE:_** command line arguments override those provided in config.json\r\n\r\n## Direct output of nomnoml and mermaid code\r\nYou can output the diagram not only as svg but also\r\nas _nomnoml_ and _mermaid_ code.\r\n\r\n### Generate nomnoml DSL output\r\n\r\n```sh\r\ntsuml2 --glob \"./src/demo/**/*.ts\" --outDsl  \"./assets/nomnoml_diagram.dsl\"\r\n```\r\nresults in the following nomnoml code stored in `nomnoml_diagram.dsl`:\r\n```nomnoml\r\n#.interface: fill=lightblue\r\n#.enumeration: fill=lightgreen\r\n#.type: fill=lightgray\r\n[<interface>Weapon||+tryHit(): boolean]\r\n[<interface>Named|+name: string|]\r\n[<interface>Magic|+kind: string|]\r\n[<interface>BlackMagic||+paintItBlack(): boolean]\r\n[<interface>MagicWeapon<MT>|+magic: MT|+tryMagicHit(): boolean]\r\n[<interface>BlackMagicWeapon||]\r\n[<enumeration>Gender|Male;Female;Else]\r\n[<type>MagicDurability|+fire: number;+water: number|]\r\n[<type>Durable|+durability: number;+magicDurability: MagicDurability|+refresh(): void]\r\n[Magic]<:--[BlackMagic]\r\n[Weapon]<:--[MagicWeapon<MT>]\r\n[MagicWeapon<MT>]<:--[BlackMagicWeapon]\r\n[BaseWeapon|#damage: number;+durability: number;+magicDurability: MagicDurability;+attributes: string\\[\\]|+refresh(): void]\r\n[Katana|+name: string|+tryHit(): boolean;+doIt(): void]\r\n[MagicKatana<MT>|+magic: MT|+tryMagicHit(): boolean]\r\n[BlackMagicKatana||+tryBlackMagicHit(): boolean]\r\n[Durable]<:--[BaseWeapon]\r\n[BaseWeapon]<:-[Katana]\r\n[Weapon]<:--[Katana]\r\n[Named]<:--[Katana]\r\n[Katana]<:-[MagicKatana<MT>]\r\n[MagicWeapon<MT>]<:--[MagicKatana<MT>]\r\n[MagicKatana<MT>]<:-[BlackMagicKatana]\r\n[MagicWeapon<MT>]<:--[BlackMagicKatana]\r\n[Ninja|+gender: Gender;+static IdCnt: number;-_weapon: Weapon;+id: number|+fight(): boolean]\r\n[Viking<WT>|+gender: Gender;+weapon: WT|+fight(): boolean]\r\n[UberViking<WT>||]\r\n[VikingWithKatana||]\r\n[Viking<WT>]<:-[UberViking<WT>]\r\n[Viking<WT>]<:-[VikingWithKatana]\r\n```\r\n\r\n### Generate mermaid DSL output\r\n\r\n```sh\r\ntsuml2 --glob \"./src/demo/**/*.ts\" --outMermaidDsl  \"./assets/mermaid_diagram.dsl\"\r\n```\r\nstores the mermaid code to `mermaid_diagram.dsl`.\r\n\r\n> **_Note:_** You can use it directly in github markdown!\r\n\r\n```mermaid\r\n\r\nclassDiagram\r\nclass EquipmentPart~T~{\r\n            +id: string\r\n+name?: string\r\n+content?: T\r\n            +mount() void\r\n+unmount() void\r\n        }\r\nMountable~T~<|..EquipmentPart~T~\r\nclass Weapon {\r\n            <<interface>>\r\n            \r\n            +tryHit() boolean\r\n        }\r\nclass Named {\r\n            <<interface>>\r\n            +name: string\r\n            \r\n        }\r\nclass Magic {\r\n            <<interface>>\r\n            +kind: string\r\n            \r\n        }\r\nclass BlackMagic {\r\n            <<interface>>\r\n            \r\n            +paintItBlack() boolean\r\n        }\r\nclass MagicWeapon~MT~ {\r\n            <<interface>>\r\n            +magic: MT\r\n            +tryMagicHit() boolean\r\n        }\r\nclass BlackMagicWeapon {\r\n            <<interface>>\r\n            \r\n            \r\n        }\r\nclass Attribute~T~ {\r\n            <<interface>>\r\n            +id: string\r\n+value: T\r\n+description?: string\r\n            \r\n        }\r\nclass Mountable~T~ {\r\n            <<interface>>\r\n            \r\n            +mount() void\r\n+unmount() void\r\n        }\r\nclass Gender {\r\n        <<enumeration>>\r\n        Male\r\nFemale\r\nElse\r\n      }\r\nclass MagicDurability {\r\n            <<type>>\r\n            +fire: number\r\n+water: number\r\n            \r\n        }\r\nclass Durable {\r\n            <<type>>\r\n            +durability: number\r\n+magicDurability: MagicDurability\r\n            +refresh() void\r\n        }\r\nMagic<|..BlackMagic\r\nWeapon<|..MagicWeapon~MT~\r\nMagicWeapon~MT~<|..BlackMagicWeapon\r\nDurable  --  MagicDurability\r\nclass BaseWeapon{\r\n            #damage: number\r\n+durability: number\r\n+magicDurability: MagicDurability\r\n+attributes: Attribute~any~[]\r\n            +refresh() void\r\n        }\r\nclass Katana{\r\n            +name: string\r\n            +tryHit() boolean\r\n+doIt() void\r\n        }\r\nclass MagicKatana~MT~{\r\n            +magic: MT\r\n            +tryMagicHit() boolean\r\n        }\r\nclass BlackMagicKatana{\r\n            \r\n            +tryBlackMagicHit() boolean\r\n        }\r\nclass AttributeWithDefault~T~ {\r\n            <<interface>>\r\n            +default: T\r\n            \r\n        }\r\nEquipmentPart~T~<|--BaseWeapon\r\nDurable<|..BaseWeapon\r\nBaseWeapon<|--Katana\r\nWeapon<|..Katana\r\nNamed<|..Katana\r\nKatana<|--MagicKatana~MT~\r\nMagicWeapon~MT~<|..MagicKatana~MT~\r\nMagicKatana~MT~<|--BlackMagicKatana\r\nMagicWeapon~MT~<|..BlackMagicKatana\r\nAttribute~T~<|..AttributeWithDefault~T~\r\nclass Ninja{\r\n            +gender: Gender\r\n+IdCnt: number$\r\n-_weapon: Weapon\r\n#secondaryWeapon?: Weapon\r\n-blockade?: Blockade\r\n+id: number\r\n            +fight() boolean\r\n        }\r\nclass Blockade {\r\n            <<interface>>\r\n            +magic: number\r\n+physical: number\r\n            \r\n        }\r\nNinja  --  Gender\r\nNinja  --  Weapon\r\nNinja  --  Weapon\r\nclass Viking~WT~{\r\n            +age: (10 | 20)[]\r\n+gender: Gender\r\n+weapon: WT\r\n+secondaryWeapon?: WT\r\n+bag: EquipmentPart~any~[]\r\n            +fight() boolean\r\n        }\r\nclass UberViking~WT~{\r\n            +belt?: EquipmentPart~any~\r\n            \r\n        }\r\nclass VikingWithKatana{\r\n            \r\n            \r\n        }\r\nclass MagicViking{\r\n            +secondaryWeapon?: MagicKatana~BlackMagic~\r\n            \r\n        }\r\nViking~WT~<|--UberViking~WT~\r\nViking~WT~<|--VikingWithKatana\r\nViking~WT~<|--MagicViking\r\nViking~WT~  --  Gender\r\n```\r\n\r\n## Usage in Node Applications:\r\n\r\n\r\n```js\r\n const {createDiagram, TsUML2Settings} = require('tsuml2')\r\n\r\n const settings = new TsUML2Settings();\r\n settings.glob = `./src/app/**/!(*.d|*.spec).ts`;\r\n settings.outFile = 'd:/apps/src/demo.svg'\r\n createDiagram(settings); \r\n```\r\n\r\n\r\n\r\n## Examples\r\n### Demo Diagram\r\n\r\n```sh\r\ntsuml2 --glob \"./src/demo/**/*.ts\" -o \"./assets/uml_diagram.svg\"\r\n```\r\n\r\nThe diagram generated for the code under the [demo folder](https://github.com/demike/TsUML2/tree/master/src/demo) looks as follows:\r\n\r\n![uml diagram example](/assets/uml_diagram.svg)\r\n\r\n### A complex command line parameter example:\r\n```\r\n./tsuml2 --glob=./src/demo/**/*.ts --nomnoml \"#arrowSize: 1.5\" \"#.interface: fill=#8f8 dashed\" --modifiers false --propertyTypes false\r\n```\r\n\r\n![alternative diagram style](/assets/alt_uml_diagram.svg)\r\n\r\n### With type links enabled: [live example](https://raw.githubusercontent.com/demike/TsUML2/master/assets/uml_diagram.svg)\r\n\r\n![type links](/assets/type_links.gif)\r\n\r\n\r\n### With member associations enabled:\r\nAssociations between class / interfaces / types and their members\r\nare represented by lines without arrows.\r\nThe associations also include multiplicity (\"0..*\").\r\n\r\nUse the `-m` parameter to enable output of member associations.\r\n \r\n```sh\r\ntsuml2 --glob \"./src/demo/**/*.ts\" -m -o \"./assets/uml_diagram.svg\"\r\n```\r\n\r\n![member associations](/assets/member_associations.png)","readmeFilename":"README.md"}