npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

d3-no-dom

v2.1.0

Published

Fully use d3 in environments without DOM

Downloads

31

Readme

d3-no-dom

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

Features

  • Simple API with maximum extensibility.
  • Support for asynchronous operations and API calls in render function
  • Utilities like sanitizing the HTML or outputting the base64 from generated svg
  • Tests covering most of the functionality ensuring robustness

Installation

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

The d3-no-dom library does not provide any underlying DOM implementation, giving users the flexibility to choose their preferred DOM library. Some options are:

npm i linkedom 
# or
yarn add linkedom 
# or
pnpm add linkedom 
  • jsdom: A more comprehensive and heavier DOM implementation, suitable for traditional backend environments like monolithic applications hosted on dedicated servers.
npm i jsdom 
# or
yarn add jsdom 
# or
pnpm add jsdom 

[!WARNING]
jsdom may not work on the Cloudflare Workers without specifying nodejs_compat flag due to use of the Node native modules

How to use

  1. At first, you must supply your own d3 instance and dom provider to the d3-no-dom's prepreSvgServerSideRenderer
  • using linkedom (recommended)

    import * as d3 from "d3"
    import { parseHTML } from "linkedom"
    
    // ...
    
    class Linkedom {
      window: { document: Document };
      constructor(html: string) {
        const { document, window } = parseHTML(html);
        this.window = { document };
        Object.assign(this.window, window);
      }
    }
    
    const { render } = prepareSvgServerSideRenderer({
      domProvider: Linkedom,
      d3Instance: d3
    });
  • using jsdom

    import * as d3 from "d3"
    import { JSDOM } from "jsdom"
    
    // ...
    
    const { render } = prepareSvgServerSideRenderer({
      domProvider: 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 (the underlying mechanism is integration with Virtual DOM)
//               you can make e.g. API calls here   
//           it can also be synchronous if not needed!
//              ╭────────────┤
//              │            │    
//              ↓            ↓ 
const result = await 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 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!