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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@abimongo/core

v1.1.4

Published

Enterprise-grade MongoDB ORM built on the official MongoDB driver.

Readme

@abimongo/core

npm version Release workflow

A production-ready, TypeScript-first ORM/ODM for MongoDB built on the official MongoDB Node.js driver. @abimongo/core focuses on developer ergonomics, multi-tenant support, caching, and first-class GraphQL integration while keeping the API small and extensible.

Key capabilities

  • Schema validation and type-safe models

  • Middleware (pre/post hooks) for lifecycle events

  • Multi-tenancy with tenant context and lazy connection management

  • Redis-backed caching utilities for query results

  • Transaction helpers for multi-step operations

  • Aggregation pipeline helpers and convenience utilities

  • Change streams / real-time change listeners

  • Optional GraphQL schema generation and resolver wiring

  • CLI scaffolding and project bootstrap utilities


    Installation

    Install from npm or using yarn:

    npm install @abimongo/core
    # or
    yarn add @abimongo/core

    Local development note

    If you're developing or testing @abimongo/core locally, avoid installing a runtime copy of graphql inside the @abimongo/core repository itself. graphql is a peer dependency and should be provided by the consuming app. Installing graphql in both the library repo and the consumer app can cause Node to load multiple physical copies of the graphql runtime which leads to runtime errors such as "GraphQLSchema from another module or realm".

    Recommended approaches when developing locally:

    • Use a pnpm workspace or pnpm add ../path/to/abimongo/packages/core from the consumer app so the consumer's node_modules provides graphql.

    • If you need to run pnpm install in the abimongo repo for dev work, avoid leaving graphql installed there while testing the consumer app; you can reinstall dev dependencies after testing.

    • Treat graphql as a peer dependency (it already is) and ensure the consumer app has an explicit graphql dependency or overrides configured.

      If you are using TypeScript, make sure tsconfig.json is configured to include node types and target a supported ECMAScript version.


      Quick start

      This example demonstrates model creation and basic CRUD operations using the high-level API.

      import { AbimongoClient } from '@abimongo/core';
      
      const clientDB = new AbimongoClient('mongodb://localhost:27017');
      
      await clientDB.connnect();
      console.log('MongoDB connection successful.')
      import { AbimongoSchema, AbimongoModel } from '@abimongo/core';
      
      const userSchema = new AbimongoSchema({
        name: { type: String, required: true },
        email: { type: String, required: true, unique: true },
        age: { type: Number },
      });
      
      const UserModel = new AbimongoModel({
        collectionName: 'users',
        schema: userSchema,
      });
      
      async function example() {
        const created = await UserModel.create({ name: 'Jane', email: '[email protected]', age: 28 });
        const found = await UserModel.find({ age: { $gte: 18 } });
        await UserModel.updateOne({ email: '[email protected]' }, { $set: { age: 29 } });
        await UserModel.deleteOne({ email: '[email protected]' });
      }
      
      example().catch(console.error);

      Multi-tenancy

      @abimongo/core includes helpers for multi-tenant applications. You can register tenants with connection URIs and use a tenant-aware model resolver.

      Example (Express middleware + lazy tenant connections):

      import express from 'express';
      import { applyMultiTenancy, getTenantModel } from '@abimongo/core';
      
      const app = express();
      
      const tenants = {
        tenant1: 'mongodb://localhost:27017/tenant1',
        tenant2: 'mongodb://localhost:27017/tenant2',
      };
      
      applyMultiTenancy(app, tenants, { headerKey: 'x-tenant-id', initOptions: { lazy: true } });
      
      app.get('/users', async (req, res) => {
        const tenantId = req.headers['x-tenant-id'] as string;
        const UserModel = await getTenantModel({ modelName: 'User', tenantId });
        const users = await UserModel.find();
        res.json(users);
      });
      
      app.listen(3000);

      Notes

    • Tenant connections are managed by MultiTenantManager. Use registerTenant at runtime to add tenants dynamically.

    • TenantContext provides a way to run code bound to a tenant without threading tenant ids through every function call.


      Schema validation & middleware

      Define schemas with validation rules (types, required, min/max, unique) and attach middleware hooks for lifecycle events.

      const productSchema = new AbimongoSchema({
        name: { type: String, required: true },
        price: { type: Number, required: true, min: 0 },
        category: { type: String },
      });
      
      productSchema.pre('save', async (doc) => { /* ... */ });
      productSchema.post('save', async (doc) => { /* ... */ });

      Transactions

      Helpers are provided to make transactional updates simpler. These utilities use MongoDB sessions under the hood.

      await UserModel.updateWithTransaction({ email: '[email protected]' }, { $set: { age: 30 } });

      Caching

      Use built-in Redis-backed caching helpers for expensive aggregation queries or frequently requested results.

      const cached = await UserModel.aggregateWithCache([
        { $match: { active: true } },
      ], 'active_users_cache', 300);

      Change streams

      Listen for real-time changes on collections with a simple watcher API.

      UserModel.watchChanges((change) => {
        console.log('change:', change);
      });

      GraphQL integration

      Optional GraphQL helpers can generate type definitions and resolvers from your models. The feature supports queries, mutations and subscriptions and includes RBAC hooks.

      API (examples):

    • AbimongoGraphQL.generateSchema({ models?, options? }) – generate an executable GraphQL schema.

    • schema.customResolvers(...) and schema.customTypeDefs(...) – extend generated schema with custom definitions.

      Example (Apollo Server):

      import { AbimongoGraphQL } from '@abimongo/core';
      import { ApolloServer } from '@apollo/server';
      
      const schema = AbimongoGraphQL.generateSchema({ models: [/* models */], options: { enableSubscriptions: true } });
      const server = new ApolloServer({ schema });
      // start the server with your preferred method

      Note: GraphQL generation is powerful but may be considered experimental for very complex schemas—review generated types before using them in production.


      CLI scaffolding

      The accompanying CLI accelerates project setup and scaffolding of models, schemas and GraphQL components.

      # Run the CLI without installing globally (recommended):
      npx abimongo init my-app-name
      
      # Example: scaffold with GraphQL, multi-tenant and logger support (no installs by default):
      npx abimongo init my-app-name --with-graphql --multi-tenant --logger
      
      # If you want the scaffold to auto-install dependencies into the generated project, pass `--install`:
      npx abimongo init my-app-name --with-graphql --multi-tenant --logger --install
      
      # Notes:
      # - By default the scaffold does NOT run `npm`/`pnpm` installs. This keeps scaffolding fast and CI-friendly.
      # - Use `--install` to opt into installing `@abimongo/core` and `@abimongo/logger` into the generated project.
      # - The `abimongo` binary is provided by `@abimongo/core` and is safe to run via `npx` or after installing the package locally.

      Flags will toggle features in the generated abimongo.config.json. If you omit a flag you can still enable features later by editing the config.

      See the docs-site for a full CLI guide: docs-site/docs/guides/CLI-Scaffolding.md


      RBAC

      Built-in role-based access control utilities make it straightforward to protect resolvers or REST handlers.

    • enforceRBAC(resolver, action) — wrap resolvers with permission checks

    • getRBACAction(resolver) — inspect mapped action

      The RBAC layer integrates with caching for efficient permission evaluation.


      Plugin system

      Extend the platform using plugins that can add behavior at the model, schema or manager layer.


      Bootstrapping

      AbimongoBootstrap helps initialize new projects, creating a recommended folder layout and a starter abimongo.config.json.


      API reference (short)

      Abbreviated list of commonly used APIs. See the generated docs in the repo for full signatures and options.

    • AbimongoModel

      • create(doc)
      • find(filter)
      • updateOne(filter, update)
      • deleteOne(filter)
      • aggregate(pipeline)
    • TenantContext

      • run(tenantId, callback)
      • getTenantId()
    • MultiTenantManager

      • registerTenant(tenantId, uri)
      • getClient(tenantId)
    • AbimongoGraphQL

      • generateSchema({ models, options })
    • RBAC utilities

      • enforceRBAC(resolver, action)

      Contributing

      Contributions are welcome. Please check CONTRIBUTING.md in the repository root for guidelines on code style, tests and committing.


      License

      This package is published under the MIT license. See the project LICENSE for details.


      Support

      If you find a bug or need help, open an issue in the repository.


      Acknowledgements

      Thanks to the MongoDB Node.js Driver team and the community contributors.