{"id":28430656,"url":"https://github.com/jaktestowac/data-mock-builder","last_synced_at":"2026-02-25T00:38:45.634Z","repository":{"id":289317873,"uuid":"970878661","full_name":"jaktestowac/data-mock-builder","owner":"jaktestowac","description":"📦 A fluent, flexible utility for building mock objects for testing in TypeScript/JavaScript. Supports static values, factories, arrays, nested objects, incrementing fields, templates, presets, and more.","archived":false,"fork":false,"pushed_at":"2025-04-27T22:47:38.000Z","size":148,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-22T05:06:43.532Z","etag":null,"topics":["automation","data-generator","data-mocking","npmjs-packages","test-automation"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/data-mock-builder","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jaktestowac.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-22T17:11:44.000Z","updated_at":"2025-04-27T22:47:42.000Z","dependencies_parsed_at":"2025-04-22T17:51:37.032Z","dependency_job_id":"31aaad21-9aaa-4bad-a1c5-887e67e0f952","html_url":"https://github.com/jaktestowac/data-mock-builder","commit_stats":null,"previous_names":["jaktestowac/data-mock-builder"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jaktestowac/data-mock-builder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaktestowac%2Fdata-mock-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaktestowac%2Fdata-mock-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaktestowac%2Fdata-mock-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaktestowac%2Fdata-mock-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jaktestowac","download_url":"https://codeload.github.com/jaktestowac/data-mock-builder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaktestowac%2Fdata-mock-builder/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267184095,"owners_count":24049127,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-26T02:00:08.937Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","data-generator","data-mocking","npmjs-packages","test-automation"],"created_at":"2025-06-05T14:07:41.977Z","updated_at":"2026-02-25T00:38:40.605Z","avatar_url":"https://github.com/jaktestowac.png","language":"TypeScript","readme":"# data-mock-builder\n\nA fluent, flexible utility for building mock objects for testing in TypeScript/JavaScript. Supports static values, factories, arrays, nested objects, incrementing fields, templates, presets, and more.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n---\n\n## ✨ Features\n\n- 🏗️ Fluent API for building mock objects\n- 🔢 Supports string, number, boolean, array, object, and incrementing fields\n- 🔁 Generate single or multiple objects (`repeat`)\n- 🧩 Extend with templates or reusable presets\n- 🧪 Supports value factories (functions)\n- 🪄 TypeScript support with type casting for results\n- 🪶 Zero dependencies\n- 🛡️ Optional deep copy to prevent mutation between builds\n- 🛡️ Optional field validation (see `.build()` options)\n- ✅ Custom field validators to ensure data integrity\n\n---\n\n## 📦 Install\n\n```bash\nnpm install data-mock-builder\n```\n\n---\n\n## 🚀 Usage\n\n### Basic Example\n\n```typescript\nimport { MockBuilder } from \"data-mock-builder\";\n\nconst builder = new MockBuilder().field(\"id\").increment(1).field(\"name\").string(\"Alice\").field(\"active\").boolean(true);\n\nconst result = builder.build();\nconsole.log(result);\n// { id: 1, name: \"Alice\", active: true }\n```\n\nOr with compacted field definition:\n\n```typescript\nimport { MockBuilder } from \"data-mock-builder\";\n\nconst builder = new MockBuilder().field(\"id\", 1).field(\"name\", \"Alice\").field(\"active\", true);\n\nconst result = builder.build();\nconsole.log(result);\n// { id: 1, name: \"Alice\", active: true }\n```\n\n### Generate Multiple Objects\n\n```typescript\nconst users = new MockBuilder().field(\"id\").increment(100).field(\"role\").string(\"user\").repeat(3).build();\n\nconsole.log(users);\n// [\n//   { id: 100, role: \"user\" },\n//   { id: 101, role: \"user\" },\n//   { id: 102, role: \"user\" }\n// ]\n```\n\nOr with compacted field definition:\n\n```typescript\nconst users = new MockBuilder()\n  .field(\"id\", () =\u003e Math.floor(Math.random() * 1000))\n  .field(\"role\", \"user\")\n  .repeat(2)\n  .build();\n\nconsole.log(users);\n// [\n//   { id: 123, role: \"user\" },\n//   { id: 456, role: \"user\" }\n// ]\n// (ids will be random)\n```\n\n### Use Factories\n\n```typescript\nconst builder = new MockBuilder()\n  .field(\"createdAt\")\n  .number(() =\u003e Date.now())\n  .field(\"randomTag\")\n  .string(() =\u003e Math.random().toString(36).slice(2, 8));\n\nconst result = builder.build();\nconsole.log(result);\n// { createdAt: 1680000000000, randomTag: \"a1b2c3\" } // values will vary\n```\n\n### Nested Objects\n\n```typescript\nconst addressBuilder = new MockBuilder().field(\"city\").string(\"Paris\").field(\"zip\").number(75000);\n\nconst userBuilder = new MockBuilder()\n  .field(\"name\")\n  .string(\"Alice\")\n  .field(\"address\")\n  .object(() =\u003e addressBuilder.build());\n\nconst user = userBuilder.build();\nconsole.log(user);\n// { name: \"Alice\", address: { city: \"Paris\", zip: 75000 } }\n```\n\n### Templates and Presets\n\n```typescript\nMockBuilder.definePreset(\"user\", { name: \"Bob\", age: 25 });\n\nconst builder = new MockBuilder().preset(\"user\").field(\"age\").number(30); // override preset\n\nconst result = builder.build();\nconsole.log(result);\n// { name: \"Bob\", age: 30 }\n```\n\n### Preset Example\n\n```typescript\n// Define a preset for a product\nMockBuilder.definePreset(\"product\", { name: \"Widget\", price: 9.99 });\n\n// Use the preset and override a field\nconst builder = new MockBuilder().preset(\"product\").field(\"price\").number(19.99);\n\nconst result = builder.build();\nconsole.log(result);\n// { name: \"Widget\", price: 19.99 }\n```\n\n### Extend Example\n\n```typescript\nconst template = { foo: \"bar\", count: 42 };\n\nconst builder = new MockBuilder().extend(template).field(\"extra\", true);\n\nconst result = builder.build();\nconsole.log(result);\n// { foo: \"bar\", count: 42, extra: true }\n```\n\n### Overload: Direct Field Assignment\n\n```typescript\nconst builder = new MockBuilder().field(\"foo\", 123).field(\"bar\", () =\u003e \"baz\");\nconst result = builder.build();\nconsole.log(result);\n// { foo: 123, bar: \"baz\" }\n```\n\n### Increment with Step\n\n```typescript\nconst builder = new MockBuilder().field(\"n\").increment(0, 5).repeat(3);\n\nconst result = builder.build();\nconsole.log(result);\n// [{ n: 0 }, { n: 5 }, { n: 10 }]\n```\n\n### Advanced Generator Usage\n\n```typescript\nconst builder = new MockBuilder()\n  .field(\"id\")\n  .increment(1)\n  .field(\"name\")\n  .string(\"User\")\n  // Access index parameter in generator function\n  .field(\"displayName\", (obj, index) =\u003e `${obj.name} ${index || 0}`)\n  // Access current object and control deep copy\n  .field(\"summary\", (obj, index, options) =\u003e {\n    // options.deepCopy controls whether the returned value is deep copied\n    // options.skipValidation provides validation setting\n    return `ID: ${obj.id}, Name: ${obj.displayName}, Deep Copy: ${options?.deepCopy}`;\n  });\n\nconst users = builder.repeat(2).build();\nconsole.log(users);\n// [\n//   {\n//     id: 1,\n//     name: \"User\",\n//     displayName: \"User 0\",\n//     summary: \"ID: 1, Name: User 0, Deep Copy: true\"\n//   },\n//   {\n//     id: 2,\n//     name: \"User\",\n//     displayName: \"User 1\",\n//     summary: \"ID: 2, Name: User 1, Deep Copy: true\"\n//   }\n// ]\n```\n\n---\n\n### Custom Field Validation\n\n```typescript\nconst builder = new MockBuilder()\n  .field(\"age\")\n  .number(25)\n  // Add validator using standalone method\n  .validator(\"age\", (value) =\u003e ({\n    success: value \u003e= 18,\n    errorMsg: \"Age must be at least 18\",\n  }))\n  .field(\"email\")\n  .string(\"user@example.com\")\n  // Add validator by chaining after field definition\n  .field(\"username\")\n  .string(\"user123\")\n  .validator((value) =\u003e ({\n    success: value.length \u003e= 5,\n    errorMsg: \"Username must be at least 5 characters\",\n  }));\n\n// By default, validation is skipped for performance\nconst user1 = builder.build();\n\n// Enable validation by setting skipValidation to false\ntry {\n  // This would throw if any validation fails\n  const user2 = builder.build({ skipValidation: false });\n  console.log(\"All validations passed!\");\n} catch (error) {\n  console.error(error.message); // Contains all validation error messages\n}\n```\n\n---\n\n### 🪄 TypeScript Type Casting\n\nYou can cast the result of `.build()` to your interface or type for full type safety:\n\n```typescript\ninterface User {\n  id: number;\n  name: string;\n  active: boolean;\n}\n\nconst builder = new MockBuilder().field(\"id\").number(1).field(\"name\").string(\"Alice\").field(\"active\").boolean(true);\n\nconst user = builder.build\u003cUser\u003e();\n// user is typed as User\n\nconst users = builder.repeat(2).build\u003cUser[]\u003e();\n// users is typed as User[]\n```\n\n---\n\n### 🛡️ Deep Copy and Field Validation Control\n\nBy default, the builder deep-copies all field values to prevent mutation between builds.  \nYou can disable deep copy globally or per build:\n\n```typescript\nconst builder = new MockBuilder().field(\"arr\").array([1, 2]);\n\n// Default: deep copy ON\nconst a = builder.build();\na.arr.push(3);\nconst b = builder.build();\nconsole.log(b.arr); // [1, 2]\n\n// Disable deep copy for all builds from this builder\nbuilder.deepCopy(false);\nconst c = builder.build();\nc.arr.push(4);\nconst d = builder.build();\nconsole.log(d.arr); // [1, 2, 4]\n\n// Or disable/enable deep copy per build:\nconst e = builder.build({ deepCopy: true }); // deep copy ON for this build\nconst f = builder.build({ deepCopy: false }); // deep copy OFF for this build\n```\n\n#### Field Validation\n\nBy default, field validation is **skipped** for performance and compatibility.  \nIf you want to validate that all fields required by a type are present in the built object, use:\n\n```typescript\ninterface User {\n  id: number;\n  name: string;\n}\n\nconst builder = new MockBuilder().field(\"id\").number(1);\n// This will NOT throw by default:\nconst user = builder.build\u003cUser\u003e();\n\n// To enable runtime validation:\ntry {\n  builder.build\u003cUser\u003e({ skipValidation: false }); // Throws if any required field is missing\n} catch (err) {\n  console.error(err);\n}\n```\n\n\u003e **Note:** Due to TypeScript type erasure, runtime validation only works for plain objects, not for arrays of objects (e.g., `User[]`).  \n\u003e For most use cases, type safety is enforced at compile time.\n\n---\n\n## 🧩 API\n\n| Method                            | Description                                                                                                            |\n| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `.field(name)`                    | Start defining a field. Chain with `.string()`, `.number()`, `.boolean()`, `.array()`, `.object()`, or `.increment()`. |\n| `.field(name, value)`             | Add a field directly with a static value or factory function.                                                          |\n| `.validator(name, fn)`            | Add a validator function for a field. Can return true or an error message string.                                      |\n| `.repeat(n)`                      | Generate `n` objects (returns an array from `.build()`).                                                               |\n| `.extend(template)`               | Add fields from a plain object.                                                                                        |\n| `.preset(name)`                   | Add fields from a named preset (see `.definePreset`).                                                                  |\n| `.build\u003cT\u003e(options?)`             | Build the object(s), optionally cast to type `T`. Options: `{ deepCopy?: boolean; skipValidation?: boolean }`          |\n| `.deepCopy(enabled)`              | Enable or disable deep copy for all subsequent builds from this builder.                                               |\n| `.increment(start = 1, step = 1)` | Incrementing number field.                                                                                             |\n| `.definePreset(name, template)`   | Define a reusable preset.                                                                                              |\n\n---\n\n## 📄 License\n\nMIT © jaktestowac.pl\n\nPowered by [jaktestowac.pl](https://www.jaktestowac.pl/) team.\n\n🌐 Check out **[GitHub](https://github.com/jaktestowac) profile** for more open-source projects and resources.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaktestowac%2Fdata-mock-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaktestowac%2Fdata-mock-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaktestowac%2Fdata-mock-builder/lists"}