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

@igoitl/platform-contracts

v1.4.0

Published

Shared event contracts and REST API request/response types for the IGO Platform — the single source of truth consumed by igo-platform-api, igo-platform-web, and igo-platform-admin.

Readme

@igo/platform-contracts

Shared event contracts and REST API request/response types for the IGO Platform. This is the single source of truth igo-platform-api, igo-platform-web, and igo-platform-admin all consume — when an endpoint or event payload changes, the version here bumps and every consumer upgrades explicitly, per the platform's repo-isolation rule (frontends never import backend code; this package is the only thing that crosses the boundary).

Structure

src/
  events/             Zod-validated domain event envelopes/payloads (in-process EventEmitter2 today,
                       a real broker later — this package doesn't change either way)
  api/
    tenancy/          Wire types for the tenancy module's REST endpoints (auth, tenants, businesses)

Each future backend module (accounting, hrms, billing, platform) gets its own src/api/<module>/ namespace here as it's built — never duplicated across modules, per the platform's module-uniqueness rule.

Why Zod for events, plain types for API DTOs

Events cross a process/transport boundary with no compiler in between, so a malformed or stale-version payload needs a runtime check — Zod gives that in the same place the type is defined. REST DTOs are checked at the boundary by the server's own class-validator DTOs (which must stay structurally compatible with these) and by TypeScript at the call site in each frontend, so a second runtime validation layer here isn't buying anything extra.

Consuming this package

Not yet published to a real registry — publishConfig.access: "restricted" is set for when it is (a private npm org, per the platform's infra decisions), but until then, consumers use a local file/link dependency pointing at this sibling folder:

{ "dependencies": { "@igo/platform-contracts": "file:../igo-platform-contracts" } }

Run pnpm build here after any change — consumers resolve dist/, not src/, so a local-link consumer won't see an edit until it's rebuilt (pnpm dev runs tsc --watch for this while you're actively changing contracts alongside a consumer).

Versioning

Bump version in package.json for any breaking change to an existing type or event payload; additive changes (a new optional field, a new event) don't require a bump but should still get one to keep consumers' lockfiles honest about what they're actually running against once this is on a real registry.