@warlock.js/cascade 5.20.0 → 5.21.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 (168) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/cjs/index.cjs +2283 -1037
  3. package/cjs/index.cjs.map +1 -1
  4. package/esm/contracts/query-builder.contract.d.mts +30 -3
  5. package/esm/contracts/query-builder.contract.d.mts.map +1 -1
  6. package/esm/data-source/data-source-registry.d.mts +33 -1
  7. package/esm/data-source/data-source-registry.d.mts.map +1 -1
  8. package/esm/data-source/data-source-registry.mjs +75 -5
  9. package/esm/data-source/data-source-registry.mjs.map +1 -1
  10. package/esm/database-dirty-tracker.d.mts +5 -0
  11. package/esm/database-dirty-tracker.d.mts.map +1 -1
  12. package/esm/database-dirty-tracker.mjs +16 -0
  13. package/esm/database-dirty-tracker.mjs.map +1 -1
  14. package/esm/drivers/mongodb/mongodb-driver.d.mts +12 -0
  15. package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
  16. package/esm/drivers/mongodb/mongodb-driver.mjs +47 -16
  17. package/esm/drivers/mongodb/mongodb-driver.mjs.map +1 -1
  18. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts +1 -1
  19. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -1
  20. package/esm/drivers/mongodb/mongodb-migration-driver.mjs +15 -18
  21. package/esm/drivers/mongodb/mongodb-migration-driver.mjs.map +1 -1
  22. package/esm/drivers/mongodb/mongodb-query-builder.d.mts +13 -3
  23. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
  24. package/esm/drivers/mongodb/mongodb-query-builder.mjs +72 -19
  25. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
  26. package/esm/drivers/mongodb/mongodb-query-parser.d.mts +6 -0
  27. package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
  28. package/esm/drivers/mongodb/mongodb-query-parser.mjs +128 -30
  29. package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
  30. package/esm/drivers/postgres/index.d.mts +2 -3
  31. package/esm/drivers/postgres/index.mjs +1 -2
  32. package/esm/drivers/postgres/postgres-blueprint.mjs +4 -4
  33. package/esm/drivers/postgres/postgres-blueprint.mjs.map +1 -1
  34. package/esm/drivers/postgres/postgres-dialect.d.mts +5 -1
  35. package/esm/drivers/postgres/postgres-dialect.d.mts.map +1 -1
  36. package/esm/drivers/postgres/postgres-dialect.mjs +38 -8
  37. package/esm/drivers/postgres/postgres-dialect.mjs.map +1 -1
  38. package/esm/drivers/postgres/postgres-driver.d.mts +52 -29
  39. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
  40. package/esm/drivers/postgres/postgres-driver.mjs +190 -57
  41. package/esm/drivers/postgres/postgres-driver.mjs.map +1 -1
  42. package/esm/drivers/postgres/postgres-migration-driver.d.mts +2 -1
  43. package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -1
  44. package/esm/drivers/postgres/postgres-migration-driver.mjs +8 -6
  45. package/esm/drivers/postgres/postgres-migration-driver.mjs.map +1 -1
  46. package/esm/drivers/postgres/postgres-query-builder.d.mts +18 -7
  47. package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -1
  48. package/esm/drivers/postgres/postgres-query-builder.mjs +146 -31
  49. package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -1
  50. package/esm/drivers/postgres/postgres-query-parser.d.mts +23 -1
  51. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
  52. package/esm/drivers/postgres/postgres-query-parser.mjs +160 -43
  53. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
  54. package/esm/drivers/postgres/postgres-sql-serializer.mjs +3 -2
  55. package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -1
  56. package/esm/drivers/postgres/postgres-type-converters.mjs +57 -0
  57. package/esm/drivers/postgres/postgres-type-converters.mjs.map +1 -0
  58. package/esm/events/model-events.d.mts +1 -1
  59. package/esm/events/model-events.d.mts.map +1 -1
  60. package/esm/events/model-events.mjs.map +1 -1
  61. package/esm/index.d.mts +5 -6
  62. package/esm/index.mjs +4 -5
  63. package/esm/migration/column-builder.d.mts.map +1 -1
  64. package/esm/migration/column-builder.mjs +2 -2
  65. package/esm/migration/column-builder.mjs.map +1 -1
  66. package/esm/migration/index.d.mts +2 -2
  67. package/esm/migration/index.mjs +1 -1
  68. package/esm/migration/migration-order.mjs +5 -2
  69. package/esm/migration/migration-order.mjs.map +1 -1
  70. package/esm/migration/migration-runner.d.mts +50 -5
  71. package/esm/migration/migration-runner.d.mts.map +1 -1
  72. package/esm/migration/migration-runner.mjs +369 -146
  73. package/esm/migration/migration-runner.mjs.map +1 -1
  74. package/esm/migration/migration.d.mts +36 -3
  75. package/esm/migration/migration.d.mts.map +1 -1
  76. package/esm/migration/migration.mjs +62 -5
  77. package/esm/migration/migration.mjs.map +1 -1
  78. package/esm/model/methods/accessor-methods.mjs +1 -3
  79. package/esm/model/methods/accessor-methods.mjs.map +1 -1
  80. package/esm/model/methods/delete-methods.mjs +6 -2
  81. package/esm/model/methods/delete-methods.mjs.map +1 -1
  82. package/esm/model/methods/hydration-methods.mjs +16 -2
  83. package/esm/model/methods/hydration-methods.mjs.map +1 -1
  84. package/esm/model/methods/instance-event-methods.mjs +2 -1
  85. package/esm/model/methods/instance-event-methods.mjs.map +1 -1
  86. package/esm/model/methods/meta-methods.mjs +53 -16
  87. package/esm/model/methods/meta-methods.mjs.map +1 -1
  88. package/esm/model/methods/query-methods.mjs +86 -15
  89. package/esm/model/methods/query-methods.mjs.map +1 -1
  90. package/esm/model/methods/static-event-methods.mjs +16 -1
  91. package/esm/model/methods/static-event-methods.mjs.map +1 -1
  92. package/esm/model/methods/write-methods.d.mts.map +1 -1
  93. package/esm/model/methods/write-methods.mjs +50 -50
  94. package/esm/model/methods/write-methods.mjs.map +1 -1
  95. package/esm/model/model.d.mts +16 -1
  96. package/esm/model/model.d.mts.map +1 -1
  97. package/esm/model/model.mjs +39 -5
  98. package/esm/model/model.mjs.map +1 -1
  99. package/esm/model/register-model.d.mts +6 -1
  100. package/esm/model/register-model.d.mts.map +1 -1
  101. package/esm/model/register-model.mjs +16 -1
  102. package/esm/model/register-model.mjs.map +1 -1
  103. package/esm/query-builder/query-builder.d.mts +21 -2
  104. package/esm/query-builder/query-builder.d.mts.map +1 -1
  105. package/esm/query-builder/query-builder.mjs +97 -20
  106. package/esm/query-builder/query-builder.mjs.map +1 -1
  107. package/esm/relations/key-conventions.mjs +13 -3
  108. package/esm/relations/key-conventions.mjs.map +1 -1
  109. package/esm/relations/pivot-operations.mjs +1 -1
  110. package/esm/relations/relation-loader.d.mts +15 -5
  111. package/esm/relations/relation-loader.d.mts.map +1 -1
  112. package/esm/relations/relation-loader.mjs +51 -16
  113. package/esm/relations/relation-loader.mjs.map +1 -1
  114. package/esm/remover/database-remover.d.mts.map +1 -1
  115. package/esm/remover/database-remover.mjs +21 -7
  116. package/esm/remover/database-remover.mjs.map +1 -1
  117. package/esm/restorer/database-restorer.d.mts +12 -2
  118. package/esm/restorer/database-restorer.d.mts.map +1 -1
  119. package/esm/restorer/database-restorer.mjs +43 -13
  120. package/esm/restorer/database-restorer.mjs.map +1 -1
  121. package/esm/sync/model-events.mjs +63 -3
  122. package/esm/sync/model-events.mjs.map +1 -1
  123. package/esm/sync/model-sync-operation.d.mts.map +1 -1
  124. package/esm/sync/model-sync-operation.mjs +3 -2
  125. package/esm/sync/model-sync-operation.mjs.map +1 -1
  126. package/esm/sync/sync-manager.d.mts +3 -42
  127. package/esm/sync/sync-manager.d.mts.map +1 -1
  128. package/esm/sync/sync-manager.mjs +37 -126
  129. package/esm/sync/sync-manager.mjs.map +1 -1
  130. package/esm/utils/connect-to-database.d.mts.map +1 -1
  131. package/esm/utils/connect-to-database.mjs +4 -4
  132. package/esm/utils/connect-to-database.mjs.map +1 -1
  133. package/esm/utils/database-writer.utils.d.mts +1 -1
  134. package/esm/utils/database-writer.utils.d.mts.map +1 -1
  135. package/esm/utils/database-writer.utils.mjs +1 -0
  136. package/esm/utils/database-writer.utils.mjs.map +1 -1
  137. package/esm/utils/define-model.d.mts.map +1 -1
  138. package/esm/utils/define-model.mjs +2 -10
  139. package/esm/utils/define-model.mjs.map +1 -1
  140. package/esm/utils/is-valid-date-value.mjs +3 -2
  141. package/esm/utils/is-valid-date-value.mjs.map +1 -1
  142. package/esm/utils/once-connected.d.mts.map +1 -1
  143. package/esm/utils/once-connected.mjs +12 -2
  144. package/esm/utils/once-connected.mjs.map +1 -1
  145. package/esm/validation/mutators/embed-mutator.mjs +19 -11
  146. package/esm/validation/mutators/embed-mutator.mjs.map +1 -1
  147. package/esm/validation/plugins/embed-validator-plugin.d.mts +2 -2
  148. package/esm/validation/plugins/embed-validator-plugin.d.mts.map +1 -1
  149. package/esm/validation/plugins/embed-validator-plugin.mjs +8 -2
  150. package/esm/validation/plugins/embed-validator-plugin.mjs.map +1 -1
  151. package/esm/validation/rules/database-model-rule.mjs +6 -5
  152. package/esm/validation/rules/database-model-rule.mjs.map +1 -1
  153. package/esm/validation/rules/exists-rule.mjs +6 -4
  154. package/esm/validation/rules/exists-rule.mjs.map +1 -1
  155. package/esm/validation/rules/unique-rule.mjs +5 -2
  156. package/esm/validation/rules/unique-rule.mjs.map +1 -1
  157. package/esm/validation/validators/embed-validator.d.mts.map +1 -1
  158. package/esm/validation/validators/embed-validator.mjs +1 -1
  159. package/esm/validation/validators/embed-validator.mjs.map +1 -1
  160. package/esm/writer/database-writer.d.mts +27 -0
  161. package/esm/writer/database-writer.d.mts.map +1 -1
  162. package/esm/writer/database-writer.mjs +84 -17
  163. package/esm/writer/database-writer.mjs.map +1 -1
  164. package/package.json +4 -4
  165. package/esm/drivers/postgres/postgres-sync-adapter.d.mts +0 -79
  166. package/esm/drivers/postgres/postgres-sync-adapter.d.mts.map +0 -1
  167. package/esm/drivers/postgres/postgres-sync-adapter.mjs +0 -162
  168. package/esm/drivers/postgres/postgres-sync-adapter.mjs.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { mergeDriverFields } from "./accessor-methods.mjs";
