@develohpanda/fluent-builder
v2.1.2
Published
A typed, fluent builder for creating objects in Typescript
Downloads
1,241
Maintainers
Readme
🥨 fluent-builder
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