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

pharos-tree

v0.0.1

Published

Create trees of data nodes. Stream tree transactions.

Downloads

22

Readme

pharos-tree

Build Status Coverage Status NPM version Davis Dependency Status

browser support

Create trees of data nodes. Stream tree transactions.

example

var pharosTree = require('pharos-tree'),
    assert     = require('assert');


var ptree = pharosTree();
ptree.createStream().pipe(process.stdout);

var task1 = ptree('/tasks/1');
task1.set('crawl');

ptree('/tasks/2').set('walk');
ptree('/tasks/3').set('run');

task1.child('status').set('pending');
assert(task1.child('status').version === 1);
task1.child('status').set('completed');
assert(task1.child('status').version === 2);

var tasks = ptree('/tasks').children;
assert(tasks.length === 3);
assert(ptree.pnode.isPrototypeOf(tasks[0]));
assert(tasks[0].data === 'crawl');
assert(tasks[0].children[0].name === 'status');

task1.child('status').remove();
assert(task1.children.length === 0);

The output of the above will be:

{"op":"create","pnode":{"path":"/tasks","version":1,"ctime":"2014-05-25T21:33:58.367Z","mtime":"2014-05-25T21:33:58.367Z","ctxid":2,"mtxid":2}}
{"op":"create","pnode":{"path":"/tasks/1","data":"crawl","version":1,"ctime":"2014-05-25T21:33:58.367Z","mtime":"2014-05-25T21:33:58.367Z","ctxid":3,"mtxid":3}}
{"op":"create","pnode":{"path":"/tasks/2","data":"walk","version":1,"ctime":"2014-05-25T21:33:58.367Z","mtime":"2014-05-25T21:33:58.367Z","ctxid":4,"mtxid":4}}
{"op":"create","pnode":{"path":"/tasks/3","data":"run","version":1,"ctime":"2014-05-25T21:33:58.367Z","mtime":"2014-05-25T21:33:58.367Z","ctxid":5,"mtxid":5}}
{"op":"create","pnode":{"path":"/tasks/1/status","data":"pending","version":1,"ctime":"2014-05-25T21:33:58.367Z","mtime":"2014-05-25T21:33:58.367Z","ctxid":6,"mtxid":6}}
{"op":"change","pnode":{"path":"/tasks/1/status","data":"completed","version":2,"ctime":"2014-05-25T21:33:58.367Z","mtime":"2014-05-25T21:33:58.367Z","ctxid":6,"mtxid":7}}
{"op":"remove","pnode":{"path":"/tasks/1/status","data":"completed","version":2,"ctime":"2014-05-25T21:33:58.367Z","mtime":"2014-05-25T21:33:58.367Z","ctxid":6,"mtxid":7}}

Table of Contents

api

ptree

var pharosTree = require('pharos-tree')

var ptree = pharosTree()

Create a new Pharos tree (ptree).

ptree.period

read-only, 'number'

The current period. This starts at 0, and is incremented on-demand. Each time this is incremented, the current transaction is reset to 0.

ptree.txid

read-only, 'number'

The current transaction ID. This starts at 1 (due to the automatic creation of the root node), and is incremented by 1 each time a pnode is added to or removed from the tree, or any time the data property of a pnode is changed.

ptree.pnodeCount

read-only, number

The number of pnodes currently within the ptree.

ptree.createStream(options)

Create new stream of change documents. options is an object with the following valid properties:

  • objectMode - causes createStream to return a stream in objectMode

In objectMode, the stream will produce data in the following format:

{
    op: "create|change|remove",
    pnode: <JSON representation of pnode, see below>
}

In simple (non-obeject) mode, the stream will produce new-line seperated stringified JSON objects in the above format.

returns stream

pnode

var pnode = tree('/path/of/pnode')

Create a new Pharos node (pnode).

pnode.path

read-only (read-write before pnode is persisted), string

Path of the pnode. Similar to Unix paths:

  • Must start with a '/', may not end with one
  • Path components are seperated by '/'
  • Valid characters are a-z, A-Z, 0-9, ., -, _

pnode.name

read-only, string

Contains the last component of the pnode.path. If he pnode.path === '/servers/web' then pnode.name === 'web'.

pnode.exists

read-only, true || false

true if the pnode has been persisted, otherwise false. A pnode is automatically persisted when a value is assigned to it's data property, or when a descendant is persisted. A pnode may also be manually persisted by calling pnode.persist().

