- Draw tables
- Draw relationships
- Draw self-referential relationships
- Support colours
- Support custom positions
- Support custom table dimensions
As a CLI tool, it automatically converts the ERD into an SVG (use t2erd-png to convert to png instead). In addition it will print the SVG code to the terminal.
git clone https://github.com/dosaki/t2erd
node ./t2erd/src/t2erd.js -i=/path/to/input.erd
or if installed globally via
npm install -g t2erd
t2erd -i /path/to/input.erd
Using as a library:
const t2erd = require('./t2erd.js');
const diagramText = `
[some_table]
some_column
`
const svgString = t2erd(diagramText);
Borrowed some of the syntax from https://github.com/BurntSushi/erd
Comments start with //
and are ignored by the parser.
// Comment
Anything to the right of a //
is also a comment
Foo // Comment
Table definitions start with a name between square brackets ([Table Name]
) and end when the file ends or when another table definition starts.
Column names are any line written under the beginning of a table definition and can be denoted with *
to mark them as a Primary Key or +
for a Foreign Key.
[Table1Name]
*primary key
column
+foreign key
You can optionally specify an alias for the table name (to make it easier for layout definition) by adding any text after a -
(any whitespace is ignored).
[Table1Name] - t1
*primary key
column
+foreign key
Styles can be declared anywhere after a table has been defined and will always belong to the previously defined table.
They always start with a {
and end with a }
. Properties must be a key/value pair separated by a :
. Each key/value pair can be separated by a ;
when inline.
The supported styles, so far are:
background: #96c7ff; // Table background colour
stroke: #385372; // Table border colour
color: #2c4056; // Table text colour
They can be declared inline:
[Table]
{background:red;stroke:green;}
column1
column2
And non inline:
[Table]
{
background:red;
stroke:green;
}
column1
column2
A table can have multiple styles definitions as well... if that's your thing. The latest ones will always overwrite the previous if they contain properties that had been defined already.
[Table]
{
background:red;
stroke:green;
}
column1
{background:blue;} # On second thought, I want blue and I don't feel like updating the definition above.
column2
Table relationships are declared with a table name followed by the cardinality a double dash, the other table cardinality and the table it links to.
table1 *--1 table2
Supported cardinality characters are:
*
for many1
for one
These can be declared anywhere even in the middle of table column definitions.
You can specify how you want the tables to be organized by declaring a layout. If your diagram is too complex I'd recommend using this since the automatic position calculations might not organize things the tables in the best way.
Any line starting with a |
is added to a layout in order of appearance:
|p| |
|u|i|
Where |
is the divider between the tables and between a set of |
is a table name or alias.
Each line of a layout can be separated by any other definition and it'll still belong to the layout
// Users table that only contains login info
[user] - u
{
background: #96c7ff;
stroke: #385372;
color: #2c4056;
}
*id
username
hashed_password
// This one contains other information about the user
[user_info] - i
{background:#ceffd0;stroke:#4d664e;}
*id
+user_id
email
bio
date_of_birth
registered_date
user_info 1--1 user
// Posts (a thread starts on a post without a parent)
[post] - p
*id
+poster
+parent
content
timestamp
post *--1 post
post *--1 user
|p| |
|u|i|