This project is a fork of jaime-olivares/yuml-diagram. You might want to check it out if you are more interested in a synchronous version of the API or you want to use an older version of Node.js.
Allows the creation of offline UML diagrams based on the yUML Syntax.
- Node.js v12+ (yuml2svg v5 uses ECMAScript modules, support is still experimental at the time of writing).
- Browser support through import maps or bundling (WebPack, Rollup, etc.).
- Unofficial support for Node.js v10 LTS (with the
--experimental-modules
and--experimental-worker
CLI flags). - Experimental support for Deno.
You can install it with yarn:
yarn global add yuml2svg # For CLI usage
yarn add yuml2svg # As local dependency
Or with npm:
npm --global install yuml2svg # For CLI usage
npm install yuml2svg # As local dependency
- Currently, the following diagram types are supported:
- Class
- Activity
- Use-case
- State
- Deployment
- Package
- Sequence
- Additional directives for altering diagram type and orientation
- Embedded rendering engine: No need to call an external web service
Please refer to the wiki page.
You can use the package to transform yUML diagrams to SVG via the Command-Line Interface.
# You can install the package globally (or use npx)
yarn global add yuml2svg
# Prints SVG document on the standard output
yuml2svg < diagram.yuml
# Note: On Windows Powershell, you may need to use cat command instead
cat diagram.yuml | yuml2svg
# Save SVG file to the disk
yuml2svg < diagram.yuml > diagram.svg
# Save SVG file to the disk using dark mode
yuml2svg --dark < diagram.yuml > diagram.svg
The API exports a function that accepts as arguments:
- A
Readable
stream, aBuffer
or astring
containing the yUML diagram. - An optional plain
object
containing the options for the rendering. - An optional plain
object
containing the options for Viz.js. Check it out if you are using this package in the browser. - An optional plain
object
containing the render options for Viz.js.
The API returns a Promise
which resolves in a string containing SVG document
as a string
.
The options for the rendering are:
dir
:string
The direction of the diagram "TB" (default) - topDown, "LR" - leftToRight, "RL" - rightToLefttype
:string
The type of SVG - "class" (default), "usecase", "activity", "state", "deployment", "package", "sequence".isDark
:boolean
Option to get dark or light diagramdotHeaderOverrides
:object
Option to customize output (not supported for sequence diagram)Please check out Viz.js wiki to get more the documentation of the last two parameters.
Here are some examples of a simple usage you can make of the API:
import fs from "fs";
import yuml2svg from "yuml2svg";
/**
* Renders a string or a Buffer into SVG with dark mode
* @param {string | Buffer | Readable} yuml The yUML diagram
* @returns {Promise<string>} callback The SVG document that represents the yUML diagram
*/
const renderDarkSVG = yuml => yuml2svg(yuml, { isDark: true });
/**
* Renders a given file into a SVG string asynchronously
* @param {string} filePath Path to the yUML diagram
* @returns {Promise<string>} callback The SVG document that represents the yUML diagram
*/
const renderFile = filePath => yuml2svg(fs.createReadStream(filePath));
/**
* Renders a given file into a SVG string asynchronously
* @param {string} filePath Path to the yUML diagram
* @param {{dir:string, type: string, isDark: boolean}} [options]
* @param {object} [vizOptions] @see https://github.com/mdaines/viz.js/wiki/2.0.0-API
* @returns {Promise<string>} callback The SVG document that represents the yUML diagram
*/
const renderFileWithOptions = (filePath, options, vizOptions) =>
yuml2svg(fs.createReadStream(filePath), options, vizOptions);
/**
* Generates a SVG file from a yUML file
* @param {string} inputFile Path to the .yuml document to read
* @param {string} outputFile Path to the .svg file to write
* @returns {Promise<>} Promise that resolves once the SVG file is written
*/
const generateSVG = async (inputFile, outputFile) => {
const svg = await yuml2svg(fs.createReadStream(filePath));
return await fs.promises.writeFile(outputFile, svg);
};
N.B.: yuml2svg is written using ES modules, it means it cannot be required
(require('yuml2svg')
will throw); although you still can use it from a CJS
script using dynamic import:
var fs = require("fs");
/**
* Renders a given file into a SVG string asynchronously
* @param {string} filePath Path to the yUML diagram
* @param {(Error, string)=>any} callback Async callback
*/
function renderFile(filePath, callback) {
import("yuml2svg")
.then(function(module) {
var yuml2svg = module.default;
return yuml2svg(fs.createReadStream(filePath));
})
.then(function(svg) {
callback(null, svg);
})
.catch(callback);
}
You can find a working example of a browser implementation using webpack here: yuml2svg-playground.
If you want to use streams, pass a ReadableStreamDefaultReader
or
ReadableStreamBYOBReader
object to the API:
import yuml2svg from "https://dev.jspm.io/yuml2svg@5";
const yumlOptions = {};
const vizOptions = {
workerURL:
"data:application/javascript,importScripts('https://unpkg.com/viz.js@2.1.2/full.render.js')",
};
fetch("https://raw.githubusercontent.com/aduh95/yuml2svg/master/test/test.yuml")
.then(response =>
response.ok
? yuml2svg(response.body.getReader(), yumlOptions, vizOptions)
: Promise.reject(response.text())
)
.then(svg =>
document.body.append(
new DOMParser().parseFromString(svg, "text/xml").documentElement
)
)
.catch(console.error);
Note: Only UTF-8 is supported when using streams.
- Thanks to the mdaines's port of Graphviz for JavaScript viz.js.
- Thanks to the jaime-olivares's VSCode extension.