@beignet/core 0.0.1 → 0.0.3

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 (287) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +202 -8
  3. package/dist/application/index.d.ts +93 -9
  4. package/dist/application/index.d.ts.map +1 -1
  5. package/dist/application/index.js +11 -11
  6. package/dist/application/index.js.map +1 -1
  7. package/dist/client/client.d.ts +73 -12
  8. package/dist/client/client.d.ts.map +1 -1
  9. package/dist/client/client.js +37 -12
  10. package/dist/client/client.js.map +1 -1
  11. package/dist/client/index.d.ts +12 -0
  12. package/dist/client/index.d.ts.map +1 -1
  13. package/dist/client/index.js +6 -0
  14. package/dist/client/index.js.map +1 -1
  15. package/dist/client/types.d.ts +69 -8
  16. package/dist/client/types.d.ts.map +1 -1
  17. package/dist/config/index.d.ts +84 -0
  18. package/dist/config/index.d.ts.map +1 -1
  19. package/dist/config/index.js +36 -0
  20. package/dist/config/index.js.map +1 -1
  21. package/dist/contracts/contract-builder.d.ts +49 -22
  22. package/dist/contracts/contract-builder.d.ts.map +1 -1
  23. package/dist/contracts/contract-builder.js +48 -21
  24. package/dist/contracts/contract-builder.js.map +1 -1
  25. package/dist/contracts/contract-group.d.ts +35 -19
  26. package/dist/contracts/contract-group.d.ts.map +1 -1
  27. package/dist/contracts/contract-group.js +35 -19
  28. package/dist/contracts/contract-group.js.map +1 -1
  29. package/dist/contracts/contract-like.d.ts +4 -4
  30. package/dist/contracts/contract-like.d.ts.map +1 -1
  31. package/dist/contracts/contract-like.js +2 -1
  32. package/dist/contracts/contract-like.js.map +1 -1
  33. package/dist/contracts/index.d.ts +28 -0
  34. package/dist/contracts/index.d.ts.map +1 -1
  35. package/dist/contracts/index.js +12 -0
  36. package/dist/contracts/index.js.map +1 -1
  37. package/dist/contracts/openapi-meta.d.ts +8 -8
  38. package/dist/contracts/openapi-meta.d.ts.map +1 -1
  39. package/dist/contracts/path-template.d.ts +27 -0
  40. package/dist/contracts/path-template.d.ts.map +1 -1
  41. package/dist/contracts/path-template.js +6 -0
  42. package/dist/contracts/path-template.js.map +1 -1
  43. package/dist/contracts/types.d.ts +104 -10
  44. package/dist/contracts/types.d.ts.map +1 -1
  45. package/dist/contracts/types.js +15 -0
  46. package/dist/contracts/types.js.map +1 -1
  47. package/dist/contracts/utils.d.ts +6 -0
  48. package/dist/contracts/utils.d.ts.map +1 -1
  49. package/dist/contracts/utils.js +6 -0
  50. package/dist/contracts/utils.js.map +1 -1
  51. package/dist/domain/entity.d.ts +22 -11
  52. package/dist/domain/entity.d.ts.map +1 -1
  53. package/dist/domain/entity.js +5 -1
  54. package/dist/domain/entity.js.map +1 -1
  55. package/dist/domain/events.d.ts +5 -2
  56. package/dist/domain/events.d.ts.map +1 -1
  57. package/dist/domain/events.js +4 -1
  58. package/dist/domain/events.js.map +1 -1
  59. package/dist/domain/value-object.d.ts +19 -9
  60. package/dist/domain/value-object.d.ts.map +1 -1
  61. package/dist/domain/value-object.js +5 -1
  62. package/dist/domain/value-object.js.map +1 -1
  63. package/dist/errors/catalog.d.ts +40 -16
  64. package/dist/errors/catalog.d.ts.map +1 -1
  65. package/dist/errors/catalog.js +18 -7
  66. package/dist/errors/catalog.js.map +1 -1
  67. package/dist/errors/response.d.ts +16 -4
  68. package/dist/errors/response.d.ts.map +1 -1
  69. package/dist/errors/response.js +3 -3
  70. package/dist/errors/response.js.map +1 -1
  71. package/dist/errors/validation.d.ts +10 -1
  72. package/dist/errors/validation.d.ts.map +1 -1
  73. package/dist/errors/validation.js +3 -0
  74. package/dist/errors/validation.js.map +1 -1
  75. package/dist/events/index.d.ts +133 -0
  76. package/dist/events/index.d.ts.map +1 -1
  77. package/dist/events/index.js +30 -0
  78. package/dist/events/index.js.map +1 -1
  79. package/dist/idempotency/index.d.ts +355 -0
  80. package/dist/idempotency/index.d.ts.map +1 -0
  81. package/dist/idempotency/index.js +360 -0
  82. package/dist/idempotency/index.js.map +1 -0
  83. package/dist/jobs/index.d.ts +248 -4
  84. package/dist/jobs/index.d.ts.map +1 -1
  85. package/dist/jobs/index.js +183 -1
  86. package/dist/jobs/index.js.map +1 -1
  87. package/dist/mail/index.d.ts +149 -0
  88. package/dist/mail/index.d.ts.map +1 -1
  89. package/dist/mail/index.js +30 -0
  90. package/dist/mail/index.js.map +1 -1
  91. package/dist/notifications/index.d.ts +369 -0
  92. package/dist/notifications/index.d.ts.map +1 -0
  93. package/dist/notifications/index.js +310 -0
  94. package/dist/notifications/index.js.map +1 -0
  95. package/dist/openapi/index.d.ts +132 -16
  96. package/dist/openapi/index.d.ts.map +1 -1
  97. package/dist/openapi/index.js +1 -1
  98. package/dist/openapi/index.js.map +1 -1
  99. package/dist/outbox/index.d.ts +474 -0
  100. package/dist/outbox/index.d.ts.map +1 -0
  101. package/dist/outbox/index.js +538 -0
  102. package/dist/outbox/index.js.map +1 -0
  103. package/dist/pagination/index.d.ts +166 -0
  104. package/dist/pagination/index.d.ts.map +1 -0
  105. package/dist/pagination/index.js +96 -0
  106. package/dist/pagination/index.js.map +1 -0
  107. package/dist/ports/audit.d.ts +271 -0
  108. package/dist/ports/audit.d.ts.map +1 -1
  109. package/dist/ports/audit.js +128 -0
  110. package/dist/ports/audit.js.map +1 -1
  111. package/dist/ports/auth.d.ts +70 -0
  112. package/dist/ports/auth.d.ts.map +1 -1
  113. package/dist/ports/auth.js +30 -0
  114. package/dist/ports/auth.js.map +1 -1
  115. package/dist/ports/cache.d.ts +41 -0
  116. package/dist/ports/cache.d.ts.map +1 -1
  117. package/dist/ports/cache.js +10 -0
  118. package/dist/ports/cache.js.map +1 -1
  119. package/dist/ports/clock.d.ts +38 -0
  120. package/dist/ports/clock.d.ts.map +1 -1
  121. package/dist/ports/clock.js +20 -0
  122. package/dist/ports/clock.js.map +1 -1
  123. package/dist/ports/id-generator.d.ts +37 -0
  124. package/dist/ports/id-generator.d.ts.map +1 -1
  125. package/dist/ports/id-generator.js +22 -0
  126. package/dist/ports/id-generator.js.map +1 -1
  127. package/dist/ports/index.d.ts +83 -0
  128. package/dist/ports/index.d.ts.map +1 -1
  129. package/dist/ports/index.js +41 -5
  130. package/dist/ports/index.js.map +1 -1
  131. package/dist/ports/logger.d.ts +56 -0
  132. package/dist/ports/logger.d.ts.map +1 -1
  133. package/dist/ports/logger.js +17 -0
  134. package/dist/ports/logger.js.map +1 -1
  135. package/dist/ports/policy.d.ts +132 -0
  136. package/dist/ports/policy.d.ts.map +1 -1
  137. package/dist/ports/policy.js +45 -0
  138. package/dist/ports/policy.js.map +1 -1
  139. package/dist/ports/rate-limit.d.ts +25 -0
  140. package/dist/ports/rate-limit.d.ts.map +1 -1
  141. package/dist/ports/rate-limit.js +10 -0
  142. package/dist/ports/rate-limit.js.map +1 -1
  143. package/dist/ports/redaction.d.ts +101 -0
  144. package/dist/ports/redaction.d.ts.map +1 -1
  145. package/dist/ports/redaction.js +59 -0
  146. package/dist/ports/redaction.js.map +1 -1
  147. package/dist/ports/storage.d.ts +100 -0
  148. package/dist/ports/storage.d.ts.map +1 -1
  149. package/dist/ports/storage.js +10 -0
  150. package/dist/ports/storage.js.map +1 -1
  151. package/dist/ports/testing.d.ts +47 -0
  152. package/dist/ports/testing.d.ts.map +1 -1
  153. package/dist/ports/testing.js +23 -0
  154. package/dist/ports/testing.js.map +1 -1
  155. package/dist/ports/unit-of-work.d.ts +60 -3
  156. package/dist/ports/unit-of-work.d.ts.map +1 -1
  157. package/dist/ports/unit-of-work.js +11 -2
  158. package/dist/ports/unit-of-work.js.map +1 -1
  159. package/dist/providers/instrumentation.d.ts +205 -1
  160. package/dist/providers/instrumentation.d.ts.map +1 -1
  161. package/dist/providers/instrumentation.js +14 -0
  162. package/dist/providers/instrumentation.js.map +1 -1
  163. package/dist/providers/provider.d.ts +14 -1
  164. package/dist/providers/provider.d.ts.map +1 -1
  165. package/dist/providers/provider.js.map +1 -1
  166. package/dist/schedules/index.d.ts +246 -0
  167. package/dist/schedules/index.d.ts.map +1 -1
  168. package/dist/schedules/index.js +27 -0
  169. package/dist/schedules/index.js.map +1 -1
  170. package/dist/server/health.d.ts +14 -5
  171. package/dist/server/health.d.ts.map +1 -1
  172. package/dist/server/health.js +5 -2
  173. package/dist/server/health.js.map +1 -1
  174. package/dist/server/hooks/auth.d.ts +68 -26
  175. package/dist/server/hooks/auth.d.ts.map +1 -1
  176. package/dist/server/hooks/auth.js +44 -55
  177. package/dist/server/hooks/auth.js.map +1 -1
  178. package/dist/server/hooks/cors.d.ts +27 -0
  179. package/dist/server/hooks/cors.d.ts.map +1 -1
  180. package/dist/server/hooks/cors.js +12 -0
  181. package/dist/server/hooks/cors.js.map +1 -1
  182. package/dist/server/hooks/errors.d.ts +15 -6
  183. package/dist/server/hooks/errors.d.ts.map +1 -1
  184. package/dist/server/hooks/errors.js.map +1 -1
  185. package/dist/server/hooks/index.d.ts +4 -1
  186. package/dist/server/hooks/index.d.ts.map +1 -1
  187. package/dist/server/hooks/index.js +3 -0
  188. package/dist/server/hooks/index.js.map +1 -1
  189. package/dist/server/hooks/logging.d.ts +36 -0
  190. package/dist/server/hooks/logging.d.ts.map +1 -1
  191. package/dist/server/hooks/logging.js +6 -0
  192. package/dist/server/hooks/logging.js.map +1 -1
  193. package/dist/server/hooks/rate-limit.d.ts +33 -0
  194. package/dist/server/hooks/rate-limit.d.ts.map +1 -1
  195. package/dist/server/hooks/rate-limit.js +11 -0
  196. package/dist/server/hooks/rate-limit.js.map +1 -1
  197. package/dist/server/http.d.ts +222 -0
  198. package/dist/server/http.d.ts.map +1 -1
  199. package/dist/server/http.js +20 -1
  200. package/dist/server/http.js.map +1 -1
  201. package/dist/server/index.d.ts +19 -1
  202. package/dist/server/index.d.ts.map +1 -1
  203. package/dist/server/index.js +7 -1
  204. package/dist/server/index.js.map +1 -1
  205. package/dist/server/openapi.d.ts +5 -3
  206. package/dist/server/openapi.d.ts.map +1 -1
  207. package/dist/server/openapi.js +4 -2
  208. package/dist/server/openapi.js.map +1 -1
  209. package/dist/server/providers/loadProviderConfig.d.ts +9 -0
  210. package/dist/server/providers/loadProviderConfig.d.ts.map +1 -1
  211. package/dist/server/providers/loadProviderConfig.js +9 -0
  212. package/dist/server/providers/loadProviderConfig.js.map +1 -1
  213. package/dist/server/server.d.ts +159 -19
  214. package/dist/server/server.d.ts.map +1 -1
  215. package/dist/server/server.js +72 -31
  216. package/dist/server/server.js.map +1 -1
  217. package/dist/testing/index.d.ts +171 -0
  218. package/dist/testing/index.d.ts.map +1 -0
  219. package/dist/testing/index.js +127 -0
  220. package/dist/testing/index.js.map +1 -0
  221. package/dist/uploads/client.d.ts +278 -0
  222. package/dist/uploads/client.d.ts.map +1 -0
  223. package/dist/uploads/client.js +428 -0
  224. package/dist/uploads/client.js.map +1 -0
  225. package/dist/uploads/index.d.ts +361 -0
  226. package/dist/uploads/index.d.ts.map +1 -0
  227. package/dist/uploads/index.js +543 -0
  228. package/dist/uploads/index.js.map +1 -0
  229. package/package.json +31 -2
  230. package/src/application/index.ts +85 -22
  231. package/src/client/client.ts +73 -12
  232. package/src/client/index.ts +12 -0
  233. package/src/client/types.ts +70 -9
  234. package/src/config/index.ts +86 -0
  235. package/src/contracts/contract-builder.ts +49 -22
  236. package/src/contracts/contract-group.ts +35 -19
  237. package/src/contracts/contract-like.ts +4 -4
  238. package/src/contracts/index.ts +28 -1
  239. package/src/contracts/openapi-meta.ts +8 -8
  240. package/src/contracts/path-template.ts +27 -0
  241. package/src/contracts/types.ts +111 -10
  242. package/src/contracts/utils.ts +6 -0
  243. package/src/domain/entity.ts +22 -11
  244. package/src/domain/events.ts +5 -2
  245. package/src/domain/value-object.ts +19 -9
  246. package/src/errors/catalog.ts +40 -16
  247. package/src/errors/response.ts +16 -4
  248. package/src/errors/validation.ts +10 -1
  249. package/src/events/index.ts +134 -0
  250. package/src/idempotency/index.ts +767 -0
  251. package/src/jobs/index.ts +437 -5
  252. package/src/mail/index.ts +149 -0
  253. package/src/notifications/index.ts +771 -0
  254. package/src/openapi/index.ts +133 -16
  255. package/src/outbox/index.ts +1104 -0
  256. package/src/pagination/index.ts +278 -0
  257. package/src/ports/audit.ts +271 -0
  258. package/src/ports/auth.ts +70 -0
  259. package/src/ports/cache.ts +41 -0
  260. package/src/ports/clock.ts +38 -0
  261. package/src/ports/id-generator.ts +37 -0
  262. package/src/ports/index.ts +106 -11
  263. package/src/ports/logger.ts +56 -0
  264. package/src/ports/policy.ts +133 -0
  265. package/src/ports/rate-limit.ts +25 -0
  266. package/src/ports/redaction.ts +101 -0
  267. package/src/ports/storage.ts +100 -0
  268. package/src/ports/testing.ts +47 -0
  269. package/src/ports/unit-of-work.ts +60 -3
  270. package/src/providers/instrumentation.ts +211 -1
  271. package/src/providers/provider.ts +14 -1
  272. package/src/schedules/index.ts +247 -0
  273. package/src/server/health.ts +14 -5
  274. package/src/server/hooks/auth.ts +105 -120
  275. package/src/server/hooks/cors.ts +27 -0
  276. package/src/server/hooks/errors.ts +15 -6
  277. package/src/server/hooks/index.ts +4 -5
  278. package/src/server/hooks/logging.ts +36 -0
  279. package/src/server/hooks/rate-limit.ts +33 -0
  280. package/src/server/http.ts +249 -1
  281. package/src/server/index.ts +19 -1
  282. package/src/server/openapi.ts +5 -3
  283. package/src/server/providers/loadProviderConfig.ts +9 -0
  284. package/src/server/server.ts +296 -30
  285. package/src/testing/index.ts +348 -0
  286. package/src/uploads/client.ts +861 -0
  287. package/src/uploads/index.ts +1067 -0
