@develohpanda/fluent-builder
Version:
A typed, fluent builder for creating objects in Typescript
96 lines (66 loc) • 2.57 kB
Markdown
[](https://www.npmjs.com/package/@develohpanda/fluent-builder)
`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()`.
```ts
createBuilder<Product>(schema).name('Shirt').price(42).build();
```
`fluent-builder` aims to simplify the use of the [builder pattern](https://sourcemaking.com/design_patterns/builder) 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.
The usual
```
yarn add -D @develohpanda/fluent-builder
npm i --save-dev @develohpanda/fluent-builder
```
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
```ts
interface Product {
name: string;
price: number;
color?: string;
buy: () => void;
}
```
```ts
import {Schema} from '@develohpanda/fluent-builder';
const schema: Schema<Product> = {
name: () => 'Shirt',
price: () => 2,
color: () => undefined,
buy: () => jest.fn(),
}
```
```ts
import {createBuilder} from '@develohpanda/fluent-builder';
const builder = createBuilder(schema);
```
```ts
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.
```ts
builder.reset().price(5).build();
```
Please raise issues or feature requests via the [Github issue tracker](https://github.com/develohpanda/fluent-builder/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
Feel free to submit a pull request with your change!
```
yarn install
yarn test
```
[](LICENSE)