Skip to content

A typed, fluent builder for generating fixtures in Typescript.

License

Notifications You must be signed in to change notification settings

develohpanda/fluent-builder

Repository files navigation

🥨 fluent-builder

npm

Generate a fluent, typed object builder for any interface or type.

fluent-builder consumes a seeding schema, and generates a builder with a signature identical to the type being built, but with mutate functions, to make iterative modifications to your object. The builder contains two additional properties, reset() and build().

createBuilder<Product>(schema).name('Shirt').price(42).build();

Why?

fluent-builder aims to simplify the use of the builder pattern for Typescript, using generics. This pattern allows for iterative construction of complex, often nested objects. Typically, a unique builder class needs to be implemented for each unique interface or type, to ensure correct typing is available.

Installation

The usual

yarn add -D @develohpanda/fluent-builder

npm i --save-dev @develohpanda/fluent-builder

Gotcha!

In order for types to be detected correctly in VS Code (eg. IntelliSense on hover), any file using fluent-builder should be included in the default project tsconfig to be compiled. If you know how to fix this, please submit a PR! :)

Usage

Define your interface / type

interface Product {
  name: string;
  price: number;
  color?: string;
  buy: () => void;
}

Define a schema

import {Schema} from '@develohpanda/fluent-builder';

const schema: Schema<Product> = {
  name: () => 'Shirt',
  price: () => 2,
  color: () => undefined,
  buy: () => jest.fn(),
}

Create a builder

import {createBuilder} from '@develohpanda/fluent-builder';

const builder = createBuilder(schema);

Consume

describe('suite', () => {
  beforeEach(() => builder.reset());

  it('test', () => {
    const mock = jest.fn();
    const instance = builder.price(4).buy(mock).build();

    // use instance and mock
  });
});

The overhead of constructing a new builder can be avoided by using the builder.reset() method. This resets the mutated schema back to its original, and can be chained.

builder.reset().price(5).build();

Contributing

Please raise issues or feature requests via the Github issue tracker.

Feel free to submit a pull request with your change!

yarn install
yarn test

License

MIT