@aklinker1/zero-factory 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,12 @@
1
- <h1 align="center">@aklinker1/zero-factory</h1>
1
+ <div align="center">
2
2
 
3
- <p align="center">Zero dependency object factory generator for testing.</p>
3
+ # @aklinker1/zero-factory
4
+
5
+ [![JSR](https://jsr.io/badges/@aklinker1/zero-factory)](https://jsr.io/@aklinker1/zero-factory) [![NPM Version](https://img.shields.io/npm/v/%40aklinker1%2Fzero-factory?logo=npm&labelColor=red&color=white)](https://www.npmjs.com/package/@aklinker1/zero-factory) [![Docs](https://img.shields.io/badge/Docs-blue?logo=readme&logoColor=white)](https://jsr.io/@aklinker1/zero-factory) [![API Reference](https://img.shields.io/badge/API%20Reference-blue?logo=readme&logoColor=white)](https://jsr.io/@aklinker1/zero-factory/doc) [![License](https://img.shields.io/npm/l/%40aklinker1%2Fzero-factory)](https://github.com/aklinker1/zero-factory/blob/main/LICENSE)
6
+
7
+ Zero dependency object factory generator for testing.
8
+
9
+ </div>
4
10
 
5
11
  ```ts
6
12
  import { createFactory, createSequence } from "@aklinker1/zero-factory";
@@ -29,17 +35,17 @@ npm i @aklinker1/zero-factory
29
35
  - ✨ Deeply merge overrides with default values
30
36
  - 🔢 Sequence generator for IDs
31
37
  - 🎨 "traits" - define multiple variants of default values
38
+ - ⚡ Compatible with all fake data generators (`@ngneat/falso`, `faker-js`, `chance`, `casual`, etc)
32
39
 
33
40
  **Not Supported:**
34
41
 
35
42
  - **Class instances**: Only objects can be created. Factories will not create class instances.
36
- - **Randomized data**: There are already several mature libraries for generating randomized testing data (`@ngneat/falso`, `faker-js`, `chance`, `casual`, etc).
37
43
 
38
44
  ## Usage
39
45
 
40
46
  ### Factories
41
47
 
42
- Use `createFactory` to build an object factory. Object factories are simple functions that returns an object:
48
+ Use `createFactory` to build an object factory. Object factories are simple functions that return an object:
43
49
 
44
50
  ```ts
45
51
  const userFactory = createFactory<User>({
@@ -245,7 +251,7 @@ May or may not implement these.
245
251
  id: createSequence("post-"),
246
252
  userId: userIdSequence,
247
253
  })
248
- .associate("user", (user) => ({
254
+ .associate<User>("user", (user) => ({
249
255
  userId: user.id
250
256
  }))
251
257
 
@@ -11,6 +11,21 @@ export type Factory<TObject extends Record<string, any>, TTraits extends string
11
11
  */
12
12
  export type FactoryFn<TObject> = {
13
13
  (overrides?: DeepPartial<TObject>): TObject;
14
+ /**
15
+ * Generate multiple items.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * userFactory.many(4, { username: "override" });
20
+ * // [
21
+ * // { id: "user-0", username: "override", ... },
22
+ * // { id: "user-1", username: "override", ... },
23
+ * // { id: "user-2", username: "override", ... },
24
+ * // { id: "user-3", username: "override", ... },
25
+ * // ]
26
+ * ```
27
+ */
28
+ many(count: number, overrides?: DeepPartial<TObject>): TObject[];
14
29
  };
15
30
  /**
16
31
  * Map of factory functions for traits.
package/dist/index.js CHANGED
@@ -44,17 +44,16 @@ function createFactory(defaults) {
44
44
  return createFactoryInternal(defaults, {});
45
45
  }
46
46
  function createFactoryInternal(defaults, traits) {
47
- console.log("Created factory:", { defaults, traits });
48
47
  return Object.assign((overrides) => generateObject(defaults, overrides), {
48
+ many: (count, overrides) => generateManyObjects(count, defaults, overrides),
49
49
  trait: (name, traitDefaults) => createFactoryInternal(defaults, {
50
50
  ...traits,
51
51
  [name]: deepMerge(defaults, traitDefaults)
52
52
  }),
53
53
  ...Object.fromEntries(Object.entries(traits).map(([name, traitDefaults]) => {
54
- return [
55
- name,
56
- (overrides) => generateObject(traitDefaults, overrides)
57
- ];
54
+ const traitFactory = (overrides) => generateObject(traitDefaults, overrides);
55
+ traitFactory.many = (count, overrides) => generateManyObjects(count, traitDefaults, overrides);
56
+ return [name, traitFactory];
58
57
  }))
59
58
  });
60
59
  }
@@ -62,6 +61,9 @@ function generateObject(defaults, overrides) {
62
61
  const resolvedDefaults = resolveDefaults(defaults);
63
62
  return deepMerge(resolvedDefaults, overrides);
64
63
  }
64
+ function generateManyObjects(count, defaults, overrides) {
65
+ return Array.from({ length: count }, () => generateObject(defaults, overrides));
66
+ }
65
67
  export {
66
68
  createSequence,
67
69
  createFactory
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aklinker1/zero-factory",
3
3
  "description": "Zero dependency object factory generator for testing",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "packageManager": "bun@1.2.20",
6
6
  "type": "module",
7
7
  "license": "MIT",