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

@khatastroffik/treeifier

v1.0.0

Published

A Typescript/JavaScript library generating a tree representation of an object

Downloads

2

Readme

treeifier

A (dependency-free!) Typescript/JavaScript library generating a structured (tree) representation (textual or objectual) of any object. treeifier should make your "valuables" visible!

treeifier is published as npm package under MIT license.

treeifier-utils is published as npm package under MIT license.

screenshots

Examples of object representation/output as generated using the integrated defaultProcessor (no need to specify it explicitly) and the defaultColoredValuesProcessor provided in the treeifier-utils library:

| default output |input object → output representation| |:---:|:---:| | ASCII tree representation | object transdformation | |myTreeifier.process( aPerson )|myTreeifier.process( inputObject, 'object', TreeifierUtils.defaultColoredValuesProcessor )|

Note:

  • See the additional library package treeifier-utils for more predefined representation/output formats.
  • The colors can be adjusted using the chalk library.

introduction

Treeifier is able to process any kind of javascript input e.g. objects (structured or not), arrays etc.

  • Treeifier evaluates the types of the contained property values (empty, string, number, date, function, symbol, array, array of objects, non empty objects) and adapt the output/representation accordingly.
  • A client application may adapt the representation as needed in its own representation processor, using the analysis performed i.e the information ascertained by Treeifier. e.g. to generate a DOM elements structure (objectual representation) or an alternative output string format (textual representation).
  • Treeifier can be integrated in multiple kind of applications: it is available as a TS (typescript), CJS (nodejs) or ESM (browser) module.

What's the structure of my object instance, array, variable ...? What's its content, what's inside?

This are questions treeifier aims to answer in a very pragmatic way i.e. in form of a tree representation of the actually observed "valuable" (the intransparent object of your attention).

How to...? Is treeifier eaysy to use?

Indeed!

installation and first-step

Install the treeifier library in your (typescript/javascript) project as a development dependency (example below) or standard dependency (replace --save-dev with --save ) depending on your project's requirements:

> npm install --save-dev @khatastroffik/treeifier

and then use it as in

import { Treeifier } from "treeifier";

// output as ascii tree using default processor
console.log( new Treeifier().process( myObject ) );

or

// output as ascii tree using default processor
const treeifier = new Treeifier();
const objectRepresentation: string = treeifier.process( myObject );
console.log( objectRepresentation );

That's it!

use cases

Among others:

  • transformation: transform an input object into an alternative representation like a string list, XML, HTML etc. strings or object structures
  • debugging and logging: display the current state of an object in console, stream, file...
  • documentation: visuallize the structure of an object, including the type of its properties
  • data simplification: deep copy the "values" from a complex class instance into a (simple) data object e.g. a DTO
  • user friendly visualization: visualize the content of folders or "structured data" as a tree.

Note: the transformation use case could aim at displaying data on the UI directly i.e. per DOM element creation. See the sample browser application.

usage

Below are some examples demonstrating some of the use cases as defined above:

display a tree representation of an object in the console

This example makes use of the standard processor (integrated in the Treeifier instance).

import { Treeifier } from "treeifier";

console.log( new Treeifier().process( myObjectInstance ) );

treeify an object using your own processor

This example makes use of of a processor as provided by the client application.

import { Treeifier } from "treeifier";

function myProcessor ( node: TreeifierNode ): any => {
  ...
  // generate the representation of the current node
  ...
  return representation_of_the_current_node;
}

const treeifier = new Treeifier();
console.log( treeifier.process( myObjectInstance, '', myProcessor) );

To learn how to write your own processor function, see the documentation on Writing a "processor" function.

treeifier principles

INPUT

your object instance / your variable. It can be of any (unknown) shape.

e.g. (simplified)

const person = {
  name: {
    firstName: 'Bobby',
    lastName: 'Brown'
  },
  age: 30,
  dateOfBirth: new Date( 1990, 11, 11 ), // => 11.12.1990
  interests: ['music', 'skiing'],
  greeting: function (): string {
    return 'Hi! I\'m ' + this.name.firstName + '.';
  }
};

PROCESSOR

a single function used to shape the representation of the input object i.e. shape the branches and leafs exposed as process result:

  • defaults: use one of the default processors as provided in the treeifier-utils module
  • BYOP: bring your own processor function
    • sort-as-you-need: organize the output as required (some example "sort" functions are included)
    • filter-as-you-need: select the branches and leafs you'd like to output
    • shape-as-you-want: generate the "processResult" as needed i.e. as a specifically formated string or object.

Note the resulting tree may be a simple list i.e. it doesn't need to be structured at all, depending on your implementation goals.

See the documentation on Writing a "processor" function

OUTPUT

a textual or objectual representation of the treeified input, according to the utilized processor.

  • textual: as ascii-ed tree, as html or xml source code, as CSV, as ...
  • objectual: as object structure mapping the input structure i.e. DOM elements, HTML or XML node structure etc.

textual output

example of ascii-ed tree representation using the default processor provided by Treeifier as per new Treeifier().process( person, 'person' ):

  person
  ├─ name
  │  ├─ firstName : Bobby
  │  └─ lastName : Brown
  ├─ age : 30
  ├─ gender : male
  ├─ dateOfBirth : 11.12.1990
  ├─ interests : [music, skiing]
  └─ greeting : function

objectual output

The processor may return "objects" instead of "strings" back up to the Treeifier.process function result. The result of the processing will then be the "root" as generated by the processor, hence the processor should account to generate/provide a root object.

e.g. const DOM_RootObject = new Treeifier().process( person, 'person', My_DOM_Elements_Processor ).

objectual

See the documentation on Writing a "processor" function

API

Please see the API documentation.

debugging

Please see the debugging documentation.