Skip to content

πŸ“Š Fully use D3.js (Data Driven Documents) in environments without DOM. Perfect for serverless e.g. Vercel Functions

License

Notifications You must be signed in to change notification settings

neg4n/d3-no-dom

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

14 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

d3-no-dom

Fully use d3.js in environments without DOM, such as Cloudflare Workers or Vercel Functions

Features

  • Extensible and simple API.
  • Support for asynchronous operations
  • Utilities like sanitizing the HTML or outputting the base64 from generated svg
  • Tests covering most of the functionality

Installation

d3-no-dom's peerDependencies are jsdom and d3. These ones are not bundled into this package itself for extensibility purposes - d3-no-dom is just a wrapper around these libraries' functionality

npm i d3-no-dom d3 jsdom
# or
yarn add d3-no-dom d3 jsdom
# or
pnpm add d3-no-dom d3 jsdom 

How to use

  1. At first, you must supply the own peers instances to the d3-no-dom
import * as d3 from "d3"
import { JSDOM } from "jsdom"

// ...

const { render } = prepareSvgServerSideRenderer({
  jsdomInstance: JSDOM,
  d3Instance: d3
});
  1. Next, use the render function. It provides everything you need in order to fully use d3.js on the server side along with virtual DOM
const result = render(async ({ d3Selection, svgNode, currentDom }) => {
//      ↑                            ↑        ↑          ↑            
//      β”‚          d3 selected       β”‚        β”‚          β”‚
//      β”‚          object to work on β•―        β”‚          β•° whole DOM  
//      β”‚                                underlying
//      β•° rendered svg's           svg DOM node to work on
//   source, as HTML or base64   
})
  1. (Optionally) adjust your configuration or prepareSvgRenderer's options or the render function's options directly in order to e.g. disable sanitizing the HTML or control the return value (whether it should be HTML or base64 - where second is specifically useful with usage with satori)

License & contributing

The MIT License. All contributions are welcome!