2
+ import { sanitizeFilter } from "../../utils/sanitize-filter.mjs";
2
3
  import { emitModelEvent } from "./instance-event-methods.mjs";
3
4
  import { DatabaseWriter } from "../../writer/database-writer.mjs";
4
5
 
@@ -132,11 +133,9 @@ async function assignIdBlock(ModelClass, models) {
132
133
  * touching the database, then flush each chunk with a single
133
134
  * `driver.insertMany` call.
134
135
  *
135
- * The writer reuse is achieved by swapping the driver's single-row `insert`
136
- * for a capturing stub for the lifetime of the bulk operation: running
137
- * `writer.save({ skipEvents, skipSync })` exercises the real prep but records
138
- * the prepared document instead of issuing N single-row inserts. The original
139
- * `insert` is always restored in `finally`.
136
+ * The writer reuse goes through `DatabaseWriter.prepareForInsert()`, the same
137
+ * pipeline `save()` uses for an insert, so the shared driver is never mutated
138
+ * and concurrent `save()` calls are unaffected.
140
139
  *
141
140
  * @param ModelClass - The model class to create records for.
142
141
  * @param chunks - Pre-chunked rows.
@@ -145,33 +144,24 @@ async function assignIdBlock(ModelClass, models) {
145
144
  async function createManyBulk(ModelClass, chunks) {
146
145
  const driver = ModelClass.getDataSource().driver;
147
146
  const table = ModelClass.table;
148
- const originalInsert = driver.insert;
149
- driver.insert = (async (_table, document) => {
150
- return { document };
151
- });
152
147
  const created = [];
153
- try {
154
- for (const chunk of chunks) {
155
- const models = chunk.map((item) => new ModelClass(item));
156
- await assignIdBlock(ModelClass, models);
157
- const preparedDocuments = await Promise.all(models.map(async (model) => {
158
- await new DatabaseWriter(model).save({
159
- skipEvents: true,
160
- skipSync: true
161
- });
162
- return { ...model.data };
163
- }));
164
- const results = await driver.insertMany(table, preparedDocuments);
165
- models.forEach((model, index) => {
166
- const result = results[index];
167
- if (result) mergeDriverFields(model, "document" in result ? result.document : result);
168
- model.dirtyTracker.reset();
169
- model.isNew = false;
170
- });
171
- created.push(...models);
172
- }
173
- } finally {
174
- driver.insert = originalInsert;
148
+ for (const chunk of chunks) {
149
+ const models = chunk.map((item) => new ModelClass(item));
150
+ await assignIdBlock(ModelClass, models);
151
+ const preparedDocuments = await Promise.all(models.map(async (model) => {
152
+ return { ...await new DatabaseWriter(model).prepareForInsert({
153
+ skipEvents: true,
154
+ skipSync: true
155
+ }) };
156
+ }));
157
+ const results = await driver.insertMany(table, preparedDocuments);
158
+ models.forEach((model, index) => {
159
+ const result = results[index];
160
+ if (result) mergeDriverFields(model, "document" in result ? result.document : result);
161
+ model.dirtyTracker.reset();
162
+ model.isNew = false;
163
+ });
164
+ created.push(...models);
175
165
  }
176
166
  return created;
177
167
  }
@@ -185,38 +175,48 @@ async function findOrCreateRecord(ModelClass, filter, data) {
185
175
  }
186
176
  async function upsertRecord(ModelClass, filter, data, options) {
187
177
  const driver = ModelClass.getDriver();
188
- const mergedData = {
189
- ...filter,
178
+ const safeFilter = sanitizeFilter(filter);
179
+ const tempModel = new ModelClass({
180
+ ...safeFilter,
190
181
  ...data
191
- };
192
- const tempModel = new ModelClass(mergedData);
182
+ });
193
183
  tempModel.isNew = true;
194
184
  await emitModelEvent(tempModel, "saving", {
195
185
  isInsert: true,
196
186
  options,
197
187
  mode: "upsert"
198
188
  });
199
- const createdAtColumn = ModelClass.createdAtColumn;
200
- const updatedAtColumn = ModelClass.updatedAtColumn;
201
- if (createdAtColumn !== false && createdAtColumn !== void 0) {
202
- const createdAtKey = createdAtColumn;
203
- if (!mergedData[createdAtKey]) mergedData[createdAtKey] = /* @__PURE__ */ new Date();
189
+ await new DatabaseWriter(tempModel).prepareForUpsert();
190
+ const setData = { ...tempModel.data };
191
+ const setOnInsert = {};
192
+ const now = /* @__PURE__ */ new Date();
193
+ for (const key of new Set([
194
+ "id",
195
+ "_id",
196
+ ModelClass.primaryKey
197
+ ])) if (key in setData) {
198
+ setOnInsert[key] = setData[key];
199
+ delete setData[key];
204
200
  }
205
- if (updatedAtColumn !== false && updatedAtColumn !== void 0) {
206
- const updatedAtKey = updatedAtColumn;
207
- mergedData[updatedAtKey] = /* @__PURE__ */ new Date();
201
+ const createdAtColumn = ModelClass.createdAtColumn;
202
+ if (createdAtColumn) {
203
+ setOnInsert[createdAtColumn] = setData[createdAtColumn] ?? now;
204
+ delete setData[createdAtColumn];
208
205
  }
209
- await emitModelEvent(tempModel, "saving", {
210
- filter,
211
- data: mergedData,
212
- options,
213
- mode: "upsert"
206
+ const updatedAtColumn = ModelClass.updatedAtColumn;
207
+ if (updatedAtColumn) setData[updatedAtColumn] = now;
208
+ const result = await driver.findOneAndUpdate(ModelClass.table, safeFilter, {
209
+ $set: setData,
210
+ $setOnInsert: setOnInsert
211
+ }, {
212
+ ...options,
213
+ upsert: true,
214
+ returnDocument: "after"
214
215
  });
215
- const result = await driver.upsert(ModelClass.table, filter, mergedData, options);
216
216
  const model = ModelClass.hydrate(result);
217
217
  model.dirtyTracker.reset();
218
218
  await emitModelEvent(model, "saved", {
219
- filter,
219
+ filter: safeFilter,
220
220
  data: result,
221
221
  options,
222
222
  mode: "upsert"
@@ -1 +1 @@
1
- {"version":3,"file":"write-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/write-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\r\nimport type { InsertResult, WriterOptions } from \"../../contracts\";\r\nimport type { ChildModel, Model, ModelSchema } from \"../model\";\r\nimport { mergeDriverFields } from \"./accessor-methods\";\r\nimport { emitModelEvent } from \"./instance-event-methods\";\r\n\r\n/**\r\n * Default number of rows processed per chunk by {@link createManyRecords}.\r\n *\r\n * Chunking keeps a single huge `createMany` call from flooding the driver:\r\n * the default path runs each chunk's `save()` calls under one `Promise.all`,\r\n * and the bulk path emits one multi-row `insertMany` per chunk so the\r\n * generated `INSERT ... VALUES (...),(...)` stays under the database's bind\r\n * parameter ceiling.\r\n */\r\nexport const DEFAULT_CREATE_MANY_BATCH_SIZE = 500;\r\n\r\n/**\r\n * Options for {@link createManyRecords} (and `Model.createMany`).\r\n */\r\nexport type CreateManyOptions = {\r\n /**\r\n * Number of rows processed per chunk.\r\n *\r\n * @default 500 ({@link DEFAULT_CREATE_MANY_BATCH_SIZE})\r\n */\r\n batchSize?: number;\r\n\r\n /**\r\n * Route each chunk through the driver's native multi-row insert\r\n * (`insertMany`) instead of per-row `save()`.\r\n *\r\n * **Tradeoff:** the bulk path is 10–100× faster for large arrays but\r\n * SKIPS the per-row lifecycle: `saving` / `creating` / `created` / `saved`\r\n * events, instance hooks, and sync operations are NOT emitted. Casts,\r\n * timestamps, defaults and id-generation that the writer normally applies\r\n * ARE still applied (the rows are prepped through the same writer pipeline),\r\n * so persisted columns match the default path.\r\n *\r\n * @default false\r\n */\r\n bulk?: boolean;\r\n};\r\n\r\nexport async function saveModel<TModel extends Model>(\r\n model: TModel,\r\n options?: WriterOptions & { merge?: Partial<ModelSchema> },\r\n): Promise<TModel> {\r\n if (options?.merge) {\r\n model.merge(options.merge);\r\n }\r\n const writer = new DatabaseWriter(model);\r\n await writer.save(options);\r\n return model;\r\n}\r\n\r\nexport async function createRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel> {\r\n const model = new ModelClass(data);\r\n await model.save();\r\n return model;\r\n}\r\n\r\n/**\r\n * Split an array into sequential chunks of at most `size` elements.\r\n *\r\n * @param items - The array to split.\r\n * @param size - Maximum chunk length (callers pass a value `>= 1`).\r\n * @returns An array of chunks preserving the original order.\r\n */\r\nfunction chunkArray<TItem>(items: TItem[], size: number): TItem[][] {\r\n const chunks: TItem[][] = [];\r\n\r\n for (let index = 0; index < items.length; index += size) {\r\n chunks.push(items.slice(index, index + size));\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Create many records, chunking the work so a huge array can't overwhelm the\r\n * driver.\r\n *\r\n * Two strategies are available via `options.bulk`:\r\n *\r\n * - **Default (`bulk` falsy):** each row is persisted through `save()`, so\r\n * model hooks, lifecycle events, casts and generated ids are all preserved.\r\n * Rows are processed in sequential chunks of `batchSize`, each chunk running\r\n * under a single `Promise.all`, so an array of millions of rows can't open\r\n * millions of concurrent inserts at once.\r\n *\r\n * - **Bulk (`bulk: true`):** each chunk is routed to the driver's native\r\n * multi-row insert (`insertMany`) for 10–100× throughput. This SKIPS the\r\n * per-row save lifecycle (no `saving` / `creating` / `created` / `saved`\r\n * events, hooks, or sync). Rows are still prepped through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) so the\r\n * persisted columns match the default path, and the values returned by the\r\n * driver (generated `_id`, timestamps, SQL `RETURNING *`) are merged back\r\n * onto the returned models.\r\n *\r\n * Both strategies return the created model instances (an empty array is a\r\n * no-op that never touches the driver).\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param data - The rows to insert.\r\n * @param options - Chunking / bulk options.\r\n * @returns The created model instances.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Default: per-row save(), chunked in batches of 500\r\n * const users = await User.createMany(rows);\r\n *\r\n * // Bulk: one multi-row INSERT per 1000-row chunk (skips per-row hooks)\r\n * const users = await User.createMany(rows, { bulk: true, batchSize: 1000 });\r\n * ```\r\n */\r\nexport async function createManyRecords<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n data: Partial<TSchema>[],\r\n options: CreateManyOptions = {},\r\n): Promise<TModel[]> {\r\n if (data.length === 0) {\r\n return [];\r\n }\r\n\r\n const batchSize =\r\n options.batchSize && options.batchSize > 0\r\n ? options.batchSize\r\n : DEFAULT_CREATE_MANY_BATCH_SIZE;\r\n\r\n const chunks = chunkArray(data, batchSize);\r\n\r\n if (options.bulk === true) {\r\n return await createManyBulk(ModelClass, chunks);\r\n }\r\n\r\n const created: TModel[] = [];\r\n\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op instead\r\n // of N), pre-seeding each id-less model so its per-row save() no-ops id-gen.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n const chunkModels = await Promise.all(\r\n models.map(async (model) => {\r\n await model.save();\r\n return model;\r\n }),\r\n );\r\n\r\n created.push(...chunkModels);\r\n }\r\n\r\n return created;\r\n}\r\n\r\n/**\r\n * Reserve a single contiguous id block for one chunk and pre-assign the ids to\r\n * the models that don't already carry one, so the per-row writer's id\r\n * generation no-ops (its `model.get(\"id\")` guard short-circuits). This turns N\r\n * per-row counter round-trips into ONE per chunk.\r\n *\r\n * Falls back to per-row generation (a no-op here) when:\r\n * - the model disables auto-generation (`autoGenerateId === false`) — e.g. SQL,\r\n * which uses native `SERIAL`;\r\n * - the data source's id generator has no batch API (`generateNextIds`) — the\r\n * optional contract member is feature-detected;\r\n * - the model uses a random initial id / increment — a random stride can't form\r\n * a contiguous block, so those models keep per-row generation.\r\n *\r\n * Only models WITHOUT a caller-supplied id consume a block slot, so a chunk\r\n * mixing supplied and auto ids allocates exactly the right number (no gaps).\r\n *\r\n * @param ModelClass - The model class being inserted.\r\n * @param models - The freshly-constructed (unsaved) models for one chunk.\r\n */\r\nasync function assignIdBlock<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n models: TModel[],\r\n): Promise<void> {\r\n if (!ModelClass.autoGenerateId || ModelClass.randomInitialId || ModelClass.randomIncrement) {\r\n return;\r\n }\r\n\r\n const idGenerator = ModelClass.getDataSource().idGenerator;\r\n\r\n if (!idGenerator || typeof idGenerator.generateNextIds !== \"function\") {\r\n return;\r\n }\r\n\r\n const idLessModels = models.filter((model) => !model.get(\"id\"));\r\n\r\n if (idLessModels.length === 0) {\r\n return;\r\n }\r\n\r\n const ids = await idGenerator.generateNextIds({\r\n table: ModelClass.table,\r\n initialId: ModelClass.initialId || 1,\r\n incrementIdBy: ModelClass.incrementIdBy || 1,\r\n count: idLessModels.length,\r\n });\r\n\r\n // Enforce the contract at this pluggable, feature-detected boundary: a\r\n // non-conforming generator returning the wrong count would otherwise set\r\n // `id = undefined` on the unmatched rows, the per-row writer would silently\r\n // re-generate single ids, and the reserved block would no longer match what\r\n // is persisted. Fail loud instead of corrupting the sequence.\r\n if (ids.length !== idLessModels.length) {\r\n throw new Error(\r\n `generateNextIds returned ${ids.length} id(s) for ${idLessModels.length} row(s) on ` +\r\n `\"${ModelClass.table}\" — a batch id generator must return exactly the requested count.`,\r\n );\r\n }\r\n\r\n idLessModels.forEach((model, index) => {\r\n model.set(\"id\", ids[index]);\r\n });\r\n}\r\n\r\n/**\r\n * Bulk variant of {@link createManyRecords}: prep each row through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) without\r\n * touching the database, then flush each chunk with a single\r\n * `driver.insertMany` call.\r\n *\r\n * The writer reuse is achieved by swapping the driver's single-row `insert`\r\n * for a capturing stub for the lifetime of the bulk operation: running\r\n * `writer.save({ skipEvents, skipSync })` exercises the real prep but records\r\n * the prepared document instead of issuing N single-row inserts. The original\r\n * `insert` is always restored in `finally`.\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param chunks - Pre-chunked rows.\r\n * @returns The created model instances with driver-returned values merged in.\r\n */\r\nasync function createManyBulk<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, chunks: Partial<TSchema>[][]): Promise<TModel[]> {\r\n const dataSource = ModelClass.getDataSource();\r\n const driver = dataSource.driver;\r\n const table = ModelClass.table;\r\n // Keep the exact original reference so it can be restored verbatim (binding a\r\n // copy would, for a spied driver, replace the spy with a non-spy wrapper).\r\n const originalInsert = driver.insert;\r\n\r\n // Capture the prepared (validated/casted/timestamped/id-generated) document\r\n // instead of inserting it per row, so the writer's prep runs exactly once\r\n // per model while the actual write is deferred to a single insertMany.\r\n driver.insert = (async (\r\n _table: string,\r\n document: Record<string, unknown>,\r\n ): Promise<InsertResult> => {\r\n return { document };\r\n }) as typeof driver.insert;\r\n\r\n const created: TModel[] = [];\r\n\r\n try {\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op\r\n // instead of N), pre-seeding each id-less model so the per-row writer's\r\n // id generation no-ops.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n // Prep every model through the real writer pipeline. The captured\r\n // `insert` keeps this off the wire while still mutating each model's\r\n // data with casts/timestamps/defaults/generated ids.\r\n const preparedDocuments = await Promise.all(\r\n models.map(async (model) => {\r\n const writer = new DatabaseWriter(model);\r\n await writer.save({ skipEvents: true, skipSync: true });\r\n return { ...model.data } as Record<string, unknown>;\r\n }),\r\n );\r\n\r\n const results = await driver.insertMany(table, preparedDocuments);\r\n\r\n // Merge driver-returned values (generated _id, timestamps, RETURNING *)\r\n // back onto each model so the returned instances reflect persisted state.\r\n models.forEach((model, index) => {\r\n const result = results[index] as InsertResult | Record<string, unknown> | undefined;\r\n\r\n if (result) {\r\n const returnedDocument =\r\n \"document\" in (result as Record<string, unknown>)\r\n ? (result as InsertResult).document\r\n : result;\r\n\r\n // Driver-returned identity (generated _id / RETURNING *) — merged\r\n // through the framework-internal path so it is not treated as mass\r\n // assignment on a model the writer has already marked persisted.\r\n mergeDriverFields(model, returnedDocument as Record<string, unknown>);\r\n }\r\n\r\n model.dirtyTracker.reset();\r\n model.isNew = false;\r\n });\r\n\r\n created.push(...models);\r\n }\r\n } finally {\r\n driver.insert = originalInsert;\r\n }\r\n\r\n return created;\r\n}\r\n\r\nexport async function findOrCreateRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n): Promise<TModel> {\r\n const existing = await ModelClass.first(filter as Record<string, unknown>);\r\n\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n return await createRecord(ModelClass, { ...filter, ...data } as Partial<TSchema>);\r\n}\r\n\r\nexport async function upsertRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n options?: Record<string, unknown>,\r\n): Promise<TModel> {\r\n const driver = ModelClass.getDriver();\r\n const mergedData = { ...filter, ...data } as Record<string, unknown>;\r\n\r\n const tempModel = new ModelClass(mergedData as Partial<TSchema>);\r\n tempModel.isNew = true;\r\n\r\n await emitModelEvent(tempModel, \"saving\", {\r\n isInsert: true,\r\n options,\r\n mode: \"upsert\",\r\n });\r\n\r\n const createdAtColumn = ModelClass.createdAtColumn;\r\n const updatedAtColumn = ModelClass.updatedAtColumn;\r\n\r\n if (createdAtColumn !== false && createdAtColumn !== undefined) {\r\n const createdAtKey = createdAtColumn as string;\r\n if (!mergedData[createdAtKey]) {\r\n mergedData[createdAtKey] = new Date();\r\n }\r\n }\r\n\r\n if (updatedAtColumn !== false && updatedAtColumn !== undefined) {\r\n const updatedAtKey = updatedAtColumn as string;\r\n mergedData[updatedAtKey] = new Date();\r\n }\r\n\r\n await emitModelEvent(tempModel, \"saving\", { filter, data: mergedData, options, mode: \"upsert\" });\r\n\r\n const result = await driver.upsert(ModelClass.table, filter as Record<string, unknown>, mergedData, options);\r\n\r\n const model = ModelClass.hydrate(result as Record<string, unknown>) as TModel;\r\n model.dirtyTracker.reset();\r\n\r\n await emitModelEvent(model, \"saved\", { filter, data: result, options, mode: \"upsert\" });\r\n\r\n return model;\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"write-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/write-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\r\nimport type { InsertResult, WriterOptions } from \"../../contracts\";\r\nimport type { ChildModel, Model, ModelSchema } from \"../model\";\r\nimport { mergeDriverFields } from \"./accessor-methods\";\r\nimport { sanitizeFilter } from \"../../utils/sanitize-filter\";\r\nimport { emitModelEvent } from \"./instance-event-methods\";\r\n\r\n/**\r\n * Default number of rows processed per chunk by {@link createManyRecords}.\r\n *\r\n * Chunking keeps a single huge `createMany` call from flooding the driver:\r\n * the default path runs each chunk's `save()` calls under one `Promise.all`,\r\n * and the bulk path emits one multi-row `insertMany` per chunk so the\r\n * generated `INSERT ... VALUES (...),(...)` stays under the database's bind\r\n * parameter ceiling.\r\n */\r\nexport const DEFAULT_CREATE_MANY_BATCH_SIZE = 500;\r\n\r\n/**\r\n * Options for {@link createManyRecords} (and `Model.createMany`).\r\n */\r\nexport type CreateManyOptions = {\r\n /**\r\n * Number of rows processed per chunk.\r\n *\r\n * @default 500 ({@link DEFAULT_CREATE_MANY_BATCH_SIZE})\r\n */\r\n batchSize?: number;\r\n\r\n /**\r\n * Route each chunk through the driver's native multi-row insert\r\n * (`insertMany`) instead of per-row `save()`.\r\n *\r\n * **Tradeoff:** the bulk path is 10–100× faster for large arrays but\r\n * SKIPS the per-row lifecycle: `saving` / `creating` / `created` / `saved`\r\n * events, instance hooks, and sync operations are NOT emitted. Casts,\r\n * timestamps, defaults and id-generation that the writer normally applies\r\n * ARE still applied (the rows are prepped through the same writer pipeline),\r\n * so persisted columns match the default path.\r\n *\r\n * @default false\r\n */\r\n bulk?: boolean;\r\n};\r\n\r\nexport async function saveModel<TModel extends Model>(\r\n model: TModel,\r\n options?: WriterOptions & { merge?: Partial<ModelSchema> },\r\n): Promise<TModel> {\r\n if (options?.merge) {\r\n model.merge(options.merge);\r\n }\r\n const writer = new DatabaseWriter(model);\r\n await writer.save(options);\r\n return model;\r\n}\r\n\r\nexport async function createRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel> {\r\n const model = new ModelClass(data);\r\n await model.save();\r\n return model;\r\n}\r\n\r\n/**\r\n * Split an array into sequential chunks of at most `size` elements.\r\n *\r\n * @param items - The array to split.\r\n * @param size - Maximum chunk length (callers pass a value `>= 1`).\r\n * @returns An array of chunks preserving the original order.\r\n */\r\nfunction chunkArray<TItem>(items: TItem[], size: number): TItem[][] {\r\n const chunks: TItem[][] = [];\r\n\r\n for (let index = 0; index < items.length; index += size) {\r\n chunks.push(items.slice(index, index + size));\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Create many records, chunking the work so a huge array can't overwhelm the\r\n * driver.\r\n *\r\n * Two strategies are available via `options.bulk`:\r\n *\r\n * - **Default (`bulk` falsy):** each row is persisted through `save()`, so\r\n * model hooks, lifecycle events, casts and generated ids are all preserved.\r\n * Rows are processed in sequential chunks of `batchSize`, each chunk running\r\n * under a single `Promise.all`, so an array of millions of rows can't open\r\n * millions of concurrent inserts at once.\r\n *\r\n * - **Bulk (`bulk: true`):** each chunk is routed to the driver's native\r\n * multi-row insert (`insertMany`) for 10–100× throughput. This SKIPS the\r\n * per-row save lifecycle (no `saving` / `creating` / `created` / `saved`\r\n * events, hooks, or sync). Rows are still prepped through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) so the\r\n * persisted columns match the default path, and the values returned by the\r\n * driver (generated `_id`, timestamps, SQL `RETURNING *`) are merged back\r\n * onto the returned models.\r\n *\r\n * Both strategies return the created model instances (an empty array is a\r\n * no-op that never touches the driver).\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param data - The rows to insert.\r\n * @param options - Chunking / bulk options.\r\n * @returns The created model instances.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Default: per-row save(), chunked in batches of 500\r\n * const users = await User.createMany(rows);\r\n *\r\n * // Bulk: one multi-row INSERT per 1000-row chunk (skips per-row hooks)\r\n * const users = await User.createMany(rows, { bulk: true, batchSize: 1000 });\r\n * ```\r\n */\r\nexport async function createManyRecords<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n data: Partial<TSchema>[],\r\n options: CreateManyOptions = {},\r\n): Promise<TModel[]> {\r\n if (data.length === 0) {\r\n return [];\r\n }\r\n\r\n const batchSize =\r\n options.batchSize && options.batchSize > 0\r\n ? options.batchSize\r\n : DEFAULT_CREATE_MANY_BATCH_SIZE;\r\n\r\n const chunks = chunkArray(data, batchSize);\r\n\r\n if (options.bulk === true) {\r\n return await createManyBulk(ModelClass, chunks);\r\n }\r\n\r\n const created: TModel[] = [];\r\n\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op instead\r\n // of N), pre-seeding each id-less model so its per-row save() no-ops id-gen.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n const chunkModels = await Promise.all(\r\n models.map(async (model) => {\r\n await model.save();\r\n return model;\r\n }),\r\n );\r\n\r\n created.push(...chunkModels);\r\n }\r\n\r\n return created;\r\n}\r\n\r\n/**\r\n * Reserve a single contiguous id block for one chunk and pre-assign the ids to\r\n * the models that don't already carry one, so the per-row writer's id\r\n * generation no-ops (its `model.get(\"id\")` guard short-circuits). This turns N\r\n * per-row counter round-trips into ONE per chunk.\r\n *\r\n * Falls back to per-row generation (a no-op here) when:\r\n * - the model disables auto-generation (`autoGenerateId === false`) — e.g. SQL,\r\n * which uses native `SERIAL`;\r\n * - the data source's id generator has no batch API (`generateNextIds`) — the\r\n * optional contract member is feature-detected;\r\n * - the model uses a random initial id / increment — a random stride can't form\r\n * a contiguous block, so those models keep per-row generation.\r\n *\r\n * Only models WITHOUT a caller-supplied id consume a block slot, so a chunk\r\n * mixing supplied and auto ids allocates exactly the right number (no gaps).\r\n *\r\n * @param ModelClass - The model class being inserted.\r\n * @param models - The freshly-constructed (unsaved) models for one chunk.\r\n */\r\nasync function assignIdBlock<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n models: TModel[],\r\n): Promise<void> {\r\n if (!ModelClass.autoGenerateId || ModelClass.randomInitialId || ModelClass.randomIncrement) {\r\n return;\r\n }\r\n\r\n const idGenerator = ModelClass.getDataSource().idGenerator;\r\n\r\n if (!idGenerator || typeof idGenerator.generateNextIds !== \"function\") {\r\n return;\r\n }\r\n\r\n const idLessModels = models.filter((model) => !model.get(\"id\"));\r\n\r\n if (idLessModels.length === 0) {\r\n return;\r\n }\r\n\r\n const ids = await idGenerator.generateNextIds({\r\n table: ModelClass.table,\r\n initialId: ModelClass.initialId || 1,\r\n incrementIdBy: ModelClass.incrementIdBy || 1,\r\n count: idLessModels.length,\r\n });\r\n\r\n // Enforce the contract at this pluggable, feature-detected boundary: a\r\n // non-conforming generator returning the wrong count would otherwise set\r\n // `id = undefined` on the unmatched rows, the per-row writer would silently\r\n // re-generate single ids, and the reserved block would no longer match what\r\n // is persisted. Fail loud instead of corrupting the sequence.\r\n if (ids.length !== idLessModels.length) {\r\n throw new Error(\r\n `generateNextIds returned ${ids.length} id(s) for ${idLessModels.length} row(s) on ` +\r\n `\"${ModelClass.table}\" — a batch id generator must return exactly the requested count.`,\r\n );\r\n }\r\n\r\n idLessModels.forEach((model, index) => {\r\n model.set(\"id\", ids[index]);\r\n });\r\n}\r\n\r\n/**\r\n * Bulk variant of {@link createManyRecords}: prep each row through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) without\r\n * touching the database, then flush each chunk with a single\r\n * `driver.insertMany` call.\r\n *\r\n * The writer reuse goes through `DatabaseWriter.prepareForInsert()`, the same\r\n * pipeline `save()` uses for an insert, so the shared driver is never mutated\r\n * and concurrent `save()` calls are unaffected.\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param chunks - Pre-chunked rows.\r\n * @returns The created model instances with driver-returned values merged in.\r\n */\r\nasync function createManyBulk<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, chunks: Partial<TSchema>[][]): Promise<TModel[]> {\r\n const dataSource = ModelClass.getDataSource();\r\n const driver = dataSource.driver;\r\n const table = ModelClass.table;\r\n\r\n const created: TModel[] = [];\r\n\r\n {\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op\r\n // instead of N), pre-seeding each id-less model so the per-row writer's\r\n // id generation no-ops.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n // Prep every model through the real writer pipeline. The captured\r\n // `insert` keeps this off the wire while still mutating each model's\r\n // data with casts/timestamps/defaults/generated ids.\r\n const preparedDocuments = await Promise.all(\r\n models.map(async (model) => {\r\n const document = await new DatabaseWriter(model).prepareForInsert({\r\n skipEvents: true,\r\n skipSync: true,\r\n });\r\n return { ...document } as Record<string, unknown>;\r\n }),\r\n );\r\n\r\n const results = await driver.insertMany(table, preparedDocuments);\r\n\r\n // Merge driver-returned values (generated _id, timestamps, RETURNING *)\r\n // back onto each model so the returned instances reflect persisted state.\r\n models.forEach((model, index) => {\r\n const result = results[index] as InsertResult | Record<string, unknown> | undefined;\r\n\r\n if (result) {\r\n const returnedDocument =\r\n \"document\" in (result as Record<string, unknown>)\r\n ? (result as InsertResult).document\r\n : result;\r\n\r\n // Driver-returned identity (generated _id / RETURNING *) — merged\r\n // through the framework-internal path so it is not treated as mass\r\n // assignment on a model the writer has already marked persisted.\r\n mergeDriverFields(model, returnedDocument as Record<string, unknown>);\r\n }\r\n\r\n model.dirtyTracker.reset();\r\n model.isNew = false;\r\n });\r\n\r\n created.push(...models);\r\n }\r\n }\r\n\r\n return created;\r\n}\r\n\r\nexport async function findOrCreateRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n): Promise<TModel> {\r\n const existing = await ModelClass.first(filter as Record<string, unknown>);\r\n\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n return await createRecord(ModelClass, { ...filter, ...data } as Partial<TSchema>);\r\n}\r\n\r\nexport async function upsertRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n options?: Record<string, unknown>,\r\n): Promise<TModel> {\r\n const driver = ModelClass.getDriver();\r\n const safeFilter = sanitizeFilter(filter as Record<string, unknown>);\r\n const mergedData = { ...safeFilter, ...data } as Record<string, unknown>;\r\n\r\n const tempModel = new ModelClass(mergedData as Partial<TSchema>);\r\n tempModel.isNew = true;\r\n\r\n // One `saving` run against the model itself, so listener changes (slug,\r\n // createdBy, ...) land in the data that is written.\r\n await emitModelEvent(tempModel, \"saving\", {\r\n isInsert: true,\r\n options,\r\n mode: \"upsert\",\r\n });\r\n\r\n // Validation, casting and Mongo id generation, same as `create()`.\r\n await new DatabaseWriter(tempModel).prepareForUpsert();\r\n\r\n const setData: Record<string, unknown> = { ...tempModel.data };\r\n const setOnInsert: Record<string, unknown> = {};\r\n const now = new Date();\r\n\r\n // Identity and creation time belong to the insert only; an existing row\r\n // keeps its own.\r\n for (const key of new Set([\"id\", \"_id\", ModelClass.primaryKey])) {\r\n if (key in setData) {\r\n setOnInsert[key] = setData[key];\r\n delete setData[key];\r\n }\r\n }\r\n\r\n const createdAtColumn = ModelClass.createdAtColumn;\r\n if (createdAtColumn) {\r\n setOnInsert[createdAtColumn] = setData[createdAtColumn] ?? now;\r\n delete setData[createdAtColumn];\r\n }\r\n\r\n const updatedAtColumn = ModelClass.updatedAtColumn;\r\n if (updatedAtColumn) {\r\n setData[updatedAtColumn] = now;\r\n }\r\n\r\n const result = await driver.findOneAndUpdate(\r\n ModelClass.table,\r\n safeFilter,\r\n { $set: setData, $setOnInsert: setOnInsert },\r\n { ...options, upsert: true, returnDocument: \"after\" },\r\n );\r\n\r\n const model = ModelClass.hydrate(result as Record<string, unknown>) as TModel;\r\n model.dirtyTracker.reset();\r\n\r\n await emitModelEvent(model, \"saved\", { filter: safeFilter, data: result, options, mode: \"upsert\" });\r\n\r\n return model;\r\n}\r\n"],"mappings":"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"}
@@ -522,12 +522,27 @@ declare abstract class Model<TSchema extends ModelSchema = ModelSchema> {
522
522
  */
523
523
  isLoaded(relationName: string): boolean;
524
524
  /**
525
- * Set relation manually
525
+ * Set relation manually.
526
+ *
527
+ * For a `belongsTo` relation this also writes the foreign-key column on
528
+ * this model (the declared `foreignKey`, else the inferred `<relation>_id`)
529
+ * from the related model's owner key, so `post.setRelation("author", user)`
530
+ * followed by `save()` persists `author_id`. Passing `null` clears the FK.
531
+ * The FK is left untouched when the related model carries no owner key yet.
532
+ *
533
+ * For `hasOne`, `hasMany`, `belongsToMany` and undeclared relations only the
534
+ * in-memory relation is set; no foreign key is written (the key lives on the
535
+ * other side or in a pivot table).
526
536
  *
527
537
  * @param relationName
528
538
  * @param relationData
529
539
  */
530
540
  setRelation(relationName: string, relationData: LoadedRelationResult): void;
541
+ /**
542
+ * Relation conventions of this model's data source, or undefined when none
543
+ * are configured or no data source resolves.
544
+ */
545
+ private relationDefaultsOrUndefined;
531
546
  /**
532
547
  * Get a loaded relation by name.
533
548
  *
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.mts","names":[],"sources":["../../../../../../../cascade/src/model/model.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoKA;;;;;;;;;;;;;;;;;;;;;;;;;;uBAAsB,KAAA,iBAAsB,WAAA,GAAc,WAAA;EA6kBrB;;;;;;;;;;;;EAAA,OAhkBrB,KAAA;EA+mBX;;;;;;;;;;;;EAAA,OAjmBW,QAAA;EA4qBL;;;;EAAA,OAtqBK,eAAA;EAyqByC;;;;;;;;;;;EAAA,OA5pBzC,aAAA;EA+sBsD;;;;;;;;;;;;;;;;;;EAAA,OA3rBtD,MAAA;EA6yBX;;;;;;;;;;;;;;;EAAA,OA5xBW,UAAA,YAAsB,UAAA;EA68BC;;;EAAA,OAx8BvB,OAAA,WAAkB,IAAA,YAAgB,oBAAA,CAAqB,KAAA;EA0gC/C;;;;;;;;;;;;;;;;EAAA,OAx/BR,UAAA;EAkpCN;;;EAAA,OA7oCM,KAAA;EAupC4B;;;;;;;;;;;;;;;;;;;;EAAA,OAjoC5B,MAAA,GAAS,eAAA;EA+sCwB;;;;;;;;;;;;;;;;;;;;;EAAA,OAxrCjC,UAAA,EAAY,UAAA;EAouCb;;;;;;;;;;;;;;;;;;;;;;EAAA,OA5sCC,cAAA;EA4xCkC;;;;;;;;;;;;EAAA,OA9wClC,SAAA;EA6xC6B;;;;;;;;;;;;;;;;;;;;;EAAA,OAtwC7B,eAAA;EAqxCX;;;;;;;;;;;;;;EAAA,OArwCW,aAAA;EAyyCK;;;;;;;;;;;;;;;;;;;;;EAAA,OAlxCL,eAAA;EA0zCgC;;;EAAA,OArzChC,eAAA;EA0zCX;;;EAAA,OArzCW,eAAA;EAm0CN;;;;;;;;;;;;;;;;;;EAAA,OA/yCM,cAAA,GAAiB,cAAA;EAi2CZ;;;;;;;;;;;;;;EAAA,OAj1CL,eAAA;EA82CH;;;;;;;;;;;;;EAAA,OA/1CG,UAAA;EAm5CmD;;;;;;;;EAAA,OAz4CnD,YAAA,EAAY,GAAA,SAAA,qBAAA;EAi/CI;;;;;;EAAA,OAz+ChB,WAAA,EAAW,GAAA,SAAA,kBAAA;EA2hDjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,OA5/CM,SAAA,EAAW,QAAA,CAAS,MAAA,SAAe,kBAAA;EAkmDf;EAAA,QA/lD1B,SAAA;EA+lD6C;;;;;EAAA,QAxlD7C,kBAAA;EA8nD4D;EAAA,QA3nD5D,kBAAA;EA6nDA;;;;;;;;;;;;EAAA,IA/mDG,KAAA;EAAA,IAIA,KAAA,CAAM,KAAA;EA0oD2B;;;;;;;;;;;EAAA,IAjnDjC,iBAAA;EAmqDQ;;;;;EAxpDZ,IAAA,EAAM,OAAA;EA2pDD;;;;;;;;;;EAAA,SA/oDI,YAAA,EAAc,oBAAA;EAmqDZ;;;;EA7pDX,MAAA,EAAQ,WAAA;EAgqDJ;;;;;;;;;;;;;;EAhpDJ,eAAA,EAAiB,GAAA;EAiuDT;;;EAAA,UA5tDL,cAAA;EAivDS;;;;;;;;;;;;cAnuDA,WAAA,GAAa,OAAA,CAAQ,OAAA;EA8vD5B;;;;;;;;;;;;;;;;;;;;;;;;;EAhuDC,IAAA,IAAQ,SAAA,aAAsB,OAAA;EAi5DnC;;;;;;;;;;;;;;;EA13DD,QAAA,CAAS,YAAA;EAncF;;;;;;EA6cP,WAAA,CAAY,YAAA,UAAsB,YAAA,EAAc,oBAAA;EAhahC;;;;;;;;;;;;;;;;EAobhB,WAAA,kBAA6B,YAAA,WAAuB,SAAA;EA1O7C;;;;;;;;;;;;;;;;EAAA,OA8PA,QAAA,CAAS,IAAA,WAAY,UAAA,CAAA,KAAA,CAAA,WAAA;EAhJL;;;;;;;;;;;;;;;EAAA,OAmKhB,YAAA,IAAY,GAAA,SAAA,UAAA,CAAA,KAAA,CAAA,WAAA;EA3DP;;;;;;;;;;;;;;;;EAAA,OAmFL,IAAA,gBAAoB,KAAA,GAAQ,KAAA,EACxC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,WAAA,EAAa,UAAA,CAAW,KAAA,GACxB,WAAA,WACC,0BAAA;EAJW;;;;;;;;;;;;;;;;EAAA,OAwBA,QAAA,gBAAwB,KAAA,GAAQ,KAAA,EAC5C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,WAAA,EAAa,UAAA,CAAW,KAAA,GACxB,WAAA,WACC,0BAAA;EAHgB;;;EAAA,IAUR,EAAA;EATT;;;;;;;;;;;;;;;;;;;EAAA,IAgCS,IAAA;EAuBR;;;;;;;;;;;;;;;EAJI,GAAA,oBAAuB,OAAA,WAAkB,KAAA,EAAO,IAAA,GAAO,OAAA,CAAQ,IAAA;EAC/D,GAAA,oBAAuB,OAAA,WAC5B,KAAA,EAAO,IAAA,EACP,YAAA,EAAc,OAAA,CAAQ,IAAA,IACrB,OAAA,CAAQ,IAAA;EACJ,GAAA,6BAAgC,KAAA,WAAgB,IAAA;EAChD,GAAA,6BAAgC,KAAA,UAAe,YAAA,EAAc,IAAA,GAAO,IAAA;EAQI;;;EAAxE,IAAA,oBAAwB,OAAA,WAAkB,MAAA,EAAQ,IAAA,KAAS,MAAA,CAAO,IAAA,EAAM,OAAA,CAAQ,IAAA;EAChF,IAAA,CAAK,MAAA,aAAmB,MAAA;EAQxB;;;EAAA,MAAA,CAAO,GAAA,UAAa,YAAA;EAOb;;;EAAP,MAAA,CAAO,GAAA,UAAa,YAAA;EAOC;;;EAArB,OAAA,CAAQ,GAAA,UAAa,YAAA;EAmB2B;;;;;;;;;;;;;;;EAAhD,GAAA,oBAAuB,OAAA,WAAkB,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,IAAA;EACrE,GAAA,CAAI,KAAA,UAAe,KAAA;EA4BU;;;;;;;;;;;;;;EAT7B,GAAA,oBAAuB,OAAA,WAAkB,KAAA,EAAO,IAAA;EAChD,GAAA,CAAI,KAAA;EAqCJ;;;EA7BA,SAAA,oBAA6B,OAAA,WAAkB,KAAA,EAAO,IAAA,EAAM,MAAA;EAC5D,SAAA,CAAU,KAAA,UAAe,MAAA;EAgDzB;;;EAxCA,SAAA,oBAA6B,OAAA,WAAkB,KAAA,EAAO,IAAA,EAAM,MAAA;EAC5D,SAAA,CAAU,KAAA,UAAe,MAAA;EAwCX;;;;;;;;;;;;;;EArBd,KAAA,IAAS,MAAA,SAAe,OAAA;EACxB,KAAA,IAAS,MAAA;EAqDP;;;;;;;;;;;;;;EAlCF,KAAA,CAAM,MAAA,EAAQ,OAAA,CAAQ,OAAA;EACtB,KAAA,CAAM,MAAA,EAAQ,MAAA;EAwHd;;;;;;EA7GM,YAAA,CAAa,UAAA,EAAY,MAAA,oBAA0B,OAAA;EA8JzC;;;;;EArJV,eAAA,iBAAgC,OAAA,WAC3C,KAAA,EAAO,CAAA,EACP,MAAA,YACC,OAAA;EAgKI;;;;;EAvJM,eAAA,iBAAgC,OAAA,WAC3C,KAAA,EAAO,CAAA,EACP,MAAA,YACC,OAAA;EAsJD;;;EAAA,IA/IS,QAAA;EA4JT;;;EAAA,IArJS,SAAA,IAAa,IAAA;EAiKjB;;;EAAA,IAtJI,SAAA,IAAa,IAAA;EAwJZ;;;EA7IL,WAAA,CAAY,IAAA,EAAM,KAAA,GAAQ,aAAA;EAsKF;;;;;;;;;;;;;EArJxB,UAAA;EA2N0B;;;;;;;;;;;;EA3M1B,OAAA,CAAQ,MAAA;EAqRsB;;;;;;;;;;;;EArQ9B,yBAAA,IAA6B,MAAA;IAAiB,QAAA;IAAmB,QAAA;EAAA;EAwThE;;;;;;;;;;;EAzSD,iBAAA;EAoTL;;;;;;;;;;;EArSK,eAAA;EAiUe;;;;;;;;;;;;;;;EA9ST,SAAA,qBACX,KAAA,EAAO,cAAA,EACP,OAAA,GAAU,QAAA,GACT,OAAA;EAsUA;;;;;;;EA3TI,EAAA,qBACL,KAAA,EAAO,cAAA,EACP,QAAA,EAAU,kBAAA,OAAyB,QAAA;EAgVnC;;;;;;;EApUK,IAAA,qBACL,KAAA,EAAO,cAAA,EACP,QAAA,EAAU,kBAAA,OAAyB,QAAA;EA+U7B;;;;;;EApUD,GAAA,qBACL,KAAA,EAAO,cAAA,EACP,QAAA,EAAU,kBAAA,OAAyB,QAAA;EAyUb;;;;;;;;;;;;;;;;;;;;EAAA,OAhTV,aAAA,IAAiB,UAAA;EAwUP;;;EAAA,OAjUV,SAAA,IAAa,cAAA;EAmWmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,OAjUhC,GAAA,KAAQ,MAAA,mBACpB,GAAA,UACA,MAAA,eACC,OAAA,CAAQ,cAAA,CAAe,CAAA;EA4WlB;;;EArWK,cAAA,IAAkB,OAAA;EAsW7B;;;;;;;;;;;;;;;EAAA,OAnVY,kBAAA,CAAmB,QAAA;EAgWE;;;;;;;;;;;;;;;;;;;;;;;EAAA,OArUrB,cAAA,CACZ,IAAA,UACA,QAAA,GAAW,KAAA,EAAO,oBAAA,WAClB,OAAA,GAAS,kBAAA;EA6UG;;;;;;;;;;EAAA,OA9TA,iBAAA,CAAkB,IAAA;EAiU9B;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,OApSY,QAAA,CAAS,IAAA,UAAc,QAAA,EAAU,kBAAA;EAwUA;;;;;;;;;;EAAA,OA1TjC,WAAA,CAAY,IAAA;EAoU0B;;;EAAA,OA7TtC,KAAA,gBAAqB,KAAA,GAAQ,KAAA,EACzC,IAAA,EAAM,UAAA,CAAW,MAAA,IAChB,oBAAA,CAAqB,MAAA;EA6Tb;;;;;;;;;;;;;;;;;;;;;;EAAA,OAlSG,IAAA,gBAAoB,KAAA,GAAQ,KAAA,EACxC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,QAAA,WACC,oBAAA,CAAqB,MAAA;EA6TL;;;;;;EAAA,OArTL,IAAA,gBAAoB,KAAA,GAAQ,KAAA,EACxC,IAAA,EAAM,UAAA,CAAW,MAAA,MACd,SAAA,aACF,oBAAA,CAAqB,MAAA;EAmUV;;;;;;;;;;;;;;;;;;;;;EAAA,OA5SA,IAAA,gBAAoB,KAAA,GAAQ,KAAA,EACxC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,QAAA,UACA,UAAA,GAAa,KAAA,EAAO,oBAAA,YACnB,oBAAA,CAAqB,MAAA;EAkUtB;;;;;;;;;;;;;;;;;;;;;EAAA,OA3SY,IAAA,gBAAoB,KAAA,GAAQ,KAAA,EACxC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,SAAA,EAAW,MAAA,qBAA2B,KAAA,EAAO,oBAAA,cAC5C,oBAAA,CAAqB,MAAA;EAkUd;;;;;;;;;;;;;;;;EAAA,OA5SI,SAAA,gBAAyB,KAAA,GAAQ,KAAA,EAC7C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,QAAA,WACC,oBAAA,CAAqB,MAAA;EAkUtB;;;;;;;;EAAA,OAxTY,SAAA,gBAAyB,KAAA,GAAQ,KAAA,EAC7C,IAAA,EAAM,UAAA,CAAW,MAAA,MACd,SAAA,aACF,oBAAA,CAAqB,MAAA;EA+T0B;;;EAAA,OA1TpC,SAAA,gBAAyB,KAAA,GAAQ,KAAA,EAC7C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,SAAA,aACC,oBAAA,CAAqB,MAAA;EAwTtB;;;;;;;;;;;;;;;;EAAA,OAtSY,SAAA,gBAAyB,KAAA,GAAQ,KAAA,EAC7C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,SAAA,EAAW,MAAA,2BAAiC,KAAA,EAAO,oBAAA,cAClD,oBAAA,CAAqB,MAAA;EA+Uc;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,OA7SxB,QAAA,gBAAwB,KAAA,GAAQ,KAAA,EAC5C,IAAA,EAAM,UAAA,CAAW,MAAA,MACd,SAAA,aACF,oBAAA,CAAqB,MAAA;EAuaR;;;;;;;;;;;;;;;;;;;EAAA,OAhZF,eAAA,gBAA+B,KAAA,GAAQ,KAAA,EACnD,IAAA,EAAM,UAAA,CAAW,MAAA,IAChB,oBAAA,CAAqB,MAAA;EAobqB;;;EAAA,OA7azB,KAAA,gBAAqB,KAAA,GAAQ,KAAA,EAC/C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,GAAS,MAAA,oBACR,OAAA,CAAQ,MAAA;EA2aT;;;EAAA,OApakB,IAAA,gBAAoB,KAAA,GAAQ,KAAA,EAC9C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,GAAS,MAAA,oBACR,OAAA,CAAQ,MAAA;EAgcS;;;EAAA,OAzbN,KAAA,gBAAqB,KAAA,GAAQ,KAAA,EACzC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,KAAA,UACA,KAAA,YACC,oBAAA,CAAqB,MAAA;EAAA,OACV,KAAA,gBAAqB,KAAA,GAAQ,KAAA,EACzC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,KAAA,UACA,QAAA,EAAU,aAAA,EACV,KAAA,YACC,oBAAA,CAAqB,MAAA;EAAA,OACV,KAAA,gBAAqB,KAAA,GAAQ,KAAA,EACzC,IAAA,WAAe,IAAA,YAAgB,MAAA,IAC7B,IAAA,QAAY,KAAA,wCACd,UAAA,EAAY,WAAA,GACX,oBAAA,CAAqB,MAAA;EAAA,OACV,KAAA,gBAAqB,KAAA,GAAQ,KAAA,EACzC,IAAA,WAAe,IAAA,YAAgB,MAAA,IAC7B,IAAA,QAAY,KAAA,wCACd,QAAA,EAAU,aAAA,CAAc,MAAA,IACvB,oBAAA,CAAqB,MAAA;EAuatB;;;;EAAA,OA3ZY,KAAA,gBAAqB,KAAA,GAAQ,KAAA,EACzC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,GAAS,MAAA,oBACR,OAAA;EA6ZQ;;;EAAA,OAtZS,IAAA,gBAAoB,KAAA,GAAQ,KAAA,EAC9C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,EAAA,oBACC,OAAA,CAAQ,MAAA;EAya2C;;;;;;EAAA,OA/ZlC,GAAA,gBAAmB,KAAA,GAAQ,KAAA,EAC7C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,GAAS,MAAA,oBACR,OAAA,CAAQ,MAAA;EAkaR;;;EAAA,OA3ZiB,QAAA,gBAAwB,KAAA,GAAQ,KAAA,EAClD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,OAAA,GAAS,iBAAA;IACP,MAAA,GAAS,MAAA;EAAA,IAEV,OAAA,CAAQ,gBAAA,CAAiB,MAAA;EA+a1B;;;;;EAAA,OAtakB,MAAA,gBAAsB,KAAA,GAAQ,KAAA,EAChD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,GAAS,MAAA,oBACR,OAAA,CAAQ,MAAA;EAmayD;;;;;;;;;;EAAA,OArZtD,QAAA,gBAAwB,KAAA,GAAQ,KAAA,EAC5C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,MAAA,mBACR,KAAA,UACA,MAAA,WACC,OAAA;EAsbc;;;;;;;;;EAAA,OAzaH,QAAA,gBAAwB,KAAA,GAAQ,KAAA,EAC5C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,MAAA,mBACR,KAAA,UACA,MAAA,WACC,OAAA;EAuagB;;;;;;;;;;;;;;EAAA,OArZC,MAAA,gBAAsB,KAAA,GAAQ,KAAA,EAChD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,MAAA,mBACR,UAAA,EAAY,YAAA,EACZ,OAAA,GAAU,mBAAA,GACT,OAAA;EA8a6B;;;EAAA,OAvaZ,MAAA,gBAAsB,KAAA,GAAQ,KAAA,EAChD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,EAAA,mBACA,IAAA,EAAM,MAAA,oBACL,OAAA;EAmaiE;;;;;;;EAAA,OAxZhD,aAAA,gBAA6B,KAAA,GAAQ,KAAA,EACvD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,MAAA,mBACR,MAAA,EAAQ,YAAA,EACR,OAAA,GAAU,IAAA,CAAK,mBAAA,qBACd,OAAA,CAAQ,MAAA;EAoZyD;;;;;;;;;;;;;;;;EAAA,OAhYhD,gBAAA,gBAAgC,KAAA,GAAQ,KAAA,EAC1D,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,MAAA,mBACR,MAAA,EAAQ,YAAA,EACR,OAAA,GAAU,uBAAA,GACT,OAAA,CAAQ,MAAA;EA6aT;;;EAAA,OAtakB,cAAA,gBAA8B,KAAA,GAAQ,KAAA,EACxD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,MAAA,mBACR,QAAA,EAAU,MAAA,oBACT,OAAA,CAAQ,MAAA;EAoaH;;;;;;;;;;;;;;;;;;EA9YK,OAAA,CAAQ,OAAA;IACnB,QAAA,GAAW,cAAA;IACX,UAAA;EAAA,IACE,OAAA,CAAQ,aAAA;EAgaM;;;;;;;;;;;;EAhZL,MAAA,CAAO,QAAA,UAAkB,GAAA,EAAK,QAAA,EAAU,SAAA,GAAY,SAAA,GAAY,OAAA;EAwarE;;;;;;;;;;;;;EAvZK,MAAA,CAAO,QAAA,UAAkB,GAAA,GAAM,QAAA,GAAW,OAAA;EAidnB;;;;;;;;;;;;;;;;EA7b7B,KAAA,CAAM,QAAA,WAAmB,eAAA;EAsdpB;;;;;;;;;;;;;;;EAncL,IAAA,gBAAoB,KAAA,YAAiB,UAAA,CAAW,MAAA;EA4dhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAtbhC,KAAA;EAilBmC;;;;;;EAvkBnC,UAAA,IAAc,GAAA,EAAK,CAAA,GAAI,CAAA;EA4lBhB;;;EArlBP,YAAA;EAslBC;;;EA/kBD,aAAA;EAglBL;;;EAzkBK,SAAA,IAAS,eAAA,4BAAA,MAAA;EAilBH;AAAA;;EA1kBN,SAAA,CAAU,GAAA;;;;EAOV,aAAA,IAAiB,UAAA;;;;EAOjB,aAAA,IAAiB,UAAA;;;;SAOJ,MAAA,gBAAsB,KAAA,GAAQ,KAAA,EAChD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,GAAS,MAAA,oBACR,OAAA;;;;SAOiB,SAAA,gBAAyB,KAAA,GAAQ,KAAA,EACnD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,GAAS,MAAA,oBACR,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;SA6BiB,OAAA,gBAAuB,KAAA,GAAQ,KAAA,EACjD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,EAAA,mBACA,OAAA;IACE,YAAA;IACA,UAAA;EAAA,IAED,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;;;;SAsBS,UAAA,gBAA0B,KAAA,GAAQ,KAAA,EACpD,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,OAAA;IACE,YAAA;IACA,UAAA;EAAA,IAED,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;;;;;SAuBS,MAAA,gBACH,KAAA,GAAQ,KAAA,kBACP,WAAA,IAAc,MAAA,SAAe,KAAA,YAAiB,CAAA,GAAI,WAAA,GAClE,IAAA,EAAM,UAAA,CAAW,MAAA,GAAS,IAAA,EAAM,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAoCzC,UAAA,gBACH,KAAA,GAAQ,KAAA,kBACP,WAAA,IAAc,MAAA,SAAe,KAAA,YAAiB,CAAA,GAAI,WAAA,GAElE,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,IAAA,EAAM,OAAA,CAAQ,OAAA,KACd,OAAA,GAAU,iBAAA,GACT,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;;;;;;;SAyBS,YAAA,gBACH,KAAA,GAAQ,KAAA,kBACP,WAAA,IAAc,MAAA,SAAe,KAAA,YAAiB,CAAA,GAAI,WAAA,GAClE,IAAA,EAAM,UAAA,CAAW,MAAA,GAAS,MAAA,EAAQ,OAAA,CAAQ,OAAA,GAAU,IAAA,EAAM,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA8CnE,MAAA,gBACH,KAAA,GAAQ,KAAA,kBACP,WAAA,IAAc,MAAA,SAAe,KAAA,YAAiB,CAAA,GAAI,WAAA,GAElE,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,OAAA,CAAQ,OAAA,GAChB,IAAA,EAAM,OAAA,CAAQ,OAAA,GACd,OAAA,GAAU,MAAA,oBACT,OAAA,CAAQ,MAAA;;;;;;;;;;;SAcS,cAAA,gBACH,KAAA,GAAQ,KAAA,kBACP,WAAA,IAAc,MAAA,SAAe,KAAA,YAAiB,CAAA,GAAI,WAAA,GAElE,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,OAAA,CAAQ,OAAA,GAChB,IAAA,EAAM,OAAA,CAAQ,OAAA,GACd,OAAA,GAAU,MAAA,oBACT,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;;SAoBS,gBAAA,gBAAgC,KAAA,GAAQ,KAAA,EAC1D,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,MAAA,EAAQ,MAAA,mBACR,OAAA,GAAU,MAAA,oBACT,OAAA,CAAQ,MAAA;;;;;;;;;;;;;;;MAkBA,SAAA,IAAa,MAAA;;;;;;;;;;;;;;;SAkBV,QAAA;;;;;;;;;;;;;;;;SAmBA,MAAA,gBAAsB,KAAA,GAAQ,KAAA,EAC1C,IAAA,EAAM,UAAA,CAAW,MAAA,IAChB,WAAA,CAAY,MAAA;;;;;;;;;;;;;;;;;SAoBD,EAAA,gBAAkB,KAAA,GAAQ,KAAA,sBACtC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,KAAA,EAAO,cAAA,EACP,QAAA,EAAU,kBAAA,CAAmB,MAAA,EAAQ,QAAA;;;;;;;;;;;;;;;;;;SAsBzB,IAAA,gBAAoB,KAAA,GAAQ,KAAA,sBACxC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,KAAA,EAAO,cAAA,EACP,QAAA,EAAU,kBAAA,CAAmB,MAAA,EAAQ,QAAA;;;;;;;;;;;;;;;;SAoBzB,GAAA,gBAAmB,KAAA,GAAQ,KAAA,sBACvC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,KAAA,EAAO,cAAA,EACP,QAAA,EAAU,kBAAA,CAAmB,MAAA,EAAQ,QAAA;;;;;;;;;;;;;;;;SAoBzB,YAAA,IAAgB,WAAA,CAAY,KAAA;;;;;;;;;;;;;;;;;;EAqBnC,WAAA,CAAY,IAAA,EAAM,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CZ,IAAA,CAAK,OAAA,GAAU,aAAA;IAAkB,KAAA,GAAQ,OAAA,CAAQ,OAAA;EAAA,IAAa,OAAA;;;;;;;;;EAYpE,SAAA,IAAS,MAAA;;;;;;;;;;;;;;;;EAmBT,UAAA,IAAc,aAAA;;;;;;;;;;;;;;SAiBP,YAAA,gBAA4B,KAAA,EACxC,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,QAAA,EAAU,aAAA,GACT,MAAA;;;;;;;;;;;;;;;SAkBW,OAAA,gBAAuB,KAAA,GAAQ,KAAA,EAC3C,IAAA,EAAM,UAAA,CAAW,MAAA,GACjB,IAAA,EAAM,MAAA,oBACL,MAAA;;;;EAOI,MAAA,IAAM,MAAA;AAAA"}
1
+ {"version":3,"file":"model.d.mts","names":[],"sources":["../../../../../../../cascade/src/model/model.ts"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { ModelEvents } from "../events/model-events.mjs";
2
+ import { inferBelongsToForeignKey } from "../relations/key-conventions.mjs";
2
3
  import { getAllModelsFromRegistry, getModelFromRegistry } from "./register-model.mjs";
3
4
  import { RelationLoader, attachLoadedRelation } from "../relations/relation-loader.mjs";
4
5
  import { modelSync } from "../sync/model-sync.mjs";
@@ -6,6 +7,7 @@ import { decrementField, getBooleanField, getFieldValue, getNumberField, getOnly
6
7
  import { deleteOneRecord, deleteRecords, destroyModel } from "./methods/delete-methods.mjs";
7
8
  import { checkHasChanges, checkIsDirty, getDirtyColumns, getDirtyColumnsWithValues, getRemovedColumns } from "./methods/dirty-methods.mjs";
8
9
  import { cloneModel, deepFreezeObject, hydrateModel, modelFromSnapshot, modelToSnapshot, replaceModelData, serializeModel } from "./methods/hydration-methods.mjs";
10
+ import { cleanupModelEvents, getGlobalEvents, getModelEvents, offStaticEvent, onStaticEvent, onceStaticEvent } from "./methods/static-event-methods.mjs";
9
11
  import { emitModelEvent, offModelEvent, onModelEvent, onceModelEvent } from "./methods/instance-event-methods.mjs";
10
12
  import { applyDefaultsToModel, generateModelNextId, performAtomicDecrement, performAtomicIncrement, performAtomicUpdate } from "./methods/meta-methods.mjs";
11
13
  import { attachPivotRelation, detachPivotRelation, pivotRelation } from "./methods/pivot-methods.mjs";
@@ -13,7 +15,6 @@ import { modelToJSON } from "./methods/serialization-methods.mjs";
13
15
  import { buildNewQueryBuilder, buildQuery, countRecords, decreaseField, findAll, findAndReplaceRecord, findAndUpdateRecords, findById, findFirst, findLast, findLatest, findOneAndDeleteRecord, findOneAndUpdateRecord, increaseField, paginateRecords, performAtomic, resolveDataSource, updateById } from "./methods/query-methods.mjs";
14
16
  import { restoreAllRecords, restoreRecord } from "./methods/restore-methods.mjs";
15
17
  import { addGlobalModelScope, addLocalModelScope, removeGlobalModelScope, removeLocalModelScope } from "./methods/scope-methods.mjs";
16
- import { cleanupModelEvents, getGlobalEvents, getModelEvents, offStaticEvent, onStaticEvent, onceStaticEvent } from "./methods/static-event-methods.mjs";
17
18
  import { createManyRecords, createRecord, findOrCreateRecord, saveModel, upsertRecord } from "./methods/write-methods.mjs";
18
19
 
19
20
  //#region ../cascade/src/model/model.ts
@@ -265,7 +266,7 @@ var Model = class Model {
265
266
  * }
266
267
  * ```
267
268
  */
268
- static incrementIdBy = 1;
269
+ static incrementIdBy;
269
270
  /**
270
271
  * Randomly generate the increment amount.
271
272
  *
@@ -545,15 +546,47 @@ var Model = class Model {
545
546
  return this.loadedRelations.has(relationName);
546
547
  }
547
548
  /**
548
- * Set relation manually
549
+ * Set relation manually.
550
+ *
551
+ * For a `belongsTo` relation this also writes the foreign-key column on
552
+ * this model (the declared `foreignKey`, else the inferred `<relation>_id`)
553
+ * from the related model's owner key, so `post.setRelation("author", user)`
554
+ * followed by `save()` persists `author_id`. Passing `null` clears the FK.
555
+ * The FK is left untouched when the related model carries no owner key yet.
556
+ *
557
+ * For `hasOne`, `hasMany`, `belongsToMany` and undeclared relations only the
558
+ * in-memory relation is set; no foreign key is written (the key lives on the
559
+ * other side or in a pivot table).
549
560
  *
550
561
  * @param relationName
551
562
  * @param relationData
552
563
  */
553
564
  setRelation(relationName, relationData) {
565
+ const definition = this.self().relations?.[relationName];
566
+ if (definition?.type === "belongsTo" && !Array.isArray(relationData)) {
567
+ const foreignKey = definition.foreignKey ?? inferBelongsToForeignKey(relationName, this.relationDefaultsOrUndefined());
568
+ if (relationData === null) this.set(foreignKey, null);
569
+ else if (relationData) {
570
+ const related = relationData;
571
+ const ownerKey = definition.localKey ?? related.self().primaryKey ?? "id";
572
+ const ownerValue = related.get(ownerKey);
573
+ if (ownerValue !== void 0 && ownerValue !== null) this.set(foreignKey, ownerValue);
574
+ }
575
+ }
554
576
  attachLoadedRelation(this, relationName, relationData);
555
577
  }
556
578
  /**
579
+ * Relation conventions of this model's data source, or undefined when none
580
+ * are configured or no data source resolves.
581
+ */
582
+ relationDefaultsOrUndefined() {
583
+ try {
584
+ return this.self().getDataSource()?.relationDefaults;
585
+ } catch {
586
+ return;
587
+ }
588
+ }
589
+ /**
557
590
  * Get a loaded relation by name.
558
591
  *
559
592
  * Returns undefined if the relation has not been loaded.
@@ -651,7 +684,7 @@ var Model = class Model {
651
684
  * Get model id
652
685
  */
653
686
  get id() {
654
- return this.get("id");
687
+ return this.get(this.self().primaryKey);
655
688
  }
656
689
  /**
657
690
  * String-typed accessor for the model's primary id.
@@ -673,7 +706,8 @@ var Model = class Model {
673
706
  * ```
674
707
  */
675
708
  get uuid() {
676
- return this.get("id");
709
+ const value = this.get(this.self().primaryKey);
710
+ return value === void 0 || value === null ? value : String(value);
677
711
  }
678
712
  get(field, defaultValue) {
679
713
  return getFieldValue(this, field, defaultValue);