@c9up/atlas 0.1.19 → 0.2.1

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 (250) hide show
  1. package/README.md +63 -14
  2. package/db.darwin-arm64.node +0 -0
  3. package/db.darwin-x64.node +0 -0
  4. package/db.linux-arm64-gnu.node +0 -0
  5. package/db.linux-x64-gnu.node +0 -0
  6. package/db.win32-x64-msvc.node +0 -0
  7. package/dist/AtlasProvider.d.ts +66 -7
  8. package/dist/AtlasProvider.d.ts.map +1 -1
  9. package/dist/AtlasProvider.js +205 -39
  10. package/dist/AtlasProvider.js.map +1 -1
  11. package/dist/BaseEntity.d.ts +181 -5
  12. package/dist/BaseEntity.d.ts.map +1 -1
  13. package/dist/BaseEntity.js +339 -33
  14. package/dist/BaseEntity.js.map +1 -1
  15. package/dist/BaseModel.d.ts +127 -0
  16. package/dist/BaseModel.d.ts.map +1 -0
  17. package/dist/BaseModel.js +250 -0
  18. package/dist/BaseModel.js.map +1 -0
  19. package/dist/BaseRepository.d.ts +81 -15
  20. package/dist/BaseRepository.d.ts.map +1 -1
  21. package/dist/BaseRepository.js +1433 -387
  22. package/dist/BaseRepository.js.map +1 -1
  23. package/dist/ConnectionManager.d.ts +106 -0
  24. package/dist/ConnectionManager.d.ts.map +1 -0
  25. package/dist/ConnectionManager.js +228 -0
  26. package/dist/ConnectionManager.js.map +1 -0
  27. package/dist/ModelQuery.d.ts +577 -41
  28. package/dist/ModelQuery.d.ts.map +1 -1
  29. package/dist/ModelQuery.js +2188 -291
  30. package/dist/ModelQuery.js.map +1 -1
  31. package/dist/Transaction.d.ts +71 -1
  32. package/dist/Transaction.d.ts.map +1 -1
  33. package/dist/Transaction.js +138 -24
  34. package/dist/Transaction.js.map +1 -1
  35. package/dist/adapters/NapiDbAdapter.d.ts +44 -4
  36. package/dist/adapters/NapiDbAdapter.d.ts.map +1 -1
  37. package/dist/adapters/NapiDbAdapter.js +131 -13
  38. package/dist/adapters/NapiDbAdapter.js.map +1 -1
  39. package/dist/console/contract.d.ts +62 -0
  40. package/dist/console/contract.d.ts.map +1 -0
  41. package/dist/console/contract.js +38 -0
  42. package/dist/console/contract.js.map +1 -0
  43. package/dist/console/factoryCommands.d.ts +23 -0
  44. package/dist/console/factoryCommands.d.ts.map +1 -0
  45. package/dist/console/factoryCommands.js +62 -0
  46. package/dist/console/factoryCommands.js.map +1 -0
  47. package/dist/console/migrationCommands.d.ts +78 -0
  48. package/dist/console/migrationCommands.d.ts.map +1 -0
  49. package/dist/console/migrationCommands.js +327 -0
  50. package/dist/console/migrationCommands.js.map +1 -0
  51. package/dist/console/schemaCheckCommand.d.ts +11 -17
  52. package/dist/console/schemaCheckCommand.d.ts.map +1 -1
  53. package/dist/console/schemaCheckCommand.js +21 -15
  54. package/dist/console/schemaCheckCommand.js.map +1 -1
  55. package/dist/console/schemaDumpCommand.d.ts +30 -0
  56. package/dist/console/schemaDumpCommand.d.ts.map +1 -0
  57. package/dist/console/schemaDumpCommand.js +69 -0
  58. package/dist/console/schemaDumpCommand.js.map +1 -0
  59. package/dist/console/schemaGenerateCommand.d.ts +100 -0
  60. package/dist/console/schemaGenerateCommand.d.ts.map +1 -0
  61. package/dist/console/schemaGenerateCommand.js +246 -0
  62. package/dist/console/schemaGenerateCommand.js.map +1 -0
  63. package/dist/console/seederCommands.d.ts +46 -0
  64. package/dist/console/seederCommands.d.ts.map +1 -0
  65. package/dist/console/seederCommands.js +136 -0
  66. package/dist/console/seederCommands.js.map +1 -0
  67. package/dist/decorators/entity.d.ts +50 -8
  68. package/dist/decorators/entity.d.ts.map +1 -1
  69. package/dist/decorators/entity.js +42 -2
  70. package/dist/decorators/entity.js.map +1 -1
  71. package/dist/decorators/hooks.d.ts +3 -3
  72. package/dist/decorators/hooks.d.ts.map +1 -1
  73. package/dist/decorators/hooks.js.map +1 -1
  74. package/dist/events.d.ts +69 -0
  75. package/dist/events.d.ts.map +1 -0
  76. package/dist/events.js +82 -0
  77. package/dist/events.js.map +1 -0
  78. package/dist/factories.d.ts +8 -0
  79. package/dist/factories.d.ts.map +1 -0
  80. package/dist/factories.js +8 -0
  81. package/dist/factories.js.map +1 -0
  82. package/dist/index.d.ts +15 -5
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +14 -3
  85. package/dist/index.js.map +1 -1
  86. package/dist/lucid-schema.d.ts +15 -0
  87. package/dist/lucid-schema.d.ts.map +1 -0
  88. package/dist/lucid-schema.js +16 -0
  89. package/dist/lucid-schema.js.map +1 -0
  90. package/dist/metadata-keys.d.ts +3 -2
  91. package/dist/metadata-keys.d.ts.map +1 -1
  92. package/dist/naming/NamingStrategy.d.ts +7 -0
  93. package/dist/naming/NamingStrategy.d.ts.map +1 -1
  94. package/dist/naming/NamingStrategy.js +16 -0
  95. package/dist/naming/NamingStrategy.js.map +1 -1
  96. package/dist/orm.d.ts +14 -0
  97. package/dist/orm.d.ts.map +1 -0
  98. package/dist/orm.js +14 -0
  99. package/dist/orm.js.map +1 -0
  100. package/dist/query/DatabaseQueryBuilder.d.ts +557 -0
  101. package/dist/query/DatabaseQueryBuilder.d.ts.map +1 -0
  102. package/dist/query/DatabaseQueryBuilder.js +1798 -0
  103. package/dist/query/DatabaseQueryBuilder.js.map +1 -0
  104. package/dist/query/DmlBuilder.d.ts +62 -0
  105. package/dist/query/DmlBuilder.d.ts.map +1 -0
  106. package/dist/query/DmlBuilder.js +84 -0
  107. package/dist/query/DmlBuilder.js.map +1 -0
  108. package/dist/query/QueryBuilder.d.ts +5 -0
  109. package/dist/query/QueryBuilder.d.ts.map +1 -1
  110. package/dist/query/QueryBuilder.js +7 -0
  111. package/dist/query/QueryBuilder.js.map +1 -1
  112. package/dist/query/RawQueryBuilder.d.ts +47 -0
  113. package/dist/query/RawQueryBuilder.d.ts.map +1 -0
  114. package/dist/query/RawQueryBuilder.js +138 -0
  115. package/dist/query/RawQueryBuilder.js.map +1 -0
  116. package/dist/query/interpolate.d.ts +45 -0
  117. package/dist/query/interpolate.d.ts.map +1 -0
  118. package/dist/query/interpolate.js +51 -0
  119. package/dist/query/interpolate.js.map +1 -0
  120. package/dist/query/native.d.ts +8 -0
  121. package/dist/query/native.d.ts.map +1 -1
  122. package/dist/query/native.js +14 -0
  123. package/dist/query/native.js.map +1 -1
  124. package/dist/query/operators.d.ts +4 -0
  125. package/dist/query/operators.d.ts.map +1 -0
  126. package/dist/query/operators.js +27 -0
  127. package/dist/query/operators.js.map +1 -0
  128. package/dist/schema/Migration.d.ts +50 -3
  129. package/dist/schema/Migration.d.ts.map +1 -1
  130. package/dist/schema/Migration.js +60 -24
  131. package/dist/schema/Migration.js.map +1 -1
  132. package/dist/schema/MigrationRunner.d.ts +95 -34
  133. package/dist/schema/MigrationRunner.d.ts.map +1 -1
  134. package/dist/schema/MigrationRunner.js +523 -68
  135. package/dist/schema/MigrationRunner.js.map +1 -1
  136. package/dist/schema/Schema.d.ts +114 -0
  137. package/dist/schema/Schema.d.ts.map +1 -1
  138. package/dist/schema/Schema.js +272 -3
  139. package/dist/schema/Schema.js.map +1 -1
  140. package/dist/schema/SchemaDumper.d.ts +121 -0
  141. package/dist/schema/SchemaDumper.d.ts.map +1 -0
  142. package/dist/schema/SchemaDumper.js +365 -0
  143. package/dist/schema/SchemaDumper.js.map +1 -0
  144. package/dist/schema/Seeder.d.ts +13 -0
  145. package/dist/schema/Seeder.d.ts.map +1 -1
  146. package/dist/schema/Seeder.js +28 -5
  147. package/dist/schema/Seeder.js.map +1 -1
  148. package/dist/schema/TableBuilder.d.ts +274 -16
  149. package/dist/schema/TableBuilder.d.ts.map +1 -1
  150. package/dist/schema/TableBuilder.js +656 -52
  151. package/dist/schema/TableBuilder.js.map +1 -1
  152. package/dist/schema/catalog.d.ts +71 -0
  153. package/dist/schema/catalog.d.ts.map +1 -0
  154. package/dist/schema/catalog.js +158 -0
  155. package/dist/schema/catalog.js.map +1 -0
  156. package/dist/schema/introspect.d.ts +1 -1
  157. package/dist/schema/introspect.d.ts.map +1 -1
  158. package/dist/schema/introspect.js +26 -11
  159. package/dist/schema/introspect.js.map +1 -1
  160. package/dist/schema/types.d.ts +150 -1
  161. package/dist/schema/types.d.ts.map +1 -1
  162. package/dist/schema/types.js +11 -0
  163. package/dist/schema/types.js.map +1 -1
  164. package/dist/seeders.d.ts +7 -0
  165. package/dist/seeders.d.ts.map +1 -0
  166. package/dist/seeders.js +7 -0
  167. package/dist/seeders.js.map +1 -0
  168. package/dist/services/db.d.ts +122 -5
  169. package/dist/services/db.d.ts.map +1 -1
  170. package/dist/services/db.js +187 -14
  171. package/dist/services/db.js.map +1 -1
  172. package/dist/testing/DatabaseCleanup.d.ts +33 -7
  173. package/dist/testing/DatabaseCleanup.d.ts.map +1 -1
  174. package/dist/testing/DatabaseCleanup.js +54 -24
  175. package/dist/testing/DatabaseCleanup.js.map +1 -1
  176. package/dist/testing/DbAssertions.d.ts +48 -0
  177. package/dist/testing/DbAssertions.d.ts.map +1 -0
  178. package/dist/testing/DbAssertions.js +80 -0
  179. package/dist/testing/DbAssertions.js.map +1 -0
  180. package/dist/testing/Factory.d.ts +166 -15
  181. package/dist/testing/Factory.d.ts.map +1 -1
  182. package/dist/testing/Factory.js +497 -23
  183. package/dist/testing/Factory.js.map +1 -1
  184. package/dist/testing/TestUtils.d.ts +49 -0
  185. package/dist/testing/TestUtils.d.ts.map +1 -0
  186. package/dist/testing/TestUtils.js +79 -0
  187. package/dist/testing/TestUtils.js.map +1 -0
  188. package/dist/testing/index.d.ts +3 -1
  189. package/dist/testing/index.d.ts.map +1 -1
  190. package/dist/testing/index.js +3 -1
  191. package/dist/testing/index.js.map +1 -1
  192. package/dist/types/relations.d.ts +31 -0
  193. package/dist/types/relations.d.ts.map +1 -0
  194. package/dist/types/relations.js +20 -0
  195. package/dist/types/relations.js.map +1 -0
  196. package/index.darwin-arm64.node +0 -0
  197. package/index.darwin-x64.node +0 -0
  198. package/index.linux-arm64-gnu.node +0 -0
  199. package/index.linux-x64-gnu.node +0 -0
  200. package/index.win32-x64-msvc.node +0 -0
  201. package/package.json +32 -2
  202. package/scripts/guard-publish.mjs +15 -0
  203. package/src/AtlasProvider.ts +305 -52
  204. package/src/BaseEntity.ts +460 -41
  205. package/src/BaseModel.ts +461 -0
  206. package/src/BaseRepository.ts +1710 -421
  207. package/src/ConnectionManager.ts +298 -0
  208. package/src/ModelQuery.ts +2998 -335
  209. package/src/Transaction.ts +227 -30
  210. package/src/adapters/NapiDbAdapter.ts +224 -17
  211. package/src/console/contract.ts +96 -0
  212. package/src/console/factoryCommands.ts +73 -0
  213. package/src/console/migrationCommands.ts +448 -0
  214. package/src/console/schemaCheckCommand.ts +26 -22
  215. package/src/console/schemaDumpCommand.ts +96 -0
  216. package/src/console/schemaGenerateCommand.ts +380 -0
  217. package/src/console/seederCommands.ts +174 -0
  218. package/src/decorators/entity.ts +71 -8
  219. package/src/decorators/hooks.ts +5 -3
  220. package/src/events.ts +117 -0
  221. package/src/factories.ts +10 -0
  222. package/src/index.ts +69 -3
  223. package/src/lucid-schema.ts +22 -0
  224. package/src/metadata-keys.ts +3 -2
  225. package/src/naming/NamingStrategy.ts +23 -0
  226. package/src/orm.ts +13 -0
  227. package/src/query/DatabaseQueryBuilder.ts +2724 -0
  228. package/src/query/DmlBuilder.ts +131 -0
  229. package/src/query/QueryBuilder.ts +8 -0
  230. package/src/query/RawQueryBuilder.ts +173 -0
  231. package/src/query/interpolate.ts +73 -0
  232. package/src/query/native.ts +29 -0
  233. package/src/query/operators.ts +27 -0
  234. package/src/schema/Migration.ts +71 -3
  235. package/src/schema/MigrationRunner.ts +676 -69
  236. package/src/schema/Schema.ts +359 -3
  237. package/src/schema/SchemaDumper.ts +518 -0
  238. package/src/schema/Seeder.ts +47 -10
  239. package/src/schema/TableBuilder.ts +783 -52
  240. package/src/schema/catalog.ts +236 -0
  241. package/src/schema/introspect.ts +26 -9
  242. package/src/schema/types.ts +137 -2
  243. package/src/seeders.ts +16 -0
  244. package/src/services/db.ts +361 -21
  245. package/src/testing/DatabaseCleanup.ts +78 -25
  246. package/src/testing/DbAssertions.ts +127 -0
  247. package/src/testing/Factory.ts +837 -40
  248. package/src/testing/TestUtils.ts +123 -0
  249. package/src/testing/index.ts +12 -1
  250. package/src/types/relations.ts +43 -0
