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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@koy/virtual-dom

v1.0.3

Published

A virtual DOM algorithm.

Readme

This is the official koy virtual dom library.

The library exports Element, diff and patch function that you can do some magical thing here.

Element

Element is a Functor that you can do like React.createElement but I add more special functions.

If you don't know about Functor, you'd better learn it and here is a good palce, Tupperware.

you can use Element.of when you want to create a dom object:

Element.of('div', {class: 'container'}, 'murakami')

The above is the basic usage, If you are not familiar with Functor, I suggest you just treat Element as it.

And for some programmer, may know of is a function that put some thing into a container, that means I need some functions to handle it's value, this is map、join、chain and ap. There are the basic functions in function programming.

const container = Element.of('div', {class: 'container'}, 'murakami')

map(({tagName, attributes, children}) => ['span', attributes, ...children], container) // equals to Element.of('span', {class: 'container'}, 'murakami')

const nestedContainer = Element.of(
  Element.of('div', {class: 'container'}, 'murakami')
)
join(nestedContainer) // equals to Element.of('div', {class: 'container'}, 'murakami')

chain(({tagName, attributes, children}) => Element.of(tagName, ...children), container) // equals to Element.of('div', 'murakami')

ap(Element.of(({tagName, attributes, children}) => ['span', attributes, ...children]), container) // equals to Element.of('span', {class: 'container'}, 'murakami')

This is some simple example, and If you are familiar with category theory, you may do some better things magically, I'm sorry, currently, I'm not good at it.

Note: If your Element isn't an appropriate dom object, you can't render it in the user interface.

diff

The diff funciton is the implementation of diff algorithm, you can use it to diff two Element node tree, here is an example:

diff(
  Element.of('div', {class: 'custom-container'}, Element.of('h2', 'Welcome to @koy/vitual-dom')),
  Element.of('div', {class: 'container'}, Element.of('h2', 'Welcome to koy'))
) // new Map([[0, [{type: 'ATTRIBUTES_CHANGE', attributes: {class: 'custom-container'}}]], [2, [{type: 'TEXT_REPLACE', text: 'Welcome to @koy/vitual-dom'}]]])

Note: The above comment is just a tip, isn't a real output when you use diff since I use Symbol and other data structure.

patch

The patch method can put the patches we get from diff method to real dom.

Node: Make sure you root dom node lastChild is your root Element.

const root = document.getElementById('app')
patch(new Map([[0, [{type: 'ATTRIBUTES_CHANGE', attributes: {class: 'container'}}]]]), root) // can change root lastChild's className to 'container'

Note: The above patch function's first parameter is just a tip, isn't a real Map structure when you use patch since I use Symbol and other data structure.

I'm glad to hear from you.