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

@mostajs/module-contract

v0.1.1

Published

Le contrat N0 que tout module @mostajs conforme au démarrage (ModuleRegistration, WireManifest…). Types purs, zéro dépendance. Extrait de @mostajs/socle pour supprimer l'inversion N0→N1.

Readme

@mostajs/module-contract

Auteur : Dr Hamid MADANI [email protected] · Licence : AGPL-3.0-or-later Niveau : N0 · ZÉRO dépendance · Types purs (aucun code exécutable).

Le contrat que tout module @mostajs remplit pour se déclarer au démarrage : la forme de ModuleRegistration, WireManifest, SocleConfig, et tout le vocabulaire des contributions (SchemaDefinition, PermissionDefinition, RouteRegistration, PageRegistration, MenuContribution…).

C'est une interface, pas une implémentation. Un module s'y conforme ; il ne dépend pas de qui la consomme.

Pourquoi ce paquet existe

Ces types vivaient dans @mostajs/socle (N1), l'orchestrateur d'amorçage. Conséquence : toute primitive N0 qui voulait se déclarer — orm, ui, themes — devait importer depuis l'orchestrateur, c'est-à-dire dépendre vers le haut.

mostajs-layer-lint (§5.bis) ne le signalait pas… parce que la règle elle-même avait dû inscrire socle sur une liste blanche (BASE) pour les N0. Une dérogation dans les règles est toujours le symptôme d'une couche mal posée, jamais sa solution.

En descendant le contrat en N0 :

  • orm, ui, themes se conforment à une interface N0 — plus aucune dépendance vers le haut ;
  • socle implémente ce contrat (il le ré-exporte pour compatibilité) ;
  • socle sort de la liste blanche BASE, et l'exception §5.bis.1 disparaît des règles.

Le signe d'un bon correctif d'architecture : il retire un cas particulier. Vérifié — 240 modules, 0 faute, sans l'exception.

Le flux (analogie BIOS)

   socle (BIOS)                    application (init OS)
   ├─ découvre les modules         ├─ dépend de socle  ── reçoit les déclarations
   ├─ collecte leurs déclarations  └─ dépend de orm    ── crée les schémas collectés
   └─ remet le tout à l'app

orm ne connaît pas socle. socle ne connaît pas orm. Leur seul point commun est ce contrat — et il est sous les deux, en N0.

Usage

import type { ModuleRegistration } from '@mostajs/module-contract'

// Un module qui CONTRIBUE se conforme au contrat :
export function register(registry: { register(r: ModuleRegistration): void }): void {
  registry.register({
    manifest: { name: 'rbac', package: '@mostajs/rbac', version: '2.7.0', type: 'functional', priority: 50, register: './dist/register.js' },
    schemas: [{ name: 'User', schema: UserSchema }],
    permissions: { permissions: {}, definitions: [], categories: [] },
  })
}

Un module d'infrastructure qui ne contribue rien (comme orm) n'importe même pas ce contrat : son seul wire.json (présence) suffit.

Contenu du contrat

ModuleRegistration · WireManifest · ModuleType · SchemaDefinition · RepositoryFactory · PermissionDefinition · CategoryDefinition · RoleDefinition · MenuContribution · RouteRegistration · PageRegistration · ResolvedPage · SocleConfig · IModuleRegistry · …

Tests

npm test   # 14 tests — le contrat exporte bien chaque type, et ne dépend de RIEN

L'implémentation, elle, est prouvée par les 25 tests de @mostajs/socle, qui consomme ce contrat.