@@ -13,7 +13,51 @@
13
13
  *
14
14
  * @implements MISS-18, Story 32.13
15
15
  */
16
+ import { faker } from "@faker-js/faker";
16
17
  import { BaseRepository } from "../BaseRepository.js";
18
+ import { getPrimaryKey, getRelationMetadata } from "../decorators/entity.js";
19
+ import { getConnection } from "../services/db.js";
20
+ import { transaction } from "../Transaction.js";
21
+ const factoryInternals = new WeakMap();
22
+ /**
23
+ * Process-wide counter for stubbed primary keys (Lucid's stub id). Every
24
+ * `makeStubbed*` build with no explicit PK gets the next value, so stubbed
25
+ * instances have stable, distinct, DB-free identifiers — enough to look
26
+ * persisted and to key relations/serialization without a round trip.
27
+ */
28
+ let stubIdCounter = 0;
29
+ /**
30
+ * Global stub-id generator override (Adonis Lucid `Factory.stubId`). Set via
31
+ * {@link Factory.stubId} when models use non-integer primary keys (uuid, etc.);
32
+ * receives the running counter and the instance, returns the id to assign.
33
+ */
34
+ let globalStubId;
35
+ /** Keys that must never be written through a recursive merge — prototype-pollution guard. */
36
+ const FORBIDDEN_MERGE_KEYS = new Set(["__proto__", "constructor", "prototype"]);
37
+ function isPlainObject(value) {
38
+ if (value === null || typeof value !== "object")
39
+ return false;
40
+ const proto = Object.getPrototypeOf(value);
41
+ return proto === Object.prototype || proto === null;
42
+ }
43
+ /**
44
+ * Deep-merge `source` into `target` (Lucid `mergeRecursive`). Plain objects are
45
+ * merged key by key; arrays and every non-plain value replace wholesale. Returns
46
+ * a fresh object — neither argument is mutated. Skips prototype-pollution keys.
47
+ */
48
+ function deepMerge(target, source) {
49
+ const out = { ...target };
50
+ for (const [key, value] of Object.entries(source)) {
51
+ if (FORBIDDEN_MERGE_KEYS.has(key))
52
+ continue;
53
+ const existing = out[key];
54
+ out[key] =
55
+ isPlainObject(existing) && isPlainObject(value)
56
+ ? deepMerge(existing, value)
57
+ : value;
58
+ }
59
+ return out;
60
+ }
17
61
  /**
18
62
  * Define a model factory.
19
63
  *
@@ -22,32 +66,332 @@ import { BaseRepository } from "../BaseRepository.js";
22
66
  * name: 'Test User',
23
67
  * }))
24
68
  */
