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/ifcx

v4.6.0

Published

IFC5 (IFCX) parser for IFC-Lite

Readme

@ifc-lite/ifcx

IFC5 (IFCX) parser for IFClite. Parses the JSON-based IFCX format with ECS composition, USD geometry, and federated layer support — and writes IFCX too. Compatible with the existing IFClite data pipeline so you can mix IFC4 STEP and IFC5 IFCX in the same scene.

Installation

npm install @ifc-lite/ifcx

Parse an IFCX file

import { parseIfcx } from '@ifc-lite/ifcx';

const buffer = await fetch('model.ifcx').then(r => r.arrayBuffer());

const result = await parseIfcx(buffer, {
  onProgress: ({ phase, percent }) => console.log(`${phase}: ${percent}%`),
});

console.log(`${result.entityCount} entities, ${result.meshes.length} pre-tessellated meshes`);
console.log(`Schema: ${result.schemaVersion}`); // 'IFC5'
// result also carries properties, quantities, relationships, spatial
// hierarchy, and decoded point clouds (result.pointClouds)

// Same MeshData[] shape as @ifc-lite/parser — feed straight into renderer
renderer.loadGeometry(result.meshes);

Geometry extraction uses a Rust-owned imported-geometry program. The synchronous extractGeometry and extractPointClouds helpers keep their existing return shapes and require no initialization. A bundled static JavaScript target is compiled from the same Rust implementation as the native and WebAssembly entry; it needs no runtime WebAssembly compilation or dynamic code generation. Composition, layer provenance, images and point-cloud codecs remain with this package's existing format adapter. Display buffers preserve the current Float32 staging and Y-up frame while the internal import owner retains original source coefficients and traversal identities.

Auto-detect format

import { detectFormat, parseIfcx } from '@ifc-lite/ifcx';
import { IfcParser } from '@ifc-lite/parser';

const format = detectFormat(buffer);
// 'ifcx' | 'ifc' | 'glb' | 'unknown'

if (format === 'ifcx') {
  await parseIfcx(buffer);
} else if (format === 'ifc') {
  await new IfcParser().parse(buffer);
}

Federated layers

IFCX supports overlays — a base file with the geometry, plus one or more layers that add or override properties. The package merges them in priority order:

import { parseFederatedIfcx } from '@ifc-lite/ifcx';

const [baseBytes, psetOverlayBytes, scheduleOverlayBytes] = await Promise.all(
  ['architecture.ifcx', 'fire-safety-overlay.ifcx', 'construction-schedule.ifcx'].map(
    (name) => fetch(name).then((r) => r.arrayBuffer()),
  ),
);

const result = await parseFederatedIfcx([
  { buffer: baseBytes, name: 'architecture.ifcx' },
  { buffer: psetOverlayBytes, name: 'fire-safety-overlay.ifcx' },
  { buffer: scheduleOverlayBytes, name: 'construction-schedule.ifcx' },
]);

// Properties from later layers take precedence over earlier ones —
// fire-safety FireRating values overwrite anything in the base.

Write IFCX

The low-level writer (IfcxWriter / exportToIfcx) lives in this package. For the full IFC-to-IFC5 conversion path (cross-schema, geometry as USD, mutations applied), use Ifc5Exporter from @ifc-lite/export:

import { Ifc5Exporter } from '@ifc-lite/export';

const exporter = new Ifc5Exporter(store, geometryResult);
const ifcx = exporter.export({ includeGeometry: true });
// ifcx.content → IFCX JSON string, save as .ifcx

For the low-level IfcxWriter, spatialHierarchy is a parsed snapshot. If a mutationView changes an IfcRelAggregates, IfcRelNests, or IfcRelContainedInSpatialStructure record, supply effectiveSpatialEdges containing the complete current spatial edge set (sourceId, targetId, relationshipType). The writer uses those edges to build children and raises an error if it detects such an edit without them. applyMutations: false uses the parsed hierarchy.

API

See the Parsing Guide and API Reference.

License

MPL-2.0

Textured IFCX mesh roundtrips use the declared ifclite::appearance::v1 / ifclite::image::v1 extension. Standard USD geometry and IFC owner paths remain readable without the extension. parseIfcx returns per-fragment UVs and shared RGBA pixels, plus optional original PNG/JPEG bytes retained without decoding. The shared wire exports are consumed by @ifc-lite/export; see texture portability for interoperability, allocation limits, and the native structural-only boundary.

IFCX files may carry ifclite::georeference::v1 on one model node. The parse result's optional georeferencing field preserves canonical IfcProjectedCRS (Name, metre MapUnit) and IfcMapConversion (Eastings, Northings, OrthogonalHeight, XAxisAbscissa, XAxisOrdinate, Scale) attributes. The viewer maps this into its existing federation alignment and map placement path. Invalid or conflicting placement records fail parsing. If an overlay fails composition or extraction, addIfcxOverlay removes the rejected layer so the previous stage remains usable.