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

@rvoh/dream-plugin-json-snapshot

v2.1.1

Published

A plugin for extracting model attributes and associations into JSON

Readme

dream-plugin-json-snapshot

Serializes a Dream model and its entire association tree into a plain JSON object. Designed for internal use cases — retention archiving, compliance storage, internal audit trails. Not appropriate for user-facing data subject access requests (GDPR/CCPA "give me all my data").

Installation

pnpm add @rvoh/dream-plugin-json-snapshot

Usage

Apply the Snapshotable mixin and call takeSnapshot() on any instance:

import { Snapshotable } from '@rvoh/dream-plugin-json-snapshot'

class User extends Snapshotable(ApplicationModel) {
  // ...
}

const user = await User.firstOrFail()
const data = await user.takeSnapshot()
// { id, email, posts: [{ id, body, comments: [...] }], ... }

takeSnapshot() includes all DB columns and recursively follows HasMany and HasOne associations. BelongsTo and through associations are skipped by default.

Decorators

@SnapshotableIgnore()

Excludes a column or association from the snapshot:

class User extends Snapshotable(ApplicationModel) {
  @SnapshotableIgnore()
  public passwordDigest: DreamColumn<User, 'passwordDigest'>

  @SnapshotableIgnore()
  @deco.HasMany('AuditLog')
  public auditLogs: AuditLog[]
}

Associations with a DreamConst.required or DreamConst.passthrough and-clause must be decorated with @SnapshotableIgnore()takeSnapshot() throws at runtime if it encounters one that hasn't been excluded.

@SnapshotableFollowThrough()

Opts a specific through association back in:

@SnapshotableFollowThrough()
@deco.HasMany('Place', { through: 'hostPlaces' })
public places: Place[]

Data boundary safety

BelongsTo is always skipped, so traversal cannot cross ownership boundaries — starting from a User, you can only reach records that user owns. Many-to-many join models are safe by default: the traversal includes the join records but stops there since join models have only BelongsTo associations.

If you use @SnapshotableFollowThrough() to reach a shared resource (e.g. Group) through a join model, that resource's hasMany back to the join model will include join records for all owners — not their core records (still blocked by BelongsTo), but the join records themselves. Apply @SnapshotableIgnore() on that association if the join model carries sensitive metadata you don't want in the snapshot.

Auto-inclusion is intentional: for retention use cases, omission is the real compliance risk. The tool captures everything reachable as the schema evolves.

Performance

Uses batched preload queries to avoid N+1 for trees up to 4 levels deep; falls back to on-demand loading beyond that. Leverages the read replica if configured. Soft-deleted records are included (soft-delete scope is removed). Run in a background job — the result object can be large for deep association trees.

Questions?

Contributing

Dream is an open source library, so we encourage you to actively contribute. Visit our Contributing guide to learn more about the processes we use for submitting pull requests or issues.

Are you trying to report a possible security vulnerability? Visit our Security Policy for guidelines about how to proceed.