@anil-labs/factory 0.1.0

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.
Files changed (98) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +371 -0
  4. package/dist/builders/index.d.cts +40 -0
  5. package/dist/builders/index.d.ts +40 -0
  6. package/dist/chunks/faker-BOtDMmjd.cjs +1430 -0
  7. package/dist/chunks/faker-BOtDMmjd.cjs.map +1 -0
  8. package/dist/chunks/faker-BlEhpR26.mjs +1287 -0
  9. package/dist/chunks/faker-BlEhpR26.mjs.map +1 -0
  10. package/dist/chunks/persist-DcARfeC-.cjs +134 -0
  11. package/dist/chunks/persist-DcARfeC-.cjs.map +1 -0
  12. package/dist/chunks/persist-ZGX3NWMF.mjs +117 -0
  13. package/dist/chunks/persist-ZGX3NWMF.mjs.map +1 -0
  14. package/dist/core/collection.d.cts +41 -0
  15. package/dist/core/collection.d.ts +41 -0
  16. package/dist/core/factory.d.cts +115 -0
  17. package/dist/core/factory.d.ts +115 -0
  18. package/dist/core/index.d.cts +6 -0
  19. package/dist/core/index.d.ts +6 -0
  20. package/dist/core/registry.d.cts +20 -0
  21. package/dist/core/registry.d.ts +20 -0
  22. package/dist/core/sequence.d.cts +36 -0
  23. package/dist/core/sequence.d.ts +36 -0
  24. package/dist/core/types.d.cts +47 -0
  25. package/dist/core/types.d.ts +47 -0
  26. package/dist/faker/color.d.cts +22 -0
  27. package/dist/faker/color.d.ts +22 -0
  28. package/dist/faker/commerce.d.cts +21 -0
  29. package/dist/faker/commerce.d.ts +21 -0
  30. package/dist/faker/company.d.cts +20 -0
  31. package/dist/faker/company.d.ts +20 -0
  32. package/dist/faker/datatype.d.cts +16 -0
  33. package/dist/faker/datatype.d.ts +16 -0
  34. package/dist/faker/date.d.cts +29 -0
  35. package/dist/faker/date.d.ts +29 -0
  36. package/dist/faker/faker.d.cts +82 -0
  37. package/dist/faker/faker.d.ts +82 -0
  38. package/dist/faker/finance.d.cts +25 -0
  39. package/dist/faker/finance.d.ts +25 -0
  40. package/dist/faker/helpers.d.cts +52 -0
  41. package/dist/faker/helpers.d.ts +52 -0
  42. package/dist/faker/image.d.cts +22 -0
  43. package/dist/faker/image.d.ts +22 -0
  44. package/dist/faker/index.d.cts +21 -0
  45. package/dist/faker/index.d.ts +21 -0
  46. package/dist/faker/internet.d.cts +33 -0
  47. package/dist/faker/internet.d.ts +33 -0
  48. package/dist/faker/locale.d.cts +26 -0
  49. package/dist/faker/locale.d.ts +26 -0
  50. package/dist/faker/location.d.cts +30 -0
  51. package/dist/faker/location.d.ts +30 -0
  52. package/dist/faker/lorem.d.cts +26 -0
  53. package/dist/faker/lorem.d.ts +26 -0
  54. package/dist/faker/number.d.cts +31 -0
  55. package/dist/faker/number.d.ts +31 -0
  56. package/dist/faker/person.d.cts +29 -0
  57. package/dist/faker/person.d.ts +29 -0
  58. package/dist/faker/regex.d.cts +19 -0
  59. package/dist/faker/regex.d.ts +19 -0
  60. package/dist/faker/string.d.cts +33 -0
  61. package/dist/faker/string.d.ts +33 -0
  62. package/dist/faker/system.d.cts +29 -0
  63. package/dist/faker/system.d.ts +29 -0
  64. package/dist/faker.cjs +26 -0
  65. package/dist/faker.mjs +3 -0
  66. package/dist/index.cjs +635 -0
  67. package/dist/index.cjs.map +1 -0
  68. package/dist/index.d.cts +37 -0
  69. package/dist/index.d.ts +37 -0
  70. package/dist/index.mjs +596 -0
  71. package/dist/index.mjs.map +1 -0
  72. package/dist/locales/en.cjs +351 -0
  73. package/dist/locales/en.cjs.map +1 -0
  74. package/dist/locales/en.d.cts +11 -0
  75. package/dist/locales/en.d.ts +11 -0
  76. package/dist/locales/en.mjs +350 -0
  77. package/dist/locales/en.mjs.map +1 -0
  78. package/dist/locales/types.d.cts +30 -0
  79. package/dist/locales/types.d.ts +30 -0
  80. package/dist/persist/console.d.cts +15 -0
  81. package/dist/persist/console.d.ts +15 -0
  82. package/dist/persist/http.d.cts +42 -0
  83. package/dist/persist/http.d.ts +42 -0
  84. package/dist/persist/index.d.cts +5 -0
  85. package/dist/persist/index.d.ts +5 -0
  86. package/dist/persist/memory.d.cts +26 -0
  87. package/dist/persist/memory.d.ts +26 -0
  88. package/dist/persist.cjs +5 -0
  89. package/dist/persist.mjs +2 -0
  90. package/dist/prng/index.d.cts +5 -0
  91. package/dist/prng/index.d.ts +5 -0
  92. package/dist/prng/mulberry32.d.cts +19 -0
  93. package/dist/prng/mulberry32.d.ts +19 -0
  94. package/dist/prng/types.d.cts +23 -0
  95. package/dist/prng/types.d.ts +23 -0
  96. package/dist/snapshot/index.d.cts +16 -0
  97. package/dist/snapshot/index.d.ts +16 -0
  98. package/package.json +136 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/core/collection.ts","../src/core/sequence.ts","../src/core/factory.ts","../src/core/registry.ts","../src/builders/index.ts","../src/snapshot/index.ts"],"sourcesContent":["/**\n * Immutable iterable wrapper around an array, with Laravel-style helpers.\n *\n * @example\n * ```ts\n * const users = new Collection(userArray)\n * users.where(u => u.active).count()\n * users.pluck('email').toArray()\n * for (const u of users) console.log(u.name)\n * ```\n */\nexport class Collection<T> implements Iterable<T> {\n /** Underlying frozen items. */\n readonly items: readonly T[]\n\n constructor(items: Iterable<T> = []) {\n this.items = Object.freeze([...items])\n }\n\n /** Number of items. */\n count(): number {\n return this.items.length\n }\n\n /** True when there are no items. */\n isEmpty(): boolean {\n return this.items.length === 0\n }\n\n /** Run `fn` for each item; returns the collection for chaining. */\n each(fn: (item: T, index: number) => void): this {\n this.items.forEach(fn)\n return this\n }\n\n /** Project to a new collection via `fn`. */\n map<U>(fn: (item: T, index: number) => U): Collection<U> {\n return new Collection(this.items.map(fn))\n }\n\n /** Pluck a single field across all items. */\n pluck<K extends keyof T>(key: K): Collection<T[K]> {\n return new Collection(this.items.map((item) => item[key]))\n }\n\n /** Filter to items matching `predicate`. */\n where(predicate: (item: T, index: number) => boolean): Collection<T> {\n return new Collection(this.items.filter(predicate))\n }\n\n /** First item matching predicate (or first overall if no predicate). */\n first(predicate?: (item: T, index: number) => boolean): T | undefined {\n if (!predicate) return this.items[0]\n return this.items.find(predicate)\n }\n\n /** Last item in the collection. */\n last(): T | undefined {\n return this.items[this.items.length - 1]\n }\n\n /** Sort by a key or comparator, returning a new collection. */\n sortBy(key: keyof T, direction: 'asc' | 'desc' = 'asc'): Collection<T> {\n const sorted = [...this.items].sort((a, b) => {\n const av = a[key]\n const bv = b[key]\n if (av === bv) return 0\n const cmp = av < bv ? -1 : 1\n return direction === 'asc' ? cmp : -cmp\n })\n return new Collection(sorted)\n }\n\n /** Group items into a `Map` keyed by `fn`. */\n groupBy<K>(fn: (item: T) => K): Map<K, T[]> {\n const out = new Map<K, T[]>()\n for (const item of this.items) {\n const key = fn(item)\n const bucket = out.get(key)\n if (bucket) bucket.push(item)\n else out.set(key, [item])\n }\n return out\n }\n\n /** Reduce to a single value. */\n reduce<U>(fn: (acc: U, item: T, index: number) => U, initial: U): U {\n return this.items.reduce(fn, initial)\n }\n\n /** Plain-array view (a copy — the collection's storage is frozen). */\n toArray(): T[] {\n return [...this.items]\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]()\n }\n}\n","/** Info passed to closure-style sequence entries. */\nexport interface SequenceInfo {\n /** One-based count (index + 1). */\n readonly count: number\n /** Zero-based index of this draw. */\n readonly index: number\n}\n\n/** An entry is either a literal patch or a function receiving the index info. */\nexport type SequenceEntry<T> = Partial<T> | ((info: SequenceInfo) => Partial<T>)\n\n/**\n * Cycle through a list of attribute patches across generated items.\n *\n * @example\n * ```ts\n * factory.sequence([{ role: 'admin' }, { role: 'editor' }]).count(4).make()\n * // → admin, editor, admin, editor\n *\n * factory.sequence([({ index }) => ({ name: `User ${index}` })]).count(3).make()\n * // → User 0, User 1, User 2\n * ```\n */\nexport class Sequence<T extends object = object> {\n private cursor = 0\n private readonly entries: readonly SequenceEntry<T>[]\n\n constructor(entries: readonly SequenceEntry<T>[]) {\n if (entries.length === 0) {\n throw new Error('[Sequence] At least one entry is required.')\n }\n this.entries = [...entries]\n }\n\n /** Resolve the next patch, cycling when exhausted. */\n next(): Partial<T> {\n // Constructor guarantees entries.length > 0, so the modular index is\n // always in-bounds — the `?? throw` is a typesystem narrow, never hit.\n const entry =\n this.entries[this.cursor % this.entries.length] ??\n (() => {\n throw new Error('[Sequence] unreachable: empty entries')\n })()\n const info: SequenceInfo = { index: this.cursor, count: this.cursor + 1 }\n this.cursor++\n return typeof entry === 'function' ? entry(info) : entry\n }\n\n /** Reset the cursor to 0. */\n reset(): this {\n this.cursor = 0\n return this\n }\n\n /** Current cursor position (zero-based). */\n get currentIndex(): number {\n return this.cursor\n }\n\n /** Return a fresh sequence with the same entries but cursor reset. */\n clone(): Sequence<T> {\n return new Sequence([...this.entries])\n }\n}\n\n/** Functional shorthand for `new Sequence(entries)`. */\nexport function sequence<T extends object = object>(\n entries: readonly SequenceEntry<T>[],\n): Sequence<T> {\n return new Sequence(entries)\n}\n","import { Faker, faker as defaultFaker } from '@/faker'\nimport { Collection } from './collection'\nimport { Sequence } from './sequence'\nimport type { SequenceEntry } from './sequence'\nimport type {\n BuildContext,\n Definition,\n HasAttachedRelation,\n HasRelation,\n Hook,\n Persist,\n StateValue,\n} from './types'\n\n/**\n * Internal mutable state — never exposed outside the factory. We rebuild\n * one of these on every clone, so chaining stays immutable from the caller's\n * perspective while staying simple internally.\n */\ninterface InternalState<T extends object> {\n activeStates: string[]\n afterCreating: Hook<T>[]\n afterMaking: Hook<T>[]\n count: number\n faker: Faker\n fieldSequences: Map<keyof T | string, readonly unknown[]>\n hasAttachedRelations: HasAttachedRelation<T, object>[]\n hasRelations: HasRelation<T, object>[]\n overrides: Partial<T>\n ownsFaker: boolean\n persist: Persist<T> | null\n recycle: Map<string, readonly object[]>\n sequences: Sequence<T>[]\n states: Map<string, StateValue<T>>\n}\n\n/**\n * Laravel-inspired model factory for TypeScript. Immutable fluent chain — every\n * method returns a new factory, never mutating the original.\n *\n * @example\n * ```ts\n * interface User { id: number; name: string; email: string; active: boolean }\n *\n * const UserFactory = defineFactory<User>(({ seq, faker }) => ({\n * id: seq,\n * name: faker.person.fullName(),\n * email: faker.internet.email(),\n * active: true,\n * }))\n * .state('admin', { role: 'admin' })\n * .state('inactive', { active: false })\n *\n * UserFactory.make() // single User\n * UserFactory.count(5).make() // User[]\n * UserFactory.state('admin').make() // with admin overrides\n * await UserFactory.persist(...).create()\n * ```\n */\nexport class Factory<T extends object> {\n /** @internal */ private readonly definition: Definition<T>\n /** @internal */ private readonly internals: InternalState<T>\n\n /** @internal — use {@link defineFactory} or {@link Factory.define} instead. */\n private constructor(definition: Definition<T>, internals: InternalState<T>) {\n this.definition = definition\n this.internals = internals\n }\n\n // -------------------------------------------------------------------------\n // Construction\n // -------------------------------------------------------------------------\n\n /** Create a new factory. Mirrors Laravel's `Factory::new()`. */\n static define<T extends object>(definition: Definition<T>, persist?: Persist<T>): Factory<T> {\n return new Factory(definition, {\n faker: defaultFaker,\n count: 1,\n overrides: {},\n states: new Map(),\n activeStates: [],\n sequences: [],\n fieldSequences: new Map(),\n afterMaking: [],\n afterCreating: [],\n hasRelations: [],\n hasAttachedRelations: [],\n recycle: new Map(),\n persist: persist ?? null,\n ownsFaker: false,\n })\n }\n\n /** Internal: build a copy with a single field replaced. */\n private clone(patch: Partial<InternalState<T>>): Factory<T> {\n const next: InternalState<T> = {\n faker: this.internals.faker,\n count: this.internals.count,\n overrides: this.internals.overrides,\n states: new Map(this.internals.states),\n activeStates: [...this.internals.activeStates],\n sequences: this.internals.sequences.map((s) => s.clone()),\n fieldSequences: new Map(this.internals.fieldSequences),\n afterMaking: [...this.internals.afterMaking],\n afterCreating: [...this.internals.afterCreating],\n hasRelations: [...this.internals.hasRelations],\n hasAttachedRelations: [...this.internals.hasAttachedRelations],\n recycle: new Map(this.internals.recycle),\n persist: this.internals.persist,\n ownsFaker: this.internals.ownsFaker,\n ...patch,\n }\n return new Factory(this.definition, next)\n }\n\n // -------------------------------------------------------------------------\n // Fluent chain\n // -------------------------------------------------------------------------\n\n /** Set how many items will be built on the next terminal call. */\n count(n: number): Factory<T> {\n if (!Number.isInteger(n) || n < 0) {\n throw new Error(`[Factory] count(n): expected a non-negative integer, got ${String(n)}.`)\n }\n return this.clone({ count: n })\n }\n\n /** Alias of {@link count} — matches Laravel's `->times()`. */\n times(n: number): Factory<T> {\n return this.count(n)\n }\n\n /** Merge inline overrides into every built item. */\n with(overrides: Partial<T>): Factory<T> {\n return this.clone({ overrides: { ...this.internals.overrides, ...overrides } })\n }\n\n /**\n * Register a named state OR activate a previously-registered state.\n *\n * - Two-arg form (`state(name, value)`) **registers** the state.\n * - One-arg form (`state(name)`) **activates** it.\n * - One-arg with a Sequence (`state(seq)`) attaches a sequence as a state.\n */\n state(arg1: string | Sequence<T>, value?: StateValue<T>): Factory<T> {\n if (arg1 instanceof Sequence) {\n return this.clone({ sequences: [...this.internals.sequences, arg1.clone()] })\n }\n if (value !== undefined) {\n const states = new Map(this.internals.states)\n states.set(arg1, value)\n return this.clone({ states })\n }\n if (!this.internals.states.has(arg1)) {\n throw new Error(\n `[Factory] Unknown state \"${arg1}\". Register it first via .state(\"${arg1}\", ...).`,\n )\n }\n return this.clone({ activeStates: [...this.internals.activeStates, arg1] })\n }\n\n /** Bulk-register multiple states. */\n states(map: Record<string, StateValue<T>>): Factory<T> {\n const states = new Map(this.internals.states)\n for (const [name, value] of Object.entries(map)) states.set(name, value)\n return this.clone({ states })\n }\n\n /** Cycle values through one field across generated items. */\n fieldSequence<K extends keyof T>(field: K, values: readonly T[K][]): Factory<T> {\n const fieldSequences = new Map(this.internals.fieldSequences)\n fieldSequences.set(field, values)\n return this.clone({ fieldSequences })\n }\n\n /** Attach a sequence of attribute patches. */\n sequence(entries: readonly SequenceEntry<T>[]): Factory<T> {\n const seq = new Sequence<T>(entries)\n return this.clone({ sequences: [...this.internals.sequences, seq] })\n }\n\n // -------------------------------------------------------------------------\n // Relations\n // -------------------------------------------------------------------------\n\n /** Attach child records under `key` (one-to-many). */\n has<C extends object>(childFactory: Factory<C>, key: keyof T | string): Factory<T> {\n return this.clone({\n hasRelations: [\n ...this.internals.hasRelations,\n {\n kind: 'has',\n factory: childFactory as unknown as HasRelation<T, object>['factory'],\n count: childFactory.internals.count,\n key,\n },\n ],\n })\n }\n\n /**\n * Set a foreign-key field by either resolving from another factory\n * (eager — built once), a plain object (used directly), or a lazy callback\n * (built per-item).\n */\n for<P extends object>(\n parent: Factory<P> | P | (() => P),\n foreignKey: keyof T | string,\n resolver?: (parent: P) => Partial<T>,\n ): Factory<T> {\n let resolved: P\n if (typeof parent === 'function') {\n resolved = parent()\n } else if (parent instanceof Factory) {\n resolved = parent.makeOne()\n } else {\n resolved = parent\n }\n const patch = resolver\n ? resolver(resolved)\n : ({ [foreignKey]: (resolved as Record<string, unknown>)['id'] } as unknown as Partial<T>)\n return this.with(patch)\n }\n\n /** Attach related records with pivot/intermediate data (many-to-many). */\n hasAttached<C extends object>(\n childFactory: Factory<C>,\n key: keyof T | string,\n pivot: Record<string, unknown> | ((parent: T, child: C) => Record<string, unknown>) = {},\n ): Factory<T> {\n return this.clone({\n hasAttachedRelations: [\n ...this.internals.hasAttachedRelations,\n {\n kind: 'hasAttached',\n factory: childFactory as unknown as HasAttachedRelation<T, object>['factory'],\n count: childFactory.internals.count,\n key,\n pivot: pivot as HasAttachedRelation<T, object>['pivot'],\n },\n ],\n })\n }\n\n /** Add models to the recycle pool keyed by `key`. */\n recycle<M extends object>(models: M | readonly M[], key: string): Factory<T> {\n const list: readonly object[] = Array.isArray(models) ? models : [models]\n const next = new Map(this.internals.recycle)\n next.set(key, list)\n return this.clone({ recycle: next })\n }\n\n /** Pick a random recycled model from `key`, or undefined. */\n getRecycled(key: string): object | undefined {\n const pool = this.internals.recycle.get(key)\n if (!pool || pool.length === 0) return undefined\n const idx = this.internals.faker.rawPrng().int(0, pool.length - 1)\n return pool[idx]\n }\n\n // -------------------------------------------------------------------------\n // Hooks + persistence\n // -------------------------------------------------------------------------\n\n /** Register a hook fired after each item is built. */\n afterMaking(fn: Hook<T>): Factory<T> {\n return this.clone({ afterMaking: [...this.internals.afterMaking, fn] })\n }\n\n /** Register a hook fired after each item is persisted via `create()`. */\n afterCreating(fn: Hook<T>): Factory<T> {\n return this.clone({ afterCreating: [...this.internals.afterCreating, fn] })\n }\n\n /** Set or replace the persistence callback used by `create()`. */\n persist(fn: Persist<T>): Factory<T> {\n return this.clone({ persist: fn })\n }\n\n // -------------------------------------------------------------------------\n // Faker control (per-factory determinism)\n // -------------------------------------------------------------------------\n\n /**\n * Bind this factory to its own private `Faker` instance, seeded as given.\n * Useful when one factory in a suite must be deterministic without\n * affecting the shared default faker.\n */\n seed(seed: number): Factory<T> {\n const own = new Faker({ seed })\n return this.clone({ faker: own, ownsFaker: true })\n }\n\n /** Set the locale on this factory's faker (creates one if it was shared). */\n locale(name: string): Factory<T> {\n const own = this.internals.ownsFaker\n ? this.internals.faker\n : new Faker({ seed: this.internals.faker.currentSeed() })\n own.locale(name)\n return this.clone({ faker: own, ownsFaker: true })\n }\n\n // -------------------------------------------------------------------------\n // Terminal methods\n // -------------------------------------------------------------------------\n\n /** Build a single item (ignoring `count`). */\n makeOne(): T {\n const item = this.buildOne(0)\n this.fireAfterMakingSync([item])\n return item\n }\n\n /** Build `count` items. */\n makeMany(): T[] {\n const items = this.buildMany()\n this.fireAfterMakingSync(items)\n return items\n }\n\n /**\n * Build — single item when `count === 1`, array otherwise.\n * Use {@link makeOne} / {@link makeMany} when you need a specific shape.\n */\n make(): T | T[] {\n return this.internals.count === 1 ? this.makeOne() : this.makeMany()\n }\n\n /** Raw attribute objects with the same shape as `make()`. */\n raw(): T | T[] {\n return this.make()\n }\n\n /** Build and return as a {@link Collection}. */\n collect(): Collection<T> {\n return new Collection(this.makeMany())\n }\n\n /**\n * Build and persist via the registered persistence callback.\n * Returns single item when `count === 1`, array otherwise.\n */\n async create(): Promise<T | T[]> {\n const persist = this.internals.persist\n if (!persist) {\n throw new Error(\n '[Factory] create(): no persistence callback registered. Use .persist(fn) or pass one to defineFactory().',\n )\n }\n const items = this.buildMany()\n await this.runHooks(items, this.internals.afterMaking)\n const persisted = await Promise.all(items.map((item) => Promise.resolve(persist(item))))\n await this.runHooks(persisted, this.internals.afterCreating)\n return this.internals.count === 1 ? (persisted[0] as T) : persisted\n }\n\n /** Always-array variant of {@link create}. */\n async createMany(): Promise<T[]> {\n const result = await this.create()\n return Array.isArray(result) ? result : [result]\n }\n\n // -------------------------------------------------------------------------\n // Build engine\n // -------------------------------------------------------------------------\n\n private buildOne(index: number): T {\n const seq = index + 1\n const ctx: BuildContext = { seq, faker: this.internals.faker }\n\n let item = this.definition(ctx)\n\n for (const stateName of this.internals.activeStates) {\n const state = this.internals.states.get(stateName)\n if (!state) continue\n item = { ...item, ...(typeof state === 'function' ? state(item, ctx) : state) }\n }\n\n for (const sequence of this.internals.sequences) {\n item = { ...item, ...sequence.next() }\n }\n\n for (const [field, values] of this.internals.fieldSequences) {\n const value = values[index % values.length]\n item = { ...item, [field]: value }\n }\n\n item = { ...item, ...this.internals.overrides }\n\n for (const rel of this.internals.hasRelations) {\n const children = rel.factory.count(rel.count).make()\n const arr = Array.isArray(children) ? children : [children]\n item = { ...item, [rel.key as string]: arr }\n }\n\n for (const rel of this.internals.hasAttachedRelations) {\n const children = rel.factory.count(rel.count).make()\n const arr = Array.isArray(children) ? children : [children]\n const withPivot = arr.map((child: object) => {\n const pivotData = typeof rel.pivot === 'function' ? rel.pivot(item, child) : rel.pivot\n return { ...child, pivot: pivotData }\n })\n item = { ...item, [rel.key as string]: withPivot }\n }\n\n return item\n }\n\n private buildMany(): T[] {\n const out: T[] = []\n for (let i = 0; i < this.internals.count; i++) out.push(this.buildOne(i))\n return out\n }\n\n /**\n * Fire afterMaking hooks for the sync build path (`make`/`makeOne`/`makeMany`/\n * `collect`). Async hooks are kicked off without awaiting — use {@link create}\n * if you need guaranteed sequencing.\n */\n private fireAfterMakingSync(items: readonly T[]): void {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item === undefined) continue\n for (const hook of this.internals.afterMaking) {\n const r = hook(item, i)\n if (r instanceof Promise) r.catch(swallow)\n }\n }\n }\n\n private async runHooks(items: readonly T[], hooks: readonly Hook<T>[]): Promise<void> {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item === undefined) continue\n for (const hook of hooks) await hook(item, i)\n }\n }\n}\n\n// Sync-path afterMaking hooks intentionally fire-and-forget; this swallows\n// rejections so an unrelated hook can't crash the build.\nfunction swallow(): void {\n /* intentional no-op */\n}\n\n/** Functional alias for `Factory.define()`. */\nexport function defineFactory<T extends object>(\n definition: Definition<T>,\n persist?: Persist<T>,\n): Factory<T> {\n return Factory.define(definition, persist)\n}\n","import type { Factory } from './factory'\n\n/**\n * Process-global registry that lets you look up factories by name.\n * Mirrors how Laravel resolves `UserFactory` from `User::factory()`.\n *\n * @example\n * ```ts\n * FactoryRegistry.register('User', UserFactory)\n * const f = FactoryRegistry.resolve<User>('User')\n * f.count(5).make()\n * ```\n */\nexport const FactoryRegistry = {\n register<T extends object>(name: string, factory: Factory<T>): void {\n registry.set(name, factory as unknown as Factory<object>)\n },\n\n resolve<T extends object>(name: string): Factory<T> {\n const f = registry.get(name)\n if (!f) {\n throw new Error(\n `[FactoryRegistry] No factory registered as \"${name}\". Registered: ${[...registry.keys()].join(', ')}`,\n )\n }\n return f as unknown as Factory<T>\n },\n\n has(name: string): boolean {\n return registry.has(name)\n },\n\n unregister(name: string): boolean {\n return registry.delete(name)\n },\n\n clear(): void {\n registry.clear()\n },\n\n names(): string[] {\n return [...registry.keys()]\n },\n}\n\nconst registry = new Map<string, Factory<object>>()\n","import { faker } from '@/faker'\n\n/**\n * Pick one value from `choices` at call time. Reads from the default faker.\n * Use inside factory definitions to express \"any of these\".\n *\n * @example\n * ```ts\n * defineFactory<User>(({ faker }) => ({\n * role: oneOf(['admin', 'editor', 'viewer']),\n * }))\n * ```\n */\nexport function oneOf<T>(choices: readonly T[]): T {\n return faker.helpers.arrayElement(choices)\n}\n\n/**\n * Return `value` with probability `chance`, else `undefined`. Useful for\n * optional fields.\n *\n * @example\n * ```ts\n * { bio: maybe(faker.lorem.sentence(), 0.6) }\n * ```\n */\nexport function maybe<T>(value: T, chance = 0.5): T | undefined {\n return faker.helpers.maybe(value, chance)\n}\n\n/**\n * Build an array of length `[min, max]` (inclusive) by calling `fn(index)`.\n * If only `min` is given, the length is exactly `min`.\n *\n * @example\n * ```ts\n * { tags: array(2, 5, () => faker.lorem.word()) }\n * ```\n */\nexport function array<T>(\n min: number,\n maxOrFn: number | ((i: number) => T),\n fn?: (i: number) => T,\n): T[] {\n if (typeof maxOrFn === 'function') {\n return Array.from({ length: min }, (_, i) => maxOrFn(i))\n }\n if (!fn) throw new Error('[builders] array(min, max, fn): missing builder function.')\n const length = faker.helpers.arrayElement(\n Array.from({ length: maxOrFn - min + 1 }, (_, i) => min + i),\n )\n return Array.from({ length }, (_, i) => fn(i))\n}\n\n/**\n * Defer evaluation until the value is actually read. Inside factory\n * definitions you rarely need this (the definition is a function already),\n * but it's useful for sequence entries and state values.\n */\nexport function lazy<T>(fn: () => T): { resolve(): T } {\n return { resolve: fn }\n}\n","/**\n * Snapshot helpers.\n *\n * The package doesn't write files itself — it just normalises payloads so\n * test runners (vitest, jest) can snapshot them deterministically.\n *\n * @example\n * ```ts\n * import { snapshot } from '@anil-labs/factory'\n *\n * const items = UserFactory.seed(42).count(3).make()\n * expect(snapshot(items)).toMatchSnapshot()\n * ```\n */\n\n/** Recursively normalise dates, undefineds, and key order so snapshots are stable. */\nexport function snapshot(value: unknown): unknown {\n return normalise(value)\n}\n\nfunction normalise(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (value instanceof Date) return { __type: 'Date', value: value.toISOString() }\n if (Array.isArray(value)) return value.map(normalise)\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(value).sort()) {\n out[key] = normalise((value as Record<string, unknown>)[key])\n }\n return out\n }\n return value\n}\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @anil-labs/factory — Laravel-inspired model factories + faceted seedable faker
3
+ * for TypeScript. Zero runtime deps, ESM + CJS, framework-agnostic.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { defineFactory, faker, memoryPersist } from '@anil-labs/factory'
8
+ *
9
+ * interface User { id: number; name: string; email: string }
10
+ *
11
+ * const UserFactory = defineFactory<User>(({ seq, faker }) => ({
12
+ * id: seq,
13
+ * name: faker.person.fullName(),
14
+ * email: faker.internet.email(),
15
+ * }))
16
+ *
17
+ * UserFactory.count(5).make() // → User[]
18
+ * UserFactory.seed(42).make() // → deterministic
19
+ * await UserFactory.persist(memoryPersist()).create()
20
+ * ```
21
+ */
22
+ export { Factory, defineFactory } from './core/factory';
23
+ export { Sequence, sequence } from './core/sequence';
24
+ export type { SequenceEntry, SequenceInfo } from './core/sequence';
25
+ export { Collection } from './core/collection';
26
+ export { FactoryRegistry } from './core/registry';
27
+ export type { BuildContext, Definition, Hook, HasAttachedRelation, HasRelation, Persist, StateFn, StateValue, } from './core/types';
28
+ export { Faker, faker } from './faker';
29
+ export type { FakerOptions } from './faker';
30
+ export { LocaleRef, registerLocale, getLocale, listLocales, en, generateFromRegex, Person, Internet, Location, Lorem, DateGen, NumberGen, StringGen, Color, Company, Commerce, Finance, Image, System, Datatype, Helpers, } from './faker';
31
+ export type { LocaleData, WeightedItem, UniqueOptions } from './faker';
32
+ export { Mulberry32, createPrng } from './prng';
33
+ export type { Prng } from './prng';
34
+ export { oneOf, maybe, array, lazy } from './builders';
35
+ export { memoryPersist, httpPersist, consolePersist } from './persist';
36
+ export type { HttpPersistOptions } from './persist';
37
+ export { snapshot } from './snapshot';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @anil-labs/factory — Laravel-inspired model factories + faceted seedable faker
3
+ * for TypeScript. Zero runtime deps, ESM + CJS, framework-agnostic.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { defineFactory, faker, memoryPersist } from '@anil-labs/factory'
8
+ *
9
+ * interface User { id: number; name: string; email: string }
10
+ *
11
+ * const UserFactory = defineFactory<User>(({ seq, faker }) => ({
12
+ * id: seq,
13
+ * name: faker.person.fullName(),
14
+ * email: faker.internet.email(),
15
+ * }))
16
+ *
17
+ * UserFactory.count(5).make() // → User[]
18
+ * UserFactory.seed(42).make() // → deterministic
19
+ * await UserFactory.persist(memoryPersist()).create()
20
+ * ```
21
+ */
22
+ export { Factory, defineFactory } from './core/factory';
23
+ export { Sequence, sequence } from './core/sequence';
24
+ export type { SequenceEntry, SequenceInfo } from './core/sequence';
25
+ export { Collection } from './core/collection';
26
+ export { FactoryRegistry } from './core/registry';
27
+ export type { BuildContext, Definition, Hook, HasAttachedRelation, HasRelation, Persist, StateFn, StateValue, } from './core/types';
28
+ export { Faker, faker } from './faker';
29
+ export type { FakerOptions } from './faker';
30
+ export { LocaleRef, registerLocale, getLocale, listLocales, en, generateFromRegex, Person, Internet, Location, Lorem, DateGen, NumberGen, StringGen, Color, Company, Commerce, Finance, Image, System, Datatype, Helpers, } from './faker';
31
+ export type { LocaleData, WeightedItem, UniqueOptions } from './faker';
32
+ export { Mulberry32, createPrng } from './prng';
33
+ export type { Prng } from './prng';
34
+ export { oneOf, maybe, array, lazy } from './builders';
35
+ export { memoryPersist, httpPersist, consolePersist } from './persist';
36
+ export type { HttpPersistOptions } from './persist';
37
+ export { snapshot } from './snapshot';