69
+ /**
70
+ * Adonis Lucid `Factory.define(Model, callback).build()` entry point. `define`
71
+ * captures the model and its defaults; `build()` returns the usable factory
72
+ * builder. Equivalent to the one-call {@link factory} shorthand, which stays.
73
+ *
74
+ * const UserFactory = Factory.define(User, ({ faker }) => ({
75
+ * email: faker.internet.email(),
76
+ * })).build()
77
+ */
78
+ export const Factory = {
79
+ define(entityClass, defaults) {
80
+ return { build: () => factory(entityClass, defaults) };
81
+ },
82
+ /**
83
+ * Override the global stub-id generator (Adonis Lucid `Factory.stubId`). Use
84
+ * when your models have non-integer primary keys — the callback receives the
85
+ * running counter and the instance and returns the id to assign. Pass
86
+ * `null`/nothing to restore the default incrementing integer.
87
+ */
88
+ stubId(generator) {
89
+ globalStubId = generator ?? undefined;
90
+ },
91
+ };
25
92
  export function factory(entityClass, defaults) {
26
93
  // Persistent state — lives across calls.
27
94
  const states = new Map();
28
95
  // Transient state — resets after every `make`/`create`.
29
96
  let pendingOverrides = {};
97
+ // Per-row overrides from `merge([...])`, applied by row index on makeMany/createMany.
98
+ let pendingOverridesList;
99
+ // `merge(callback)` mutators, applied on the built INSTANCE (with the resolved
100
+ // attributes) after instantiation, in call order.
101
+ let pendingMergeFns = [];
102
+ // Recursive overrides are kept apart from the shallow `pendingOverrides`
103
+ // because they must deep-merge into `defaults()`, which only exists at build
104
+ // time — a shallow spread here would clobber a whole nested object.
105
+ let pendingRecursive = {};
30
106
  let pendingStates = [];
31
- const buildData = () => {
32
- const data = {
33
- ...defaults(),
107
+ // Relations: persistent factory resolvers keyed by relation name, plus the
108
+ // transient `.with()` queue consumed by create()/createMany().
109
+ const relations = new Map();
110
+ let pendingWith = [];
111
+ // Transient `.tap()` callbacks run on the built instance before persistence.
112
+ // Adonis Lucid passes the model, the runtime context, and the factory builder.
113
+ let pendingTap = [];
114
+ // Transient pivot columns for the NEXT m2m `.with()` link (Adonis Lucid
115
+ // `.pivotAttributes()`), read by the parent factory's applyRelations. A single
116
+ // object applies to every linked row; an array sets per-row values.
117
+ let pendingPivot;
118
+ // Persistent custom instantiation (Adonis Lucid `.newUp`) — replaces
119
+ // `new Model() + setProp` when set.
120
+ let customNewUp;
121
+ // Persistent connection bound via `.client()`/`.connection()`, used when
122
+ // create()/createMany() are called without an explicit `db`.
123
+ let boundClient;
124
+ /** The connection to persist through: the explicit arg wins over the bound one. */
125
+ const resolveConnection = (db) => {
126
+ const conn = db ?? boundClient;
127
+ if (!conn) {
128
+ throw new Error(`Factory ${entityClass.name}: no connection — pass one to create()/createMany() or bind one with .client()/.connection().`);
129
+ }
130
+ return conn;
131
+ };
132
+ const beforeHooks = {
133
+ create: [],
134
+ makeStubbed: [],
135
+ };
136
+ // `make` has no `before` counterpart in Lucid (nothing to gate before an
137
+ // un-persisted build), so it lives on the after-side only.
138
+ const afterHooks = {
139
+ make: [],
140
+ create: [],
141
+ makeStubbed: [],
142
+ };
143
+ // Primary-key property, resolved once, for stub-id assignment. Same fallback
144
+ // as BaseRepository so a model without an explicit `@PrimaryKey` uses `id`.
145
+ const primaryKey = getPrimaryKey(entityClass) ?? "id";
146
+ /** Hydrate a fresh (not-yet-persisted) instance — or defer to `.newUp` when set. */
147
+ const newInstance = (data, ctx) => {
148
+ if (customNewUp)
149
+ return customNewUp(data, ctx);
150
+ const entity = new entityClass();
151
+ for (const [key, value] of Object.entries(data)) {
152
+ entity.setProp(key, value);
153
+ }
154
+ return entity;
155
+ };
156
+ /** Run every tap with the Lucid `(model, ctx, builder)` signature. */
157
+ const runTaps = (taps, entity, ctx) => {
158
+ for (const tap of taps)
159
+ tap(entity, ctx, builder);
160
+ };
161
+ /** Build a stubbed instance: hydrate, run taps, give it a stub id if none was
162
+ * supplied, then mark persisted so it mirrors a fetched row. Taps run before
163
+ * `markAsPersisted` so tapped fields land in the clean snapshot. */
164
+ /** Build the runtime context for a build (Adonis Lucid factory `ctx`). */
165
+ const makeCtx = (isStubbed) => ({
166
+ faker,
167
+ isStubbed,
168
+ $trx: boundClient,
169
+ });
170
+ const stub = (data, taps, mergeFns, stateNames, ctx) => {
171
+ const entity = newInstance(data, ctx);
172
+ applyMergeFns(entity, data, mergeFns, ctx);
173
+ applyStates(entity, stateNames, ctx);
174
+ runTaps(taps, entity, ctx);
175
+ // before('makeStubbed') runs BEFORE the stub id, so a hook can set the PK.
176
+ for (const hook of beforeHooks.makeStubbed)
177
+ hook(builder, entity, ctx);
178
+ // Assign a stub id only when neither the data NOR a before hook set the PK.
179
+ // A global `Factory.stubId` override generates it (uuid, etc.) when set.
180
+ if (entity[primaryKey] === undefined) {
181
+ const next = ++stubIdCounter;
182
+ entity.setProp(primaryKey, globalStubId ? globalStubId(next, entity) : next);
183
+ }
184
+ entity.markAsPersisted();
185
+ for (const hook of afterHooks.makeStubbed)
186
+ hook(builder, entity, ctx);
187
+ return entity;
188
+ };
189
+ const buildData = (ctx, index = 0) => {
190
+ let data = {
191
+ ...defaults(ctx),
34
192
  ...pendingOverrides,
193
+ // Per-row array overrides (merge([...])) win over the shared object.
194
+ ...(pendingOverridesList?.[index] ?? {}),
35
195
  };
36
- for (const name of pendingStates) {
196
+ // Deep overrides layer on top of the shallow one so nested defaults survive.
197
+ if (Object.keys(pendingRecursive).length > 0) {
198
+ data = deepMerge(data, pendingRecursive);
199
+ }
200
+ return data;
201
+ };
202
+ /**
203
+ * Run `merge(callback)` mutators on the built INSTANCE (Adonis Lucid passes the
204
+ * model, the resolved attributes, and the context). Runs before states/taps.
205
+ */
206
+ const applyMergeFns = (entity, attributes, mergeFns, ctx) => {
207
+ for (const fn of mergeFns)
208
+ fn(entity, attributes, ctx);
209
+ };
210
+ /**
211
+ * Run the named states on the built INSTANCE (Adonis Lucid). Separated from
212
+ * {@link buildData} because states mutate the model, not the raw attributes.
213
+ */
214
+ const applyStates = (entity, stateNames, ctx) => {
215
+ for (const name of stateNames) {
37
216
  const fn = states.get(name);
38
- if (!fn)
217
+ if (!fn) {
39
218
  throw new Error(`Factory state '${name}' is not defined on ${entityClass.name}Factory`);
40
- fn(data);
219
+ }
220
+ fn(entity, ctx);
41
221
  }
222
+ };
223
+ /** Build one raw row and clear transient state — the persistence paths
224
+ * (`create`/`createMany`) need the plain object, not an instance. */
225
+ const consumeData = (ctx) => {
226
+ const data = buildData(ctx);
227
+ resetPending();
42
228
  return data;
43
229
  };
230
+ /** Build `count` raw rows (distinct faker/Date values per row), then reset. */
231
+ const consumeDataMany = (count, ctx) => {
232
+ const rows = [];
233
+ for (let i = 0; i < count; i++)
234
+ rows.push(buildData(ctx, i));
235
+ resetPending();
236
+ return rows;
237
+ };
44
238
  const resetPending = () => {
45
239
  pendingOverrides = {};
240
+ pendingOverridesList = undefined;
241
+ pendingMergeFns = [];
242
+ pendingRecursive = {};
46
243
  pendingStates = [];
244
+ pendingTap = [];
245
+ pendingPivot = undefined;
246
+ // Also clear queued relations, so `.with(...).make()` — which ignores
247
+ // relations — cannot leak them into the NEXT create() (create/createMany
248
+ // capture the queue before make() runs, so they are unaffected).
249
+ pendingWith = [];
250
+ };
251
+ /**
252
+ * Persist one row. With no taps this is the plain `repo.create(data)` path,
253
+ * untouched. With taps, the instance is built, tapped, then saved — so a tap
254
+ * can mutate the model before the INSERT (Adonis Lucid `.tap`). `save` on a
255
+ * fresh instance runs the same create hooks as `create`.
256
+ */
257
+ const persist = async (repo, data, taps, mergeFns, stateNames, ctx) => {
258
+ if (taps.length === 0 &&
259
+ mergeFns.length === 0 &&
260
+ stateNames.length === 0 &&
261
+ beforeHooks.create.length === 0 &&
262
+ afterHooks.create.length === 0 &&
263
+ !customNewUp) {
264
+ return repo.create(data);
265
+ }
266
+ const entity = newInstance(data, ctx);
267
+ applyMergeFns(entity, data, mergeFns, ctx);
268
+ applyStates(entity, stateNames, ctx);
269
+ runTaps(taps, entity, ctx);
270
+ for (const hook of beforeHooks.create)
271
+ hook(builder, entity, ctx);
272
+ await repo.save(entity);
273
+ for (const hook of afterHooks.create)
274
+ hook(builder, entity, ctx);
275
+ return entity;
276
+ };
277
+ /**
278
+ * Persist a parent and its queued `.with()` relations. With relations, the
279
+ * whole graph runs in a managed transaction (Adonis Lucid: if a related write
280
+ * fails the parent insert rolls back too); the parent is created through a
281
+ * `useTransaction`-bound repo so its `related()` proxies also use the trx.
282
+ * With no relations there's nothing to make atomic — a single insert already
283
+ * is — so it stays on the plain connection.
284
+ */
285
+ const persistWithRelations = async (conn, withReqs, recursive, build) => {
286
+ if (withReqs.length === 0) {
287
+ // ctx.$trx is the connection actually used to persist (an explicit
288
+ // create(db) client, or the bound one) — not just the bound client.
289
+ return build(new BaseRepository(entityClass, conn), {
290
+ faker,
291
+ isStubbed: false,
292
+ $trx: conn,
293
+ });
294
+ }
295
+ return transaction(conn, async (trx) => {
296
+ const repo = new BaseRepository(entityClass, conn).useTransaction(trx);
297
+ const entity = await build(repo, { faker, isStubbed: false, $trx: trx });
298
+ await applyRelations(entity, withReqs, trx, recursive);
299
+ return entity;
300
+ });
301
+ };
302
+ /**
303
+ * Persist the queued `.with()` relations for one just-created parent, routing
304
+ * through the parent's relation proxy so the FK / pivot is wired by the
305
+ * already-tested relation-write code (not re-derived here).
306
+ */
307
+ const applyRelations = async (parent, reqs, db, recursive) => {
308
+ const meta = getRelationMetadata(entityClass);
309
+ const hasRecursive = recursive && Object.keys(recursive).length > 0;
310
+ for (const req of reqs) {
311
+ const relMeta = meta.find((r) => r.propertyKey === req.name);
312
+ if (!relMeta) {
313
+ throw new Error(`Factory .with('${req.name}'): '${req.name}' is not a declared relation on ${entityClass.name}`);
314
+ }
315
+ const resolver = relations.get(req.name);
316
+ if (!resolver) {
317
+ throw new Error(`Factory .with('${req.name}'): no related factory — declare it with .relation('${req.name}', () => XFactory)`);
318
+ }
319
+ const childFactory = resolver();
320
+ // mergeRecursive cascades the SAME overrides onto every related factory
321
+ // (Adonis Lucid) — applied before the callback so an explicit merge in
322
+ // the callback still wins.
323
+ if (hasRecursive && recursive)
324
+ childFactory.mergeRecursive(recursive);
325
+ if (req.callback)
326
+ req.callback(childFactory);
327
+ const childInternals = factoryInternals.get(childFactory);
328
+ const proxy = parent.related(req.name);
329
+ if (proxy.type === "belongsTo") {
330
+ // FK lives on the parent: create() runs the owner's OWN with-graph,
331
+ // then associate re-saves the parent with the FK set.
332
+ const owner = await childFactory.create(db);
333
+ await proxy.associate(owner);
334
+ continue;
335
+ }
336
+ // The proxy-persisted branches bypass the child factory's create() path,
337
+ // so its queued nested `.with()` must be captured before make() clears it,
338
+ // then recursed onto each persisted child (Adonis Lucid nested factories:
339
+ // `post.with('comments', 5)` inside the callback).
340
+ const nestedWith = childInternals?.consumeWith() ?? [];
341
+ // Pivot columns from a `.pivotAttributes()` in the callback — captured
342
+ // now, before make() clears the child's transient state.
343
+ const nestedPivot = childInternals?.consumePivot();
344
+ const recurse = async (children) => {
345
+ if (nestedWith.length === 0 || !childInternals)
346
+ return;
347
+ for (const child of children) {
348
+ // Cascade the recursive overrides further down the graph.
349
+ await childInternals.applyRelations(child, nestedWith, db, recursive);
350
+ }
351
+ };
352
+ if (proxy.type === "hasMany") {
353
+ await recurse(await proxy.createMany(childFactory.makeMany(req.count)));
354
+ }
355
+ else if (proxy.type === "hasOne") {
356
+ await recurse([await proxy.create(childFactory.make())]);
357
+ }
358
+ else if (proxy.type === "manyToMany") {
359
+ // The m2m proxy's create() inserts the related row AND the pivot link,
360
+ // with the `.pivotAttributes()` columns on the pivot row. An array of
361
+ // pivot attrs applies per-row (`pivot[i]`); a single object, to all.
362
+ const rows = childFactory.makeMany(req.count);
363
+ // Adonis Lucid: an array's length must match the related-row count —
364
+ // reject a mismatch rather than silently leave rows without pivot data.
365
+ if (Array.isArray(nestedPivot) && nestedPivot.length !== rows.length) {
366
+ throw new Error(`Factory .with('${req.name}'): pivotAttributes array length (${nestedPivot.length}) must match the related-row count (${rows.length}).`);
367
+ }
368
+ for (let i = 0; i < rows.length; i++) {
369
+ const pivot = Array.isArray(nestedPivot)
370
+ ? nestedPivot[i]
371
+ : nestedPivot;
372
+ await recurse([await proxy.create(rows[i], pivot)]);
373
+ }
374
+ }
375
+ else {
376
+ throw new Error(`Factory .with('${req.name}'): '${relMeta.type}' relations are not supported`);
377
+ }
378
+ }
47
379
  };
48
380
  const builder = {
49
381
  merge(overrides) {
50
- pendingOverrides = { ...pendingOverrides, ...overrides };
382
+ if (typeof overrides === "function") {
383
+ pendingMergeFns.push(overrides);
384
+ }
385
+ else if (Array.isArray(overrides)) {
386
+ pendingOverridesList = overrides;
387
+ }
388
+ else {
389
+ pendingOverrides = { ...pendingOverrides, ...overrides };
390
+ }
391
+ return builder;
392
+ },
393
+ mergeRecursive(overrides) {
394
+ pendingRecursive = deepMerge(pendingRecursive, overrides);
51
395
  return builder;
52
396
  },
53
397
  state(name, fn) {
@@ -58,46 +402,176 @@ export function factory(entityClass, defaults) {
58
402
  pendingStates.push(...names);
59
403
  return builder;
60
404
  },
405
+ relation(name, resolver) {
406
+ relations.set(name, resolver);
407
+ return builder;
408
+ },
409
+ with(name, count = 1, callback) {
410
+ pendingWith.push({ name, count, callback });
411
+ return builder;
412
+ },
413
+ tap(fn) {
414
+ pendingTap.push(fn);
415
+ return builder;
416
+ },
417
+ newUp(fn) {
418
+ customNewUp = fn;
419
+ return builder;
420
+ },
421
+ pivotAttributes(attrs) {
422
+ // An array (per-row values) replaces wholesale; objects merge (repeated
423
+ // `.pivotAttributes({...})` accumulate, matching the single-object case).
424
+ pendingPivot =
425
+ Array.isArray(attrs) || Array.isArray(pendingPivot)
426
+ ? attrs
427
+ : { ...pendingPivot, ...attrs };
428
+ return builder;
429
+ },
430
+ before(event, callback) {
431
+ beforeHooks[event].push(callback);
432
+ return builder;
433
+ },
434
+ after(event, callback) {
435
+ afterHooks[event].push(callback);
436
+ return builder;
437
+ },
438
+ client(connection) {
439
+ boundClient = connection;
440
+ return builder;
441
+ },
442
+ connection(name) {
443
+ const conn = getConnection(name);
444
+ if (!conn) {
445
+ throw new Error(`Factory ${entityClass.name}: no connection registered under '${name}'.`);
446
+ }
447
+ boundClient = conn;
448
+ return builder;
449
+ },
450
+ query(options) {
451
+ if (options.client) {
452
+ boundClient = options.client;
453
+ }
454
+ else if (options.connection) {
455
+ const conn = getConnection(options.connection);
456
+ if (!conn) {
457
+ throw new Error(`Factory ${entityClass.name}: no connection registered under '${options.connection}'.`);
458
+ }
459
+ boundClient = conn;
460
+ }
461
+ return builder;
462
+ },
61
463
  make() {
62
- const data = buildData();
464
+ // Lucid `make`: an UN-persisted instance (no PK, `$isPersisted` false).
465
+ // Taps run on it, like the other instance-producing paths.
466
+ const taps = pendingTap;
467
+ const mergeFns = pendingMergeFns;
468
+ const stateNames = pendingStates;
469
+ const ctx = makeCtx(false);
470
+ const data = buildData(ctx);
471
+ const entity = newInstance(data, ctx);
472
+ applyMergeFns(entity, data, mergeFns, ctx);
473
+ applyStates(entity, stateNames, ctx);
474
+ runTaps(taps, entity, ctx);
475
+ for (const hook of afterHooks.make)
476
+ hook(builder, entity, ctx);
63
477
  resetPending();
64
- return data;
478
+ return entity;
65
479
  },
66
480
  makeMany(count) {
67
481
  // Re-evaluate defaults for each row so `Date.now()` / faker generate
68
- // distinct values. `buildData()` reads (never mutates) the pending
69
- // overrides/states, so they stay stable across iterations on their own.
482
+ // distinct values, each hydrated into its own un-persisted instance.
483
+ const taps = pendingTap;
484
+ const mergeFns = pendingMergeFns;
485
+ const stateNames = pendingStates;
486
+ const ctx = makeCtx(false);
70
487
  const rows = [];
71
488
  for (let i = 0; i < count; i++) {
72
- rows.push(buildData());
489
+ const data = buildData(ctx, i);
490
+ const entity = newInstance(data, ctx);
491
+ applyMergeFns(entity, data, mergeFns, ctx);
492
+ applyStates(entity, stateNames, ctx);
493
+ runTaps(taps, entity, ctx);
494
+ for (const hook of afterHooks.make)
495
+ hook(builder, entity, ctx);
496
+ rows.push(entity);
73
497
  }
74
498
  resetPending();
75
499
  return rows;
76
500
  },
77
501
  makeStubbed() {
78
- const data = buildData();
502
+ const taps = pendingTap;
503
+ const mergeFns = pendingMergeFns;
504
+ const stateNames = pendingStates;
505
+ const ctx = makeCtx(true);
506
+ const entity = stub(buildData(ctx), taps, mergeFns, stateNames, ctx);
79
507
  resetPending();
80
- const entity = new entityClass();
81
- for (const [key, value] of Object.entries(data)) {
82
- entity.setProp(key, value);
83
- }
84
508
  return entity;
85
509
  },
510
+ makeStubbedMany(count) {
511
+ // Re-evaluate defaults per row (distinct Date.now()/faker values), same
512
+ // as makeMany; each row then gets its own stub id + taps via `stub`.
513
+ const taps = pendingTap;
514
+ const mergeFns = pendingMergeFns;
515
+ const stateNames = pendingStates;
516
+ const ctx = makeCtx(true);
517
+ const rows = [];
518
+ for (let i = 0; i < count; i++) {
519
+ rows.push(stub(buildData(ctx, i), taps, mergeFns, stateNames, ctx));
520
+ }
521
+ resetPending();
522
+ return rows;
523
+ },
86
524
  async create(db) {
87
- const data = builder.make();
88
- const repo = new BaseRepository(entityClass, db);
89
- return repo.create(data);
525
+ // Capture + clear the relation/tap queues, then consume the raw data
526
+ // (which resets the rest of the pending state) — BEFORE resolveConnection,
527
+ // so a missing connection can't throw with pending overrides/states/with/
528
+ // tap still dirty and leak them into the next create().
529
+ const withReqs = pendingWith;
530
+ pendingWith = [];
531
+ const taps = pendingTap;
532
+ const mergeFns = pendingMergeFns;
533
+ const stateNames = pendingStates;
534
+ // Snapshot the recursive overrides BEFORE consumeData resets them — they
535
+ // cascade onto every related factory (Adonis Lucid `mergeRecursive`).
536
+ const recursive = { ...pendingRecursive };
537
+ const ctx = makeCtx(false);
538
+ const data = consumeData(ctx);
539
+ const conn = resolveConnection(db);
540
+ return persistWithRelations(conn, withReqs, recursive, (repo, txCtx) => persist(repo, data, taps, mergeFns, stateNames, txCtx));
90
541
  },
91
542
  async createMany(count, db) {
92
- const rows = builder.makeMany(count);
93
- const repo = new BaseRepository(entityClass, db);
543
+ const withReqs = pendingWith;
544
+ pendingWith = [];
545
+ const taps = pendingTap;
546
+ const mergeFns = pendingMergeFns;
547
+ const stateNames = pendingStates;
548
+ const recursive = { ...pendingRecursive };
549
+ const ctx = makeCtx(false);
550
+ const rows = consumeDataMany(count, ctx);
551
+ const conn = resolveConnection(db);
94
552
  const created = [];
95
553
  for (const data of rows) {
96
- created.push(await repo.create(data));
554
+ // Each created parent + its relations are atomic (Lucid semantics).
555
+ created.push(await persistWithRelations(conn, withReqs, recursive, (repo, txCtx) => persist(repo, data, taps, mergeFns, stateNames, txCtx)));
97
556
  }
98
557
  return created;
99
558
  },
100
559
  };
560
+ // Register this builder's internals so a PARENT factory can drive nested
561
+ // `.with()` on it (kept off the public type, keyed by the builder object).
562
+ factoryInternals.set(builder, {
563
+ consumeWith() {
564
+ const reqs = pendingWith;
565
+ pendingWith = [];
566
+ return reqs;
567
+ },
568
+ consumePivot() {
569
+ const pivot = pendingPivot;
570
+ pendingPivot = undefined;
571
+ return pivot;
572
+ },
573
+ applyRelations,
574
+ });
101
575
  return builder;
102
576
  }
103
577
  //# sourceMappingURL=Factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Factory.js","sourceRoot":"","sources":["../../src/testing/Factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Factory.js","sourceRoot":"","sources":["../../src/testing/Factory.ts"],"names":[],"mappings":"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"}