d2/d2js/js
2025-02-18 18:27:25 +00:00
..
ci fix build command 2025-01-12 11:13:10 -07:00
examples d2js: updating render option processing, adding tests 2025-02-18 18:27:25 +00:00
src d2js: updating render option processing, adding tests 2025-02-18 18:27:25 +00:00
test d2js: updating render option processing, adding tests 2025-02-18 18:27:25 +00:00
wasm init d2.js 2025-01-12 10:50:05 -07:00
.gitignore separate node esm and browser esm builds 2025-01-12 21:36:19 -07:00
.prettierignore minified browser build 2025-01-14 11:39:18 -07:00
build.js migrate layout engines 2025-01-15 16:30:33 -07:00
bun.lockb init d2.js 2025-01-12 10:50:05 -07:00
CHANGELOG.md init d2.js 2025-01-12 10:50:05 -07:00
d2.wasm d2js: JSONify compile err msg 2025-02-04 10:01:28 -07:00
dev-server.js dev server changes 2025-01-15 11:37:04 -07:00
make.sh init d2.js 2025-01-12 10:50:05 -07:00
Makefile dev server changes 2025-01-15 11:37:04 -07:00
package.json bump version 2025-01-15 18:28:05 -07:00
README.md d2js: updating render option processing, adding tests 2025-02-18 18:27:25 +00:00

D2.js

npm version License: MPL-2.0

D2.js is a JavaScript wrapper around D2, the modern diagram scripting language. It enables running D2 directly in browsers and Node environments through WebAssembly.

Features

  • 🌐 Universal - Works in both browser and Node environments
  • 🚀 Modern - Built with ESM modules, with CJS fallback
  • 🔄 Isomorphic - Same API everywhere
  • Fast - Powered by WebAssembly for near-native performance
  • 📦 Lightweight - Minimal wrapper around the core D2 engine

Installation

# npm
npm install @terrastruct/d2

# yarn
yarn add @terrastruct/d2

# pnpm
pnpm add @terrastruct/d2

# bun
bun add @terrastruct/d2

Usage

D2.js uses webworkers to call a WASM file.

// Same for Node or browser
import { D2 } from '@terrastruct/d2';
// Or using a CDN
// import { D2 } from 'https://esm.sh/@terrastruct/d2';

const d2 = new D2();

const result = await d2.compile('x -> y');
const svg = await d2.render(result.diagram, result.options);

Configuring render options (see CompileOptions for all available options):

import { D2 } from '@terrastruct/d2';

const d2 = new D2();

const result = await d2.compile('x -> y', {
    sketch: true,
});
const svg = await d2.render(result.diagram, result.renderOptions);

API Reference

new D2()

Creates a new D2 instance.

compile(input: string, options?: CompileOptions): Promise<CompileResult>

Compiles D2 markup into an intermediate representation.

render(diagram: Diagram, options?: RenderOptions): Promise<string>

Renders a compiled diagram to SVG.

CompileOptions

All RenderOptions properties in addition to:

  • layout: Layout engine to use ('dagre' | 'elk') [default: 'dagre']

RenderOptions

  • sketch: Enable sketch mode [default: false]
  • themeID: Theme ID to use [default: 0]
  • darkThemeID: Theme ID to use when client is in dark mode
  • center: Center the SVG in the containing viewbox [default: false]
  • pad: Pixels padded around the rendered diagram [default: 100]
  • scale: Scale the output. E.g., 0.5 to halve the default size. The default will render SVG's that will fit to screen. Setting to 1 turns off SVG fitting to screen.
  • forceAppendix: Adds an appendix for tooltips and links [default: false]

CompileResult

  • diagram: Diagram: Compiled D2 diagram
  • options: RenderOptions: Render options merged with configuration set in diagram
  • fs
  • graph

Development

D2.js uses Bun, so install this first.

Building from source

git clone https://github.com/terrastruct/d2.git
cd d2/d2js/js
./make.sh all

If you change the main D2 source code, you should regenerate the WASM file:

./make.sh build

Running the dev server

You can browse the examples by running the dev server:

./make.sh dev

Visit http://localhost:3000 to see the example page.

Contributing

Contributions are welcome!

License

This project is licensed under the Mozilla Public License Version 2.0.