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

morphlex

v1.0.5

Published

An optimal DOM morphing library written in TypeScript.

Readme

Morphlex is a ~2.4KB (gzipped) DOM morphing library that transforms one DOM tree to match another while preserving element state and making minimal changes.

What makes Morphlex different?

  1. No cascading mutations from inserts. Simple inserts should be one DOM operation.
  2. No cascading mutations from removes. Simple removes should be one DOM operation.
  3. No cascading mutations from partial sorts. Morphlex finds the longest increasing subsequence for near optimal partial sorts.
  4. It uses moveBefore when available, preserving state.
  5. It uses isEqualNode, but in a way that is sensitive to the value of form inputs.
  6. It uses id sets inspired by Idiomorph.

Installation

npm install morphlex

Or use it directly from a CDN:

<script type="module">
  import { morph } from "https://www.unpkg.com/morphlex@latest/dist/morphlex.min.js"
</script>

Usage

import { morph, morphInner } from "morphlex"

// Morph the entire element
morph(currentNode, newNode)

// Morph only the children of the current node
morphInner(currentNode, newNode)

// Morph the entire document
morphDocument(document, newDocument)

Options

Both morph and morphInner accept an optional third parameter for configuration:

morph(currentNode, newNode, {
  preserveChanges: true,
  beforeNodeAdded: (parent, node, insertionPoint) => {
    console.log("Adding node:", node)
    return true // return false to prevent addition
  },
})

Available Options

  • preserveChanges: When true, preserves modified form inputs during morphing. This prevents user-entered data from being overwritten. Default: false

  • beforeNodeVisited: Called before a node is visited during morphing. Return false to skip morphing this node.

  • afterNodeVisited: Called after a node has been visited and morphed.

  • beforeNodeAdded: Called before a new node is added to the DOM. Return false to prevent adding the node.

  • afterNodeAdded: Called after a node has been added to the DOM.

  • beforeNodeRemoved: Called before a node is removed from the DOM. Return false to prevent removal.

  • afterNodeRemoved: Called after a node has been removed from the DOM.

  • beforeAttributeUpdated: Called before an attribute is updated on an element. Return false to prevent the update.

  • afterAttributeUpdated: Called after an attribute has been updated on an element.

  • beforeChildrenVisited: Called before an element's children are visited during morphing. Return false to skip visiting children.

  • afterChildrenVisited: Called after an element's children have been visited and morphed.