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

@btec/entity-base

v0.0.1

Published

A lightweight, immutable and schema-driven base class for data modeling with validations and relationships.

Readme

🧩 EntityBase

EntityBase is a lightweight, schema-driven, immutable base class for modeling data in modern JavaScript/TypeScript applications — especially useful in frontend frameworks like React and Vue.

It provides declarative validations, relationship handling (hasMany, belongsTo), built-in serialization for APIs, and a powerful yet minimal architecture for managing application state with confidence.


🚀 Features

  • ✅ Immutable by design – all updates return new instances
  • 🔁 Deep relationship support (hasMany, belongsTo)
  • 🧪 Validation and error handling
  • 📦 Serialization for toParams() and toObject()
  • ⚙️ Automatic getters for attributes and relations
  • 🧠 Optimized for React/Vue reactivity systems
  • 🧼 Easy-to-extend with custom logic or override methods

📦 Installation

npm install --save @btec/[email protected]

Or if you're using it directly in a monorepo or internal project, simply import the EntityBase class as a base for your models.


🧱 Example Usage

Defining a Model

import EntityBase from '@btec/entity-base'

class User extends EntityBase {
  static defaultAttributes = {
    name: '',
    age: 0,
    company: null,
    cars: []
  };

  static belongsTo = { company: Company };
  static hasMany = { cars: Car };

  static validates = {
    name: [(val) => ({ isValid: !!val, message: 'is required' })],
    company: [
      (val, entity) => ({
        isValid: !val || entity.age >= 18,
        message: 'is allowed only for users over 18'
      })
    ]
  };
}

Creating and Updating Instances

const user = new User({ name: 'Alice', age: 25 });
const updatedUser = user.set('name', 'Bob');

console.log(user.name);        // Alice
console.log(updatedUser.name); // Bob

Validating

const invalidUser = new User({ age: 16, company: { name: 'ACME' } });
const validated = invalidUser.validate();

console.log(validated.isValid()); // false
console.log(validated.errors.fullMessages());
// → [ 'Company is allowed only for users over 18', 'Name is required' ]

🌐 Serialization

toParams() for API submission

const payload = user.toParams();
// { name: 'Alice', age: 25, company: { name: 'ACME' }, cars: [ { ... }, ... ] }

toObject() for plain JS structure

const raw = user.toObject();

🔍 Relationship Access

user.company.name
user.cars.get(carId)
user.array('cars').map(car => car.model)

🧪 Testing

We recommend using Jest or Vitest for unit testing. Key testing areas include:

  • Immutability (set, updateAttributes)
  • Validation rules
  • Relationship behavior
  • Serialization (toParams, toObject)
expect(user.set('name', 'Bob')).not.toBe(user);
expect(user.validate().errors.isEmpty()).toBe(true);

⚒️ Advanced Features

  • addNested(relationName, attrs)
  • updateNested(relationName, id, attrs)
  • updateManyNested(relationName, attrs, ids?)
  • clone() – deep clone for Errors and attributes
  • isNewEntity() / isPersisted()
  • idOrToken — returns id or generated _token

📘 Documentation

All API features, internal methods, and extensibility options are documented in:


👨‍💻 Contributing

We welcome suggestions, improvements, and bug reports! Feel free to submit an issue or pull request.


📄 License

MIT License.


🧠 Final Notes

EntityBase helps you design predictable, testable, and highly maintainable data models in the frontend world. Whether you're handling nested form state or syncing data with an API — it gives you a clean, immutable foundation to build upon.

Happy coding! 🔨🤖