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/graphql

v1.2.2

Published

GraphQL fixture generation library that generates mock data based on the GraphQL schema and TypedDocumentNodes. A graphql fixture consists of two different data types:

Downloads

3

Readme

GraphQL Fixture

GraphQL fixture generation library that generates mock data based on the GraphQL schema and TypedDocumentNodes. A graphql fixture consists of two different data types:

  • Variables: The input variables for the query or mutation.
  • Data: The output data from the query or mutation.

The library generates mock data from typed document nodes, which are fully typed GraphQL document nodes. Therefore, it's advised to use graphql-codegen to generate the typed document nodes.

Table of contents

Installation

npm i -D @mocking-bird/graphql

Usage

1. Parsing GraphQL schema

Parsing the schema from the GraphQL schema string:

import { GraphQLFixture } from '@mocking-bird/graphql';

const typeDefs = `
  type User {
    name: String
    email: String
    age: Int
    workEmail: String
    address: Address
    createdAt: Date
    updatedAt: Date
  }

  type Address {
    street: String
    city: String
    country: String
  }
`;

GraphQLFixture.registerSchema(typeDefs);

Parsing the schema from a file:

import { GraphQLFixture } from '@mocking-bird/graphql';

GraphQLFixture.registerSchemaFromFile('path/to/schema.graphql');

2. Generating fixtures

import { GraphQLFixture } from '@mocking-bird/graphql';

/**
 * TypedDocumentNode generated by graphql-codegen:
 *
 * export const GetQueryDocument: TypedDocumentNode<GetQuery, GetQueryVariables> = {
 *  kind: 'Document',
 *  definitions: [
 *    kind: 'OperationDefinition',
 *    operation: 'query',
 *    name: { kind: 'Name', value: 'GetQuery' },
 *    ...
 *  ]
 * }
 */

const fixture = new GraphQLFixture(GetQueryDocument);
fixture.generate();

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)

GraphQLFixtureOptions

| name | type | default | description | | ------------------------- | ---------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------ | | ignoreCustomScalars | boolean | false | Whether to ignore custom scalar types or not | | addTypeName | boolean | false | Whether to add type names in mock query or mutations | | scalarDefinitions | Record<string, ScalarDefinition> | undefined | Custom scalar definitions | | fieldRelations | Record<FieldPath, FieldPath>, Record<FieldPath, FieldPath[]> | undefined | Field relation map. If specified related fields are assigned same values | | 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$/,
      },
    ],
  },
);

Custom Scalar Definitions

By default, the library supports Date, DateTime and JSON scalar types. You can add custom scalar definitions by:

GraphQLFixture.setGlobalOptions({
  scalarDefinitions: {
    BeforeChristDate: {
      type: FieldType.DATE,
      defaultValue: '2021-01-01',
    },
  },
});

Field Relations

Defining field relations are useful, if you want to assign the same value to related fields. For example:

const fixture = new GraphQLFixture(GetQueryDocument, {
  fieldRelations: {
    'variables.user.id': 'data.user.id',
  },
});

Note: if you are matching fields, you should use the variables and data prefixes to the field path.

In this example, generated mock variable user.id will be assigned to the generated mock data user.id. This makes sense because the id field in the variables and data should be the same.

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',
});