Example:

if ( ptree('/tasks/1').exists ) {
    // do something
}

pnode.valid

read-only, true || false

true if the pnode was created with a valid path, otherwise false. It's possible to create an invalid pnode object, but it cannot be persisted.

Example:

if ( ptree('/tasks/'+id).valid ) {
    // do something
}

pnode.data

read-write

Data assigned to the pnode. Assignment (of a different value) will cause the pnode to be persisted if it is not already. Assignment will also increment the version of the pnode (or set to 1 if unassigned), and the transaction of the ptree.

pnode.version

read-only, number

The version of the pnode represents the number of times the data property has changed. Upon initial persistance, the version will be 1. Each time data changes, the version property will be incremented by 1.

pnode.parent

read-only, pnode

The immediate parent of the pnode.

Example:

var pnode = ptree('/servers/192.168.1.10');
assert(pnode.parent.path === '/servers');

pnode.parents

read-only, array of pnodes

An array of all ancestors of the pnode.

Example:

var pnode = ptree('/servers/192.168.1.10/processes/1234');
assert(pnode.parents.length === 4);
assert(pnode.parents[0].path === '/');
assert(pnode.parents[1].path === '/servers');
assert(pnode.parents[2].path === '/servers/192.168.1.10');
assert(pnode.parents[3].path === '/servers/192.168.1.10/processes');

pnode.children

read-only, array of pnodes

An array of all immediate children of the pnode.

Example:

var pnode = ptree('/servers');
ptree('/servers/192.168.1.10').set({ hostname: 'web1' });
ptree('/servers/192.168.1.11').set({ hostname: 'web2' });
ptree('/servers/192.168.1.12').set({ hostname: 'web3' });
assert(pnode.children.length === 3);
assert(pnode.children[0].data.hostname === 'web1');
assert(pnode.children[1].data.hostname === 'web2');
assert(pnode.children[2].data.hostname === 'web3');

pnode.childrenVersion

read-only, number

The childrenVersion property represents the number of times the children array has changed. This occurs when a child is added or removed. This does not reflect changes to the child nodes themselves.

pnode.ctime

read-only, date

A date object representing the time the pnode was persisted.

pnode.mtime

read-only, date

A date object representing the last time the pnode was modified (aka the data property was changed).

pnode.ctxid

read-only, number

The txid (transaction ID) in which the pnode was created.

pnode.mtxid

read-only, txid

The txid (transaction ID) in which the pnode was last modified.

pnode.set(value)

Assign value to pnode.data. Assignment (of a different value) will also increment the version of the pnode (or set to 1 if unassigned), and the transaction of the ptree.

returns pnode

pnode.unset()

Return pnode.data to an undefined state. Will increment the version of the pnode and the ptree transaction (if there was a previous assignment).

returns pnode

pnode.remove()

Removes the pnode from the ptree if it was persisted. This will increment the ptree transaction.

pnode.child(name)

Given the name property of a child, will return a reference to that child from the ptree. If the child does not exist, a new (unpersisted) child pnode will be returned.

returns child pnode

Example:

var weather = tree('/weather');
if ( !weather.child('Boston').exists ) {
    weather.child('Boston').set('http://api.openweathermap.org/data/2.5/weather?q=boston,ma');
}
console.log(weather.child('Boston').data);

pnode.persist()

Specifically cause the pnode to be persisted, without setting a value for pnode.data.

returns pnode

pnode.toJSON()

The JSON representation of a pnode:

{
    path: ...,
    data: ...,
    version: ...,
    ctime: ...,
    mtime: ...,
    ctxid: ...,
    mtxid: ...
}

testing

[grep=pattern] npm test [--dot | --spec] [--coverage | --testling]

options

  • --dot - output test results as dots instead of tap
  • --spec - output test results as spec instead of tap
  • --coverage - display text cover report
  • --testling - run tests in browser via testling (cannot be used with --coverage and expects both browserify and testling to be installed globally)

patterns

Only run test files matching a certain pattern by prefixing the test command with grep=pattern. Example:

grep=stuff npm test --dot

html coverage report

Open it with npm run view-cover or npm run vc

benchmarking

[grep=pattern] npm run benchmark

Benchmarks support running pattern-matched files in the perf directory just as tests do.