@@ -0,0 +1,348 @@
1
+ import { type ClockPort, createSystemClock } from "../ports/clock";
2
+ import {
3
+ createUuidIdGenerator,
4
+ type IdGeneratorPort,
5
+ } from "../ports/id-generator";
6
+
7
+ /**
8
+ * Value that may be returned synchronously or asynchronously.
9
+ */
10
+ export type MaybePromise<T> = T | Promise<T>;
11
+
12
+ /**
13
+ * Arguments passed to a factory default builder.
14
+ */
15
+ export interface FactoryBuildArgs<Name extends string = string> {
16
+ /**
17
+ * Factory name.
18
+ */
19
+ readonly name: Name;
20
+ /**
21
+ * Current sequence value.
22
+ */
23
+ readonly sequence: number;
24
+ /**
25
+ * ID generator available to the factory.
26
+ */
27
+ readonly ids: IdGeneratorPort;
28
+ /**
29
+ * Clock available to the factory.
30
+ */
31
+ readonly clock: ClockPort;
32
+ }
33
+
34
+ /**
35
+ * Arguments passed to a factory persistence function.
36
+ */
37
+ export type FactoryPersistArgs<Name extends string = string> =
38
+ FactoryBuildArgs<Name>;
39
+
40
+ /**
41
+ * Overrides accepted by factory build and create methods.
42
+ */
43
+ export type FactoryOverrides<
44
+ Value extends object,
45
+ Name extends string = string,
46
+ > =
47
+ | Partial<Value>
48
+ | ((value: Value, args: FactoryBuildArgs<Name>) => Partial<Value>);
49
+
50
+ /**
51
+ * Options for declaring a test data factory.
52
+ */
53
+ export interface DefineFactoryOptions<
54
+ Name extends string,
55
+ Value extends object,
56
+ Ctx = unknown,
57
+ Created = Value,
58
+ > {
59
+ /**
60
+ * Build the default value for the current sequence.
61
+ */
62
+ defaults(args: FactoryBuildArgs<Name>): Value;
63
+ /**
64
+ * Persist a built value and return the created record.
65
+ */
66
+ persist?(
67
+ ctx: Ctx,
68
+ value: Value,
69
+ args: FactoryPersistArgs<Name>,
70
+ ): MaybePromise<Created>;
71
+ /**
72
+ * ID generator to expose to the factory.
73
+ */
74
+ ids?: IdGeneratorPort;
75
+ /**
76
+ * Clock to expose to the factory.
77
+ */
78
+ clock?: ClockPort;
79
+ /**
80
+ * Initial sequence number. Defaults to `1`.
81
+ */
82
+ start?: number;
83
+ }
84
+
85
+ /**
86
+ * Declared test data factory.
87
+ */
88
+ export interface FactoryDef<
89
+ Name extends string = string,
90
+ Value extends object = object,
91
+ Ctx = unknown,
92
+ Created = Value,
93
+ > {
94
+ /**
95
+ * Discriminator for factory definitions.
96
+ */
97
+ readonly kind: "factory";
98
+ /**
99
+ * Factory name.
100
+ */
101
+ readonly name: Name;
102
+ /**
103
+ * Build an in-memory value.
104
+ */
105
+ build(overrides?: FactoryOverrides<Value, Name>): Value;
106
+ /**
107
+ * Build multiple in-memory values.
108
+ */
109
+ buildList(count: number, overrides?: FactoryOverrides<Value, Name>): Value[];
110
+ /**
111
+ * Build and persist a value.
112
+ */
113
+ create(ctx: Ctx, overrides?: FactoryOverrides<Value, Name>): Promise<Created>;
114
+ /**
115
+ * Build and persist multiple values.
116
+ */
117
+ createList(
118
+ ctx: Ctx,
119
+ count: number,
120
+ overrides?: FactoryOverrides<Value, Name>,
121
+ ): Promise<Created[]>;
122
+ /**
123
+ * Reset the factory sequence.
124
+ */
125
+ resetSequence(next?: number): void;
126
+ }
127
+
128
+ /**
129
+ * Options for declaring a seed.
130
+ */
131
+ export interface DefineSeedOptions<Ctx> {
132
+ /**
133
+ * Optional human-readable seed description.
134
+ */
135
+ description?: string;
136
+ /**
137
+ * Execute the seed.
138
+ */
139
+ run(ctx: Ctx): MaybePromise<void>;
140
+ }
141
+
142
+ /**
143
+ * Declared seed that can be run with `runSeeds(...)`.
144
+ */
145
+ export interface SeedDef<Ctx = unknown, Name extends string = string> {
146
+ /**
147
+ * Discriminator for seed definitions.
148
+ */
149
+ readonly kind: "seed";
150
+ /**
151
+ * Seed name.
152
+ */
153
+ readonly name: Name;
154
+ /**
155
+ * Optional human-readable seed description.
156
+ */
157
+ readonly description?: string;
158
+ /**
159
+ * Execute the seed.
160
+ */
161
+ run(ctx: Ctx): MaybePromise<void>;
162
+ }
163
+
164
+ /**
165
+ * Options for running a list of seeds.
166
+ */
167
+ export interface RunSeedsOptions<Ctx> {
168
+ /**
169
+ * Context passed to every seed.
170
+ */
171
+ ctx: Ctx;
172
+ /**
173
+ * Seeds to run in order.
174
+ */
175
+ seeds: readonly SeedDef<Ctx>[];
176
+ }
177
+
178
+ /**
179
+ * Error thrown when a seed fails.
180
+ */
181
+ export class SeedRunError extends Error {
182
+ /**
183
+ * Seed that failed.
184
+ */
185
+ readonly seed: SeedDef;
186
+ /**
187
+ * Original thrown value.
188
+ */
189
+ readonly cause: unknown;
190
+
191
+ constructor(seed: SeedDef, cause: unknown) {
192
+ super(`Seed "${seed.name}" failed: ${errorMessage(cause)}`);
193
+ this.name = "SeedRunError";
194
+ this.seed = seed;
195
+ this.cause = cause;
196
+ }
197
+ }
198
+
199
+ /**
200
+ * Reset one or more factory sequences to their configured starting values.
201
+ */
202
+ export function resetFactories(
203
+ ...factories: readonly Pick<FactoryDef, "resetSequence">[]
204
+ ): void {
205
+ for (const factory of factories) {
206
+ factory.resetSequence();
207
+ }
208
+ }
209
+
210
+ function errorMessage(error: unknown): string {
211
+ return error instanceof Error ? error.message : String(error);
212
+ }
213
+
214
+ function factoryArgs<Name extends string>(args: {
215
+ name: Name;
216
+ sequence: number;
217
+ ids: IdGeneratorPort;
218
+ clock: ClockPort;
219
+ }): FactoryBuildArgs<Name> {
220
+ return args;
221
+ }
222
+
223
+ function applyOverrides<Value extends object, Name extends string>(
224
+ value: Value,
225
+ args: FactoryBuildArgs<Name>,
226
+ overrides: FactoryOverrides<Value, Name> | undefined,
227
+ ): Value {
228
+ if (!overrides) return value;
229
+
230
+ const resolved =
231
+ typeof overrides === "function" ? overrides(value, args) : overrides;
232
+
233
+ return {
234
+ ...value,
235
+ ...resolved,
236
+ };
237
+ }
238
+
239
+ function assertCount(kind: "buildList" | "createList", count: number): void {
240
+ if (!Number.isInteger(count) || count < 0) {
241
+ throw new Error(`Factory ${kind} count must be a non-negative integer.`);
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Define a typed test data factory with deterministic sequence support.
247
+ */
248
+ export function defineFactory<
249
+ const Name extends string,
250
+ Value extends object,
251
+ Ctx = unknown,
252
+ Created = Value,
253
+ >(
254
+ name: Name,
255
+ options: DefineFactoryOptions<Name, Value, Ctx, Created>,
256
+ ): FactoryDef<Name, Value, Ctx, Created> {
257
+ const start = options.start ?? 1;
258
+ const ids = options.ids ?? createUuidIdGenerator();
259
+ const clock = options.clock ?? createSystemClock();
260
+ let nextSequence = start;
261
+
262
+ function build(overrides?: FactoryOverrides<Value, Name>): Value {
263
+ const args = factoryArgs({
264
+ name,
265
+ sequence: nextSequence++,
266
+ ids,
267
+ clock,
268
+ });
269
+ const value = options.defaults(args);
270
+
271
+ return applyOverrides(value, args, overrides);
272
+ }
273
+
274
+ async function create(
275
+ ctx: Ctx,
276
+ overrides?: FactoryOverrides<Value, Name>,
277
+ ): Promise<Created> {
278
+ if (!options.persist) {
279
+ throw new Error(
280
+ `Factory "${name}" cannot create persisted records without a persist function.`,
281
+ );
282
+ }
283
+
284
+ const value = build(overrides);
285
+ const args = factoryArgs({
286
+ name,
287
+ sequence: nextSequence - 1,
288
+ ids,
289
+ clock,
290
+ });
291
+
292
+ return options.persist(ctx, value, args);
293
+ }
294
+
295
+ return {
296
+ kind: "factory",
297
+ name,
298
+ build,
299
+ buildList(count, overrides) {
300
+ assertCount("buildList", count);
301
+ return Array.from({ length: count }, () => build(overrides));
302
+ },
303
+ create,
304
+ async createList(ctx, count, overrides) {
305
+ assertCount("createList", count);
306
+ const created: Created[] = [];
307
+
308
+ for (let index = 0; index < count; index += 1) {
309
+ created.push(await create(ctx, overrides));
310
+ }
311
+
312
+ return created;
313
+ },
314
+ resetSequence(next = start) {
315
+ nextSequence = next;
316
+ },
317
+ };
318
+ }
319
+
320
+ /**
321
+ * Define a named seed.
322
+ */
323
+ export function defineSeed<const Name extends string, Ctx = unknown>(
324
+ name: Name,
325
+ options: DefineSeedOptions<Ctx>,
326
+ ): SeedDef<Ctx, Name> {
327
+ return {
328
+ kind: "seed",
329
+ name,
330
+ description: options.description,
331
+ run: options.run,
332
+ };
333
+ }
334
+
335
+ /**
336
+ * Run seeds in order and wrap failures with the seed name.
337
+ */
338
+ export async function runSeeds<Ctx>(
339
+ options: RunSeedsOptions<Ctx>,
340
+ ): Promise<void> {
341
+ for (const seed of options.seeds) {
342
+ try {
343
+ await seed.run(options.ctx);
344
+ } catch (error) {
345
+ throw new SeedRunError(seed, error);
346
+ }
347
+ }
348
+ }