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

@genoacms/internal

v0.1.0

Published

Contracts and vocabulary shared across the GenoaCMS packages, which are neither the CMS application nor a cloud abstraction

Downloads

167

Readme

@genoacms/internal

Contracts and vocabulary that more than one GenoaCMS package needs, and that belong to neither the CMS application nor the cloud abstraction.

It is empty on creation. Modules arrive here as the packages that need them are built.

Why it exists

@genoacms/cloudabstraction means one thing: what an adapter must implement in order to put GenoaCMS on a storage provider, a database, a secret store. That is the promise its name makes, and it is the promise a person writing an adapter reads it for.

Things that are shared but are not that had been accumulating there anyway, because it was the only package everything already depended on. The permission vocabulary is the clearest case — no adapter implements a permission table, yet it sat among the adapter contracts because genoa.config declares roles and the config types live there too. Each such addition is defensible alone and wrong in aggregate: the package stops meaning what its name says, and an adapter author reads past contracts that have nothing to do with them.

This package is where those live instead.

What belongs here

A module belongs here when both are true:

  1. more than one package needs it — otherwise it belongs to the package that uses it;
  2. it is not something a third party implements to plug GenoaCMS into a platform.

Concretely, that is the shared vocabulary (permission names and the rules for reading them) and the extension points that are not cloud services — beginning with the language adapter contract, which someone adding Kotlin or Swift support must depend on without depending on the CMS itself.

What does not belong here

| If it is… | it goes to | | :--- | :--- | | implemented by an adapter for a platform | @genoacms/cloudabstraction | | used only by the CMS application | @genoacms/core | | a language's parser, analyser or compiler | that language's adapter package | | consumed only by a client application | @genoacms/sdk |

"Shared" alone is not a reason. Two packages happening to use the same helper is a case for copying it or for one depending on the other, not for a third package in between. The bar is that the thing is genuinely part of the contract between packages.

Published, despite the name

"Internal" describes the audience, not the visibility. The package is published because a third-party language adapter is compiled against these contracts, and a dependency that cannot be installed is not an extension point. Nothing here is a stable public API for consumer applications — those use @genoacms/sdk.

Layout

Plain ESM with a hand-written .d.ts beside each module, matching @genoacms/cloudabstraction. There is no build step anywhere outside @genoacms/core, and this package does not introduce one.