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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@mocking-bird/mongoose

v1.2.0

Published

Generates fixtures for `mongoose`. Simply provide the schema or model, and it will generate mock data based on the types and constraints of the schema.

Downloads

6,708

Readme

Mongoose Fixture

Generates fixtures for mongoose. Simply provide the schema or model, and it will generate mock data based on the types and constraints of the schema.

Table of contents

Installation

npm i -D @mocking-bird/mongoose

Usage

import { Schema } from 'mongoose';
import { MongooseFixture } from '@mocking-bird/mongoose';

const schema = new Schema({
  name: String,
  email: String,
  age: { type: Number, min: 18, max: 100 },
  workEmail: String,
  address: {
    street: String,
    city: String,
    country: String,
  },
  createdAt: Date,
  updatedAt: Date,
});

const fixture = new MongooseFixture(schema);

const data = fixture.generate();

Example output:

{
  "name": "Turner, Thompson and Mueller",
  "email": "[email protected]",
  "age": 55,
  "workEmail": "[email protected]",
  "address": {
    "street": "Apt. 123 1234",
    "city": "Lake Ethylburgh",
    "country": "Gambia"
  },
  "createdAt": "2023-09-11T05:38:59.576Z",
  "updatedAt": "2024-02-26T08:25:16.412Z",
  "_id": "a84f58e2fcff9dfaf148d7bf"
}

Bulk generation

const data = fixture.bulkGenerate(1000);

Accurate data generation

(Back to top)

Generated data are not only random-random but also contextually accurate based on field names and types. It leverages the fuzzy search, or formally, approximate string search algorithm to search for the suitable faker to generate realistic data that relate to the field.

For example:

  • workEmail -> [email protected]
  • employeePhoneNumber -> 550-459-6013
  • uploadedFileName -> file-1234.pdf

Of course, there are still some limitations when it comes to complex field names with multiple parts, in which case the default fakers are applied. The default fakers are fallbacks in case the fuzzy search score is not high enough. The default fakers may return, depending on the field type, a random string, number, or date, and so on.

Options

(Back to top)

FixtureOptions

| name | type | default | description | | ------------------ | ------------- | ----------- | ----------------------------------------------------------- | | rules | Rule[] | undefined | Custom rules to apply for fixture generation | | exclude | FieldPath[] | undefined | Fields to exclude from fixture generation | | requiredOnly | boolean | false | Whether to generate only the required fields or not | | isAccurate | boolean | true | Should employ accurate data generation based on field names |

Rule

| name | type | isRequired | description | | -------------- | ---------------------- | ---------- | ------------------------------------------------------------------------------------------ | | path | FieldPath | true | The path to the field, for which the rule applies | | required | boolean | false | Is the field required or not | | size | number | false | The size of the generated value, which may apply to arrays, strings or numbers | | min | number | false | The min value of the generated value. For arrays or strings the minimum size. | | max | number | false | The max value of the generated value. For arrays or string the maximum size. | | enum | string[], number[] | false | The enum to apply for the generated value | | pattern | RegExp | false | The pattern to apply for the generated value. The generated value will adhere to the regex |

FieldPath

FieldPath is a string that represents the path of a field in the schema. It can be a nested path, such as address.street. It can also be a wildcard path, such as address.*, which means all fields under address.

Example

fixture.generate(
  {},
  {
    exclude: ['createdAt', 'updatedAt'],
    isAccurate: false,
    requiredOnly: true,
    rules: [
      {
        path: 'address.city',
        enum: ['Berlin', 'Frankfurt'],
      },
      {
        path: 'age',
        min: 18,
        max: 60,
      },
      {
        path: 'workEmail',
        pattern: /@gmail.com$/,
      },
    ],
  },
);

Global Options

You can also set global options for all fixtures:

MongooseFixture.setGlobalOptions({
  isAccurate: false,
  requiredOnly: true,
});

Resolving paths

(Back to top)

When working with nested data structures, you may want to resolve the paths to the fields. This is especially useful when you want to exclude or apply rules to fields that are nested.

fixture.generate({}, { exclude: ['address.city'] });

You can also use wildcard paths to exclude or apply rules to all fields under a certain path:

fixture.generate({}, { exclude: ['address.*'] });

fixture.generate({
  'person.*.jobTitle': 'Software Engineer',
});

fixture.generate({
  'person.**.is*': true,
}); // will override every field that starts with `is` to true, e.g., isDefault, isCool etc...

Overriding values

(Back to top)

You can override the generated values by providing a map of values to override:

fixture.generate({
  name: 'John Doe',
  email: '[email protected]',
  age: 25,
});

// or using wildcards

fixture.generate({
  'address.**.buildingNo': '1234',
});

Schema rules

(Back to top)

The generated values comply with the schema rules, for example:

const schema = new Schema({
  name: { type: String, required: true },
  age: { type: Number, min: 18, max: 100 },
  city: { type: String, enum: ['Berlin', 'Frankfurt'] },
});

In this case, the age will be a number between 18 and 100, and the city will be either Berlin or Frankfurt.

| 🚧 IMPORTANT | | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | If you specify a custom rule, make sure it doesn't conflict with the schema rule. For example, in the example above, you cannot set the name field to be not required |

Limitation

There is a limitation when it comes to custom schema validators. In the below example, the generated value cannot comply with the custom validator, as it's a function.

const schema = new Schema({
  name: {
    type: String,
    validate: {
      validator: (v) => v.length > 5,
      message: 'Name must be longer than 5 characters',
    },
  },
});

Alternatively, you can define the same schema validator as a custom rule:

fixture.generate(schema, {
  rules: [
    {
      path: 'name',
      min: 6,
    },
  ],
});