https://github.com/labd/graphql-codegen-faker-fixtures
Generate Faker fixtures for your GraphQL Fragments using GraphQL codegen
https://github.com/labd/graphql-codegen-faker-fixtures
codegen fakerjs fixtures graphql
Last synced: about 1 year ago
JSON representation
Generate Faker fixtures for your GraphQL Fragments using GraphQL codegen
- Host: GitHub
- URL: https://github.com/labd/graphql-codegen-faker-fixtures
- Owner: labd
- Created: 2023-07-11T10:14:43.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2024-02-01T00:59:45.000Z (over 2 years ago)
- Last Synced: 2025-03-28T22:51:12.760Z (about 1 year ago)
- Topics: codegen, fakerjs, fixtures, graphql
- Language: TypeScript
- Homepage:
- Size: 567 KB
- Stars: 4
- Watchers: 4
- Forks: 1
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# graphql-codegen-faker-fixtures
This repository contains a GraphQL Codegen plugin that generates fixture builders of your fragments based on your GraphQL schema and populates them with [faker](https://github.com/faker-js/faker).
## Installation
Run either of the following commands to add the package and it's dependencies, based on your package manager of choice:
```sh
# pnpm
pnpm i -D graphql-codegen-faker-fixtures @faker-js/faker deepmerge-ts
# npm
npm i --save-dev graphql-codegen-faker-fixtures @faker-js/faker deepmerge-ts
# yarn
yarn add -D graphql-codegen-faker-fixtures @faker-js/faker deepmerge-ts
```
## Usage
### Config file
Both `codegen.yml` and `codegen.ts` config files are permitted. It is recommended to use the typescript format which includes a config interface.
```typescript
import type { CodegenConfig } from "graphql-codegen-faker-fixtures";
const config: CodegenConfig = {
verbose: true,
schema: "example/schema.graphql",
documents: "example/queries.ts",
generates: {
"example/fixture_builders.ts": {
plugins: ["graphql-codegen-faker-fixtures"],
config: {
typeImport: "@types",
fakerjsSeed: 98765,
scalars: {
Email: {
_default: "faker.internet.email()",
secondaryEmail: "faker.internet.exampleEmail()",
},
String: {
_default: "faker.lorem.word()",
firstName: "faker.person.firstName()",
lastName: "faker.person.lastName()",
phone: "faker.phone.number()",
},
Boolean: { married: "faker.helpers.arrayElement(['yes', 'no'])" },
ID: {
id: "faker.string.symbol()",
["Person.id"]: "faker.string.nanoid()",
},
},
},
},
},
hooks: {
afterOneFileWrite: ["prettier --write"],
},
};
export default config;
```
Example in yml format
```yml
schema: example/schema.graphql
documents: example/queries.ts
verbose: true
generates:
example/fixture_builders.ts:
plugins:
- graphql-codegen-faker-fixtures
config:
typeImport: "@types"
fakerjsSeed: 98765
scalars:
Email:
_default: faker.internet.email()
secondaryEmail: faker.internet.exampleEmail()
String:
_default: faker.lorem.word()
firstName: faker.person.firstName()
lastName: faker.person.lastName()
phone: faker.phone.number()
Boolean:
married: faker.helpers.arrayElement(['yes', 'no'])
ID:
id: faker.string.symbol()
Person.id: faker.string.nanoid()
hooks:
afterOneFileWrite:
- prettier --write
```
The example above and a copy in `yml` format can be found in the /examle directory and can be run with `pnpm example:ts` and `pnpm example:yml` respectively.
### API
The config object includes the following fields:
#### `buildersOnly` (`boolean`)
When true the plugin will only return the fixture builder functions without the normal addition of a disclaimer, utility functions (`repeat`, `deepmerge` & `random`), utilty type (`DeepPartial`), and faker seed setup.
#### `fakerjsSeed` (`number`)
default value: `12345654321`
Number used to seed faker.
[Reference](https://fakerjs.dev/guide/usage.html#reproducible-results)
#### `namingConvention` (`"keep" | "change-case-all#"`)
default value: `change-case-all#pascalCase`
supported `` options: `camelCase | capitalCase | constantCase | dotCase | headerCase | noCase | paramCase | pascalCase | pathCase | sentenceCase | snakeCase`
Naming convention used in fixture builder generation.
[Reference](https://github.com/btxtiger/change-case-all)
#### `scalars` (`ScalarConfig`)
Override default faker methods for a given scalar type. The default methods and configured scalar are:
| Scalar | Default faker method |
| ------------- | -------------------------- |
| `Int` | `faker.number.int()` |
| `Float` | `faker.number.float()` |
| `Boolean` | `faker.datatype.boolean()` |
| `ID` | `faker.string.uuid()` |
| `String` | `faker.lorem.words()` |
| custom scalar | `faker.lorem.words()` |
Overriding a faker methods:
```typescript
scalars: {
String: {
// Override the default method for the String scalar
_default: "faker.lorem.word()"
// Provide a faker method for a specific field name for the String scalar
firstName: "faker.person.firstName()"
},
ID: {
// Provide a faker method for a specific field name and type for the ID scalar
["Person.id"]: "faker.string.nanoid()",
}
}
```
#### `skipFields` (`string[]`)
Skip the given fields while generating the fixture builders. The notation is as follows:
```typescript
skipFields: ['PersonFragment.email'],
```
#### `skipFragments` (`string[]`)
Skip the given fragments while generating the fixture builders. The notation is as follows:
```typescript
skipFragments: ['person'],
```
#### `typeImport` (`string`)
Import types generated from your fragments based on your GraphQL schema. These types provide typing of the fixture builder functions.
## Development
Assuming you have `pnpm` installed with `node@18`, run:
```sh
pnpm install
pnpm start
```
## Publishing
Publishing is done automatically via merging a changesets release pull request to main.