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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ifc-lite/flow

v0.4.0

Published

Keyed-data graph runtime for BIM workflows: typed ports, item/list/group lifting, memoised evaluation, and element tracking for re-runnable graphs

Readme

@ifc-lite/flow

Keyed-data graph runtime for BIM workflows: the engine behind ifc-lite's node graphs. Pure TypeScript, no DOM, no SDK dependency — the same graph evaluates in the browser viewer and in the headless CLI.

What it does

  • One data model. Every value on an edge is an Item, a List, or a Group (lists keyed by string: GlobalId, storey, sheet name, grid intersection). Tables carry typed columns with IFC value types, units and the property they were read from.
  • Lifting instead of data trees. A port declares item, list or group access. The scheduler lifts a node over lists by lacing (shortest, longest, cross) and over groups by key — branches match when their keys are equal, never by position. Unmatched keys are reported, not silently dropped.
  • Memoised evaluation. Topological order, content-digested inputs, per-model revisions for nodes that read the model, a structured run log with per-lane errors.
  • Element tracking. A write node's output survives re-runs: GlobalIds are derived from a user-visible tracking key and the lane key, vanished lanes are removed, and the tracked set is pinned to the model state it was made against.
  • Documents. *.flow.json is git-diffable, hand-validated, and migrated by version.

Install

npm install @ifc-lite/flow

Usage

import { NodeRegistry, runFlow, parseFlowDocument, list } from '@ifc-lite/flow';

const registry = new NodeRegistry<{ names: string[] }>().register({
  type: 'demo.upper',
  title: 'Upper-case',
  category: 'demo',
  inputs: [{ name: 'text', type: { kind: 'scalar', access: 'item' } }],
  outputs: [{ name: 'upper', type: { kind: 'scalar', access: 'item' } }],
  params: [],
  capabilities: [],
  run: (_ctx, inputs) => ({ upper: String(inputs.text).toUpperCase() }),
});

const doc = parseFlowDocument(JSON.stringify({
  flowVersion: 1, id: 'demo', name: 'demo', capabilities: [], inputs: [], outputs: [],
  nodes: [{ id: 'u', type: 'demo.upper' }], edges: [],
}));

const result = await runFlow(doc, { host: { names: [] }, registry });
console.log(result.ok, result.reports);

Node libraries over the ifc-lite SDK live in @ifc-lite/flow-nodes.

License

MPL-2.0